V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
pppy
V2EX  ›  Python

2018 年在使用或学习 Python 过程中,“醍醐灌顶“的点有哪些?

  •  
  •   pppy · 2019-01-16 14:57:25 +08:00 · 4597 次点击
    这是一个创建于 2142 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,欢迎讨论

    28 条回复    2019-01-17 11:38:09 +08:00
    hjq98765
        1
    hjq98765  
       2019-01-16 15:00:35 +08:00
    滥用 eval 会被打
    zhaishunqi
        2
    zhaishunqi  
       2019-01-16 15:19:22 +08:00
    @hjq98765 哈哈,大神,请说出你的故事...
    sidegem
        3
    sidegem  
       2019-01-16 15:54:15 +08:00
    @hjq98765 怎么算滥用
    xpresslink
        4
    xpresslink  
       2019-01-16 16:30:43 +08:00   ❤️ 2
    我来一个吧,独家发明,是我深入理解了 python 的对象系统以后灵感一闪写出来的。

    >>> add = type('add', (int,), {'__call__':lambda o,i: add(o.numerator+i)})
    >>> add(1)
    1
    >>> add(2)
    2
    >>> add(1)(2)
    3
    >>> add(1)(2)(3)(4)
    10
    >>>
    azuginnen
        5
    azuginnen  
       2019-01-16 16:40:18 +08:00
    kwargs 好,一个调用很深的函数,上层新增一个需求,直接塞一个 kwargs,在调用链最下面取一下,做分支判断。但是这样会被项目组成员打。

    如果是你个人项目,那没问题。 多用 kwargs.setdefault('', conf.xxx)
    azuginnen
        6
    azuginnen  
       2019-01-16 16:41:39 +08:00
    还有一个 python lookup table

    lookup table
    #function lookup table


    def print1():
    print(1)


    def print2():
    print(2)


    def print3():
    print(3)


    def print4():
    print(4)


    ops = {
    "1": print1,
    "2": print2,
    "3": print3,
    "4": print4,
    }


    if __name__ == '__main__':

    for key in ["1", "2", "3", "4"]:
    ops[key]()
    mrchi
        7
    mrchi  
       2019-01-16 16:50:48 +08:00
    @hjq98765 推荐 ast.literal_eval
    hjq98765
        8
    hjq98765  
       2019-01-16 17:20:56 +08:00
    @zhaishunqi
    @sidegem
    @mrchi
    来一个我之前开脑洞写的:
    a = '1,2,3,4,5,6'
    b = eval('['+a+']')

    做到了跟[int(x) for x in a.split(',')]一样的效果
    ererrrr
        9
    ererrrr  
       2019-01-16 17:38:51 +08:00
    都是一些旁门左道.
    xpresslink
        10
    xpresslink  
       2019-01-16 17:42:01 +08:00
    @hjq98765
    写得太丑陋了
    b=list(eval(a))
    cominghome
        11
    cominghome  
       2019-01-16 17:59:16 +08:00
    @hjq98765 这样的代码三天后来看绝对一脸懵逼
    pkoukk
        12
    pkoukk  
       2019-01-16 18:15:03 +08:00
    @hjq98765
    感觉自己掌握不了 py 就是因为你这样的大神太多了,为什么要有这么多种花式写法呢
    每次读别人源码都是一种痛苦...
    reself
        13
    reself  
       2019-01-16 18:17:21 +08:00
    @xpresslink 扩展一下,是不是可以写个高阶函数来做柯里化哈哈

    func= curry(func)
    func(1)(2)(3)
    cgsv
        14
    cgsv  
       2019-01-16 19:04:29 +08:00
    @azuginnen 有必要用这个 table 吗?直接 globals()['print' + key]()
    KgM4gLtF0shViDH3
        15
    KgM4gLtF0shViDH3  
       2019-01-16 19:06:14 +08:00 via iPhone
    @xpresslink #4 面试做过,当时懵逼了,现在转 go 去了😂
    xpresslink
        16
    xpresslink  
       2019-01-16 19:20:50 +08:00
    @cgsv 实际上那些函数名字不是相同前辍。exec('print'+key)😂
    ipwx
        17
    ipwx  
       2019-01-16 19:32:57 +08:00   ❤️ 2
    https://github.com/haowen-xu/tfsnippet

    上面是我的某项目,兼容 Python 2.7 & 3,TensorFlow 1.5 ~ 1.12 。为了达成这个目的,可谓花费不少心思。

    比如以下摘自我项目的 requirements.txt:

    ----
    backports.tempfile >= 1.0 ; python_version < '3.2'
    filelock >= 3.0.10
    frozendict >= 1.2.0
    idx2numpy >= 1.2.2
    lazy-object-proxy >= 1.3.1
    natsort >= 5.3.3
    numpy >= 1.12.1
    pathlib2 >= 2.3.0 ; python_version < '3.5'
    requests >= 2.18.4
    scipy >= 1.2.0
    semver >= 2.7.9
    six >= 1.11.0
    tqdm >= 4.23.0
    ----

    比如我为了在 Travis CI 上测试兼容性做的 Docker 镜像:

    https://github.com/haowen-xu/travis-tensorflow-docker

    而且做到了 99% 测试覆盖率。
    ----

    等等等等细节,就不一一论述了。我的项目,完全没有四楼等各位那么炫技,但是非常朴实。

    我认为这才是 Python 的真谛。
    ibreaker
        18
    ibreaker  
       2019-01-16 19:58:28 +08:00
    @hjq98765 不敢用 eval
    azuginnen
        19
    azuginnen  
       2019-01-16 21:21:46 +08:00
    @cgsv #14
    @xpresslink #16 是啊! 囧~
    penghong
        20
    penghong  
       2019-01-16 21:49:54 +08:00   ❤️ 2
    在团队协作中,可读性永远是最重要的,少用一些花里胡哨的东西。
    heimafinal
        21
    heimafinal  
       2019-01-16 22:14:26 +08:00
    @penghong 你说的不对
    lithiumii
        22
    lithiumii  
       2019-01-16 22:53:53 +08:00
    楼上各位大佬牛逼,与此同时我的代码基本上就是英语
    reself
        23
    reself  
       2019-01-16 23:15:11 +08:00 via Android
    装饰器

    刚学时是这样的
    @decorator
    def func():
    ...

    然后看到了这样的
    @decorator(some_args)
    def func():
    ...

    后来自己有固定局部变量的需求时,才明白后面的写法是调用 decorator(some_args)生成了一个装饰器来装饰 func,起到了把 some_args 固定下来的作用。
    dudu2017
        24
    dudu2017  
       2019-01-16 23:42:07 +08:00 via iPhone
    借楼问一个关于 list 排序的问题。
    需求:对文件夹中的文件(包括子文件里的文件)的绝对路径需要按照字典顺序( Lexicographical Numbers )输出并且目标文件夹的的文件优先。
    现在我已经利用递归把文件夹里的所有文件的路径放 list 中了,但无论如何排序都无法按照需求打印出来,问题总出现在子文件里的文件没有按要求输出或者就是目标文件里的文件后打印。
    还是想用递归但没有好的想法了,困扰了一天了,来这里求助一下。谢谢🙏
    andylsr
        25
    andylsr  
       2019-01-16 23:42:21 +08:00 via Android
    @ipwx star~
    wind3110991
        26
    wind3110991  
       2019-01-17 10:42:51 +08:00
    在看同事代码的我:“操,这个程序怎么那么慢,不就遍历个列表么,我来看看写了些什么鬼”
    代码:

    '''
    def is_value_in_list(self, v):
    filter_list = self.load_db_all_list() # about 100k numbers of elements

    if v not in filter_list:
    return False

    return True
    '''

    ——我日你大爷。。。
    pppy
        27
    pppy  
    OP
       2019-01-17 10:51:47 +08:00
    感觉有点跑偏了,变成了 python 奇技淫巧 🤣
    zh826256645
        28
    zh826256645  
       2019-01-17 11:38:09 +08:00
    初学 Python 时,让我最惊喜的是 <<Python Cookbook>>
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1825 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 16:28 · PVG 00:28 · LAX 08:28 · JFK 11:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.