一魂那、遞歸函數(shù)
實際開發(fā)時候仓蛆,能不用遞歸就不用
1.什么是遞歸函數(shù)
函數(shù)中調(diào)用函數(shù)本身的函數(shù)就是遞歸函數(shù)
2.遞歸的作用
循環(huán)能做的事情历谍,遞歸函數(shù)都能做
a = 0
def func2():
global a
if a < 5:
print('~~~~~')
a += 1
func2()
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)實現(xiàn)南吮,通過f(n-1)來實現(xiàn)f(n)的功能
def f(n):
# 1 找臨界值
if n == 1:
return 1
# 2.找關(guān)系
"""
f(n) = f(n-1) + n
"""
return f(n-1)+n
print(f(100))
4.循環(huán)能做的事情不能用遞歸做!
原因:
遞歸函數(shù):每次調(diào)用函數(shù)本身誊酌,都會在棧區(qū)間開辟一塊空間部凑,并且不會釋放,直到找到臨界點碧浊,嚴(yán)重消耗內(nèi)存
循環(huán):開辟一塊空間涂邀,反復(fù)改變里面的值
二、模塊
1.什么是模塊
在python中一個.py文件就是一個模塊
分類:
a.系統(tǒng)模塊(標(biāo)準(zhǔn)庫):系統(tǒng)提供的模塊(安裝解釋器時箱锐,已經(jīng)導(dǎo)入到解釋器中,直接使用即可)
random
作用:提供隨機(jī)數(shù)
math
作用:提供數(shù)學(xué)運算相關(guān)的方法
json庫
作用:提供json相關(guān)操作
re
作用:提供正則表達(dá)式的操作
socket
作用:提供python的套接字編程
time
作用:提供和時間相關(guān)的操作
threading
作用:提供和線程相關(guān)的操作
b.自定義模塊:
自己創(chuàng)建的py文件
分類:
1.自己寫的模塊
2.別人寫的模塊:第三方庫(需要先下載到解釋器中比勉,然后才能在代碼中導(dǎo)入)
補充:標(biāo)準(zhǔn)庫和第三方庫一般是通過模塊提供變量、函數(shù)驹止、類
2.怎么使用模塊
寫法:import 模塊名(庫名)
作用:直接導(dǎo)入指定的模塊浩聋,導(dǎo)入后可以使用模塊中所有的全局變量
(包含了變量、函數(shù)和類)
使用:模塊名.變量 -> 來使用模塊中的內(nèi)容
寫法:from 模塊名 import 變量1臊恋,變量2
作用:在程序中導(dǎo)入指定的模塊衣洁,導(dǎo)入后只能使用import后面的變量
使用:直接使用變量,無需加’模塊名.‘
寫法:from 模塊名 import *
使用:直接使用變量抖仅,無需加’模塊名.‘
導(dǎo)入模塊的實質(zhì):
a.不管是使用import還是from-import,導(dǎo)入模塊的時候都會執(zhí)行模塊中所有的代碼
b.python中一個模塊不會重復(fù)導(dǎo)入多次坊夫,因為導(dǎo)入時,系統(tǒng)會自動檢查當(dāng)前模塊是否已經(jīng)導(dǎo)入
4.怎么阻止模塊中的內(nèi)容被其他模塊執(zhí)行
如果不希望被其他模塊執(zhí)行的代碼放在if語句中撤卢,
如果希望被其他模塊使用的代碼就放在if語句外面
(這里的if語句指的是:if __name__ == '__main__':)
原理:每個模塊都有一個name屬性环凿,代表模塊名,默認(rèn)情況下它的值是py文件的文件名凸丸,當(dāng)當(dāng)前模塊正在被執(zhí)行(直接執(zhí)行)的時候拷邢,它的屬性__name__的值就會變成__main__
# 1.系統(tǒng)模塊
import random
print(random.randint(1, 199))
# 自定義模塊
import model1
model1.a = 1000
print(model1.a)
print(model1.fun1())
# 不用模塊名.方法就能調(diào)用模塊中的一些變量
from model2 import aa, x # 不能是強制使用
print('aa:', aa)
print(x) # 9
# 不用模塊名.方法就能調(diào)用模塊中所有變量
from model2 import * # *是通配符
print(aa)
print(x)
5.重命名
目的:導(dǎo)入模塊時,可以對模塊或者模塊中的內(nèi)容重新命名
寫法:
a.import 模塊名 as 新模塊名
b.from 模塊名 import 變量1 as 新變量1屎慢,變量2 as 新變量2
應(yīng)用:當(dāng)模塊名很長時瞭稼,可以使用此方法
# 修改模塊名
import model4 as newMode
print(model4.age)
# 修改模塊中的內(nèi)容
name = 100
from model4 import name as new_name, age as new_age
print(name)
print(new_name)
print(new_age)
三、迭代器
1.什么是迭代器(iter)
定義:python中提供的容器型數(shù)據(jù)類型
特點:
a.從前往后一個一個的取
b.取出后腻惠,迭代器中不復(fù)存在
2.迭代器的字面量
a.迭代器沒有指定格式的字面量
b.迭代器元素的產(chǎn)生:
1.通過其他序列轉(zhuǎn)換环肘,
2.通過生成器產(chǎn)生
元素:任意數(shù)據(jù)類型
# 將字符串轉(zhuǎn)換成迭代器,元素就是字符串中的每個字符
iter1 = iter('hello')
print(iter1)
# 將列表轉(zhuǎn)換成迭代器集灌,元素就是列表中的每個元素
iter2 = iter([100, 'dfd', (10, 39), [1, 2], {'a': 10, 'b': 20}, lambda x: x])
print(iter2)
3.獲取元素
元素特點:只支持查悔雹,不支持增刪改
獲取方式:
1.next函數(shù)
寫法:next(迭代器名)
目的:獲取迭代器中最新(最頂層)的數(shù)據(jù)
2.for 變量 in 迭代器
作用:遍歷獲取每一個元素
# next
iter3 = iter('hello')
print(next(iter3))
print(next(iter3))
print(next(iter3))
print(next(iter3))
print(next(iter3))
# print(next(iter3)) # 報錯 StopIteration 因為迭代器中的數(shù)據(jù)已經(jīng)取完
# 通過for - in 取迭代器中的元素和next效果一樣复哆,元素還是會被取出
iter3 = iter('123456')
print(next(iter3))
for x in iter3:
print('x': x)
注意:迭代器元素取完,迭代器不會消失
四腌零、生成器
1.什么是生成器
生成器就是迭代器梯找,迭代器不一定是生成器
2.生成器怎么產(chǎn)生元素
如何產(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)鍵字后面的值
def func1():
print('===')
return 100
print(func1()) # 100
def func2():
print('===')
return 100
yield
print(func2()) # <generator object func2 at 0x006F7ED0>
3.獲取生成器中的元素
使用:
1.next()
2.for 變量 in 生成器
重點O醒>妹狻!
原理:
第一步:執(zhí)行生成器對應(yīng)的函數(shù)
第二步:每次都是執(zhí)行到y(tǒng)ield語句為止扭弧,并且會將yield后面的值作為當(dāng)次獲取到的元素
第三步:下次獲取元素會接著上次結(jié)束的位置阎姥,接著執(zhí)行,直到下一個yield為止
第四步:以此類推鸽捻,直到函數(shù)結(jié)束呼巴,如果執(zhí)行函數(shù)結(jié)束沒有遇到y(tǒng)ield,那么就會報"stopxxxx"異常
一個yield是獲取一個元素
幾個yield就是獲取幾個元素
len(迭代器)無效泊愧,因為元素都是臨時取用
print('=================')
def func3():
print('~~~~~')
yield 100
gen1 = func3() # gen1就是一個生成器
# next()
print(gen1)
print('打印', next(gen1))
# 練習(xí):給每個學(xué)生一個學(xué)號伊磺,并且不會重復(fù)
def creat_num():
num = 1
while True:
yield 'py1809%d' % num
num += 1
num_gen = creat_num()
for _ in range(10):
print(next(num_gen))
print('新來的學(xué)生')
print(next(num_gen))
實現(xiàn)一個屬于自己的迭代器方法
def pu_iter(seq):
for x in seq:
yield x
iter1 = pu_iter('abc')
print(next(iter1)) # a
print(next(iter1)) # b
print(next(iter1)) # c