Day11
一谤牡、 遞歸
1实柠、 什么是遞歸函數(shù)
在函數(shù)體內(nèi)調(diào)用函數(shù)本身的函數(shù)就是遞歸函數(shù)
實(shí)際開發(fā)的時候婆翔,能不用就不用
2拯杠、 遞歸的作用:循環(huán)能做的事情遞歸函數(shù)都能做
3、 怎么寫遞歸函數(shù):f(n)
第一步:確定臨界值 - 循環(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)的功功能
4、 循環(huán)能做的事情不能用遞歸做
def func1(x):
print(x)
if x != 0:
x -= 3
func1(x)
func1(3)
def sum_digui(n):
if n == 1:
return 1
return sum_digui(n - 1) + n
print(sum_digui(100))
練習(xí):斐波那契序列第N個數(shù)
def feibo(n):
# 找臨界值
if n == 1 or n == 2:
return 1
# 找關(guān)系
# f(n) = f(n-1) + f(n-2)
return feibo(n - 1) + feibo(n - 2)
print(feibo(6))
二纺腊、 模塊
1畔咧、 什么是模塊
在python中一個py文件就是模塊
a. 系統(tǒng)模塊 - python系統(tǒng)提供的模塊
random - 提供隨機(jī)數(shù)
math - 提供數(shù)學(xué)運(yùn)算
json庫 - 提供json數(shù)據(jù)相關(guān)操作
re - 提供正則表達(dá)式相關(guān)操作
socket - 提供python套接字編程
time - 提供和時間相關(guān)的操作
threading - 提供和線程相關(guān)的操作
b. 自定義模塊 - 程序員自己創(chuàng)建的py文件,又叫第三方模塊
自己寫的模塊
別人寫的模塊 - 第三方庫"(需要先下載到解釋器中揖膜,然后才能在代碼中導(dǎo)入)
標(biāo)準(zhǔn)款和第三庫一般是通過模塊提供變量誓沸、函數(shù)、類
2壹粟、 怎么使用模塊
import 模塊名 -- 直接導(dǎo)入指定的模塊拜隧,導(dǎo)入后可以使用模塊中所有的全局變量(包含了變量、函數(shù)趁仙、類)
導(dǎo)入后通過‘模塊名.變量’來使用模塊中的內(nèi)容
from 模塊名 import 變量1,洪添,變量2 …… - 在程序中導(dǎo)入指定的模塊,導(dǎo)入后只能使用import后面的變量
導(dǎo)入后直接使用變量雀费,不用在前面加‘模塊名.’
from 模塊名 import * -- 導(dǎo)入模塊名中所有的變量
3干奢、 導(dǎo)入模塊的實(shí)質(zhì):
a. 不管是使用import還是from-import,導(dǎo)入模塊的時候都會執(zhí)行模塊中的所有代碼
b. python中一個模塊不會重復(fù)導(dǎo)入多次盏袄。因?yàn)閷?dǎo)入的時候系統(tǒng)會自動檢查當(dāng)前模塊是否導(dǎo)入
4忿峻、 怎么組織模塊中的內(nèi)容被其他模塊執(zhí)行
if name ='main': 寫在這個if語句中的代碼不會別的模塊中執(zhí)行
如果希望被其他模塊使用的代碼就放在if語句的外面
原理:每個模塊中都有一個name屬性,代表模塊名辕羽。默認(rèn)情況下它的值是py文件的的文件名
當(dāng)當(dāng)前模塊正在被執(zhí)行(直接執(zhí)行0的時候逛尚,模塊屬性name的值就會變成'main'
5、 重命名 - 導(dǎo)入模塊的時候可以對模塊或者模塊中的內(nèi)容重新命名
import 模塊名 as 新模塊名
form 模塊名 import 變量名1 as 新變量名1刁愿,變量名2 绰寞,變量名3 as 新變量名3
import time
print(time.localtime())
if __name__ == '__main__':
print('123')
import tets1
三、 迭代器
1、 什么是迭代器(iter)
是python提供的容器型數(shù)據(jù)類型克握。
獲取迭代器中的元素的時候蕾管,只能從前往后一個一個的取,而且去了之后這個元素在迭代器中菩暗,在迭代器中就不存在了
2掰曾、 迭代器的字面量
迭代器沒有指定格式的字面量。迭代器作為容器停团,里面的元素只能通過請他序列轉(zhuǎn)換旷坦,或者通過生成器生成。
3佑稠、獲取元素(迭代器中的元素只支持查秒梅,不支持增刪改)
迭代器是通過next函數(shù)獲取單個元素,for-in遍歷一個一個獲取所有元素舌胶。
不管哪種方式獲取捆蜀,已經(jīng)獲取過的元素,在迭代器中就不存在幔嫂。
# 將字符串轉(zhuǎn)換成迭代器辆它,迭代器中的元素就是字符串中的每個字符
iter1 = iter('hello')
print(iter1)
# 將列表轉(zhuǎn)換成迭代器,迭代器中的元素就是列表中的每個字符
iter2 = iter([100,'qw'])
print(iter2)
next(迭代器) -> 獲取迭代器中最新的數(shù)據(jù)
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
# print(next(iter1)) # 報(bào)“stopIteration”異常履恩,因?yàn)樵谶@兒迭代器中的數(shù)據(jù)已經(jīng)取完了
# 通過for-in取迭代器中的元素和next效果一樣锰茉,元素還是會從迭代器中取出
for x in iter2:
print(x)
四、 生成器
1切心、 什么是生成器
生成器就是迭代器飒筑,迭代器不一定是生成器
2、 生成器是怎么產(chǎn)生元素
調(diào)用一個帶有yield關(guān)鍵字的函數(shù)就能得到一個生成器
不帶yield的函數(shù):調(diào)用的時候會執(zhí)行函數(shù)體绽昏,并且獲取返回值
帶yield的函數(shù):調(diào)用的時候不會執(zhí)行函數(shù)體协屡,也不會獲取返回值,而是產(chǎn)生一個生成器(此時的函數(shù)調(diào)用表達(dá)式就是換一個生成器)
這個生成器中的元素就是yield關(guān)鍵字后面的值
3全谤、 生成器中的元素
生成器中的元素也是通過next或者for-in
生成器獲取元素肤晓,實(shí)質(zhì)就是去執(zhí)行生成器對應(yīng)的函數(shù),每次執(zhí)行到y(tǒng)ield語句為止啼县,并且會將yield后面值作為當(dāng)次獲取到的元素。
下次獲取元素的時候會接著上次結(jié)束的位置往后執(zhí)行沸久,直到下一個yield季眷,
依次類推,直到函數(shù)調(diào)用結(jié)束卷胯。如果執(zhí)行到函數(shù)結(jié)束沒有遇到y(tǒng)ield那么就會報(bào)‘Stopxxxx’異常
def func1():
print('====')
return 100
print(func1())
def func2():
print('!!!!!')
yield
return 100
print(func2())
gen1 = func2()
next(gen1)
# 120101 - 120199
def creat_num():
num = 1
while True:
yield ('1201%d'% num)
num += 1
num_gen =creat_num()
st = []
for _ in range(10):
st.append(next(num_gen))
print(st[1])