1. <em id="2qvri"><tr id="2qvri"></tr></em>
      1. 首頁»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條評論
        登錄會員中心
        江苏快3投注技巧