python-学习 协程函数 模块与包
?一、協(xié)程函數(shù) ?
yield的用法:
1:把函數(shù)的執(zhí)行結(jié)果封裝好__iter__和__next__,即得到一個(gè)迭代器2:與return功能類似,都可以返回值,但不同的是,return只能返回一次值,而yield可以返回多次值
3:函數(shù)暫停與再繼續(xù)運(yùn)行的狀態(tài)是有yield保存 1 # 例子1 2 # def chi(name): 3 # print('%s 開始上菜啦~'%name) 4 # cd=[] #菜單 5 # while True: 6 # food=yield cd 7 # cd.append(food) 8 # print('%s上了一份%s'%(name,food)) 9 # print(cd) 10 # esa=chi('alex') 11 # esa.send('芹菜') 12 # 例子2 13 # def chi(name): 14 # print('%s 開始上菜啦~'%name) 15 # cd=[] #菜單 16 # while True: 17 # food=yield cd 18 # cd.append(food) 19 # print('%s上了一份%s'%(name,food)) 20 # def shui(): 21 # name = input('服務(wù)員名字>>: ').strip() 22 # while True: 23 # food=input('菜名>>: ').strip() 24 # sc=chi(name) 25 # next(sc)#初始化:就是讓函數(shù)執(zhí)行停到y(tǒng)ield 26 # if not food or not name :continue 27 # sc.send(food)#給yield傳值 28 # shui() 例子
通過裝飾器初始化:
1 def chushi(func): 2 def hua(*args,**kwargs): 3 g=func(*args,**kwargs) 4 next(g) 5 return g 6 return hua 7 @chushi 8 def chi(name): 9 print('%s 開始上菜啦~'%name) 10 cd=[] #菜單 11 while True: 12 food=yield cd 13 cd.append(food) 14 print('%s上了一份%s'%(name,food)) 15 print(cd) 16 esa=chi('alex') 17 esa.send('芹菜') 18 19 20 21 #例子2 22 # def chushi(func): 23 # def hua(*args,**kwargs): 24 # g=func(*args,**kwargs) 25 # next(g) 26 # return g 27 # return hua 28 # @chushi 29 # def chi(name): 30 # print('%s 開始上菜啦~'%name) 31 # cd=[] #菜單 32 # while True: 33 # food=yield cd 34 # cd.append(food) 35 # print('%s上了一份%s'%(name,food)) 36 # def shui(): 37 # name = input('服務(wù)員名字>>: ').strip() 38 # while True: 39 # food=input('菜名>>: ').strip() 40 # sc=chi(name) 41 # # next(sc)#初始化:就是讓函數(shù)執(zhí)行停到y(tǒng)ield 42 # if not food or not name :continue 43 # sc.send(food)#給yield傳值 44 # shui() 例子二、面向過程編程
面向過程:核心是過程二字,過程即解決問題的步驟,基于面向過程去設(shè)計(jì)程序就像是在設(shè)計(jì)
一條工業(yè)流水線,是一種機(jī)械式的思維方式
優(yōu)點(diǎn):程序結(jié)構(gòu)清晰,可以把復(fù)雜的問題簡單化,流程化
缺點(diǎn):可擴(kuò)展性差,一條流線只是用來解決一個(gè)問題
應(yīng)用場景:linux內(nèi)核,git,httpd,shell腳本
三、遞歸與二分法
遞歸調(diào)用:在調(diào)用一個(gè)函數(shù)的過程中,直接或間接地調(diào)用了函數(shù)本身
1 #直接 2 # def func(): 3 # print('from func') 4 # func() 5 # 6 # func() 7 8 #間接 9 # def foo(): 10 # print('from foo') 11 # bar() 12 # 13 # def bar(): 14 # print('from bar') 15 # foo() 16 # 17 # foo() 例子 遞歸的執(zhí)行分為兩個(gè)階段:
1 遞推
2 回溯
二分法
1 #例子1 2 l = [1,2,5,7,10,31,44,47,56,99,102,130,240] 3 4 5 def binary_search(l,num): 6 print(l) [10, 31] 7 if len(l) > 1: 8 mid_index=len(l)//2 1 9 if num > l[mid_index]: 10 in the right 11 l=l[mid_index:] l=[31] 12 binary_search(l,num) 13 elif num < l[mid_index]: 14 in the left 15 l=l[:mid_index] 16 binary_search(l,num) 17 else: 18 print('find it') 19 else: 20 if l[0] == num: 21 print('find it') 22 else: 23 print('not exist') 24 return 25 26 binary_search(l,32) 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 #例子2 45 l = [1,2,5,7,10,31,44,47,56,99,102,130,240] 46 47 48 def binary_search(l,num): 49 print(l) 50 if len(l) == 1: 51 if l[0] == num: 52 print('find it') 53 else: 54 print('not exists') 55 return 56 mid_index=len(l)//2 57 mid_value=l[mid_index] 58 if num == mid_value: 59 print('find it') 60 return 61 if num > mid_value: 62 l=l[mid_index:] 63 if num < mid_value: 64 l=l[:mid_index] 65 binary_search(l,num) 66 67 binary_search(l,32) 例子四、模塊與包
1.模塊只在第一次導(dǎo)入時(shí)才會(huì)執(zhí)行,之后的導(dǎo)入都是直接引用內(nèi)存已經(jīng)存在的結(jié)果
模塊搜索路徑:
內(nèi)存中--》內(nèi)置模塊————》sys.path
注意:自定義的模塊名一定不要與python自帶的模塊名重名
2.什么是模塊
? ?常見的場景:一個(gè)模塊就是一個(gè)包含了python定義和聲明的文件,文件名就是模塊名字加上.py的后綴。
? ?但其實(shí)import加載的模塊分為四個(gè)通用類別:
1 使用python編寫的代碼(.py文件)
2 已被編譯為共享庫或DLL的C或C++擴(kuò)展
3 包好一組模塊的包
4 使用C編寫并鏈接到python解釋器的內(nèi)置模塊
3.import的導(dǎo)入
1 #spam.py 2 print('from the spam.py') 3 4 money=1000 5 6 def read1(): 7 print('spam->read1->money',money) 8 9 def read2(): 10 print('spam->read2 calling read') 11 read1() 12 13 def change(): 14 global money 15 money=0 span.py導(dǎo)入span模塊
1 #test.py 2 import spam #只在第一次導(dǎo)入時(shí)才執(zhí)行spam.py內(nèi)代碼,此處的顯式效果是只打印一次'from the spam.py',當(dāng)然其他的頂級(jí)代碼也都被執(zhí)行了,只不過沒有顯示效果. 3 import spam 4 import spam 5 import spam 6 ''' 7 執(zhí)行結(jié)果: 8 from the spam.py 9 ''' 例子可以使用__all__來控制*(用來發(fā)布新版本)
在spam.py中新增一行
__all__=['money','read1'] #這樣在另外一個(gè)文件中用from spam import *就這能導(dǎo)入列表中規(guī)定的兩個(gè)名字
4.rom.......import的導(dǎo)入
優(yōu)點(diǎn):使用源文件內(nèi)的名字時(shí)無需加前綴,使用方便
缺點(diǎn):容易與當(dāng)前文件的名稱空間內(nèi)的名字混淆
5.絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入
1 在glance/api/version.py 2 3 #絕對(duì)導(dǎo)入 4 from glance.cmd import manage 5 manage.main() 6 7 #相對(duì)導(dǎo)入 8 from ..cmd import manage 9 manage.main() 例子?
1. 無論是import形式還是from...import形式,凡是在導(dǎo)入語句中(而不是在使用時(shí))遇到帶點(diǎn)的,都要第一時(shí)間提高警覺:這是關(guān)于包才有的導(dǎo)入語法
2. 包是目錄級(jí)的(文件夾級(jí)),文件夾是用來組成py文件(包的本質(zhì)就是一個(gè)包含__init__.py文件的目錄)
3. import導(dǎo)入文件時(shí),產(chǎn)生名稱空間中的名字來源于文件,import 包,產(chǎn)生的名稱空間的名字同樣來源于文件,即包下的__init__.py,導(dǎo)入包本質(zhì)就是在導(dǎo)入該文件
強(qiáng)調(diào):
1. 在python3中,即使包下沒有__init__.py文件,import 包仍然不會(huì)報(bào)錯(cuò),而在python2中,包下一定要有該文件,否則import 包報(bào)錯(cuò)
2. 創(chuàng)建包的目的不是為了運(yùn)行,而是被導(dǎo)入使用,記住,包只是模塊的一種形式而已,包即模塊
轉(zhuǎn)載于:https://www.cnblogs.com/ikere/p/7280145.html
總結(jié)
以上是生活随笔為你收集整理的python-学习 协程函数 模块与包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uva 11400 - Lighting
- 下一篇: 提供openssl -aes-256-c