Python代碼最佳化及技巧筆記(一)

來源:互聯網
上載者:User

標籤:編寫   方法   xls   html   pycha   arm   理解   全排列   dir   

前言這裡是記錄一些本人在開發過程中遇到的一些細節問題。與君共勉。

著作權說明著作權歸作者全部。
商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。


Coding-Naga
連結:http://blog.csdn.net/lemon_tree12138/article/details/50736887

來源:CSDN


1.Python實現全排列

方案一:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]result = list(itertools.permutations(a, 9))
方案二:
上面是使用python的內建函數itertools.permutations對於僅僅有9個元素的全排列速度上是驚人的。
假設是我們自己來寫全排列邏輯,能夠是以下這種:
# get full permutation listdef full_permutation(l):    if(len(l) <= 1):        return [l]    r = []    for i in range(len(l)):        s = l[:i] + l[i + 1:] # 將l的前三項以及l的第i+1後的字串賦給s        p = full_permutation(s)        for x in p:            r.append(l[i : i + 1] + x)    return r
全部在項目中還是建議使用Python內建的全排列函數,當中的第二個參數能夠是1-9之間的不論什麼一個整數,非常方便。


2.遍曆檔案夾下全部子檔案夾和檔案? 在Python中能夠非常方便地對檔案檔案夾進行迴圈遍曆。檢查檔案及檔案夾,代碼例如以下:

import osimport os.pathdef cycle_visiting(root_dir=None):    for parent, folder_names, file_names in os.walk(root_dir):        for folder_name in folder_names:            print ‘folder: ‘ + folder_name        for file_name in file_names:            print ‘file: ‘ + os.path.join(parent, file_name)


3.針對字串的進位轉化? 假設你有其它語言的編程功底,可能你已對進位轉化十分熟悉。只是我這裡要說的進位轉化可不是簡單從十進位轉化為二進位或是轉成十六進位。以下你能夠試著來解決以下幾個問題:
? a.將a = ‘ff‘的十六進位數轉成十進位的255
? b.將a = 14的十進位數轉成十六進位的0e
解決方案:
? a.這裡須要用一個參數指明原來的進位數
decstr = int(a, 16)
? b.這裡須要用一個切片操作用來去掉首碼‘0x‘
decstr = hex(a)[2:]
if len(decstr) % 2 == 1:
? ? decstr = ‘0‘ + decstr


4.IP的點分型和整形數字之間的轉化? 首先須要import兩個模組:socket和struct
? 1.將ip1 = ‘172.123.156.241‘轉化為ip2 = 2893782257L
? ? ip2 = socket.ntohl(struct.unpack("I",socket.inet_aton(ip1))[0])
? 2.將ip2 = 2893782257L轉化為ip1 = ‘172.123.156.241‘
? ? ip1 = socket.inet_ntoa(struct.pack(‘I‘,socket.htonl(ip2)))


5.Python獲得Linux控制台中的輸出資訊? 能夠通過兩種方式來解決問題,分別例如以下:
? 方法一:
import subprocessimport osoutput = os.popen(‘cat /proc/cpuinfo | grep model‘)print output.read()
? 方法二:
status, model = commands.getstatusoutput(shell)print model


6.使用enumerate()函數擷取序列迭代的索引和值

? 有時我們在對序列進行迭代的時候,不單單是僅僅要知道序列中的值,還想要知道這個值在序列的什麼位置。

? 假設要使用代碼實現。的確不難。只是會顯得多餘,由於Python已經為我們做了這些工作。例如以下:

def test_enumerate():    array = [1, 2, 3, 4, 5, 6]    for index, data in enumerate(array):        print("%d: %d" % (index, data))    e = enumerate(array)    print(e.next())    print(e.next())    print(e.next())

7.i+=1與++i有差別

? 我們知道Python中是不支援自增操作的。所以,你是不是就會以為這裡的++i會拋出一個語法錯誤呢?

? 非常可惜,這裡並不會拋出語法錯誤。

對於i++的確是有這種問題,只是對於++i則不會。比如在PyCharm編輯器中,我們能夠看到例如以下現象:

??

? 在上面的圖示中。我們能夠看到PyCharm對a++拋出了一個錯誤提示,對於++a則是一個警告。

? 原因是在Python裡。++a會被看成是+(+a),也就是說,“+”被理解成了一個正符號。

所以,++a的結果還是a。同理,--a的結果也是a.


8.使用DeprecationWarning定義過時方法

? Python中也有相似Java中一樣的註解方法。這裡我們就以過時註解為例,代碼例如以下:

@DeprecationWarningdef test_dep(name):    print("Hi, %s." % name)

? 與Java不同的是,在Python中使用過時註解。程式被拋出異常而終止執行。例如以下:

??


9.使用Counter進行計數統計

? 怎樣實現對一個列表進行計數統計呢?

? 遍曆、打表、集合,還有呢?然而。這些操作對於Python而言卻並不那麼優雅。

以下就是一段比較優雅的操作方式,使用了Python內建的Counter實現。

代碼例如以下:

from collections import Counterdef get_counter(data):    print(data)    print(Counter(data))if __name__ == ‘__main__‘:    get_counter([‘d‘, ‘a‘, ‘d‘, ‘a‘, ‘s‘, ‘e‘, ‘f‘, ‘h‘, ‘w‘, ‘e‘, ‘q‘, ‘d‘, ‘e‘, ‘w‘, ‘f‘, ‘s‘, ‘d‘, ‘a‘])
? 程式執行的結果例如以下所看到的:

??


10.準確推斷檔案類型

? 假設準確推斷一個檔案的類型呢?這裡所說的類型比如:png、jpg、doc、csv等等。

? 不要說從檔案的尾碼中獲得。

假設真的是這樣,這個問題就沒有不論什麼意義了。並且。我們知道在日常的開發中,我們遇到的檔案常常是沒有尾碼的。這個時候可還怎麼用尾碼去推斷呢?

? 但是,萬變不離其宗。同一種類型的檔案的檔案頭都是一樣的,不同類型的檔案的頭部是不同的。

通過這一點,就能夠推斷出不同的檔案類型了。代碼也非常好寫,例如以下:

import struct# 支援檔案類型# 用16進位字串的目的是能夠知道檔案頭是多少位元組# 各種檔案頭的長度不一樣。少則2字元,長則8字元def type_list_table():    return {        "FFD8FF": "JPEG",        "89504E47": "PNG",        "47494638": "GIF",        "49492A00": "TIFF",        "424D": "BMP",        "41433130": "CAD",        "38425053": "Adobe Photoshop",        "7B5C727466": "Rich Text Format(rtf)",        "3C3F786D6C": "XML",        "68746D6C3E": "HTML",        "D0CF11E0": "MS Word/Excel (xls.or.doc)",        "5374616E64617264204A": "MS Access (mdb)",        "4357530A": "Flash data [swf]"    }# ----------------------------------------- ## 位元組碼轉16進位字串                         ## ----------------------------------------- #def bytes2hex(byte_array):    num = len(byte_array)    hex_string = u""    for i in range(num):        t = u"%x" % byte_array[i]        if len(t) % 2:            hex_string += u"0"        hex_string += t    return hex_string.upper()# ----------------------------------------- ## 擷取檔案類型                                ## ----------------------------------------- #def file_type(file_name):    file_reader = open(file_name, ‘rb‘)     # 必須二制制讀取    type_list = type_list_table()    type_label = ‘unknown‘    for value in type_list.keys():        num_of_bytes = len(value) / 2       # 須要讀多少位元組        file_reader.seek(0)                 # 每次讀取都要回到檔案頭,不然會一直往後讀取        hbytes = struct.unpack_from("B" * num_of_bytes, file_reader.read(num_of_bytes))  # 一個“B”表示一個位元組        type_code = bytes2hex(hbytes)        if type_code == value:            type_label = type_list[value]            break    file_reader.close()    return type_labelif __name__ == ‘__main__‘:    print file_type(‘xxx/xxx.jpg‘)


Ref:

  1. 《編寫高品質代碼:改善Python程式的91個建議》
  2. 編程中遇到

Python代碼最佳化及技巧筆記(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.