Python代码优化及技巧笔记(一)
前言
?
這里是記錄一些本人在開發過程中遇到的一些細節問題,與君共勉。
?
?
版權說明
?
著作權歸作者所有。
商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
作者:Q-WHai
鏈接:https://qwhai.blog.csdn.net/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個元素的全排列速度上是驚人的。
如果是我們自己來寫全排列邏輯,可以是下面這樣的:
所有在項目中還是建議使用Python內建的全排列函數,其中的第二個參數可以是1-9之間的任何一個整數,非常方便。
?
?
?
2.遍歷文件夾下所有子文件夾和文件
? 在Python中可以很方便地對文件目錄進行循環遍歷,檢查文件及目錄,代碼如下:
?
?
import os import 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_namefor 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 subprocess import os output = 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中一樣的注解方法。這里我們就以過時注解為例,代碼如下:
?
@DeprecationWarning def 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 += treturn 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]breakfile_reader.close()return type_labelif __name__ == '__main__':print file_type('xxx/xxx.jpg')?
Ref:
?
?
征集
如果你也需要使用ProcessOn這款在線繪圖工具,可以使用如下邀請鏈接進行注冊:
https://www.processon.com/i/56205c2ee4b0f6ed10838a6d
總結
以上是生活随笔為你收集整理的Python代码优化及技巧笔记(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSunpack-n模拟WireShar
- 下一篇: Python命令行选项参数解析策略