1.變量的作用域
變量在程序中能夠使用的范圍
a.全局變量
聲明在函數(shù)或者類的外部的變量都是全局變量
作用域是從變量聲明開始到整個py文件結束任何位置
b.局部變量
聲明在函數(shù)或者類的內部的變量都是局部變量
作用域是從變量聲明開始到函數(shù)結束
2.global 關鍵字
在函數(shù)中聲明一個全局變量徐绑,在外部使用時必須先調用函數(shù)
語法:
global 變量名
變量名 = 值
3.nonlocal 關鍵字
當需要在局部的局部中修改局部變量的值,就使用nonlocal
語法:
nonlocal 變量名
變量名 = 值
2.函數(shù)作為變量
python中聲明函數(shù)其實就是聲明一個類型是function的變量,函數(shù)名其實就是變量名
函數(shù)名作為變量除了用來調用函數(shù)獲取返回值鸠窗,還可以做普通變量能做的
a = lambda x: x * x
print(type(a))
將函數(shù)1作為實參,傳遞給函數(shù)2遵馆;函數(shù)2就是一個高價函數(shù)(實參高階函數(shù))
返回值是函數(shù)的函數(shù)数尿,也叫高階函數(shù)(返回值高階函數(shù))
sort函數(shù)
def sort(key=None, reverse=False)
key - 確定排序的時候以什么值為標準來排序(默認以列表元素的大小為標準)
需要傳一個函數(shù),函數(shù)需要一個參數(shù)和一個返回值商佛。這兒的參數(shù)是列表的元素
reverse - False 升序 Ture 降序
list1 = [{1: 2}, {1: 3}, {1: 1}]
list1.sort(key=lambda x: x[1])
print(list1)
def opration1(opration, *args):
if opration == '-':
result = args[0]
for x in range(1, len(args)):
result -= args[x]
return result
print(opration1('-', 1, 2, 3))
運行:
3.迭代器
1.什么是迭代器(iter)
迭代器是Python中容器類的數(shù)據(jù)類型,可以同時存儲多個數(shù)據(jù)姆打。
取數(shù)據(jù)的時候良姆,只能一個一個取,而且取出來的數(shù)據(jù)在迭代器中就不存在了
2.迭代器中的數(shù)據(jù)來源
a.將其他序列轉換成迭代器
b.使用生成式幔戏、生成器去產(chǎn)生數(shù)據(jù)
?1.將數(shù)據(jù)轉換成迭代器 (所有的數(shù)據(jù)都可以轉換成迭代器)
iter1 = iter('abcd')
print(iter1)
iter2 = iter([1, 2, 3, 4])
print(iter2)
iter3 = iter({'name': '小明', 'age': 20})
print(iter3) # 存的只是字典的key
?2.獲取迭代器中的元素
next(迭代器) / 迭代器.next() 取出迭代器中第一個元素(當?shù)髦袥]有元素的時候玛追,會報異常StopIteration)
通過for循環(huán)取出迭代器中的元素
for x in iter3:
print(x)
運行:
image.png
4.生成器
生成器就是迭代器,迭代器不一定是生成器
調用帶有yield關鍵字的函數(shù),拿到的結果就是一個生成器
生成器中的元素就是yield關鍵字后面的值
只要函數(shù)中有yield關鍵字,調用函數(shù)不會再執(zhí)行函數(shù)體闲延,而是創(chuàng)建一個生成器
當獲取生成器的元素的時候痊剖,才會執(zhí)行函數(shù)的函數(shù)體,執(zhí)行到y(tǒng)ield語句為止垒玲,
并且將yield后面的值作為結果返回陆馁;并且保存當前執(zhí)行的位置。
獲取下一個元素的時候合愈,就從上次結束的位置叮贩,接著往下去執(zhí)行函數(shù)击狮,
直到函數(shù)結束或者遇到y(tǒng)ield為止;如果遇到y(tǒng)ield就將yield后面的值作為結果返回益老,
并且保存當前執(zhí)行的位置彪蓬。如果函數(shù)結束了就會出現(xiàn)StopIteration異常
生成器對應的函數(shù),執(zhí)行完成遇到的yield的次數(shù)捺萌,決定了生成器能產(chǎn)生的數(shù)據(jù)的個數(shù)
def func1():
print('abc')
# return 10
yield 100
print('!!!!!!!!')
re = func1()
print(re)
next(re) 執(zhí)行re對應的函數(shù)的函數(shù)體档冬,將yield關鍵字后邊的值作為結果
print(next(re))
print(next(re))
運行:
image.png
def numbers():
for x in range(100):
yield x
print('next', x)
gener = numbers()
print(next(gener))
print(next(gener))
print(next(gener))
運行:
image.png
?練習:寫一個生成器,可以不斷產(chǎn)生斐波那契數(shù)列:1桃纯, 1酷誓, 2, 3态坦, 5盐数, 8, 13驮配, 21娘扩。。壮锻。
def fibonacci():
num1 = 0
num2 = 1
yield 1
while True:
num3 = num2 + num1
num1, num2 = num2, num3
yield num3
gen = fibonacci()
for x in range(10):
print(next(gen))
運行: