1. 程式人生 > >攜程函數、遞歸、二分法、import、from。。。import

攜程函數、遞歸、二分法、import、from。。。import

。。 for 空間 打印 name 打開文件 from else 流水線

攜程函數 與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