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