<li id="2aw4k"></li>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
    <center id="2aw4k"><small id="2aw4k"></small></center><center id="2aw4k"><small id="2aw4k"></small></center>
    首页»Python»几个小技巧让你的Python代码更Pythonic

    几个小技巧让你的Python代码更Pythonic

    来源:imtuzi.com 发布时间:2017-09-05 阅读次数:

      Python是一门非常灵活的语言,很多语法是其他语言不具备的,特别?#23884;?#20110;从C、Java等语言转向Python的人来说,很容易按照C、Java等语言的写法来写Python,对于初学者来说,如果对Python语言的理解?#36824;?#36879;彻,就会写出很冗余的代码来。

      这篇文章,主要介绍几个简单技巧,让你在写Python代码,更Pythonic。

     变量交换

      Pythonic写法

    a, b = b, a

      普通写法

    tmp = a;
    a = b;
    b = tmp;
    

     循环遍历区间元素

    # 生成器与列表更加节省内存
    # range(start, end, step)
    # [start, end) 包含开头不包含结尾
    for i in range(1, 1000, 2) # python3
    for i in range(6) # python3
    for i in xrange(6) #python2
    

      在Python2中,有range和xrange2种写法,xrange?#24039;?#25104;器写法,更节省内存。Python3中的range等价于Python2中的xrange。

      生成器,只有在使用时才会动态生成,而且只能使用1次,比如range(1000000),Python2中会在内存中生成1百万个元素的列表,而在Python3不会生成列表,而?#24039;?#25104;器,?#21152;?#24456;小的内存。

      如何你还在使用Python2,建议用xrange代替range

      Java的写法

    for(int i = start; i < end; i += step) {
        // ....
    }
    

      生成器扩展

    # 定义一个生成器
    odd = (num for num in range(10) if num % 2 == 1)
    for num in odd:
        print(num)
    
    # 定义一个生成器
    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n = n + 1
    
    >>> type(fib(3)) 
    <generator object fib at 0x10e610728>
    >>> for num in fib(3):
    ...     print(num)
    ... 
    1
    1
    2
    
    def odd():
        print('step 1')
        yield 1
        print('step 2')
        yield 3
        print('step 3')
        yield 5
    
    gen = odd()
    
    print(next(gen))
    print(next(gen))
    print(next(gen))
    

     索引

      Pythonic写法

    num_list = [1, 4, 9]
    for i, val in enumerate(num_list):
        print(i, '-->', val)
    

      普通写法

    num_list = [1, 4, 9]
    for i in range(len(num_list))
        print(i, '-->', num_list[i])
    

      显然,Pythonic写法更加直观,优雅。

     字符串拼接

      Pythonic写法

    names = ['Tom', 'Jack', 'Sam']
    ','.join(names) 
    

      普通写法

    names = 'Tom' + 'Jack' + 'Sam'
    

      每次+操作都会产生新字符串,造成内存浪费,而join,整个过程中只会产生一个字符串对象

     文件打开与关闭

      Pythonic写法

    # 写法二
    with open('a.txt') as f:
        data = f.read()
    

      普通写法

    f = open('a.txt')
    try:
        data = f.read()
    finally:
        f.close()
    

      使用with,Python将自动管理文件流的打开与关闭,无需手动操作。

     列表操作

      Pythonic写法

    from collections import deque
    
    
    names = deque(['c', 'd', 'e'])
    names.popleft()
    names.appendleft('b')
    names.append('f')
    
    # names => deque(['b', 'd', 'e', 'f'])
    

      普通写法

    names = list['c', 'd', 'e']
    names.pop(0)
    names.insert(0, 'b')
    names.append('f')
    

      list也可以用pop(0)来删除第一个元素,但是list在内存中是顺序存储的,删除第一个元素,会导致之后的所有元素都会前移,效率很低,插入类似。

      开头如果?#20889;?#37327;的删除和插入操作,避免使用list。

     解构赋值

      Pythonic写法

    student = ['Tom', 18, 'male']
    name, age, gender = student
    print(name, age, gender)
    # Tom 18 male
    
    num_list = [100, 19, 20, 98]
    first, *left_num_list, last = num_list
    print(first, left_num_list, last)
    # 100 [19, 20] 98
    
    student = [['Tom', (98, 96, 100)], ['Jack', (98, 96, 100)]]
    
    for name, (first, second, third) in student:
        print(name, first, second, third)
    
    student = {
        'name': 'Tom',
        'age': 18
    }
    
    # python3
    for k, v in student.items():
        print('k', '-->', v)
    
    # python2
    for k, v in student.iteritems():
        print('k', '-->', v)
    

      字典也类似,在Python2中,字典的items方法将返回列表,当字典比较大时,这样会很耗内存。而iteritems方法返回的?#24039;?#25104;器。

      Python3中,没有iteritems,items等价于Python2的iteritems。

      如果在使用Python2,请用iteritems代替items

     推导式

      Pythonic写法

    # 生成1-100的奇数
    odd = [i for i in range(1, 100) if i % 2 == 1]
    
    # 集合a,b分别去一个数,找出和大于100的所有组合
    result = [(x, y) for x in a_set for y in b_set if x + y > 100]
    

      普通写法

    # 生成1-100的奇数
    result = []
    for i in range(100):
        if i % 2 == 1:
            result.append(i)
            
    # 集合a,b分别去一个数,找出和大于100的所有组合
    result = []
    for x in a_set:
        for y in b_set:
            if x + y > 100:
            result.append((x, y))
    
    QQ群:WEB开发者官方群(515171538),验证消息:10000
    微信群:加小编微信 849023636 邀请您加入,验证消息:10000
    提示:更多精彩内容关注微信公众号:全栈开发者中?#27169;╢sder-com)
    网友评论(共0条评论) 正在载入评论......
    理智评论文明上网,拒绝恶意谩骂 发表评论 / 共0条评论
    登录会员中心
    大乐透彩票预测
    <li id="2aw4k"></li>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
    <center id="2aw4k"><small id="2aw4k"></small></center><center id="2aw4k"><small id="2aw4k"></small></center>
    <li id="2aw4k"></li>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
  • <div id="2aw4k"><tr id="2aw4k"></tr></div>
    <center id="2aw4k"><small id="2aw4k"></small></center><center id="2aw4k"><small id="2aw4k"></small></center>
    意大利足球直播 香港赛马会大小走势图彩控 重庆秒速时时彩规律大全 北京快3开奖 香港99099开奖结果 今天快乐双彩170期开奖 3d走势图网易彩票 河北十一选五429期开奖结果 甘肃快3开奖直播5 竞猜足彩 360富豪炸金花电脑版 两码中特期期准免费2码中特 澳门线上娱乐网址 乐透分布图 新开真钱的棋牌游戏