【Python教程】《零基礎(chǔ)入門學(xué)習(xí)Python》最新版

修改編輯器的字體,使中英文標(biāo)點(diǎn)符號(hào)差異大些:
- 點(diǎn)擊IDLE菜單欄上"Options-Configure IDLE"
- 選擇"Fonts/Tabs"選擇等寬字體(推薦Consolas),點(diǎn)擊"Apply"后點(diǎn)擊“OK”
Python3代碼樣式指導(dǎo)手冊(cè)(PEP8)
https://fishc.com.cn/thread-139746-1-1.html
變量名可以用漢字表示 eg:數(shù)量=1
python內(nèi)置函數(shù)共68個(gè)

Tab 鍵除了用于縮進(jìn),Tab 鍵的另一個(gè)妙用就是自動(dòng)填充,比如咱輸入 pr 兩個(gè)字符,再摁一下鍵盤上的 Tab 鍵,會(huì)彈出一個(gè)提示款,IDLE 在猜測(cè)你想干哈呢
Python3 雖然支持中文作為變量名,但有些大牛卻不贊同這么做,你覺得他們的依據(jù)是什么?
答:隨著時(shí)代的發(fā)展,越來越多的編程語言不僅支持純英文代碼,還支持全球多數(shù)國(guó)家的語言開發(fā),有些變態(tài)的甚至還能使用 Emoji 符號(hào)……但是,都沒能流行起來!為什么呢?以下是小甲魚認(rèn)同的幾點(diǎn)原因,歡迎補(bǔ)充。
- 不利于與外國(guó)友人協(xié)同開發(fā)程序;
- 敲一個(gè)中文單詞的步驟比英文單詞要多;
- 習(xí)慣問題:以前的編程語言多數(shù)只支持純英文,大家只能硬著頭皮用英文;
- 就算是變量名支持中文了,但符號(hào)卻還是只能使用英文的;
- 難道你們不覺得切輸入法很煩嗎?
給變量命名,要避免與 Python 內(nèi)部使用的名字沖突,不然這個(gè)內(nèi)置函數(shù)就廢掉了
如果要為一個(gè)函數(shù)寫說明文檔,那么你覺得應(yīng)該使用哪種字符串比較合適?三引號(hào)字符串,也就是長(zhǎng)字符串合適。
如果在 IDLE 的交互模式中使用 help(obj) 函數(shù),可以查看到 obj 對(duì)應(yīng)的說明文檔
print()
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)



1 + 1 >= 2返回 True。?2 >= 2 成立
random -- 生成偽隨機(jī)數(shù)
https://fishc.com.cn/thread-145254-1-1.html
可以實(shí)現(xiàn)對(duì)偽隨機(jī)數(shù)的攻擊,random生成的隨機(jī)數(shù)可以被重現(xiàn):
random.getstate()獲取隨機(jī)數(shù)種子加工之后,隨機(jī)數(shù)生成器的內(nèi)部狀態(tài)
x=random.getstate()
random.randint(1,10)
random.setstate(x)
random.randint(1,10)
Python 除法的運(yùn)算結(jié)果是以浮點(diǎn)數(shù)的形式存儲(chǔ)的(盡管結(jié)果可以整除)
浮點(diǎn)數(shù)在計(jì)算機(jī)中的存儲(chǔ)是存在 “誤差” 的,但當(dāng)浮點(diǎn)數(shù)相加的結(jié)果等于整數(shù)時(shí),偏差則不會(huì)出現(xiàn)。如果需要做到 100% 精確計(jì)算浮點(diǎn)數(shù),請(qǐng)使用 decimal 模塊(傳送門)
from decimal import Decimal
a = Decimal('0.1')
b = Decimal('0.3')
print(a - b)
#-0.2
random.randint(a, b) 返回一個(gè)隨機(jī)整數(shù) N,范圍是:a <= N <= b
擁有相同的種子的語句,打印的結(jié)果是相同的

random.sample(range(1,8),6)從1-7之間隨機(jī)抽取6個(gè)不重復(fù)數(shù)
運(yùn)算符 // 取比目標(biāo)結(jié)果小的最大整數(shù) -3//2 #-2
如果給 int() 函數(shù)傳入一個(gè)浮點(diǎn)數(shù)參數(shù),那么 int() 是簡(jiǎn)單暴力地將小數(shù)部分裁掉(比如 int(9.99) 的結(jié)果等于 9)……可是我們更習(xí)慣的是使用“四舍五入”的方式來取整。如果不借助其它函數(shù),你能夠單純使用 int() 函數(shù)來實(shí)現(xiàn)嗎
答:只需要將 int() 函數(shù)的參數(shù) +0.5 即可實(shí)現(xiàn)四舍五入


and 和 or 遵從短路邏輯


print1 if condition1 else print2

extend()參數(shù)必須是可迭代對(duì)象,新加內(nèi)容追加到列表最后一個(gè)元素的后面

list變量名.clear() 清空列表
列表X is 列表Y False。因?yàn)榱斜鞽和Y的值位置不同

淺拷貝:copy() 或者 lista=listb[:]
深拷貝:decopy()
兩者效果一樣,但后者效率更快,但后者推導(dǎo)式語句使用較為復(fù)雜時(shí),需要權(quán)衡下使用,后期是否好維護(hù)

字符串

swapcase()將原字符串大寫變小寫,小寫變大寫。

fillchar默認(rèn)為0

zfill(width) ,當(dāng)width大于原字符串width, 用0填充左側(cè)。

find()從左往右找,rfind()從右往左找

在find()里的值,沒有在字符串里,會(huì)返回-1。
在index()里的值,沒有在字符串里,會(huì)報(bào)錯(cuò)。

expandtabs(4)即指定一個(gè)tab等于4個(gè)空格

#P30

[,start[,end]]代表start和end是可選參數(shù)

removeprefix(prefix)和removesuffix(suffix)允許刪除指定的前綴或后綴
將字符串以參數(shù)指定的分隔符為依據(jù)將字符串切割并返回1個(gè)3元組。
partition() 從左往右
rpartition()從右往左
split()從左往右
rsplit()從右往左

splitlines(keepends=False)按行分割并將結(jié)果以列表的方式返回。keepends=True表示結(jié)果包含換行符

.join()拼接效率 比 +拼接效率 高


format()





例如:

適用整數(shù)的值有(值前面加#會(huì)在輸出時(shí)顯示值類型):

例如

適用浮點(diǎn)數(shù)的值有(值前面加#會(huì)在輸出時(shí)顯示值類型):

例如:

is 、is not 判斷是否同一對(duì)象


sort和sorted處理列表排序,使用sort(),原列表會(huì)被改變。參數(shù)reverse表示反排序,key=len表示按照len大小排序
all()判斷可迭代對(duì)象所有對(duì)象是否為真
all()判斷可迭代對(duì)象任一對(duì)象是否為真







1個(gè)迭代器肯定是1個(gè)可迭代對(duì)象??傻鷮?duì)象可以重復(fù)使用,而迭代器則是一次性的。
iter()

next()逐個(gè)將迭代器的元素提取出來。當(dāng)?shù)鳑]有任何元素就會(huì)報(bào)錯(cuò)


pop不存在元素會(huì)報(bào)錯(cuò),可給一個(gè)default值替代報(bào)錯(cuò)信息

popitem()在python 3.7版本后刪除字典最后加入的鍵值對(duì)。
del語句可以用于字典
clear()清空字典的鍵值對(duì),字典是空的。

setdefault()查找一個(gè)鍵是否存在于字典中,如果不存在,則指定一個(gè)新的值
復(fù)制字典:copy()
逆向排序:reverse(3.8版本及以后才可以)
isdisjoint()
issubset()
issuperset()
union()
intersection()
difference()
symmetric_diffference()
.frozenset()創(chuàng)建不可變的集合
.set()創(chuàng)建可變的集合
不可變對(duì)象是可哈希的,可變對(duì)象是不可哈希的!

集合的嵌套使用.frozenset()


其中,/代表/左側(cè)必須是位置參數(shù),不能使用關(guān)鍵字參數(shù)
*代表*左側(cè)可以是位置參數(shù)或關(guān)鍵字參數(shù),*右側(cè)必須是關(guān)鍵字參數(shù)才不會(huì)報(bào)錯(cuò)

return語句被執(zhí)行后,直接返回結(jié)果,不會(huì)再執(zhí)行之后的語句

使用**可以把參數(shù)打包成字典


全局變量可以在函數(shù)內(nèi)部中訪問,但無法在函數(shù)中修改值。

不建議global申明全局變量并修改,易出現(xiàn)難以排查的bug


在內(nèi)部函數(shù)修改外部函數(shù)的變量,使用nonlocal語句

作用域的影響范圍存在相互覆蓋的情況,當(dāng)沖突出現(xiàn)的時(shí)候,python會(huì)選擇誰?
Local(局部作用域) 、Enclosed(嵌套函數(shù)外層函數(shù)作用域)、Global(全局作用域)、Build-In(內(nèi)置作用域)
Local與Global發(fā)生沖突時(shí),除非使用global語句申明,否則python會(huì)使用Local的變量;
當(dāng)函數(shù)嵌套發(fā)生的時(shí)候,除非使用nonlocal語句,
否則局部作用域又會(huì)覆蓋外層函數(shù)的作用域的變量

多看幾遍...

以下寫法結(jié)果相同

表示調(diào)用myfunc()時(shí)把myfunc()作為參數(shù)傳遞給裝飾器time_master()再調(diào)用裝飾器


多個(gè)裝飾器 從最靠近函數(shù)的@開始

以下寫法結(jié)果相同



lambda能出現(xiàn)在python不允許def語句出現(xiàn)的地方

在函數(shù)中,yield表達(dá)式代替return語句就是生成器。下例是counter()生成器

生成器的作用是每次提供1個(gè)數(shù)據(jù)。不能使用下標(biāo)索引的方式獲取值,會(huì)報(bào)錯(cuò)。

generator object 生成對(duì)象。
遞歸(函數(shù)調(diào)用函數(shù)本身),如果沒有結(jié)束條件,就會(huì)不斷運(yùn)行,直至ctrl+c強(qiáng)制終止



def hanoi(n,x,y,z):
? ? #print("!!--------------------",str(n),x,y,z)
? ? if n==1:
? ? ? ? print(x,"-->",z) ?
? ? ? ?
? ? else:
? ? ? ? hanoi(n-1,x,z,y)
? ? ? ? #print("++---------------------",str(n-1),x,z,y)
? ? ? ? print(x,"-->",z)
? ? ? ? hanoi(n-1,y,x,z)
? ? ? # ?print("----------------------",str(n-1),y,x,z) # 1 b a c
n=int(input("層數(shù):"))
hanoi(n,"a","b","c")
使用help(函數(shù)名)查看函數(shù)文檔

:str 或者:int 、 ->str是給人看的,即類型注釋,是作者期望輸入的類型,如果不按類型注釋輸入,python也不會(huì)阻止/報(bào)錯(cuò)。

.__name__ 獲取函數(shù)名字
.__annotations__查看類型注釋
.__doc__查看函數(shù)文檔
當(dāng)一個(gè)函數(shù)接收另一個(gè)函數(shù)作為參數(shù)時(shí),該函數(shù)為高階函數(shù)
functool庫

將1個(gè)函數(shù)的多個(gè)參數(shù)拆分多次進(jìn)行傳遞

沒調(diào)用@wraps之前,是有副作用的(紅框)

調(diào)用后

ctr+f 搜索快捷鍵

form pathlib import Path()
Path.cwd() #獲取當(dāng)前目錄的路徑·
.is_dir()#判斷一個(gè)路徑是否為一個(gè)文件夾
.is_file()#判斷一個(gè)路徑是否為一個(gè)文件
.exist()#判斷一個(gè)路徑是否存在
.name#獲取路徑的最后一個(gè)部分
.stem獲取文件名
.suffix獲取文件后綴
.parent獲取父級(jí)目錄
.parents獲取邏輯祖先路徑構(gòu)成的序列

.parts將路徑的各個(gè)組件拆分成元組

.stat查詢文件/文件夾的信息

絕對(duì)路徑:文件真正存在的路徑
相對(duì)路徑:以當(dāng)前目錄為基準(zhǔn)進(jìn)行一級(jí)一級(jí)目錄推導(dǎo)的路徑。使用 . 表示當(dāng)前路徑,..表示上一路徑
resolve()將相對(duì)路徑變?yōu)榻^對(duì)路徑
iterdir()獲取當(dāng)前路徑下所有子文件和子文件夾
generator object 生成器

打印文件列表

mkdir()創(chuàng)建文件夾。如果要?jiǎng)?chuàng)建的文件夾已存在,會(huì)報(bào)錯(cuò)。除非exist_ok=True

創(chuàng)建多個(gè)文件需要設(shè)置紅框內(nèi)容才不會(huì)報(bào)錯(cuò)

open()打開文件
rename()修改文件名字
replace()替換指定的文件或文件夾
rmdir()刪除文件夾(文件夾為空才不報(bào)錯(cuò))
unlink() 刪除文件
glob()查找

with語句能確保文件關(guān)閉。
生成以二進(jìn)制形式保存內(nèi)容的pkl文件


讀取pkl 內(nèi)容


try-except-else:沒運(yùn)行except就會(huì)接著運(yùn)行else
try-except-finally 無論異常是否發(fā)生都會(huì)運(yùn)行finally

實(shí)現(xiàn)代碼自爆。

能偷天換日

raise 不能生成異常。

異常列:
通常用于代碼調(diào)試
條件不成立時(shí)引發(fā)AsserttionError

利用異常實(shí)現(xiàn)goto

類里面的變量是屬性,函數(shù)叫方法。
可通過實(shí)例對(duì)象訪問類的屬性和方法
在創(chuàng)建對(duì)象之前,通過類將相關(guān)屬性和方法給打包到一起,然后通過類生成相應(yīng)的對(duì)象。
class B:子類 class A:父類
當(dāng)子類存在與父類相同的屬性和方法,訪問子類時(shí)將得到子類的屬性和方法

判斷1個(gè)對(duì)象是否屬于1個(gè)類 isinstance()
由于B是子類,所以isinstance(b,A)也True

檢測(cè)1個(gè)類是否為另一個(gè)類的子類 issubclass()

1個(gè)子類可以同時(shí)繼承多個(gè)父類。


__dict__可以訪問出實(shí)例對(duì)象有哪些屬性
最小的類
