一遞歸函數(shù)
1.什么是遞歸函數(shù)
函數(shù)中調(diào)用函數(shù)本身的函數(shù)就是遞歸函數(shù)
2.遞歸的作用:循環(huán)能做的事情遞歸都能做
3.怎么寫遞歸函數(shù)
第一步:確定臨界值 - 循環(huán)結(jié)束的條件,在臨界值得位置要讓遞歸函數(shù)結(jié)束
第二步:找關(guān)系 - 找當(dāng)次循環(huán)和上次循環(huán)的關(guān)系秕铛;
找f(n)和f(n-1)的關(guān)系
第三步:假設(shè)函數(shù)的功能已經(jīng)實(shí)現(xiàn)约郁,通過f(n-1)來實(shí)現(xiàn)f(n)的功能
例如:求斐波拉切數(shù)列第n個(gè)數(shù)
1,1,2,3,5,8......
def sequence(n):
# 1.找臨界值
if n==1 or n==2:
return 1
# 2.f(n)和f(n-1)
return sequence(n-1)+sequence(n-2)
print(sequence(20))
二.什么是模塊
1.在python中一個(gè)py文件時(shí)就是一個(gè)模塊
a.系統(tǒng)模塊 - 程序員自己創(chuàng)建的py文件(安裝解析器的時(shí)候已經(jīng)導(dǎo)入到解析器中了,使用的時(shí)候在代碼中直接導(dǎo)入)
random模塊 - python系統(tǒng)提供的模塊
json庫 - 提供json 數(shù)據(jù)相關(guān)操作
re模塊 - 提供正則表達(dá)式的相關(guān)操作
socket模塊 - 提供python套接字編程
threading模塊 - 提供和線程相關(guān)的操作
b.自定義模塊
自己寫的模塊:
別人寫的模塊 - 第三方庫(需要下載到解釋器中但两,然后才能在代碼中導(dǎo)入)
標(biāo)準(zhǔn)庫和第三方庫一般是通過模塊提供變量鬓梅、函數(shù)、類
2.怎么使用模塊
import 模塊名 -直接導(dǎo)入指定的模塊谨湘,可以使用模塊中所有的全局變量(包含了函數(shù)绽快、變量芥丧、類)導(dǎo)入后通過'模塊名.變量'來使用模塊中的內(nèi)容
from 模塊名 變量1,變量2
-導(dǎo)入指定的模塊坊罢,只能使用import后邊的變量续担,不用加'模塊名.'
from 模塊名 import* --在程序中導(dǎo)入指定的模塊,并且可以使用里面的所有的全局變量
3.導(dǎo)入模塊的實(shí)質(zhì)
a.不管是使用import還是from-import活孩,導(dǎo)入模塊的時(shí)候都會(huì)執(zhí)行模塊中所有代碼
b.重復(fù)導(dǎo)入模塊只會(huì)執(zhí)行一次物遇,導(dǎo)入模塊是系統(tǒng)會(huì)自動(dòng)檢查是否已導(dǎo)入
4.怎么最值模塊中的內(nèi)容被其他模塊執(zhí)行
將不希望被其他模塊執(zhí)行的代碼放在if name == 'main':語句中
如果
原理:
每個(gè)模塊都有一個(gè)name屬性憾儒,代表模塊名。默認(rèn)情況下值是py文件的文件名
當(dāng)當(dāng)前模塊正在被執(zhí)行(直接執(zhí)行)的時(shí)候诗舰,模塊屬性name就會(huì)變成main
5.重命名 - 導(dǎo)入模塊的時(shí)候可以對(duì)模塊或者模塊中的內(nèi)容重新命名
import 模塊名 as 新模塊名
from 模塊名 import 變量
6.1
什么是迭代器(iter)
是python提供的容器型數(shù)據(jù)類型阳掐。
獲取迭代器中的元素的時(shí)候只能從前往后一個(gè)一個(gè)的取冷蚂,而且取了這個(gè)之后這個(gè)元素在迭代器中就不存在了
2.迭代器的字面量
迭代器沒有指定格式的字面量蝙茶。迭代器作為容器,只能通過轉(zhuǎn)換其他的序列轉(zhuǎn)換钳恕,或者通過生成器生成
迭代器里面的元素可以是任何類型的數(shù)據(jù).
list1=[1,3,4,5,56,]
print(list1[0])
print(list1[1])
將字符串轉(zhuǎn)換成迭代器蹄衷,迭代器中的元素就是字符串中的每一個(gè)字符
iter1=iter('hello')
print(iter1)
iter2= iter([100,'sss',(10,20)],'xiaohua',True,lambda x:x)
print(iter2)
3.獲取元素
(迭代器中的元素只支持查,不支持增刪改睦番。)
迭代器只能通過next函數(shù)獲取單個(gè)元素托嚣,for--in遍歷一個(gè)一個(gè)獲取每一個(gè)元素
不管怎樣的方式獲取厚骗,已經(jīng)獲取的元素在迭代器中不存在
iter3=iter('hello')
print()
# 1.next
next(迭代器) - >獲取迭代器中最新的數(shù)據(jù)(最頂層)
print(next(iter3))
print(next(iter3))
print(next(iter3))
print(next(iter3))
print(next(iter3))
通過for in 取迭代器中的元素和next效果一樣,元素還是會(huì)從迭代器中取出
for x in iter3:
print('x',x)
7.1什么是生成器
生成器就是迭代器夫嗓,迭代器不一定是生成器。
2.生成器怎么產(chǎn)生元素
調(diào)用一個(gè)帶有yield關(guān)鍵字的函數(shù)就能得到生成器
不帶yield的函數(shù):調(diào)用的時(shí)候會(huì)執(zhí)行函數(shù)體煮仇,并獲取返回值
帶有yield的函數(shù):調(diào)用的時(shí)候不會(huì)執(zhí)行函數(shù)體谎仲,也不會(huì)獲取返回值,而是產(chǎn)生一個(gè)生成器(函數(shù)調(diào)用表達(dá)式就是一個(gè)生成器)
這個(gè)生成器中的元素就是yield關(guān)鍵字后邊的值夹姥。
def func1():
print('====')
return 100
print(func1())
def func2():
print('======')
return 100
yield
print(func2()) #<generator object func2 at 0x000000000257A9E8>
3.生成器的元素
生成器中的元素也是通過next或者for-in
生成器獲取元素辙诞,實(shí)質(zhì)是去執(zhí)行生成器對(duì)應(yīng)的函數(shù),每次執(zhí)行到y(tǒng)ield語句為止旦部,并且會(huì)將yield后邊的值作為當(dāng)次獲取道德元素
下次獲取元素的時(shí)候回接著上次結(jié)束的位置往后執(zhí)行较店,直到下一個(gè)yield為止...
以此類推,直到函數(shù)結(jié)束婚度。如果執(zhí)行到函數(shù)結(jié)束沒有yield那就會(huì)報(bào)錯(cuò).