<dl id="3wz6h"></dl><li id="3wz6h"></li>

      1. <dl id="3wz6h"></dl>

      2. <dl id="3wz6h"><ins id="3wz6h"></ins></dl>

            <dl id="3wz6h"></dl>

            <dl id="3wz6h"><ins id="3wz6h"></ins></dl>
            1. 
              
              <output id="3wz6h"><ins id="3wz6h"><nobr id="3wz6h"></nobr></ins></output>

              <li id="3wz6h"><ins id="3wz6h"></ins></li>
              
              

            2. <output id="3wz6h"><ins id="3wz6h"><nobr id="3wz6h"></nobr></ins></output>
              首頁»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條評論
              登錄會員中心
              云南十一选往期