章節(jié)號 | 內(nèi)容???????????? |
---|---|
1圖片格式(png) | 寬度大于620px,保持高寬比減低為620px |
1-1 | 應(yīng)用 |
1-1-1 | 方法 |
第1章節(jié)? 生成器
-
1-1?生成器—生成器的2種方式
??列表生成式:
In [17]: a=[x for x in range(10)]
In [18]: a
Out[18]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [21]: a=[x*2 for x in range(10)]
In [22]: a
Out[22]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
??什么是生成器:
??1延都、把列表生成式的[]
改為()
In [25]: b=(x*2 for x in range(10))
In [26]: b
Out[26]: <generator object <genexpr> at 0x7fbf76db3eb8>
??怎么來使用?使用next(生成器名)
棠耕,一次一個毡们。
In [27]: next(b)
Out[27]: 0
In [28]: next(b)
Out[28]: 2
In [36]: next(b)
Out[36]: 18
In [37]: next(b)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-37-adb3e17b0219> in <module>()
----> 1 next(b)
StopIteration:
??斐波那契數(shù)列問題。
??2昧辽、使用yield
??引言衙熔,兩數(shù)交換
問題。
In [38]: a,b=0,1
In [39]: a,b=b,a
In [40]: a
Out[40]: 1
In [41]: b
Out[41]: 0
In [42]: a=9
In [43]: b=10
In [44]: a=a+b
In [45]: b=a-b
In [46]: a=a-b
In [47]: a
Out[47]: 10
In [48]: b
Out[48]: 9
??↓這里使用列表的方式來實現(xiàn)斐波那契數(shù)列的計算搅荞。
def fab(n):
a = [1, 1]
for i in range(n):
an = a[i]+a[i+1]
a.append(an)
# yield a
print(a)
fab(10)
# c=fab(10)
# print(next(c))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
??↓用yield實現(xiàn):
def fab(n):
a = [1, 1]
for i in range(n):
an = a[i]+a[i+1]
a.append(an)
yield a
print(a)
print(fab(10))
c=fab(10)
print(next(c))
<generator object fab at 0x7f7f94fff1a8>
[1, 1, 2]
??↑函數(shù)體內(nèi)一旦聲明了yield红氯,此函數(shù)就會變成一個生成器框咙。不再能被以普通的方式調(diào)用。
??1痢甘、首先要把函數(shù)賦給一個變量c=fab(10)
??2喇嘱、使用next(c)
來取生成器的值,或者a=c.__next__()
來調(diào)用函數(shù)取得返回值。
??3塞栅、你yield誰者铜,使用next()的時候,就返回誰放椰。
??4作烟、一般都是套在循環(huán)中,next()一次砾医,執(zhí)行一次循環(huán)拿撩。
??5、程序每次停在yield結(jié)束處如蚜,下一次next()從yield的下一句開始執(zhí)行
In [4]: def fab(n):
...: a = [1, 1]
...:
...: for i in range(n):
...: an = a[i]+a[i+1]
...: a.append(an)
...: print("before yield")
...: yield a
...: print("after yield")
...: print(a)
...:
...: print(fab(10))
...: c=fab(10)
...:
<generator object fab at 0x7fb98914dfa0>
In [5]: next(c)
before yield
Out[5]: [1, 1, 2]
In [6]: next(c)
after yield
before yield
Out[6]: [1, 1, 2, 3]
??如果沒有循環(huán)會咋樣呢压恒?只能生成一次~
In [1]: def fab():
...: a=0
...: b=1
...: c=a+b
...: yield c
...:
...:
...: print(fab())
...: a=fab()
...:
<generator object fab at 0x7fb98a1f65f0>
In [2]: next(a)
Out[2]: 1
In [3]: next(a)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-3-15841f3f11d4> in <module>()
----> 1 next(a)
-
1-2?生成器—自動輸出生成器返回值,不報錯
def fab(n):
a = [1, 1]
for i in range(n):
an = a[i]+a[i+1]
a.append(an)
# print("before yield")
yield a
# print("after yield")
# print(a)
for t in fab(10):
print(t)
[1, 1, 2]
[1, 1, 2, 3]
[1, 1, 2, 3, 5]
[1, 1, 2, 3, 5, 8]
[1, 1, 2, 3, 5, 8, 13]
[1, 1, 2, 3, 5, 8, 13, 21]
[1, 1, 2, 3, 5, 8, 13, 21, 34]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
??↑一個生成器错邦,可以中for循環(huán)來輸入探赫,放到in的后面即可。
-
1-3?生成器—send
In [14]: def test():
...: i=0
...: while i<5:
...: t = yield i
...: print(t)
...: i+=1
...:
...: t1=test()
...:
In [15]: next(t1)
Out[15]: 0
In [16]: next(t1)
None
Out[16]: 1
In [17]: t1.send("hhhhh")
hhhhh
Out[17]: 2
In [18]: next(t1)
None
Out[18]: 3
In [19]: t1.send("jjjjjjj")
jjjjjjj
Out[19]: 4
??↑yield i
本身是沒有值的撬呢,一旦使用了send()函數(shù)期吓,則相當(dāng)于給yield i
發(fā)送了一個值,這個值就會賦值給t倾芝,從而被打印出來讨勤。
??↓send()
和next()
都可以讓程序往下走一步。第一次不能使用send()
晨另!
In [21]: def test():
...: i=0
...: while i<5:
...: t = yield i
...: print(t)
...: i+=1
...:
...: t1=test()
...:
In [22]: t1.send("1123")
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-22-fb04f94f864c> in <module>()
----> 1 t1.send("1123")
TypeError: can't send non-None value to a just-started generator
??↓非要使用潭千,則必須傳遞一個None
!
In [25]: def test():
...: i=0
...: while i<5:
...: t = yield i
...: print(t)
...: i+=1
...:
...: t1=test()
...:
In [26]: t1.send(None)
Out[26]: 0
In [27]: def test():
...: i=0
...: while i<5:
...: if i==0:
...: temp = yield i
...: else:
...: yield i
...: i+=1
...: print(temp)
...:
...: t=test()
...:
In [28]: next(t)
Out[28]: 0
In [29]: t.send("hahah")
hahah
Out[29]: 1
In [30]: next(t)
hahah
Out[30]: 2
In [31]: next(t)
hahah
Out[31]: 3
In [32]: next(t)
hahah
Out[32]: 4
In [33]: next(t)
hahah
??↑如果yield這里有了一個賦值的操作借尿,那么如果不使用send給yield x
發(fā)送一個值刨晴,那么yield x
就會產(chǎn)生一個None,從而給等號左邊的變量賦值一個None,那么完全可以控制好程序的走向路翻,從而把send()
出去的值一直保留下來狈癞?這有什么用呢?茂契?蝶桶??掉冶?真竖?脐雪??恢共?战秋??讨韭?
-
1-4?生成器—完成多任務(wù)
??yield
不是暫停
的概念脂信,而是本輪執(zhí)行結(jié)束
的概念。我結(jié)束了透硝,那執(zhí)行流就交給下一行代碼狰闪。我等待下一次執(zhí)行。
import time
def t1():
while True:
print("t1")
yield None
def t2():
while True:
print("t2")
yield None
t11=t1()
t22=t2()
while True:
t11.__next__()
t22.__next__()
time.sleep(1)
t1
t2
t1
t2
t1
t2
t1
t2
t1
t2
t1
t2
t1
t2
??↑實現(xiàn)的效果就是t1和t2看上去同時執(zhí)行蹬铺。這就叫!秉撇!協(xié)程L鹋省!
??多任務(wù)分:進程琐馆、線程规阀、協(xié)程
。
第2章節(jié)? pdb調(diào)試(命令行)
??如何開啟調(diào)試
python3 -m pdb 名字.py
??交互調(diào)試瘦麸,進入python或ipython解釋器
import pdb
??調(diào)試命令:
??1谁撼、l 。顯示當(dāng)前代碼list(不好使敲個n滋饲,再l)厉碟。
??2、n屠缭。 向下執(zhí)行一行next(不進入函數(shù))箍鼓。
??3、c呵曹。 直接執(zhí)行完畢continue款咖。
??4、b 空格 行數(shù)奄喂。在制定行數(shù)加斷點铐殃。
??5、b跨新。查看斷點序號富腊。
??6、clear 斷點序號域帐。刪除斷點蟹肘。
??7词疼、s。執(zhí)行進入函數(shù)帘腹。
??8贰盗、p 變量。查看變量數(shù)據(jù)阳欲。
??9舵盈、a。查看函數(shù)內(nèi)參數(shù)球化。
??10秽晚、
??↓小寫字母l,查看執(zhí)行流位置
li@li-System-Product-Name:~/py$ python3 -m pdb 2.py
> /home/li/py/2.py(1)<module>()
-> class person(object):
(Pdb) l
1 -> class person(object):
2 def __init__(self, name, age):
3 self.__name = name
4 self.__age = age
5
6 def chaname(self, name):
7 self.__name = name
8
9 def chaage(self, age):
10 if age <=100:
11 self.__age = age
(Pdb)
??↓小寫字母n筒愚,執(zhí)行一步
(Pdb) n
> /home/li/py/2.py(25)<module>()
-> ren = person("xiaom", 14)
(Pdb)
??↓再l看一下
(Pdb) l
20 print(self.__age)
21
22 def getname(self):
23 return self.__name
24
25 -> ren = person("xiaom", 14)
26 ren.priname()
27 ren.priage()
28
29 ren.chaname("aaa")
30 ren.chaage(1111)
(Pdb)
??↓c赴蝇,直接執(zhí)行完畢
li@li-System-Product-Name:~/py$ python3 -m pdb 2.py
> /home/li/py/2.py(1)<module>()
-> class person(object):
(Pdb) c
xiaom
14
輸入的年紀(jì)非法
aaa
14
The program finished and will be restarted
> /home/li/py/2.py(1)<module>()
-> class person(object):
??↓b空格7,回車巢掺,c句伶。設(shè)斷點,執(zhí)行到斷點陆淀。
(Pdb) b 6
Breakpoint 1 at /home/li/py/2.py:6
(Pdb) c
> /home/li/py/2.py(6)person()
-> def chaname(self, name):
(Pdb) l
1 class person(object):
2 def __init__(self, name, age):
3 self.__name = name
4 self.__age = age
5
6 B-> def chaname(self, name):
7 self.__name = name
8
9 def chaage(self, age):
10 if age <=100:
11 self.__age = age
(Pdb)
-
2-1?pdb調(diào)試—
-
3-1?類的初步—定義一個類并創(chuàng)建對象實例
??↑↓類的基本結(jié)構(gòu):
-
1-1?類的初步—定義一個類并創(chuàng)建對象實例
??1-1-1. 導(dǎo)言—用戶管理—用戶的分類及介紹
-
1-2?類的初步—定義一個類并創(chuàng)建對象實例
??1-2-1. 導(dǎo)言—用戶管理—用戶的分類及介紹
第2章節(jié)?
-
2-1?類的初步—定義一個類并創(chuàng)建對象實例
??2-1-1. 導(dǎo)言—用戶管理—用戶的分類及介紹
-
2-2?類的初步—定義一個類并創(chuàng)建對象實例
??2-2-1. 導(dǎo)言—用戶管理—用戶的分類及介紹
第3章節(jié)?
-
3-1?類的初步—定義一個類并創(chuàng)建對象實例
??3-1-1. 導(dǎo)言—用戶管理—用戶的分類及介紹
-
3-2?類的初步—定義一個類并創(chuàng)建對象實例