python递归迭代_Python入门基础知识点(python迭代器和递归)
函數(shù)名的使用:
函數(shù)名是一個變量, 但它是一個特殊的變量, 與括號配合可以執(zhí)行函數(shù)的變量
函數(shù)名的內(nèi)存地址:
deffunc():pass
print(func) #函數(shù)的內(nèi)存地址
結(jié)果:
函數(shù)名可以賦值給其他變量:
deffunc():print(1)
a=func
a()
func()#函數(shù)名可以當(dāng)做值賦值給變量
結(jié)果:1
1
函數(shù)名可以當(dāng)做容器類的元素:
deffunc():print(1)deffunc2():print(2)
li=[func,func2]print(li) #函數(shù)名可以當(dāng)做元素放到容器里
結(jié)果:[, ](打印的是函數(shù)的內(nèi)存地址,列表里的函數(shù)可以加括號,打印的是函數(shù)執(zhí)行的結(jié)果,及列表的返回的None)deffunc():print(1)deffunc2():print(2)
li=[func(),func2()]print(li) #函數(shù)名可以當(dāng)做元素放到容器里
結(jié)果:1
2[None, None]
函數(shù)名可以當(dāng)做函數(shù)的參數(shù):
deffunc():print("吃了么")deffunc2(fn):print("我是1")
fn()#執(zhí)行傳遞過來的fn
print("我是2")
func2(func)#把函數(shù)func當(dāng)成參數(shù)傳遞給func2的參數(shù)fn.
結(jié)果: 我是1
吃了么
我是2
函數(shù)名可以作為函數(shù)的返回值
deffunc_1():print("這里是函數(shù)1")deffunc_2():print("這里是函數(shù)2")print("這里是函數(shù)3")returnfunc_2
fn=func_1()#執(zhí)行函數(shù)1. 函數(shù)1返回的是函數(shù)2, 這時fn指向的就是上面函數(shù)2
fn() #執(zhí)行func_2函數(shù)
結(jié)果:
這里是函數(shù)1
這里是函數(shù)3
這里是函數(shù)2
deffunc():defaa():print(2)returnNonereturn aa() #return None#func() # func() == None
print(func())
結(jié)果:2None
例題:
li =[]for i in range(3): #for循環(huán)三次,三次最終結(jié)果i=2
def func(x): #定義函數(shù),形參為x
print(x*i) #打印形參與i(2)相乘的結(jié)果
li.append(func) #將func依此添加到li列表當(dāng)中,循環(huán)三次,添加三個,
#此時,列表里的func雖然外表相同,定義的函數(shù)相同,但內(nèi)存地址不一樣,存在三個內(nèi)存地址
for func in li: #將列表里的函數(shù)循環(huán)出來
func(2) #依此執(zhí)行func函數(shù),實參數(shù)為2
結(jié)果:4
4
4此時我要想將結(jié)果打印為0,2,4,只需定義一個數(shù)即可
li=[]for i in range(3): #for循環(huán)三次,循環(huán)為 i =(0,1,2)
def func(x,y=i): #定義函數(shù),形參為x,y=循環(huán)的 i 值
print(x*y) #打印形參與y(0,1,2)相乘的結(jié)果
li.append(func) #將func依此添加到li列表當(dāng)中,循環(huán)三次,添加三個,
#此時,列表里的func雖然外表相同,定義的函數(shù)相同,但內(nèi)存地址不一樣,存在三個內(nèi)存地址
for func in li: #將列表里的函數(shù)循環(huán)出來
func(2) #依此執(zhí)行func函數(shù),實參數(shù)為2
閉包
什么是閉包? 閉包就是內(nèi)層函數(shù), 對外層函數(shù)(非全局)的變量的引用. 叫閉包
# 1.一個嵌套函數(shù)
# 2.在嵌套函數(shù)的內(nèi)部函數(shù)使用外部(非全局的變量)
# 滿足以上兩條就是閉包
defwrapper():
a= 10
definner():print(a)print(inner.__closure__) #不是None 就是閉包
inner()
wrapper()
結(jié)果:
(,)10
將里邊的函數(shù)名當(dāng)做參數(shù)返回給調(diào)用者
defouter():
name= "alex"
#內(nèi)部函數(shù)
definner():print(name)returninner
fn= outer() #訪問外部函數(shù), 獲取到內(nèi)部函數(shù)的函數(shù)地址
fn() #訪問內(nèi)部函數(shù)
結(jié)果:alex
例:
money = 10
#全局里存放會有污染和不安全的現(xiàn)象
defwrapper():
money= 10
definner(num):global money #從全局調(diào)用money
money +=numprint(money)returninner
wrapper()(100) #第二個括號是return的返回值inner的執(zhí)行,實參為100
# python中閉包,會進(jìn)行內(nèi)存駐留, 普通函數(shù)執(zhí)行完后就銷毀了
# 全局里存放會有污染和不安全的現(xiàn)象
# 面試必問,裝飾器 -- 裝飾器的本質(zhì)就是閉包
# 閉包有個弊端:會出現(xiàn)內(nèi)存泄漏
迭代器
可迭代對象有哪些:str list tuple dic set
可迭代對象:可以被for的就是可迭代對象
# Python 協(xié)議
# 具有.__iter__方法的就是可迭代對象
# a = 對象.__iter__ # 創(chuàng)建一個迭代器
# 具有__iter__和__next__就是一個迭代器
可以for循環(huán)的就有__iter__方法,包括range
.這里的__iter__是幫助我們獲取到對象的迭代器.我們使用迭代器中的__next__()來獲取到一個迭代器的元素
li = [1,2,3]
a= li.__iter__()print(a.__next__())print(a.__next__()) #一個一個取
print(a.__next__())
結(jié)果:1
2
3
我們使用while循環(huán)和迭代器來模擬for循環(huán): 必須要會:
lst = [6,5,4]
l= lst.__iter__()while 1:try:
i= l.__next__()print(i)except StopIteration #當(dāng)遇到報錯的時候,就break退出
break
# 迭代器特性:
# 惰性機(jī)制
# 不能從下向上走
# 一次性的,用完就沒了
小總結(jié):
Iterable: 可迭代對象. 內(nèi)部包含__iter__()函數(shù)
? Iterator: 迭代器. 內(nèi)部包含__iter__() 同時包含__next__().
迭代器的特點:
? 1. 節(jié)省內(nèi)存.
? 2. 惰性機(jī)制
? 3. 不能反復(fù), 只能向下執(zhí)行.
我們可以把要迭代的內(nèi)容當(dāng)成子彈. 然后呢. 獲取到迭代器__iter__(), 就把子彈都裝在彈夾中. 然后發(fā)射就是__next__()把每一個子彈(元素)打出來. 也就是說, for循環(huán)的時候.一開始的 時候是__iter__()來獲取迭代器. 后面每次獲取元素都是通過__next__()來完成的. 當(dāng)程序遇到 StopIteration將結(jié)束循環(huán).
遞歸:
# 1. 自己玩自己 (自己調(diào)用自己本身)
# 2. 玩的有限制 (有明確結(jié)束條件)
count =0deffunc():globalcount
count+= 1
print(count)if count == 4: #當(dāng)count=4時,返回
returnfunc()#產(chǎn)生遞歸現(xiàn)象
func()
打印1到100
deffunc(n):
n+=1
print(n)if n == 100:returnfunc(n)
func(0)
例題:
deffunc(age):print(age) #最后打印4
deffunc1(age):print(age) #3
func(age+1) #執(zhí)行func,實參數(shù)位4
deffunc2(age):print(age) #2
func1(age+1) #執(zhí)行func1,實參數(shù)位3
func2(2)
打印結(jié)果:2
3
4
作業(yè):
1.寫函數(shù),傳入n個數(shù),返回字典{‘max’:最大值,’min’:最小值}
例如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}(此題用到max(),min()內(nèi)置函數(shù))2.寫函數(shù),傳入一個參數(shù)n,返回n的階乘
例如:cal(7) 計算7*6*5*4*3*2*1
3.寫函數(shù),返回一個撲克牌列表,里面有52項,每一項是一個元組
例如:[(‘紅心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]4. 相關(guān)面試題(先從紙上寫好答案,然后在運行):def calc(a,b,c,d=1,e=2):return (a+b)*(c-d)+e
請分別寫出下列標(biāo)號代碼的輸出結(jié)果,如果出錯請寫出Error。print(calc(1,2,3,4,5))_____
print(calc(1,2))____
print(calc(e=4,c=5,a=2,b=3))___
print(calc(1,2,3))_____
print(calc(1,2,3,e=4))____
print(calc(1,2,3,d=5,4))_____下面代碼打印的結(jié)果分別是_________,________,________.def extendList(val,list=[]):
list.append(val)returnlist
list1= extendList(10)
list2= extendList(123,[])
list3= extendList('a')print('list1=%s'%list1)print('list2=%s'%list2)print('list3=%s'%list3)5.寫代碼完成99乘法表.(升級題)1 * 1 = 1
2 * 1 = 2 2 * 2 = 4
3 * 1 = 3 3 * 2 = 6 3 * 3 = 9......9 * 1 = 9 9 * 2 = 18 9 * 3 = 27 9 * 4 = 36 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
總結(jié)
以上是生活随笔為你收集整理的python递归迭代_Python入门基础知识点(python迭代器和递归)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩转oracle 11g(1):Orac
- 下一篇: 启动python内核时发生错误_启动内核