[python Cookbook]阅读笔记
@toc]
前記:為了補充一下python語法知識,感謝網友的推薦閱讀了pythonCookbook,這本書確實不錯,以問題為導向,引導解決思路。
這個博文是從閱讀筆記typora中直接復制過來的沒有排版,僅作為記錄!方便自己查詢使用!書還沒看完!持續更新!代碼部分是直接使用IDLE運行的;
更新迭代記錄
| 閱讀前八章 | 2021/11/27 23:04:12 | Jucw |
| 添加第九章/十一章 | 2021/11/28 12:25:22 | Jucw |
| 添加8.3/8.4 | 2021/11/29 23:50:26 | Jucw |
| 添加9.1裝飾器的內容 | 2021/12/01 08:47:47 | Jucw |
第二章 惰性匹配
2.1(. * ?)
2.2字符串拼接
對于可迭代容器中的每個元素是字符串時候,使用join 進行字符串拼接
parts = ['my', 'is', 'a', 'handsome', 'boy'] t = ' '.join(parts) print(t) # 'my is a handsome boy'針對列表,元組,字典,文件,集合,生成器
針對簡單的直接拼接的時候,使用 + 進行拼接 ;
+可以連接多個字符,之后拼接成完整的字符串
打印的時候使用字符進行分割
a = 0 b = 2 c = 5 print(a,b,c,sep=':') # 使用這種方法更好 print(':'.join(a,b,c))格式化文本
# import textwrap text = "" print(textwrap.fill(text,40,initial_indent='')) # 每40個為一行,最后使用空字符結尾在字節串執行
能在文本字符串上執行的操作都能在字節字符串上進行
Byte String
打印的時候將字節字符串轉化為ascii碼進行打印,這個時候就跟文本字符串一樣
print(bString.decode(‘ascii’))
第三章,數字,日期時間
3.1數據
3.11 浮點數取整(固定位數)
round(num, n) 進行四舍五入到指定小數點后面幾位
執行之后的id 是不一樣的,也就是在內存的位置是不一樣的
1852106442928
id ?
1852106442928
id (d)
1852106441840
c==d
True
id ?==id(d)
False
當處于中間數的時候,取值是最接近的偶數
1.5=2 2.5=2
round(1.5)
2
round(2.5)
2
3.2 浮點數計算存在誤差
這是CPU計算浮點數的特性
from decimal import Decimal
將浮點數轉為字符串進行計算
3.3 二進制,十進制,八進行,十六進制
將一個整數轉為二進制,八進制,十六進制
bin()
oct()
hex()
這一種轉化會出現前綴,可以使用切片進行處理
如果使用不想出現前綴使用
format(a, ‘b’) # 二進制
format(a, ‘o’) # 八進制
format(a, ‘x’) # 十六進制
將字符串的形式不同進制轉換為整數,需要使用 int 同時指定 當前字符串所代表的進制類型就可以轉為整數
int(‘4b2’,16)
int(‘010101’,2)
3.4 復數
a.real
a.imag
a.conjugate()
對復數進行運算
import cmath
cmath.sin()
cmath.cos()
cmath.exp()
Python 的標準庫默認是不會產生復數值,所以計算復數的時候使用cmath 或者 numpy 是可以對復數進型運算的
import cmath
a = 1-2j
a.real
1.0
a.imag
-2.0
a.conjugate()
(1+2j)
cmath.sin(a)
3.5 隨機數
random 使用馬特賽特旋轉算法(梅森旋轉算法)來計算隨機數,這是一個確定性的算法。通過random.seed() 來修改 初始的種子值;
隨機數選擇
import random
random.choice() # 隨機選擇一個數
隨機數生成
隨機采樣n個數
random.sample(a, N)
對元素進行原地打亂
3.6 時間換算
天數轉為秒,小時轉為分鐘
datatime 可以實現不同的時間單位的換算
datadelta表示時間間隔
now = datatime.datatime
datatime.timedelta(days = 2, minutes = 20, seconds = 10) # 都要加上s 來表示時間單位,然后可以往前推導出時間
計算上周五的日期
上周五是幾月幾號
from datetime import datetime, timedelta weeksday = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']第四章 迭代器和生成器
4.1 訪問元素
next() 進行迭代
items._iter_()
生成器只會在響應迭代操作時候才會運行
一旦生成器函數返回,迭代也就停止,如果執行for 語句的時候這些是不需要進行考慮的;
定義一個反向迭代
def __reversed__(self):n = 1while n < self.start:yield nn = n + 1? 迭代器和生成器是沒法執行普通的切片操作
使用itertools.islice() 返回一個生成器,這是通過訪問生成器然后丟棄掉開始索引之前的元素來實現切片操作
這里會消耗掉前面丟棄的數據,因為生成器是沒法倒回去的,如果需要倒回去需要將生成器轉為列表之后再進行操作
import itertools
跳過文件的注釋行
from itertools import dropwhilewith open(“”) as f:for line in dropwhile(lambda line: line.startswith('#'), f)print(line, end=' ')排列組合
iterations.permutations # 排列 考慮順序
iterations.combinations # 組合 {a, b} 和 {b, a} 是一樣的只會出現一次,不考慮順序
iterations.combinations_with_replacement # 選擇過之后的數字仍然可以在一次選擇, {a, a, a} 相當于有放回的選擇小球
迭代一個序列保存序列的下標
a = [1, 2, 3, 4, 5]
for idx, val in enumerate(a):
print(idx, val)
0 1
1 2
2 3
3 4
4 5
索引下標是從0開始的
同時迭代多個序列使用 zip
a = []
b = []
for x,y in zip(a,b):
? 同時迭代a and b 這兩個序列
? print (x, y)
zip 的工作原理是創建出一個迭代器,該迭代器可以產生元組,(x ,y) 當其中某個序列沒有元素可以進行迭代的時候,迭代過程結束;
如果要匹配最長迭代對象
import iterations.zip_longest
這個時候產生的是最長迭代隊列,短的序列使用None來替代
zip 返回的是一個迭代器,必要時候需要將其轉換為列表;
4.2 多個迭代對象
處理多個迭代對象,返回一個迭代器
包
from iterations import chain
from iterations import chain a = [1, 1, 2] b = ['i', 'love', 'you'] for i in chainm(a,b):print(i, end=' ')1 1 2 i love youset = iteration()
inactive_items = set()
4.3 合并多個有序序列
包
import heapq
如果序列不是有序的,合并之后還是不會對序列進行排序,這個使用對進行合并不會一次性進行讀取,而是在合并過程中邊讀取邊比較
主要是用在將兩個有序的序列進行合并之后保證序列還是有序的
只是簡單的檢查每個序列的第一個元素,比較之后將第一個元素較小的發送出去,之后再從新的序列讀取下一個元素,重復操作直到元素讀取結束
第五章 文件和IO
5.1 讀寫文本數據
換行符: \r\n 和 \n 這是 UNIX 和 Window 之間的區別
輸出進行重定向 也就是將讀取的內容重新寫入到新的文件中,
with open(“…txt”, ‘’wt’) as f:
使用 print(“text”, file = f) # 只要是確保文件是使用文本格式打開的就行,如果是使用二進制打開可能會打印失敗!
以不同的分割符打印數據
print(, seq = ‘;’, end=‘!!\n’) # 讀取的內容使用; 進行分割,最后結尾部分使用!!還有換行進行輸出
檢查文件是否已經存在
import os if not os.path.exists(''):with open ('', '') as f: ##使用xb 模式進行打開就不用判讀, 將會直接進行覆蓋f.read()else:print("File is exitst!!")5.2 處理路徑名
os.path.basename() # 獲取最后的文件名稱
os.path.dirname() #獲取路徑名
os.path.join(‘’,‘’,os.path.basename(path)) # 將多個字符串組裝成新的路徑
5.3 將對象轉為字節流
import pickle
data = …
with open(‘’, ‘’) as f:
pickle.dump(data, f)
在字節流中重新創建出對象
pickle.load() 這是在文件傳輸過程中需要進行序列化的一種方式。這樣比較高效的進行文件傳輸;
第六章數據編碼與處理
6.1 讀寫CSV數據
寫入數據到csv文件中
head = []rows = [(),()]with open(‘’, ‘’) as f:f_csv = csv.writer(f):f_csv.writerow(head)f_csv.write rows(rows)數據是字典,也就是使用列表存儲字典,之后將字典的對應的值映射到表格中
headers = []rows = [{}{}]with open() as f:f_csv = csv.DictWriter(f, headers) # 將表頭和文件進行建立聯系f_csv.writeheader() # 先將表頭寫入到表格中f_csv.writerows(rows) # 將每行對應數據寫入到表格中6.2 讀取JSON數據
json.dumps()
json.loads()
數據是字典的格式
使用json.dumps(data)
將數據dumps 到 json 文件中去
讀取json文件
讀取的網頁信息使用功pprint 進行打印,可以更好的展示結果
這個過程使用的是json 會將信息以字典或者列表的形式進行存儲
6.3 B64編碼和解碼
import base64.b64encode()
import base64.B64decode()
面向字節的編碼
字節串和字節數組
編碼之后輸出字節串 之后可以轉換為decode(‘ascii’)
第七章 函數
7.1 接受任意類型的函數
def avg(fist, *rest):return (first + sum(rest))/(1+len(rest)) # rest 可以是多個數據 >>> def avg(first, *rest):return (first + sum(rest))/(1+len(rest))>>> c = avg(1,2,3,4,5,6) >>> c 3.5 = 21/6rest 作為一個元組傳來,代碼將其作為一個序列進行處理
*rest 和 ** kwargs 前者傳遞位置參數(元組) 后者是傳遞關鍵字參數(字典) size = 'large', quantity = 6 # 這里是傳遞一個字典 (1, 2, 3) # 這里是傳遞一個位置參數,這是一個元組注意: * 打頭的只能作為最后一個位置參數出現,以 ** 打頭的只能作為最后一個參數出現
也就是說以 * 打頭之后的參數只能是關鍵字參數
7.2 函數返回多個值
只要簡單的返回一個元組,就可以實現函數返回多個值
7.3 定義匿名函數或內聯函數
add = lambda x, y: x+y # 將x, y 直接連接起來
>>> x = 10 >>> b = lambda y:x+y >>> x = 20 >>> c = lambda y:x+y >>> b()10 SyntaxError: invalid syntax >>> b(10) # 這里執行的時候x是20 30 >>> c(10) # 這里執行的時候x也是20 30lambda 中的變量是在執行的是后進行綁定,也就是說執行是變量時多少就是多少,而不是定義的時候的值
第八章類與對象
8.1 修改實例字符串表示
通過定義_repr_()
_str_()方法實現
_repr_()返回的是實例的代碼表示,通常可以用他返回的字符串文本來重新創建這個實例,內建的repr()函數可以用來返回這個字符串,_str_()將實例轉為字符串,這就是使用print() 和 str() 這兩個方法產生的效果,
p = Pair(3,4) # _repr_() output 輸出的時候使用!r 表示使用特殊的格式化代碼輸出
print§ # _str_()
8.2 對象支持上下文管理
with 要實現_enter_() and _exit_()函數
如果_enter_()有返回值的話,被放置在使用as作為限定下
8.3 裝飾器
@property
類外直接調用屬性變量
8.4 深拷貝和淺拷貝
copy.copy() #
copy.deepcopy() # 深拷貝 直接復制一份地址不同
copy.copy() 和 copy.deepcopy() 都是直接復制一份
第九章 元編程
9.1 裝飾器
定義一個裝飾器:裝飾器就是一個函數,接受一個函數作為輸入并返回一個新的函數作為輸出
from functools import wraps def time():@wrapsdef wrapper():print(start-end)@time # 使用什么定義的裝飾器來作為自己的時間計算 def count(): # output: 輸入@time 內中函數內容裝飾器的代碼一般會涉及創建一個新的函數,利用*args 和 ** kwargs 來接受任意的參數;在這個函數內部需要調用原來的那個函數,也就是被包裝的那個函數,它是裝飾器的輸入函數,這個新創建的wraps()函數會 作為裝飾器的結果返回,取代原來的函數;
】
def set_fun(fun):def call_fun():print("quanxina1")fun()return call_fun@set_fun def test():print("----test----")#ret = set_fun(test) 如果在test()前不添加@ 可以 使用這種方式,一樣可以實現裝飾器的作用,調用的原理是,先進入到閉包的外部函數,執行內部函數的定義,返回值調用內部函數,這個時候根據傳進來的參數執行內部函數地址空間的信息;test()注解:這里是添加裝飾器實現不修改原理函數從而添加新的需求功能
這里的裝飾器是通過閉包調用的功能來實現,閉包的定義是外部函數返回內部函數,首先外部函數先進行定義內部函數并不執行內部函數,在返回值直接返回內部函數,這個時候才是調用內部函數,執行的流程是通過返回值調用內部函數,這個過程可以在內部函數先定義需要添加的功能, 之后在進行調用原來的舊的函數,這樣就能實現增加新的功能而不修改原來的函數
使用是通過在原來函數前@閉包函數是實現,
對于裝飾器這一章節還需要多學習
9.2 解析并分析python 源代碼
編寫一些程序來解析Python 源代碼并對此進行一些分析工作
import ast 將python 編譯為一個抽象語法樹
ast.parse()
>>> import ast >>> e = ast.parse('6+2') >>> e <_ast.Module object at 0x000001CBBD850CD0> >>> ast.dump(e) 'Module(body=[Expr(value=BinOp(left=Constant(value=6, kind=None), op=Add(), right=Constant(value=2, kind=None)))], type_ignores=[])'抽象語法樹分析Python源碼
知識博客地址:
第十一章 網絡和Web編程
11.1 與網絡進行交互
### get funcfrom urllib import request, parseurl = ‘’parms = {‘’:’’, ‘’:“”,}u = request.urlopen(url)response = u.read().decode(‘ascii’)## post func 將參數編碼后作為可選參數傳遞gei URLopen(url, parms) response = r.read()需要重新看的章節部分
2.19這一章還沒看
5.19/5.20這一章需要重新看
6.12 Struct 復習
time: 2021-11-27
總結
以上是生活随笔為你收集整理的[python Cookbook]阅读笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Overleaf] -带你初识Late
- 下一篇: [pythonjava爬虫实战]-爬取学