首頁»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條評論
                    登錄會員中心
                    福彩试机号今天