1. 常用工具
1.1 讀寫 CSV 文件
import csv
# 無header的讀寫
with open(name, 'rt', encoding='utf-8', newline='') as f: # newline=''讓Python不將換行統一處理
for row in csv.reader(f):
print(row[0], row[1]) # CSV讀到的數據都是str類型
with open(name, mode='wt') as f:
f_csv = csv.writer(f)
f_csv.writerow(['symbol', 'change'])
# 有header的讀寫
with open(name, mode='rt', newline='') as f:
for row in csv.DictReader(f):
print(row['symbol'], row['change'])
with open(name, mode='wt') as f:
header = ['symbol', 'change']
f_csv = csv.DictWriter(f, header)
f_csv.writeheader()
f_csv.writerow({'symbol': xx, 'change': xx})
注意,當 CSV 文件過大時會報錯:_csv.Error: field larger than field limit (131072),通過修改上限解決
import sys
csv.field_size_limit(sys.maxsize)
csv 還可以讀以 \t 分割的數據
f = csv.reader(f, delimiter='\t')
1.2 迭代器工具itertools 中定義了很多迭代器工具,例如子序列工具:
import itertools
itertools.islice(iterable, start=None, stop, step=None)
# islice('ABCDEF', 2, None) -> C, D, E, F
itertools.filterfalse(predicate, iterable) # 過濾掉predicate為False的元素
# filterfalse(lambda x: x < 5, [1, 4, 6, 4, 1]) -> 6
itertools.takewhile(predicate, iterable) # 當predicate為False時停止迭代
# takewhile(lambda x: x < 5, [1, 4, 6, 4, 1]) -> 1, 4
itertools.dropwhile(predicate, iterable) # 當predicate為False時開始迭代
# dropwhile(lambda x: x < 5, [1, 4, 6, 4, 1]) -> 6, 4, 1
itertools.compress(iterable, selectors) # 根據selectors每個元素是True或False進行選擇
# compress('ABCDEF', [1, 0, 1, 0, 1, 1]) -> A, C, E, F
序列排序:
sorted(iterable, key=None, reverse=False)
itertools.groupby(iterable, key=None) # 按值分組,iterable需要先被排序
# groupby(sorted([1, 4, 6, 4, 1])) -> (1, iter1), (4, iter4), (6, iter6)
itertools.permutations(iterable, r=None) # 排列,返回值是Tuple
# permutations('ABCD', 2) -> AB, AC, AD, BA, BC, BD, CA, CB, CD, DA, DB, DC
itertools.combinations(iterable, r=None) # 組合,返回值是Tuple
itertools.combinations_with_replacement(...)
# combinations('ABCD', 2) -> AB, AC, AD, BC, BD, CD
多個序列合并:
itertools.chain(*iterables) # 多個序列直接拼接
# chain('ABC', 'DEF') -> A, B, C, D, E, F
import heapq
heapq.merge(*iterables, key=None, reverse=False) # 多個序列按順序拼接
# merge('ABF', 'CDE') -> A, B, C, D, E, F
zip(*iterables) # 當最短的序列耗盡時停止,結果只能被消耗一次
itertools.zip_longest(*iterables, fillvalue=None) # 當最長的序列耗盡時停止,結果只能被消耗一次
1.3 計數器
計數器可以統計一個可迭代對象中每個元素出現的次數。
import collections
# 創建
collections.Counter(iterable)
# 頻次
collections.Counter[key] # key出現頻次
# 返回n個出現頻次最高的元素和其對應出現頻次,如果n為None,返回所有元素
collections.Counter.most_common(n=None)
# 插入/更新
collections.Counter.update(iterable)
counter1 + counter2; counter1 - counter2 # counter加減
# 檢查兩個字符串的組成元素是否相同
collections.Counter(list1) == collections.Counter(list2)
1.4 帶默認值的 Dict
當訪問不存在的 Key 時,defaultdict 會將其設置為某個默認值。
import collections
collections.defaultdict(type) # 當第一次訪問dict[key]時,會無參數調用type,給dict[key]提供一個初始值
1.5 有序 Dict
import collections
collections.OrderedDict(items=None) # 迭代時保留原始插入順序
2. 高性能編程和調試
2.1 輸出錯誤和警告信息
向標準錯誤輸出信息
import sys
sys.stderr.write('')
輸出警告信息
import warnings
warnings.warn(message, category=UserWarning)
# category的取值有DeprecationWarning, SyntaxWarning, RuntimeWarning, ResourceWarning, FutureWarning
控制警告消息的輸出
$ python -W all # 輸出所有警告,等同于設置warnings.simplefilter('always')
$ python -W ignore # 忽略所有警告,等同于設置warnings.simplefilter('ignore')
$ python -W error # 將所有警告轉換為異常,等同于設置warnings.simplefilter('error')
2.2 代碼中測試
有時為了調試,我們想在代碼中加一些代碼,通常是一些 print 語句,可以寫為:
# 在代碼中的debug部分
if __debug__:
pass
一旦調試結束,通過在命令行執行 -O 選項,會忽略這部分代碼:
$ python -0 main.py
2.3 代碼風格檢查
使用 pylint 可以進行不少的代碼風格和語法檢查,能在運行之前發現一些錯誤
pylint main.py
2.4 代碼耗時
耗時測試
$ python -m cProfile main.py
測試某代碼塊耗時
# 代碼塊耗時定義
from contextlib import contextmanager
from time import perf_counter
@contextmanager
def timeblock(label):
tic = perf_counter()
try:
yield
finally:
toc = perf_counter()
print('%s : %s' % (label, toc - tic))
# 代碼塊耗時測試
with timeblock('counting'):
pass
代碼耗時優化的一些原則
- 專注于優化產生性能瓶頸的地方,而不是全部代碼。
- 避免使用全局變量。局部變量的查找比全局變量更快,將全局變量的代碼定義在函數中運行通常會快 15%-30%。
- 避免使用.訪問屬性。使用 from module import name 會更快,將頻繁訪問的類的成員變量 self.member 放入到一個局部變量中。
- 盡量使用內置數據結構。str, list, set, dict 等使用 C 實現,運行起來很快。
- 避免創建沒有必要的中間變量,和 copy.deepcopy()。
- 字符串拼接,例如 a + ‘:’ + b + ‘:’ + c 會創造大量無用的中間變量,’:’,join([a, b, c]) 效率會高不少。另外需要考慮字符串拼接是否必要,例如 print(‘:’.join([a, b, c])) 效率比 print(a, b, c, sep=’:’) 低。
3. Python 其他技巧
3.1 argmin 和 argmax
items = [2, 1, 3, 4]
argmin = min(range(len(items)), key=items.__getitem__)
argmax同理。
3.2 轉置二維列表
A = [['a11', 'a12'], ['a21', 'a22'], ['a31', 'a32']]
A_transpose = list(zip(*A)) # list of tuple
A_transpose = list(list(col) for col in zip(*A)) # list of list
3.3 一維列表展開為二維列表
A = [1, 2, 3, 4, 5, 6]
# Preferred.
list(zip(*[iter(A)] * 2))
內容轉自Python專欄
(如有侵權請聯系刪除)
今日福利
今天給大家分享一份Python程序員的圣經——《Python編程快速上手:讓繁瑣工作自動化》。這是本面向實踐的Python編程實用指南。
如果你想改變現狀,自學提升一下或者報課提升,可以給你一些學習干貨。
資料獲?。?/strong>PDF已經打包好,可以通過下述步驟來獲取,回復關鍵詞:快速上手
目錄
第一章 Python基礎
第二章 控制流
第三章 函數
第四章 列表
第五章 字典和結構化數據
第六章 字符串操作
第七章 模式匹配與正則表達式
第八章 讀寫文件
第九章 組織文件
第十章 調試
第十一章 從Web抓取信息
第十二章 處理Excel電子表格
第十三章 處理PDF和Word文檔
第十四章 處理CSV文件和JSON數據
第十五章 保持時間、計劃任務和啟動程序
第十六章 發送電子郵件和短信
第十七章 操作圖像
第十八章 用GUI自動化控制鍵盤和鼠標
*聲明:資料來自于網絡,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜
第一章 Python基礎
你可以用一個計算器來計算表達式,或在文本處理器中輸入字符串連接。甚至可以通過復制粘貼文本,很容易地實現字符串復制。但是表達式以及組成它們的值(操作符、變量和函數調用),才是構成程序的基本構建塊。一旦你知道如何處理這些元素,就能夠用Python操作大量的數據。
第二章 控制流
通過使用求值為True或False的表達式(也稱為條件),你可以編寫程序來決定哪些代碼執行,哪些代碼跳過??梢栽谘h中一遍又一遍地執行代碼,只要某個條件求值為True。如果需要跳出循環或回到開始處,break和continue語句很有用。
第三章 函數
函數是將代碼邏輯分組的主要形式。因為函數中的變量存在于他們自己的局部作用域內,所以一個函數中的代碼不能直接影響其他函數中變量的值。這限制了哪些代碼才能改變變量的值,對于調試代碼是很有幫助的。
第四章 列表
列表是可變的,這意味著它們的內容可以改變。元組和字符串雖然在某些方面像列表,卻是不可變的,不能被修改。
第五章 字典和結構化數據
列表和字典是這樣的值,它們可以包含多個值,包括其他列表和字典。字典是有用的,因為你可以把一些項(鍵)映射到另一些項(值),它不像列表,只包含一系列有序的值。字典中的值是通過方括號訪問的,像列表一樣。字典不是只能使用整數下標,而是可以用各種數據類型作為鍵:整型、浮點型、字符串或元組。
第六章 字符串操作
文本是常見的數據形式,Python自帶了許多有用的字符串方法,來處理保存在字符串中的文本。在你寫的幾乎每個Python程序中,都會用到取下標、切片和字符串方法。
第七章 模式匹配與正則表達式
雖然計算機可以很快地查找文本,但你必須精確地告訴它要找什么。正則表達式讓你精確地指明要找的文本模式。實際上,某些文字處理和電子表格應用提供了查找替換功能,讓你使用正則表達式進行查找。
第八章 讀寫文件
文件被組織在文件夾中(也稱為目錄),路徑描述了一個文件的位置。運行在計算機上的每個程序都有一個當前工作目錄,它讓你相對于當前的位置指定文件路徑,而非總是需要完整路徑(絕對路徑)。os.path模塊包含許多函數,用于操作文件路徑。
第九章 組織文件
通常,你不僅需要對一個文件夾中的文件執行這些操作,而是對所有下級子文件夾執行操作。os.walk()函數將處理這個艱苦工作,遍歷文件夾,這樣你就可以專注于程序需要對其中的文件做什么。
第十章 調試
斷言、異常、日志和調試器,都是在程序中發現和預防缺陷的有用工具。用
Python語句實現的斷言,是實現心智正常檢查的好方式。如果必要的條件沒有保持為True,它將盡早給出警告。斷言所針對的錯誤,是程序不應該嘗試恢復的,而是應該快速失敗。否則,你應該拋出異常。
回復關鍵詞:快速上手
目錄
第十一章 從Web抓取信息
大多數無聊的任務并不限于操作你計算機中的文件。能夠編程下載網頁,可以讓你的程序擴展到因特網。requests模塊讓下載變得很簡單,加上HTML的概念和選擇器的基本知識,你就可以利用BeautifulSoup模塊,解析下載的網頁。
第十二章 處理Excel電子表格
處理信息是比較難的部分,通常不是處理本身難,而是為程序得到正確格式的數據較難。一旦你將電子表格載入Python,就可以提取并操作它的數據,比手工操作要快得多。
第十三章 處理PDF和Word文檔
文本信息不僅僅是純文本文件,實際上,很有可能更經常遇到的是PDF和Word文檔??梢岳肞yPDF2模塊來讀寫PDF文檔。遺憾的是,從PDF文檔讀取文本并非總是能得到完美轉換的字符串,因為PDF文檔的格式很復雜,某些PDF可能根本讀不出來。在這種情況下,你就不太走運了,除非將來PyPDF2更新,支持更多的PDF功能。
第十四章 處理CSV文件和JSON數據
CSV和JSON是常見的純文本格式,用于保存數據。它們很容易被程序解析,同時仍然讓人可讀,所以它們經常被用作簡單的電子表格或網絡應用程序的數據。csv和json模塊大大簡化了讀取和寫入CSV和JSON文件的過程。
第十五章 保持時間、計劃任務和啟動程序
對于許多編程語言,包括Python,Unix紀元(1970年1月1日午夜,UTC)是一個標準的參考時間。雖然time.time()函數模塊返回一個Unix紀元時間戳(也就是自Unix紀元以來的秒數的浮點值),但datetime模塊更適合執行日期計算、格式化和解析日期信息的字符串。
第十六章 發送電子郵件和短信
Python 的 smtplib 提供了一些函數,利用 SMTP,通過電子郵件提供商的SMTP服務器發送電子郵件。同樣,第三方的imapclient和pyzmail模塊讓你訪問IMAP服務器,并取回發送給你的電子郵件。雖然IMAP比SMTP復雜一些,但它也相當強大,允許你搜索特定電子郵件、下載它們、解析它們,提取主題和正文作為字符串值。
第十七章 操作圖像
圖像由像素的集合構成,每個像素具有表示顏色的RGBA值,可以通過x和y坐標的定位。兩種常見的圖像格式是JPEG和PNG。Pillow模塊可以處理這兩種圖像格式和其他格式。
第十八章 用GUI自動化控制鍵盤和鼠標
利用pyautogui,你可以在屏幕上移動鼠標,模擬鼠標點擊、擊鍵和快捷鍵。pyautogui模塊也能檢查屏幕上的顏色,讓GUI自動化程序對屏幕內容有足夠的了解,知道它是否有偏差。甚至可以向它提供一個屏幕快照,讓它找出你希望點擊的區域坐標。
本書適合任何想要通過Python學習編程的讀者,尤其適合缺乏編程基礎的初學者。通過閱讀本書,讀者將能利用強大的編程語言和工具,并且會體會到Python編程的快樂。
資料獲?。?/strong>PDF已經打包好,可以通過下述步驟來獲取,回復關鍵詞:快速上手
本文鏈接:http://www.thecarconnectin.com/46743.html
網友評論comments