攜程函數、遞歸、二分法、import、from。。。import
攜程函數 與yield類似 yield:
1:把函數的執行結果封裝好__iter__和__next__,即得到一個叠代器
2:與return功能類似,都可以返回值,但不同的是,return只能 返回一次值,而yield可以返回多次值
3:函數暫停與再繼續運行的狀態是有yield保存
def func(count):
print(‘start‘)
while True:
yield count
count+=1
g=func(10)
print(g)
print(next(g))
print(next(g))
yield的表達式形式的應用
def eater(name):
print(‘%s 說:我開動啦‘ %name)
while True:
food=yield print(‘%s eat %s‘ %(name,food))
alex_g=eater(‘alex‘)
print(alex_g)
print(next(alex_g))
print(‘==============>‘)
print(next(alex_g))
print(‘==============>‘)
print(next(alex_g))
用法: def eater(name):
print(‘%s 說:我開動啦‘ %name) f
ood_list=[]
while True:
food=yield food_list
food_list.append(food) #[‘骨頭‘,‘菜湯‘]
print(‘%s eat %s‘ %(name,food))
alex_g=eater(‘alex‘)
第一階段:初始化 next(alex_g) #等同於alex_g.send(None) print(‘===========>‘)
第二階段:給yield傳值 print(alex_g.send(‘骨頭‘))
#1 先給當前暫停位置的yield傳骨頭
2 繼續往下執行,直到再次碰到yield,然後暫停並且把yield後的返回值當做本次調用的返回值
def eater(name): print(‘%s 說:我開動啦‘ %name) food_list=[] while True: food=yield food_list food_list.append(food) #[‘骨頭‘,‘菜湯‘] print(‘%s eat %s‘ %(name,food))
def producer(): alex_g=eater(‘alex‘)
#第一階段:初始化 next(alex_g)
#第二階段:給yield傳值
while True:
food=input(‘>>: ‘).strip()
if not food:continue
print(alex_g.send(food))
producer()
print(‘===========>‘)
print(alex_g.send(‘菜湯‘))
print(alex_g.send(‘狗肉包子‘))
#解決初始化問題
def init(func):
def wrapper(*args,**kwargs):
g=func(*args,**kwargs)
next(g)
return g
return wrapper
@init def eater(name):
print(‘%s 說:我開動啦‘ %name)
food_list=[]
while True:
food=yield food_list
food_list.append(food) #[‘骨頭‘,‘菜湯‘]
print(‘%s eat %s‘ %(name,food))
alex_g=eater(‘alex‘) 第二階段:給yield傳值 print(alex_g.send(‘骨頭‘))
#1 先給當前暫停位置的yield傳骨頭
2 繼續往下執行,直到再次碰到yield,然後暫停並且把yield後的返回值當做本次調用的返回值 print(‘===========>‘)
面向過程編程
--------------------------------------------------------
面向過程:核心是過程二字,過程即解決問題的步驟,像一條工業流水線,是一種機器式的思維方式 優點:程序結構清晰,可以把負載的問題簡單化,流程化 缺點:可擴展性差,一條線只是用來解決一個問題 應用場景:linux內核,git,httpd,shell腳本 grep -rl ‘error‘ /dir/ 第一階段:找到所有文件的絕對路徑 第二階段:打開文件 第三階段:循環讀出每一行內容 第四階段:過濾 第五階段:打印該行屬於的文件名
--------------------------------------------------------------------
遞歸與二分法
遞歸調用:在調用一個函數的過程中,直接或間接地調用了函數本身 直接
def func():
print(‘from func‘)
func()
func()
間接 def foo():
print(‘from foo‘)
bar()
def bar():
print(‘from bar‘)
foo()
foo()
age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=18
age(n)=age(n-1)+2 #n>1 age(1)=18 #n=1
def age(n): if n == 1: return 18 return age(n-1)+2
print(age(5))
遞歸的執行分為兩個階段: 1 遞推 2 回溯
l =[1, 2, [3, [4, 5, 6, [7, 8, [9, 10, [11, 12, 13, [14, 15,[16,[17,]],19]]]]]]]
def search(l):
for item in l:
if type(item) is list:
search(item)
else:
print(item)
search(l)
二分法
l = [1,2,5,7,10,31,44,47,56,99,102,130,240]
def binary_search(l,num):
print(l) #[10, 31]
if len(l) > 1:
mid_index=len(l)//2 #1
if num > l[mid_index]:
#in the right
l=l[mid_index:] #l=[31]
binary_search(l,num)
elif num < l[mid_index]:
#in the left
l=l[:mid_index]
binary_search(l,num)
else:
print(‘find it‘)
else:
if l[0] == num:
print(‘find it‘)
else:
print(‘not exist‘)
return
binary_search(l,32)
======================================================================
軟件開發規範: 把一個程序分成各個包並且來互相調用功能: bin、conf、core、log、lib、db
======================================================================
模塊與包的使用 import from。。。import
---------------------------------------
導入模塊幹了哪些事: 1、執行源文件 2、以一個源文件的全局名稱空間 3、在當前位置拿到一個模塊名,指向2創建的名稱空間
from。。。improt 優點:使用源文件內的名字是無需加前綴,使用方便 缺點:容易與當前文件的名字混淆
模塊只會在第一次執行時才會導入,之後導入都是直接引用內存裏的東西
模塊搜索路徑: 註意:自定義的模塊名一定不要與python自帶的模塊重名 內存》內置模塊》硬盤中
攜程函數、遞歸、二分法、import、from。。。import