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
love
V2EX  ›  Python

强迫症患者 python 列表写法的这三种风格你喜欢哪一种

  •  
  •   love · 2015-06-17 11:54:50 +08:00 · 4738 次点击
    这是一个创建于 3446 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1. 括号能就省,不能省用()

    __all__ = 'get', 'post', 'delete'
    a = 1, 2, 3, \
        4, 5, 6
    

    2. 能用()绝对不用[]

    因为大部分情况我们只是要一个列表,用tuple和list是一样的,而tuple不可更改的特性要好一点点,性能上我测过,tuple只比list微强。

    a = (1, 2, 3)
    b = ('one', )
    bulk_load((1, 2, 3))
    

    3. 不管什么情况全用[]

    a = [1, 2, 3]
    bulk_load([1, 2, 3])
    
    42 条回复    2015-06-18 12:14:49 +08:00
    neoblackcap
        1
    neoblackcap  
       2015-06-17 12:01:16 +08:00   ❤️ 1
    首先,第一种是tuple不是list,你得到的是一个iterable的对象而已。

    其二,你这个标题有明显的误导,我看了只有tuple跟list的使用而已,没看到所谓的三种list写法。要知道list跟tuple还是很大的不同,就不能变更这个特性就影响够大的了。
    love
        2
    love  
    OP
       2015-06-17 12:06:16 +08:00
    @neoblackcap 我这里中文的列表就是指list或tuple,英文的表示python里的意思
    neoblackcap
        3
    neoblackcap  
       2015-06-17 12:08:30 +08:00   ❤️ 1
    @love 我虽然读得书少,但是你这个列表放哪里的python社区都之会认为是list,tuple中文翻译我引用《python基础教程(第二版)》中的翻译为“元组”
    echo1937
        4
    echo1937  
       2015-06-17 12:15:11 +08:00
    你写的不是列表,是元组呐,2者都是序列,但差别还是很大的。
    ca1n
        5
    ca1n  
       2015-06-17 12:15:13 +08:00
    既然知道tuple的不可更改性, 那么就也应该知道这两这不能混用
    love
        6
    love  
    OP
       2015-06-17 12:15:57 +08:00
    @neoblackcap 好吧这里知道什么意思就行了。我一向反对在技术文章里把程序中用到的名字类型什么的翻成中文的,因为你程序里还是要写英文的,搞成中文的没有什么意思,反而不利于学习。
    mhycy
        7
    mhycy  
       2015-06-17 12:17:06 +08:00
    啥时候元组与列表可以混用了。。。这是坏习惯,得改。
    love
        8
    love  
    OP
       2015-06-17 12:19:18 +08:00
    @ca1n 实际上大部分情况都是可以混用的,因为很多时候我们是只是需要一个sequence,除非你明确要一个可修改的列表。
    kingname
        9
    kingname  
       2015-06-17 12:21:22 +08:00
    显而易见楼主是新手。
    zenliver
        10
    zenliver  
       2015-06-17 12:21:23 +08:00
    不同的数据结构, 和写法有毛关系
    love
        11
    love  
    OP
       2015-06-17 12:23:49 +08:00
    楼上的不要纠结这个问题了,我改。
    这二者的区别我懂,我是说都可以的情况下用哪个:
    大部分参数只是需要一个sequence,比如标准函数sum:
    sum((1, 2, 3))
    sum([1, 2, 3])
    neoblackcap
        12
    neoblackcap  
       2015-06-17 12:27:40 +08:00   ❤️ 1
    @love 这个只是需要一个可迭代的对象而已,我传迭代器进去都可以
    Tiande
        13
    Tiande  
       2015-06-17 12:30:36 +08:00   ❤️ 1
    楼主认个错就不会有人喷了。
    混了数据结构可没啥好解释的。
    love
        14
    love  
    OP
       2015-06-17 12:32:33 +08:00
    @neoblackcap 我说的是代码风格,是用()还是[],就象js行尾加不加分号,在需要一个sequence的情况下喜欢用哪个,你们真的不知道我说的是什么吗
    neoblackcap
        15
    neoblackcap  
       2015-06-17 12:37:18 +08:00
    @love 我理解你在说什么,但是我只是支出你的想法的根基没有依据,你说需要一个sequence的时候并不是真正需要一个sequence,那是需要一个iterable,一个可迭代的对象而已,你这根基无疑是海市蜃楼。你这样对文档的理解是不对的。
    johnsmith123
        16
    johnsmith123  
       2015-06-17 12:52:49 +08:00
    LZ需要新手大礼包吗?
    lingo233
        17
    lingo233  
       2015-06-17 13:01:02 +08:00
    (-。-;)我喜欢这样写
    '列表' = 'value value1 value3'.split() #(雾
    gkiwi
        18
    gkiwi  
       2015-06-17 13:05:26 +08:00
    @lingo233 拖出去!
    staticor
        19
    staticor  
       2015-06-17 13:11:35 +08:00   ❤️ 1
    从一个code style变成了code review, 人间的欢喜.
    20015jjw
        20
    20015jjw  
       2015-06-17 13:22:46 +08:00 via Android
    @lingo233 6666
    lingo233
        21
    lingo233  
       2015-06-17 13:29:26 +08:00
    @gkiwi 你找不着对象,拖出去定义了没 XD
    qaulau
        22
    qaulau  
       2015-06-17 13:38:58 +08:00
    楼主加入很早呀,难道以前都在水
    holmesabc
        23
    holmesabc  
       2015-06-17 13:44:02 +08:00
    话说根着喷人的,倒是一大堆.

    喷完, 麻烦也回答一下别人的问题呗...
    101
        24
    101  
       2015-06-17 13:45:09 +08:00
    我用第三种
    love
        25
    love  
    OP
       2015-06-17 13:56:59 +08:00
    看了下我竟然是10年加入的,楼上的喷子们你们都没我资格老吧还敢瞎喷
    hahastudio
        26
    hahastudio  
       2015-06-17 14:00:27 +08:00
    http://stackoverflow.com/questions/626759/whats-the-difference-between-list-and-tuples
    如果你不明白 tuple 和 list 的区别,可以问
    如果你不明白 Data Structure 和 Code Style 的区别,也可以问

    对我个人而言,是这样用的:
    1. 手写小片段的话,随意,一般用 list,因为 [] 不用 shift
    2. 写接口的话,你就要注意了,一般一个 tuple 被当成一个单独的数据,list 里面装一组数据
    不过,更多的时候我会写 generator 就是了= =
    hahastudio
        27
    hahastudio  
       2015-06-17 14:01:38 +08:00
    @love 所以你说明了为什么依靠注册时间定义智商是不明智的
    ca1n
        28
    ca1n  
       2015-06-17 14:15:16 +08:00
    @love 只需要一个sequence的话 我用字典也行咯
    zhyu
        29
    zhyu  
       2015-06-17 14:31:45 +08:00
    建议看看 http://coolshell.cn/articles/10804.html

    其实你想问的是,在需要一个 iterable 对象的时候,习惯用 list 还是 tuple 吧

    个人习惯是能用 generator 最好,其次是 list,tuple 由于其不可变的特性,一般当作一个单位元素用,比如坐标表示 (x, y)
    Kabie
        30
    Kabie  
       2015-06-17 14:34:17 +08:00
    当然要[1,2,3,]
    love
        31
    love  
    OP
       2015-06-17 14:38:09 +08:00
    @hahastudio 唉早说了我不是问list和tuple的区别,这二个的区别入门python五分钟都全知道。
    我是说
    sock = socket.create_connection(('127.0.0.1', 8080))
    还是
    sock = socket.create_connection(['127.0.0.1', 8080])


    @ca1n 字典就扯太远了吧
    hahastudio
        32
    hahastudio  
       2015-06-17 14:49:43 +08:00
    @love 你这就没意思了,如果你一开始就问 socket.create_connection 大家喜欢写哪个的话,那不就结了
    我喜欢 ('127.0.0.1', 8080)
    11
        33
    11  
       2015-06-17 14:56:29 +08:00   ❤️ 2
    @love

    socket.create_connection(address[, timeout[, source_address]])

    Connect to a TCP service listening on the Internet address (a 2-tuple (host, port)), and return the socket object.

    @hahastudio 所以 lz 还是没看文档
    lilydjwg
        34
    lilydjwg  
       2015-06-17 15:03:21 +08:00
    一和二是风格,三是习惯但不是风格因为不等价。

    我的原则是:

    1. 能不用 \ 续行就不用。需要续行时先看看 () 能用不
    2. 能不写括号就不写
    3. 能用 tuple 就不用 list
    ffffwh
        35
    ffffwh  
       2015-06-17 15:32:34 +08:00
    可以这样嘛
    cons = lambda x, y: lambda f: f(x, y)
    head = lambda l: l(lambda x, y: x)
    tail = lambda l: l(lambda x, y: y)
    v2014
        36
    v2014  
       2015-06-17 15:48:38 +08:00 via Android
    @11 说的好。强迫症的世界不是谁都懂得
    swjtutipo
        37
    swjtutipo  
       2015-06-17 16:01:46 +08:00
    @lingo233 干得漂亮 好评 2333333
    Delbert
        38
    Delbert  
       2015-06-17 16:50:27 +08:00 via Android
    @love 列表是list,tuple不是列表。
    可惜了这么一个好的id。
    ()和[]根本不是一个东西,还强调风格。
    建议楼主看《python编程初学者指南》
    ryd994
        39
    ryd994  
       2015-06-18 03:26:11 +08:00
    常量用tuple性能更好
    list当容器用
    ryd994
        40
    ryd994  
       2015-06-18 03:27:59 +08:00
    用tuple我还是会写括号的
    不写括号太作,改代码容易出事
    bybyisking
        41
    bybyisking  
       2015-06-18 10:56:15 +08:00
    换行别用\了,用括号...
    herojaxy
        42
    herojaxy  
       2015-06-18 12:14:49 +08:00   ❤️ 1
    LZ你的标题确实有一些歧义,不过我相信大部分理解能力正常的人在看过内容后其实都明白你的意思。
    不过有些人就喜欢故意装糊涂,非要指出楼主的错误,享受教育别人的优越感。列表是指list哦,跟tuple两个概念哦,楼主还要加强学习哦。好像谁不知道似的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2848 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:06 · PVG 22:06 · LAX 06:06 · JFK 09:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.