你们认为怎样的代码才算是 pythonic - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
gino86
V2EX    程序员

你们认为怎样的代码才算是 pythonic

  •  
  •   gino86 2017-01-12 16:16:59 +08:00 3464 次点击
    这是一个创建于 3196 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有人说,处理文件的时候用 try except ,那很不 pythonic,用 context manager 就很好 例如:

    try: with open('D:\nothing_here.exe') as fd: # do something here except Exception as error: #handle error 

    也有人说 for 循环里写 if 也很不 pythonic ,应该用列表推导。我就想听听大家的意见

    15 条回复    2017-01-12 18:27:14 +08:00
    kutata
        1
    kutata  
       2017-01-12 16:30:40 +08:00
    最近有个项目需要用到 python ,原来这写到一列的代码叫做列表推导,酷炫!
    gimp
        2
    gimp  
       2017-01-12 16:42:25 +08:00
    在 python 控制台中输入 import this ,就会输出 python 之禅

    个人理解就是使用 python 的特性使得代码更加的高效,简洁,可读
    introom
        3
    introom  
       2017-01-12 16:47:23 +08:00 via Android   1
    你能跑,别人看得懂就行了
    gouchaoer
        4
    gouchaoer  
       2017-01-12 16:48:35 +08:00   2
    不兼容,低性能, list comprehension+list slicing+参数缺乏类型甚至鼓励忽略类型的写法+第三方库缺乏 typehint 等导致读不懂,编码灾难,第三方库都统一安装到全局 py 二进制,游标卡尺,没有办法格式化代码
    jarry777
        5
    jarry777  
       2017-01-12 16:48:49 +08:00 via Android
    @gimp
    然而 this 的源码一点都不 pythonic 。。。
    gouchaoer
        6
    gouchaoer  
       2017-01-12 16:49:42 +08:00
    啥是 pythonic , guido 去 google 还得学怎么写规范的大家能读懂的 python 编码风格
    gimp
        7
    gimp  
       2017-01-12 17:06:44 +08:00
    @jarry777 这就尴尬了。
    sudoz
        8
    sudoz  
       2017-01-12 17:14:39 +08:00
    @kutata effective python 里说了,不要过度使用列表推导,改用 for 循环嵌套就用 for 嵌套
    octopus_new
        9
    octopus_new  
       2017-01-12 17:19:26 +08:00   1
    如果你认同在 production 代码中去掉不必要 try except , context manager 就是更好的选择
    "也有人说 for 循环里写 if 也很不 pythonic ,应该用列表推导", 个人认为这个可能要分情况吧, list comprehension 目的是生成 list ,如果 for 循环的目的不是生成 list ,那么还需要用到 list comprehension 么?难道 for 都需要写成 list comprehension 才算 pythonic... 更不用说其中是否包含 if. 而且 list comprehension 的性能也是在生成 list 的时候才比一般的 for loop 更快,如果不生成 list 那么 list comprehension 的性能是比 for loop 更差一些。
    当然最重要的一点是,如果工作在一个团队中,代码是需要容易理解的,追求风格之类的考虑很难说是重要的.
    其实 pythonic 这种提法,我个人认为是为了让大家"正确"使用 python ,使用 python 中最优的解决方法,如果你越接受这种"正确"的解决方法,那么你就越 pythonic ,是这么个意思吧?
    spice630
        10
    spice630  
       2017-01-12 17:25:26 +08:00
    你用 golang 就不会出现这么无用的问题了
    kutata
        11
    kutata  
       2017-01-12 17:28:35 +08:00
    @sudoz 啊,刚入门,还在熟悉语法中~
    gladuo
        12
    gladuo  
       2017-01-12 17:32:50 +08:00   2
    phrack
        13
    phrack  
       2017-01-12 18:17:15 +08:00 via Android
    总结起来还真不好说,可能结合几个例子会合适点。我自己感觉的话就是,一个算法的几个代码实现中比较简洁又不会过于依赖语法糖导致难懂的那个。
    hahastudio
        14
    hahastudio  
       2017-01-12 18:24:56 +08:00
    能用原生语法、标准库的,就用那些
    loading
        15
    loading  
       2017-01-12 18:27:14 +08:00 via Android
    @spice630 对,只要查一下 if err != nil 的数量就行,哈哈。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3058 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 12:44 PVG 20:44 LAX 05:44 JFK 08:44
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86