函式的遞迴呼叫
函式在呼叫階段間接或直接又呼叫了自己
遞迴:遞推:基於回溯的結果,一步一步往上推
二分法:
演算法:高效率解決問題的方法
二分法必須基於乙個有順序的容器型別
判斷某個值在不在容器裡面
每次擷取上一次容器型別一半進行比較
三元表示式:
結果一 if 條件 else 結果二
只有結果為2個可能性的情況下就可以用三元表示式
匿名函式
沒有名字的函式
關鍵字lambda
lambda 形參:返回值
1.當場定義當場呼叫
(lambda 形參:返回值)()
2.給匿名命名
func = lanbda 形參:返回值
func()
3.匿名函式通常是配合其他函式一起使用的(內建函式,自定義函式)
常見的內建函式
max:內部基於for迴圈的,先乙個乙個將傳入的容器型別的元素乙個個取出,如果沒有指定key(key對應著乙個函式)那麼就根據取出的元素乙個個進行比較得出最大的值。如果指定了key,那麼max會將元素交給這個函式,拿函式的返回值進行比較,但出來的結果還是傳入的結果
min:同上,求出最小值
sum:求和
map:對映關係,乙個個成對應map(匿名函式,容器物件)
filter:過濾
zip:拉鍊,也是一一對應,返回出來的是乙個元祖
sorted:排序,裡面可以指定rerverse=true可以使其反轉,預設是false
reduce:是將多個值變成乙個值,reduce(匿名函式,物件,預設值)不指定預設值的話那麼就拿容器的第一和第二個進行比較
迭代器:
所以說迭代器就是重複過程的工具
可迭代物件:
內建有__iter__方法的物件就是可迭代物件
迭代器物件:
內建有__iter__方法和__next__方法的就是迭代器物件
迭代器物件裡面的呼叫__iter__方法得到的是自身,然後可迭代物件呼叫__iter__方法得到的結果就是迭代器物件
count =0
while count < 3:
print(111)
count+=1
這個就可以說是乙個迭代器
迭代器物件呼叫__next__方法可以進行取值
迭代器物件一定是可迭代物件,但可迭代物件一定不是迭代器物件
迭代器優缺點:
優點:不依賴索引取值,減少記憶體空間,不會記憶體溢位
缺點:不能取出指定的元素,取完後會報錯,需要try處理。
特點:只能依次往後進行取值,不能後退
迭代器的取值:
ls = [1,2,3,4]
iter_l = ls.__iter__() 生成乙個迭代器物件
print(iter_l.__next__())進行取值
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__())
print(iter_l.__next__()) 如果已經去完了就會報錯stopiteration
for迴圈的in後面的跟著的是乙個可迭代物件
for迴圈執行的步驟:
1.將in後面的可迭代物件執行__iter__方法轉換成迭代器物件
2.呼叫__next__方法進行迭代取值
3.進行異常處理
其本質上也是乙個迭代器,但是乙個自定義的迭代器。
其內部有yield的關鍵字
如果在函式內部有yield關鍵字,那麼這個函式在函式名加括號呼叫的時候,不會執行其函式體**,會將其轉換成乙個生成器,這也可以說是,生成器初始化,將函式變成乙個迭代器
例子:
deffunc():
print('
2222')
yield
print('
33333')
yield
..........
res = func()生成器初始化
這樣在res.__next__()就可以進行取值,但會返回乙個none,yield後面可以跟值,yield後面跟的值,就是呼叫__next__()獲取到的您可以得到的值。
yield後面可以跟多個值,返回的會打包成乙個元祖。
另外yield會暫停函式的執行狀態。
yield支援外界傳參defdog(name):
print('
%s 準備開吃
'%name)
while
true:
food = yield
print('
%s 吃了 %s
'%(name,food))
g = dog('
owen')
g.__next__() #
必須將**執行至yield才能夠為其傳值
然後用關鍵字send從外界為其傳值
g.send('火腿
') #
給yield的左邊變數傳參,觸發了__next__方法
g.send('
大雞腿')
yield總結:
1.能夠將自定義的函式變成乙個生成器,提供了一種自定義生成器的方式
2.yield能夠將函式的執行狀態給暫停住
3.能夠支援外界給其傳參,關鍵字send
4.yield可以有返回值
與return的異同點:
相同之處:都有返回值,並能夠返回多個值
不同點:yield能夠暫停函式的執行狀態,並且yield可以返回多次值,但return只能返回一次值,並且立即結束函式。yield可以有外界進行傳參
chr():是將數字轉為ascill表對應的字元
ord():是將字元轉為ascill表對應的數字
div():是返回當前物件命名空間的裡面的可呼叫的名字
divmod()是分頁器
callable()是可以判斷是不是乙個可呼叫(加括號可以執行其相應的功能)的物件
all()裡面的物件只要有乙個為false那麼將為false
any()裡面的物件只要有乙個為true,那麼就都為true
help()檢視物件裡面的注釋內容
exec():字串執行python**,支援多行,並且只要是支援python語法的都能夠被執行,並且會將執行**過程中產生的名字放入某個命名空間裡面
eval():字串執行python**,但不支援語法,只能做簡單的表示式
isinterance判斷物件是不是什麼型別(object,型別)
str()轉為字串
int()轉為整型
面向過程概念:
面向過程就是一條流水線式的寫**,就是先乾這個在幹那個,一步一步往下面走。
優點:就是將複雜的問題流程化,將其簡單化了
建議是在寫好不用去更改的場景下去使用面向過程,如linux的核心,就是寫好後不用去更改的場景
生成器 迭代器
最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。想深入具體學習廖大部落格請移步廖雪峰的官方 有時候用迴圈生成列表太過繁...
迭代器,生成器
迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...
迭代器 生成器
迭代器 iter 可迭代物件 下乙個元素的值 next 可迭代物件 類中實現 iter 方法 提供迭代器 實現迭代器 import time class mylistiter object 迭代器類 def init self,data self.data data self.index 0 def...