高颜值的Python

作者: 曾会玩 | 来源:发表于2015-10-31 13:46 被阅读635次

    本文旨在收集记录分享简洁漂亮的Python写法,欢迎补充

    字典/集合推导式(dict/set comprehension)

    类似于列表推导式:

    my_dict = {i: i * i for i in xrange(100)} 
    my_set = {i * 15 for i in xrange(100)}
    #这俩在写法上的区别只是字典推导式多了一个':'
    
    Caution:

    区别一下三种写法:

    >>>my_set={i*15 for i in xrange(100)}
    >>>my_list=[i*15 for i in xrange(100)]
    >>>my_generator=(i*15 for i in xrange(100))
    
    >>>print "my_set", type(my_set)
    my_set <type 'set'>
    >>>print "my_list", type(my_list)
    my_list <type 'list'>
    >>>print "my_generator", type(my_generator)
    my_generator <type 'generator'>
    

    枚举 (enumerate)

    要在枚举过程中使用序号,可以使用enumerate优雅地实现:

    #i从0开始,每次加1
    for i, item in enumerate(iterable):
        print i, item
    
    #i从2开始
    for i, item in enumerate(iterable, 2):
        print i, item
    

    强制浮点数除法

    如果我们对两个整数做/除法,Python 2 返回的是一个整数,如需返回浮点数的结果,在Python 2.x中通常会这么做:

    >>>1.0/2
    0.5
    

    可以这样更漂亮地实现:

    >>>from __future__ import division 
    >>>1/2
    0.5
    

    而在Python 3中,/是真除,默认精确到小数点后一位。

    使用literal_eval()

    我们都知道eval:

     expr = "[1, 2, 3]" 
    my_list = eval(expr)
    

    但估计没几个人知道literal_eval( ):

    import ast 
    my_list = ast.literal_eval(expr)
    

    (看起来好像并没有变漂亮呢,但ast.literal_eval()更安全。)

    用dir( )查看一个Python对象

    >>> foo = [1, 2, 3, 4]
    >>> dir(foo) 
    ['__add__', '__class__', '__contains__', 
    '__delattr__', '__delitem__', '__delslice__', ... , 
    'extend', 'index', 'insert', 'pop', 'remove', 
    'reverse', 'sort']
    

    调试脚本

    利用pdb模块可以轻松地在脚本中设置断点:

    import pdb
    pdb.set_trace()
    

    你可以在脚本的任何位置加上pdb.set_trace()来设置断点。

    简化if 结构

    当有多个值需要检验的时候,通常会这么写:

    if n==1 or n==4 or n==5 or n==6:
    

    更漂亮的写法是:

    if n in [1,4,5,6]:
    

    反转列表/字符串

    你可以这样快速地反转一个列表:

    >>>a=[1,2,3]
    >>>a[::-1]
    [3,2,1]
    

    这样会生成一个新的列表,原列表不会变。如果你想在原地反转列表,可以这样:

    >>> a.reverse()
    >>> a
    [3, 2, 1]
    

    字符串类型string是不可变类型,因此也就没有reverse( )咯。

    行内if 声明

    a=1 if b>c else -1
    
    print a if b>c else d
    

    交换两个变量

    a, b=b, a
    

    连续赋值

    a, b, c=1, 2, 3
    

    串联

    >>>a=[1,2]
    >>>b=[3,4]
    >>>a+b
    [1,2,3,4]
    >>>print str(1) + " a"
    1 a
    >>>print `1` + " b"
    1 b
    >>>print 1, " c"
    1 c
    

    地板除 (Python 2.2以后)

    >>>5//2
    2
    >>>5.0//2
    2.0
    

    乘方

    #a**b, a的b次方
    >>>2**5
    32
    

    级联比较

    if a<b<c:
        blabla...
    
    if a<b>c:
        blabla...
    

    同时遍历两个列表:

    names=['Tom','Jerry']
    ages=[23,17]
    for name, age in zip(names, ages):
        print name, age
    

    建立并初始化列表

    #一维
    a=[0]*4
    #二维, 3行4列
    b=[[0]*4 for i in range(3)]
    

    join( )

    >>>a=['my', 'life', 'is', 'awesome']
    >>>print '!'.join(a)
    my!life!is!awesome
    

    获取字典内的元素

    #bad implementation:
    dix={'Tom':23}
    try:
        name=dix['Tom']
    except KeyError:
        name='Default'
    
    #good implementation:
    name=dix.get('Tom', 'Default')
    

    截取列表的一部分

    >>>a = [1,2,3,4,5,6]
    >>>a[:3]
    [1,2,3]
    >>>a[1:5]
    [2,3,4,5]
    >>>a[-3:]
    [4,5,6]
    >>>a[::2]
    [1,3,5]
    >>>a[1::2]
    [2,4,6]
    

    这里的a[x:y:z], x和y分别是下标起点,下标终点+1,z是间隔值。于是就能理解为啥a[::-1]能得到一个反转的列表了。

    向列表添加元素

    my_list=[1,2,3]
    my_list+=4,
    #my_list变成了[1,2,3,4]
    my_list+=[5]
    #my_list变成了[1,2,3,4,5]
    

    参考:

    Python Shortcuts for the Python Beginner

    不断更新中...

    相关文章

      网友评论

      本文标题:高颜值的Python

      本文链接:https://www.haomeiwen.com/subject/lmnfhttx.html