day11 遞歸函數(shù) 模塊 生成器 迭代器

"""
1.函數(shù)的聲明
def 函數(shù)名(參數(shù)列表):
函數(shù)體

lambda 參數(shù)列表: 返回值

(重點(diǎn))函數(shù)聲明的時(shí)候函數(shù)體不會(huì)執(zhí)行!

2.函數(shù)調(diào)用
函數(shù)名() <---> 變量() - 要求變量中存儲(chǔ)的地址對(duì)應(yīng)的值是function

調(diào)用過程:
回到函數(shù)聲明的位置
傳參 - 保證每個(gè)參數(shù)都有值
執(zhí)行函數(shù)體
確定返回值
回到函數(shù)調(diào)用的位置

3.函數(shù)的參數(shù)
位置參數(shù)和關(guān)鍵參數(shù)
參數(shù)默認(rèn)值
參數(shù)類型說明
不定長參數(shù)

4.返回值
怎么確定函數(shù)的返回值
怎么獲取函數(shù)的返回值 - 函數(shù)調(diào)用表達(dá)式

5.全局變量和局部變量
6.函數(shù)作為量: 聲明函數(shù)就是聲明一個(gè)類型是function的變量擒权,函數(shù)名就是變量名
"""
def func1():
return 10

a = 10

func1和a是一樣的毁腿,都是變量

print(a - 1)
print(func1())

a = [1, 2]
print(a[0])

func1 = 'abc'
print(func1[0])

lambda x: x 和 10是一樣的蜀备,都是值

num = 10
list1 = [10]

func2 = lambda x: x
list2 = [lambda x: x]

func2(10)
list20

def yt_sums(*num):
"""求多個(gè)數(shù)的和"""
# num = (1, 2, 3, 4)
sum1 = 0
for x in num:
sum1 += x
return sum1

def yt_product(*num):
sum1 = 1
for x in num:
sum1 *= x
return sum1

print(yt_sums(1, 2, 3))

print(yt_product(2, 4, 6))

def opration(char: str, nums):
# char = '+', nums = (1, 2, 3, 4) nums 相當(dāng)于 1, 2, 3, 4
if char == '+':
return yt_sums(
nums) # yt_sums(1,2,3,4)
else:
return yt_product(
nums)

print(opration('+', 1, 2, 3, 4))
print(opration('*', 1, 2, 3, 4))

(了解!)

"""
實(shí)際開發(fā)的時(shí)候穿挨,能不用遞歸就不用
1.什么是遞歸函數(shù)
函數(shù)中調(diào)用函數(shù)本身的函數(shù)就是遞歸函數(shù)

2.遞歸的作用:循環(huán)能做的事情遞歸函數(shù)都能做
"""

def func1():
print('====')
func1()

a = 0

def func2():
global a
if a < 5:
print('~~~~~')
a += 1
func2()

"""
func2()

0 < 5:  a = 1   func2()

1 < 5 a = 2 func2()

2 < 5    a = 3   func2()

3 < 5 a = 4 func2()

4 < 5    a = 5   func2()

5 < 5

"""
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ù)f的功能已經(jīng)實(shí)現(xiàn)豫领,通過f(n-1)來實(shí)現(xiàn)f(n)的功能
"""

實(shí)現(xiàn):1+2+3+...+n

a.for循環(huán)

n = 20

# sum1 = 0

# for x in range(n+1):

# sum1 += x

# print(sum1)

b.遞歸

def yt_sum(n):
# 1.找臨界值
if n == 1:
return 1

# 2. 找關(guān)系
"""
找yt_sum(n)和yt_sum(n-1)的關(guān)系
yt_sum(n): 1+2+3+...+n-1+n
yt_sum(n-1): 1+2+3+...n-1
yt_sum(n) = yt_sum(n-1)+n
"""
return yt_sum(n-1)+n

"""
yt_sum(4):
n = 4 4==1 return yt_sum(3)+4 ---> return 1+2+3+4
yt_sum(3):
n = 3 3==1 return yt_sum(2)+3 ---> return 1+2+3
yt_sum(2):
n = 2 2==1 return yt_sum(1)+2 ---> return 1+2
yt_sum(1):
n = 1 1==1 return 1
"""
print(yt_sum(4))
print(yt_sum(100))

練習(xí): 求斐波那契數(shù)列第n個(gè)數(shù)

1, 1, 2, 3, 5, 8, 13....

def sequence(n):
# 1.找臨界值
if n == 1 or n == 2:
return 1
# 2. f(n)和f(n-1)
"""
f(n) = f(n-1)+f(n-2)
"""
return sequence(n-1)+sequence(n-2)

print(sequence(5))

"""
4.循環(huán)能做的事情不能使用遞歸做矩屁!
"""
sum1 = 0
for x in range(10001):
sum1 += x
print(sum1)

def yt_sum(n):
if n == 1:
return 1
return yt_sum(n-1)+n

print(yt_sum(100))

"""
1.什么是模塊
在python中一個(gè)py文件就是一個(gè)模塊
a.系統(tǒng)模塊(標(biāo)準(zhǔn)庫) - python系統(tǒng)提供的模塊(安裝解釋器的時(shí)候已經(jīng)導(dǎo)入到解釋器中了,使用的時(shí)候在代碼中直接導(dǎo)入)
random模塊 - 提供隨機(jī)數(shù)
math模塊 - 提供數(shù)學(xué)運(yùn)算
json庫 - 提供json數(shù)據(jù)相關(guān)操作
re模塊 - 提供正則表達(dá)式相關(guān)操作
socket模塊 - 提供python套接字編程
time模塊 - 提供和時(shí)間相關(guān)的操作
threading模塊 - 提供和線程相關(guān)的操作
...

b.自定義模塊 - 程序員自己創(chuàng)建的py文件
自己寫的模塊
別人寫的模塊 - 第三方庫 (需要先下載到解釋器中辟宗,然后才能再代碼中導(dǎo)入)

標(biāo)準(zhǔn)庫和第三庫一般是通過模塊提供變量、函數(shù)吝秕、類
***直接導(dǎo)入會(huì)直接使用init文件
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)入指定的模塊, 導(dǎo)入后可以使用模塊中所有的全局變量(包含了變量烁峭、函數(shù)和類)
導(dǎo)入后直接使用變量,不用在前面加'模塊名.'

3.導(dǎo)入模塊的實(shí)質(zhì):
a.不管是使用import還是from-import容客,導(dǎo)入模塊的時(shí)候都會(huì)執(zhí)行模塊中所有的代碼
b.python中一個(gè)模塊不會(huì)重復(fù)導(dǎo)入多次。因?yàn)閷?dǎo)入的時(shí)候系統(tǒng)會(huì)自動(dòng)檢查當(dāng)前模塊是否已經(jīng)導(dǎo)入

4.怎么阻止模塊中的內(nèi)容被其他模塊執(zhí)行
將不希望被其他模塊執(zhí)行的代碼放在if語句中
如果希望被其他模塊使用的代碼就放在if語句的外碼
(這兒的if語句指的是: if name == 'main')

原理:
每個(gè)模塊都有一個(gè)name屬性, 代表模塊名约郁。默認(rèn)情況下它的值是py文件的文件名缩挑。
當(dāng)當(dāng)前模塊正在被執(zhí)行(直接執(zhí)行)的時(shí)候,模塊屬性name的值就會(huì)變成'main'
"""

1. 系統(tǒng)模塊

import random
print(random.randint(10, 100))

print('=======import model1之前=======')
import model1
import model1
print('=======import model1之后=======')
model1.a = 1000
print(model1.a)
print(model1.fun1())

print('=========from model2 import之前=========')

from model2 import aa, x

print('=========from model2 import之后=========')

print('aa:', aa)

print(x)

# print(model2.func2()) # 不能是用model2中除了aa和x的內(nèi)容

aa = 'hello'
from model2 import *

導(dǎo)入model2,并且可以直接使用里面所有的全局變量

print('aa:', aa)
print(x)
func2()

print('==============import model3================')
import model3

print(model3.a)

print(model3.b)

"""
5.重命名 - 導(dǎo)入模塊的時(shí)候可以對(duì)模塊或者模塊中的內(nèi)容重新命名
import 模塊名 as 新模塊名
from 模塊名 import 變量名1 as 新變量名1, 變量名2, 變量名3 as 新變量名3
"""

import model4 as newMode

print(newMode.age)

import threading as TD
name = 100

from model4 import name as yt_name, age as yt_age

print(name)
print(yt_name)
print(yt_age)

"""
1.什么是迭代器(iter)
是python提供的容器型數(shù)據(jù)類型鬓梅。
獲取迭代器中的元素的時(shí)候只能從前往后一個(gè)一個(gè)的取,而且取了之后這個(gè)元素在迭代器中就不存在了

2.迭代器的字面量
迭代器沒有指定格式的字面量供置。迭代器作為容器,里面的元素只能通過其他序列轉(zhuǎn)換绽快,或者通過生成器生成
迭代器中的元素可以是任何類型的數(shù)據(jù)
"""

將字符串轉(zhuǎn)換成迭代器芥丧,迭代器中的元素就是字符串中的每個(gè)字符

iter1 = iter('hello')
print(iter1)

將列表轉(zhuǎn)換成迭代器,迭代器中的元素就是列表中的每個(gè)元素

iter2 = iter([100, 'shj', (10, 20), [1, 2], True, {'name': '小花'}, lambda x: x])
print(iter2)

"""
3.獲取元素
(迭代器中的元素只支持查坊罢,不支持增刪改)
迭代器是通過next函數(shù)獲取單個(gè)元素续担,for-in遍歷一個(gè)一個(gè)獲取每一個(gè)元素。
不管哪種方式獲取活孩,已經(jīng)獲取過的元素物遇,在迭代器中就不存在
"""
iter3 = iter('hello')

1.next

"""
next(迭代器) -> 獲取迭代器中最新的數(shù)據(jù)(最頂層)
"""
print(iter3)
print(next(iter3))
print(next(iter3))
print(next(iter3))
print(next(iter3))
print(next(iter3))

print(next(iter3)) # 報(bào) 'StopIteration'異常, 因?yàn)樵谶@兒迭代器中的數(shù)據(jù)已經(jīng)取完了

print(iter3)

iter3 = iter('123456')
print(next(iter3))

通過for-in取迭代器中的元素和next效果一樣憾儒,元素還是會(huì)從迭代器中取出

for x in iter3:
print('x:', x)

print(next(iter3))

練習(xí): 看打印結(jié)果

iter4 = iter([10, True, 'abc', (1, 2)])

index = 0
for x in iter4:
index += 1
if index == 2:
break

"""
index = 0
x = 10 iter4 = True, 'abc', (1, 2) index = 1 if 1 == 2
x = True iter4 = 'abc', (1, 2) index = 2 if 2==2
"""

item = next(iter4)
print(item)
print(next(iter4))

"""
1.什么是生成器
生成器就是迭代器, 迭代器不一定是生成器询兴。

2.生成器怎么產(chǎn)生元素
調(diào)用一個(gè)帶有yield關(guān)鍵字的函數(shù)就能得到一個(gè)生成器

不帶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()) # 100

def func2():
if False:
yield
print('@@@@@@@')
return 100

print(func2()) # <generator object func2 at 0x1054f6200>

"""

  1. 生成器的元素
    生成器中的元素也是通過next或者for-in

生成器獲取元素,實(shí)質(zhì)就是去執(zhí)行生成器對(duì)應(yīng)的函數(shù)阳掐, 每次執(zhí)行到y(tǒng)ield語句為止,并且會(huì)將yield后面的值作為當(dāng)次獲取到的元素;
下次獲取元素的時(shí)候會(huì)接著上次結(jié)束的位置往后執(zhí)行,直到下一個(gè)yield為止....
以此類推缭保,直到函數(shù)結(jié)束汛闸。如果執(zhí)行到函數(shù)結(jié)束沒有遇到y(tǒng)ield那么就會(huì)報(bào)'StopXXXXX'異常

"""
print('=================')
def func3():
print('~~~~')
yield 'abc', 200
print('!R章睢V罾稀!G 1鸱!')
yield 100

gen1 = func3() # gen1就是一個(gè)生成器(生成器就是迭代器)
print(gen1)
re = next(gen1)
print('打印:', re)
print('第一次結(jié)束!')
print(next(gen1))

py18091 py18092 py18093 py18094

def creat_num():
num = 1
while True:
yield 'py1809%d' % num
num += 1

num_gen = creat_num()

students = []
for _ in range(10):
students.append(next(num_gen))

print(students)
print('上了兩天的課')

students.append(next(num_gen))
print(students)

students.pop(9)
print(students)

students.append(next(num_gen))
print(students)

iter1 = iter('1234')

print(next(iter1))

def yt_iter(seq):
for x in seq:
yield x

iter1 = yt_iter('abc')
print(next(iter1))
print(next(iter1))
print(next(iter1))

print(next(iter1))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忧额,一起剝皮案震驚了整個(gè)濱河市厘肮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睦番,老刑警劉巖类茂,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異托嚣,居然都是意外死亡巩检,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門示启,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兢哭,“玉大人,你說我怎么就攤上這事夫嗓〕俾荩” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵啤月,是天一觀的道長煮仇。 經(jīng)常有香客問我,道長谎仲,這世上最難降的妖魔是什么浙垫? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮郑诺,結(jié)果婚禮上夹姥,老公的妹妹穿的比我還像新娘。我一直安慰自己辙诞,他們只是感情好辙售,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飞涂,像睡著了一般旦部。 火紅的嫁衣襯著肌膚如雪祈搜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天士八,我揣著相機(jī)與錄音容燕,去河邊找鬼。 笑死婚度,一個(gè)胖子當(dāng)著我的面吹牛蘸秘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蝗茁,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼醋虏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哮翘?” 一聲冷哼從身側(cè)響起颈嚼,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忍坷,沒想到半個(gè)月后粘舟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奈嘿,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡系羞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轻庆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旬薯。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晰骑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绊序,到底是詐尸還是另有隱情硕舆,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布骤公,位于F島的核電站抚官,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏阶捆。R本人自食惡果不足惜凌节,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望洒试。 院中可真熱鬧倍奢,春花似錦、人聲如沸垒棋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叼架。三九已至畔裕,卻和暖如春衣撬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柴钻。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國打工淮韭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贴届。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蜡吧,于是被迫代替她去往敵國和親毫蚓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349