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 · 11233 次点击
    这是一个创建于 3193 天前的主题,其中的信息可能已经有所发展或是发生改变。
    66 条回复    2015-07-25 10:41:26 +08:00
    scream7
        1
    scream7  
       2015-07-23 18:18:32 +08:00
    我就觉得列表切片,推倒简直是爽
    scream7
        2
    scream7  
       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  
       2015-07-24 09:00:54 +08:00
    @Wyc0

    >>> [a for a in 'hahahha']
    ['h', 'a', 'h', 'a', 'h', 'h', 'a']
    Tiande
        40
    Tiande  
       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  
       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
    laucie
        52
    laucie  
       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   ·   我们的愿景   ·   实用小工具   ·   3679 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 10:26 · PVG 18:26 · LAX 03:26 · JFK 06:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.