<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是一門非常靈活的語言,很多語法是其他語言不具備的,特別是對于從C、Java等語言轉向Python的人來說,很容易按照C、Java等語言的寫法來寫Python,對于初學者來說,如果對Python語言的理解不夠透徹,就會寫出很冗余的代碼來。

      這篇文章,主要介紹幾個簡單技巧,讓你在寫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是生成器寫法,更節省內存。Python3中的range等價于Python2中的xrange。

      生成器,只有在使用時才會動態生成,而且只能使用1次,比如range(1000000),Python2中會在內存中生成1百萬個元素的列表,而在Python3不會生成列表,而是生成器,占用很小的內存。

      如何你還在使用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在內存中是順序存儲的,刪除第一個元素,會導致之后的所有元素都會前移,效率很低,插入類似。

      開頭如果有大量的刪除和插入操作,避免使用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方法返回的是生成器。

      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
    提示:更多精彩內容關注微信公眾號:全棧開發者中心(fsder-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>