最近刚学 python,以前学的是 JAVA,对比起来才知道 JAVA 真的语法有点嗦,那 python 有哪些令你感到优雅、简洁、易懂、而且强大的的代码片段可以分享分享 - V2EX
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
lyning
V2EX    Python

最近刚学 python,以前学的是 JAVA,对比起来才知道 JAVA 真的语法有点嗦,那 python 有哪些令你感到优雅、简洁、易懂、而且强大的的代码片段可以分享分享

  •  
  •   lyning 2015-07-23 18:16:55 +08:00 12099 次点击
    这是一个创建于 3733 天前的主题,其中的信息可能已经有所发展或是发生改变。
    66 条回复    2015-07-25 10:41:26 +08:00
    scream7
        1
    scream7  
    PRO
       2015-07-23 18:18:32 +08:00
    我就觉得列表切片,推倒简直是爽
    scream7
        2
    scream7  
    PRO
       2015-07-23 18:19:27 +08:00
    @scream7 推倒->推导
    loggerhead
        3
    loggerhead  
       2015-07-23 18:27:14 +08:00
    ```c
    int swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
    }
    ```

    等价于

    ```python
    a, b = b, a
    ```
    loggerhead
        4
    loggerhead  
       2015-07-23 18:28:05 +08:00
    这缩进怎么回事?我明明加了空格
    chengzhoukun
        5
    chengzhoukun  
       2015-07-23 18:30:26 +08:00 via Android
    @loggerhead 回帖不支持Markdown吧
    janxin
        6
    janxin  
       2015-07-23 19:28:34 +08:00   1
    [a for a in b]
    Wyc0
        7
    Wyc0  
       2015-07-23 19:42:05 +08:00
    @janxin 然而你这个跟直接用b没差别 2333
    zonghua
        8
    zonghua  
       2015-07-23 19:47:23 +08:00
    Javascript太自由,没约束
    s51431980
        9
    s51431980  
       2015-07-23 19:48:06 +08:00
    java 想优雅,可以用 groovy
    hitluobin
        10
    hitluobin  
       2015-07-23 20:00:17 +08:00
    matsuijurina
        11
    matsuijurina  
       2015-07-23 20:12:12 +08:00   2
    看了这个标题我觉得楼主的JAVA肯定学得很好
    Ouyangan
        12
    Ouyangan  
       2015-07-23 20:32:07 +08:00
    java菜鸟一枚, 至今未领略过优雅是何种滋味, 等我学好java再来搞搞python . 你们等着啊
    lzhtony
        13
    lzhtony  
       2015-07-23 20:35:36 +08:00
    @loggerhead JAVA: a^=b^=a^=b
    yakczh
        14
    yakczh  
       2015-07-23 20:37:52 +08:00   2
    ruby才是优雅,python那叫蛋疼
    cxe2v
        15
    cxe2v  
       2015-07-23 21:14:10 +08:00
    @Ouyangan 来学C#,立马体验优雅
    unique
        16
    unique  
       2015-07-23 21:21:01 +08:00
    @Ouyangan python比java语法简洁 有空可以试试jruby
    loggerhead
        17
    loggerhead  
       2015-07-23 21:25:55 +08:00
    @chengzhoukun 确实不支持,但是 每一行的前置空格会被自动去掉
    @lzhtony 三句弄成一句,可读性太低了。python那种没见过挺多说“诶,这是什么神奇的语法”,你这个没见过就“这什么鬼。。”
    dddd
        18
    dddd  
       2015-07-23 21:31:04 +08:00
    就语法上来讲…
    mingyun
        19
    mingyun  
       2015-07-23 21:43:57 +08:00
    python复制粘代替比较蛋疼
    mingyun
        20
    mingyun  
       2015-07-23 21:44:30 +08:00
    @hitluobin 这个很赞
    littleshy
        21
    littleshy  
       2015-07-23 22:57:12 +08:00
    python的lambda表达式好直白,直接写个lambda算什么啊……
    yakczh
        22
    yakczh  
       2015-07-23 23:08:53 +08:00
    写两行的lambda试试
    est
        23
    est  
       2015-07-23 23:13:48 +08:00
    @yakczh 单行lambda可以组合成任意复杂的表达式。。只是很蛋痛而已。。。直接嵌套x1000
    seki
        24
    seki  
       2015-07-23 23:19:17 +08:00
    numpy 程序 demo 写得很爽,就是 freeze 之后整个程序三百多兆
    想换个 C++ 什么的写一个,查了一下相关的库之后觉得还是算了 = =
    illuz
        25
    illuz  
       2015-07-23 23:29:04 +08:00
    lzhtony
        26
    lzhtony  
       2015-07-23 23:45:01 +08:00
    @loggerhead 写在swap函数里面谁知道2333
    个人认为代码的优雅,就是用较少的代码写出较好的效果(较高的效率 较多的功能...etc).
    bdbai
        27
    bdbai  
       2015-07-24 00:06:06 +08:00 via iPhone
    @lzhtony 优雅也要建立在让读者恍然大悟的基础上吧
    mulog
        28
    mulog  
       2015-07-24 00:15:54 +08:00
    list/dict comprehension
    lincanbin
        29
    lincanbin  
       2015-07-24 00:49:49 +08:00
    Java的三目运算符:
    min=a<b?a:b;
    Python:
    min=a if a<b else b
    qw7692336
        30
    qw7692336  
       2015-07-24 01:55:03 +08:00
    哈哈
    楼主被我介绍进来的室友

    @s51431980
    groovy就不是java了,现在对几门jvm语言都有点兴趣,像比较成熟的scala、还有Jetbrains的kotlin。用scala来写Android的话,可以用https://github.com/pocorall/scaloid 来简化代码。
    用kotlin来写Android,可以用https://github.com/JetBrains/anko 来简化代码。


    java8的lambda表达式和Stream API可以进一步让java代码进一步变得优雅。
    https://github.com/ReactiveX/RxJava 可以让事件响应变得很优雅,它的Android版https://github.com/ReactiveX/RxAndroid 可以用在Android上,gradle需要用https://github.com/evant/gradle-retrolambda 才能构建

    另外Android的
    https://github.com/excilys/androidannotations
    或者
    https://github.com/JakeWharton/butterknife
    可以大大地简化代码

    这是我的收集:
    http://www.v2ex.com/t/206402
    Wangxf
        31
    Wangxf  
       2015-07-24 02:08:55 +08:00
    @zonghua 楼主说的是java,不是Javascript,也是醉了。。。
    qw7692336
        32
    qw7692336  
       2015-07-24 02:13:45 +08:00
    @matsuijurina
    楼主的标题是知乎体,好像也是我推荐他玩知乎的。


    @yakczh
    @unique
    中午看到有人吐槽Java的分层罗嗦
    http://www.v2ex.com/t/207800
    ruby on rails使用的叫涨血模型,这应该也是Java转ruby会感觉很爽的原因之一。
    我之前玩过playframework,据说也是类似ruby on rails的框架,框架也推荐使用类似rails的涨血模型。playframework是唯一一个让我感觉到用法比较优雅的Java框架,但由于Java语法本身的限制,没有办法做到更加优雅。我看到的一些简化Java代码的框架,大多数都只能采用annotation的方式进行简化。如上面的androidannotations 。
    sciooga
        33
    sciooga  
       2015-07-24 02:21:13 +08:00
    @loggerhead 不支持 markdown 还没有 white-space: pre; 所以排版就乱了,我反馈过一次,没人理~
    binjoo
        34
    binjoo  
       2015-07-24 03:28:22 +08:00 via Android
    真在学习python
    qw7692336
        35
    qw7692336  
       2015-07-24 04:37:41 +08:00
    刚刚看到我之前写到一句自己非常喜欢到代码:
    i=i>0?-i:-i+1;
    把这段代码放到循环体里面一直迭代。
    hkongm
        36
    hkongm  
       2015-07-24 08:56:38 +08:00
    说语法,不是ruby最牛么
    magicyu1986
        37
    magicyu1986  
       2015-07-24 08:58:12 +08:00
    a < b < c
    publicID001
        38
    publicID001  
       2015-07-24 08:59:37 +08:00 via Android
    @lzhtony 那交换两个对象试试呢?
    Tiande
        39
    Tiande  
    PRO
       2015-07-24 09:00:54 +08:00
    @Wyc0

    >>> [a for a in 'hahahha']
    ['h', 'a', 'h', 'a', 'h', 'h', 'a']
    Tiande
        40
    Tiande  
    PRO
       2015-07-24 09:02:22 +08:00
    @est lambda 一点都不优雅 ;(
    est
        41
    est  
       2015-07-24 09:14:32 +08:00   1
    @dtdnqsb 为什么要这样做呢。。。

    >>> list('hahahha')
    ['h', 'a', 'h', 'a', 'h', 'h', 'a']

    其实大多数时候str可以直接遍历。比如提取字符种的数字部分:

    >>> filter(str.isdigit, 'abcde123fghi567')
    '123567'
    knightdf
        42
    knightdf  
       2015-07-24 09:17:39 +08:00
    lz的java一定学的很好
    yuankui
        43
    yuankui  
       2015-07-24 09:25:00 +08:00
    [1,2,3,4][::-1] => [4,3,2,1]

    map,reduce,filter
    thinkmore
        44
    thinkmore  
       2015-07-24 09:47:57 +08:00
    你们所谓的优雅,只是代码简洁吗?过度的封装而已
    qw7692336
        45
    qw7692336  
       2015-07-24 09:50:28 +08:00
    @thinkmore
    语法糖
    Tiande
        46
    Tiande  
    PRO
       2015-07-24 10:00:57 +08:00
    @est 窝已经 特别关注 你了!
    chaucerling
        47
    chaucerling  
       2015-07-24 10:24:38 +08:00
    lz如果学学函数式吧,那才叫优雅
    googya
        48
    googya  
       2015-07-24 10:31:44 +08:00
    嗦有嗦的好处, 灵活有灵活的优点
    codeyung
        49
    codeyung  
       2015-07-24 11:02:34 +08:00
    没有太大可比性 想学啥学啥吧 Scala八错推荐
    lzhtony
        50
    lzhtony  
       2015-07-24 11:03:09 +08:00
    @publicID001 对象确实没想到什么好方法.
    @bdbai 仔细思考后发现这个方法的奥妙不是更吸引人.
    灵活的语言一般来说代码更简洁优雅吧.python确实很有这种feel,C++也是.Java和C比起来很多语法都不支持,也就没有那么高的灵活性.
    quericy
        51
    quericy  
       2015-07-24 11:11:04 +08:00
    @scream7 输入法暴露了什么233333
    cz208209
        52
    cz208209  
       2015-07-24 11:13:42 +08:00
    为啥不说python简单
    robertlyc
        53
    robertlyc  
       2015-07-24 11:26:51 +08:00
    那是因为没学过ruby
    publicID001
        54
    publicID001  
       2015-07-24 11:50:20 +08:00
    @cxe2v 大一党,平时用的最多的是C++和VB.net,之前C#的课程大作业写了个简单的Online Judge,并不觉得优雅。。。比如:
    习惯了C++各种很爽的隐式转换,想在C#里写:
    int a;
    if(a)会报错,没有隐式转换,if((bool)a)都不行。。。
    vb.net都可以用 if 3 then 这种隐式转换。。。

    还有就是switch里每个标签后都要加break之类,反正以后除非必要,否则不想用C#了……
    theJian
        55
    theJian  
       2015-07-24 12:08:13 +08:00
    Python >> Ruby >> CoffeeScript >> ?
    cutepig49
        56
    cutepig49  
       2015-07-24 14:43:31 +08:00
    @publicID001 这是优点,不是缺点
    newborn
        57
    newborn  
       2015-07-24 15:04:38 +08:00
    你可以再顺便了解下perl
    laoyuan
        58
    laoyuan  
       2015-07-24 16:39:04 +08:00
    str[:-0] 这里就是个坑。
    NeoAtlantis
        59
    NeoAtlantis  
       2015-07-24 16:58:55 +08:00 via Android
    a=[(1,2,3), (4,5,6)]
    for x,y,z in a:
    pass

    python确实不错……一个蒸汽轮机的课程设计作业……800多个参数直接用python算 完了还直接画图出报告……写程序连调试修改就花了两天时间……
    bramblex
        60
    bramblex  
       2015-07-24 20:30:08 +08:00
    {-n的所有因数:-}
    factor n = [x| x <- [1..n], n `mod` x ==0]

    {-判断n是否为素数:-}
    isPrime n = [x | x <- [1..n], n `mod` x == 0] == [1, n]

    {-n的所有素因数:-}
    primeFactor n = [x| x <- [1..n], x /= 1, n `mod` x == 0, isPrime x]

    {-最后分解n的素因数-}
    decPrimeFactor 1 = []
    decPrimeFactor n = first:(decPrimeFactor (div n first))
    _ _ where first = head ( primeFactor n )
    bramblex
        61
    bramblex  
       2015-07-24 20:45:18 +08:00
    @robertlyc

    默默看着Ruby原教旨主义者装逼
    msg7086
        62
    msg7086  
       2015-07-24 21:33:19 +08:00
    @bramblex Ruby使用者高调装逼路过。
    纯函数式还是有点太可怕了……写库还好,写逻辑头大。
    bramblex
        63
    bramblex  
       2015-07-24 21:36:03 +08:00
    @msg7086

    Ruby用过,Ruby本身挺喜欢的。讨厌Rails
    msg7086
        64
    msg7086  
       2015-07-24 21:40:22 +08:00
    @bramblex
    Rails其实还好,初创公司大杀器,常用组件全备齐了,一个框架足够用到上市了。
    当然关键是写的人要靠谱,以及测试代码都要跟上。
    现在在公司里处理的一个Rails应用,完全是一堆不会Ruby和Rails的人硬写的,还没什么测试,简直要疯。
    bramblex
        65
    bramblex  
       2015-07-24 23:21:03 +08:00
    @msg7086

    从客观上来讲,Rails还是非常适合创业公司前期用来快速搭建网站的。
    我也拿Rails做过项目,确实非常方便快捷,但是主观上依旧不喜欢。不喜欢是指不喜欢使用。不过对它的各种设计和还是非常有兴趣的。
    lancegin
        66
    lancegin  
       2015-07-25 10:41:26 +08:00
    对列表数据进行处理:map(lambda item:deal(item), list)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2393 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 01:07 PVG 09:07 LAX 18:07 JFK 21:07
    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