1.函數(shù)調(diào)用表達(dá)式:調(diào)用函數(shù)的語(yǔ)句
普通值能做的事情函數(shù)調(diào)用表達(dá)式都能做
2.函數(shù)作為變量
!python中聲明函數(shù)的本質(zhì)就是聲明一個(gè)類型是function的變量绳军,函數(shù)就是變量名
變量能做的事情函數(shù)都可以做暗膜;變量可以作為函數(shù)的參數(shù)
一個(gè)函數(shù)可以作為另外一個(gè)函數(shù)的參數(shù)匀奏,如果一個(gè)函數(shù)的參數(shù)也是函數(shù),那么這種函數(shù)叫實(shí)參高階函數(shù)
3實(shí)參高階函數(shù)應(yīng)用:
列表.sort(),sorted(),max(),min()
(1)sort和sorted
這兩個(gè)函數(shù)是實(shí)參高階函數(shù)学搜,里面有個(gè)參數(shù)key要求傳一個(gè)函數(shù)
key參數(shù)對(duì)應(yīng)的函數(shù)是用來(lái)決定排序規(guī)則:函數(shù)需要一個(gè)參數(shù)和一個(gè)返回值娃善,它的參數(shù)代表需要排序序列的元素,返回值是比較對(duì)象
4變量作為函數(shù)的返回值
一個(gè)函數(shù)的返回值也是一個(gè)函數(shù)瑞佩,那么這個(gè)函數(shù)就是返回值高階函數(shù)
5.什么是迭代器(iter)
迭代器是容器型數(shù)據(jù)類型(序列)聚磺,可變(不支持增刪改),有序(不支持下標(biāo)操作) 所有的數(shù)據(jù)都可以轉(zhuǎn)換成迭代器
保存在迭代器中的元素炬丸,只能取瘫寝,并且取出后迭代器中就不再保存,也不可以再往迭代器中添加元素
迭代器沒(méi)有對(duì)應(yīng)的格式的數(shù)據(jù)稠炬,迭代器只能是通過(guò)將其他的序列轉(zhuǎn)換成迭代器焕阿,或者是生成器
iter1 = iter([19, 29, 49])
print(iter1) # <list_iterator object at 0x000000000281B048>
6.獲取迭代器中的元素(不管用什么方式去獲取迭代器中的元素,獲取一個(gè)就會(huì)少一個(gè))
(1)獲取單個(gè)元素:next(迭代器) -- 獲取迭代器頂部的元素(最上層/第一個(gè))
iter2 = iter('hello')
print(next(iter2)) # h
print(next(iter2)) # e
(2)遍歷
iter2 = iter('abc123')
for x in iter2:
print('***', x)
7.什么是生成器
生成器就是迭代器 --- 獲取元素和迭代器一樣(只能一個(gè)一個(gè)的取首启,少一個(gè)少一個(gè))
調(diào)用函數(shù)體中有yield關(guān)鍵字的函數(shù)暮屡,就可以得到一個(gè)生成器
8.yield
yield只能出現(xiàn)在函數(shù)體中
調(diào)用有yield關(guān)鍵字的函數(shù),不會(huì)執(zhí)行函數(shù)體毅桃,也不會(huì)獲取返回值褒纲,而是得到一個(gè)生成器
9.生成器怎么產(chǎn)生數(shù)據(jù)
看一個(gè)生成器能夠產(chǎn)生幾個(gè)數(shù)據(jù)愁溜,看執(zhí)行完生成器對(duì)應(yīng)的函數(shù)會(huì)遇到幾次yield;yield后面的值就是生成器能產(chǎn)生的數(shù)據(jù)
def func2():
for x in range(10):
yield x
gen1 = func2()
print(gen1)
print(next(gen1))
for x in gen1:
print('===:', x)
10.生成器生成數(shù)據(jù)的原理
生成器不會(huì)同時(shí)將所有的元素保存起來(lái)外厂,而是需要數(shù)據(jù)的時(shí)候臨時(shí)去產(chǎn)生數(shù)據(jù)
每次獲取生成器元素的時(shí)候,就去執(zhí)行生成器對(duì)應(yīng)的函數(shù)的函數(shù)體代承,從前往后執(zhí)行汁蝶,
直到遇到y(tǒng)ield為止,并且將yield后面的值作為結(jié)果论悴;同時(shí)保存結(jié)束位置掖棉;
下次獲取下一個(gè)元素的時(shí)候,接著上次結(jié)束的位置往后執(zhí)行膀估,直到遇到下一個(gè)yield幔亥;以此類推
如果執(zhí)行到函數(shù)結(jié)束都沒(méi)有遇到y(tǒng)ield,next函數(shù)會(huì)報(bào)StopIteration錯(cuò)誤
def func3():
print('======第1個(gè)數(shù)據(jù)======')
yield 1
print('======第2個(gè)數(shù)據(jù)======')
yield 2
print('======第3個(gè)數(shù)據(jù)======')
yield 3
gen2 = func3()
print(next(gen2))
print('開(kāi)始取第2個(gè)數(shù)據(jù)')
print(next(gen2))
print('開(kāi)始取第3個(gè)數(shù)據(jù)')
print(next(gen2))
# 寫一個(gè)產(chǎn)生學(xué)號(hào)的生成器
def creat_id():
num = 1
while True:
yield 'stu' + str(num)
num += 1
num = creat_id()
print(next(num))
print(next(num))
print(next(num))
for _ in range(20):
print(next(num))
11.什么是生成式:
生成式本質(zhì)就是生成器
(1)語(yǔ)法1:
(表達(dá)式 for 變量 in 序列) - 創(chuàng)建一個(gè)生成器
展開(kāi)成生成器:
def func1():
for 變量 in 序列:
yield 表達(dá)式
[表達(dá)式 for 變量 in 序列] -- 將生成式對(duì)應(yīng)的生成器轉(zhuǎn)換成列表
(2)語(yǔ)法2:
(for 變量 in 序列 if 條件語(yǔ)句) -- 創(chuàng)建一個(gè)生成器
展開(kāi)成生成器:
def func1():
for 變量 in 序列:
if 條件語(yǔ)句:
yield 表達(dá)式
gen1 = (x*2 for x in range(10))
print(next(gen1))
print(next(gen1))
list1 = list(gen1)
print(list1) # [4, 6, 8, 10, 12, 14, 16, 18]
# print(next(gen1)) # StopIteration
list2 = [x*x for x in range(1, 10)]
print(list2) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
list3 = list(x*x for x in range(1, 10))
print(list3) # [1, 4, 9, 16, 25, 36, 49, 64, 81]
dict1 = dict((x, x*2) for x in range(5))
print(dict1) # {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
list4 = [x for x in range(10) if x % 2]
print(list4)
list5 = ['%d*2=%d' % (x, x*2) for x in range(5)]
print(list5)
print('===============')
# 展開(kāi)成生成器
def func3():
for x in range(5):
yield '%d*2=%d' % (x, x*2)
gen1 = func3()
list1 = list(gen1)
print(list1)
12.什么是模塊:一個(gè)py文件就是一個(gè)模塊
13.多模塊怎么協(xié)作:導(dǎo)入模塊
(1)import 模塊名 --- 在當(dāng)前的模塊中導(dǎo)入指定模塊察纯,導(dǎo)入后可以使用指定模塊中的所有的全局變量
以'模塊名.變量'的方式去使用
(2)from 模塊名 import 全局變量1帕棉,全局變量2,....
---- 導(dǎo)入指定模塊中指定的全局變量饼记;被導(dǎo)入的全局變量在當(dāng)前模塊中直接使用
(3)重命名
import 模塊名 as 新模塊名 -- 模塊重命名香伴,通過(guò)新模塊名去使用模塊
from 模塊名 import 變量1 as 新變量1,變量2 as 新變量2具则,....
-----變量重命名即纲,通過(guò)新變量去使用變量
(4)通配符
from 模塊名 import * --- 導(dǎo)入模塊中所有的全局變量,使用的時(shí)候直接用
14.導(dǎo)入模塊的原理
當(dāng)執(zhí)行導(dǎo)入模塊的代碼的時(shí)候博肋,實(shí)質(zhì)會(huì)執(zhí)行被導(dǎo)入的指定模塊對(duì)應(yīng)的py文件
將不希望被別的模塊執(zhí)行的代碼放到下面的if語(yǔ)句中:
if __ name __ == ' __ main __':