一、變量的作用域
1、變量的作用域
變量在程序中能夠使用的范圍
2呢铆、全局變量
a.聲明在函數(shù)或者類的外部的變量都是全局變量
b.變量的作用域:從聲明開始到整個(gè)py文件結(jié)束,任何位置都可以使用(作用域:從聲明開始到文件結(jié)束)
3罢防、局部變量
a.聲明在函數(shù)或者類的內(nèi)部的變量就是局部變量
b.變量的作用域:從聲明開始到函數(shù)結(jié)束艘虎,任何位置都可以使用
4、golbal的使用
golbal關(guān)鍵字只能在函數(shù)中使用
作用:在函數(shù)內(nèi)聲明一個(gè)全局變量
語法:
golbal 變量名
變量名 = 值
5咒吐、nonlocal的使用? (用到的非常少野建,理解就行)
nonlocal關(guān)鍵字只能在函數(shù)中使用
作用:在局部的局部中修改局部變量的的值
語法:
nonlocal 變量名
變量名 = 值
"""
# 思考?
funtions = []
for xin range(5):
def func1(a):
return a*x
funtions.append(func1)
t1 = funtions[0]
t2 = funtions[2]
print(t1(2),t2(2))
"""
二恬叹、函數(shù)作為變量
python中候生,聲明函數(shù)其實(shí)就是聲明一個(gè)類型是function的變量。函數(shù)名就是變量名
函數(shù)名作為變量除了可以用來調(diào)用函數(shù)獲取返回值以外绽昼,普通變量能做的它都能做唯鸭。
"""
# 聲明類型是int類型的值a
a=10
print(type(a))
# 聲明類型是dict類型的變量b
b = {'a':12,'b':200}
print(type(b))
print(b['a'])
# 聲明類型是function類型的變量c
c =lambda x: x*x
print(type(c))
c(10)
# 聲明類型是function類型的變量d
def d(x):
def e():
print('abc')
e()
return x*x
print(type(d))
d(10)
# 1、讓一個(gè)變量給另外一個(gè)變量賦值
#聲明一個(gè)列表變量list1
list1 = [1,2,3]
# 使用列表變量list1給list2賦值
list2=list1
print(list2[0])
# 聲明一個(gè)函數(shù)變量func11
def func11():
print("我是函數(shù)")
# 使用函數(shù)變量func11給ff賦值
ff = func11
# 將ff當(dāng)成函數(shù)來用
ff()
# 2硅确、將變量作為列表的元素或者是字典的值
# 聲明列表變量list1
list1 = [1,2,3]
# 將列表變量list1作為列表list2的元素
list2 = [list1,100]
print(list2[0][0])
# 聲明一個(gè)函數(shù)變量func2
def func2():
print("我是函數(shù)2")
# 將函數(shù)變量func2作為列表list3的元素
list3 = [func2,100]
print(list3[0]())
# 3目溉、作為函數(shù)的參數(shù)
# 將函數(shù)1作為實(shí)參,傳遞給函數(shù)2菱农;這兒的函數(shù)2就是一個(gè)高階函數(shù)(實(shí)參高階函數(shù))
def test(x):
print("text:",x)
if not isinstance(x,int):
x()
# 聲明一個(gè)int類型的變量a
a =10
# 將變量a作為test的實(shí)參
test(a)
def func3():
print("我是函數(shù)3")
test(func3)
#3.1? sort函數(shù)
"""
def sort(key=None,reverse=False)
key - 確定排序的時(shí)候以什么值為標(biāo)準(zhǔn)來排序(默認(rèn)的情況下缭付,以列表的元素的大小為標(biāo)準(zhǔn)來排序)
需要傳一個(gè)函數(shù),函數(shù)需要一個(gè)參數(shù)和一個(gè)返回值循未。這的參數(shù)是列表的元素
reverse - 是否降序排序陷猫,需要穿一個(gè)bool值
"""
def yt_sort(list1,key):
if key ==None:
for indexin range(len(list1)):
for index2in range(index+1,len(list1)):
current = list1[index]
behind = list2[index2]
if behind
list1[index],list2[index2] = list2[index2],list1[index]
else:
for indexin range(len(list1)):
for index2in range(index+1,len(list1)):
current = key(list1[index])
behind = key(list2[index2])
if behind
list1[index],list2[index2] = list2[index2],list1[index]
my_list = [1,34,20,89,8]
# yt_sort(my_list)
# my_list.sort()
print(my_list)
my_list2 = [
{'name':'張三','age':18},
{'name':'李四','age':30},
{'name':'王五','age':10}
]
# my_list2.sort() # TypeError: '<' not supported between instances of 'dict' and 'dict'
# yt_sort(my_list2) # TypeError: '<' not supported between instances of 'dict' and 'dict'
def get_age(x):
return x['age']
yt_sort(my_list2, get_age)
print(my_list2)
my_list2 = [
{'name':'張三','age':18,'score':90},
{'name':'李四','age':30,'score':80},
{'name':'王五','age':10,'score':89}
]
# 取最大年齡對應(yīng)的字典
max_age =max(my_list2,key=lambda x: x['age'])
print(max_age)
# 取最大成績對應(yīng)的字典
max_score =max(my_list2,key=lambda x: x['score'])
print(max_score)
# 4.變量作為函數(shù)的返回值
# 返回值是函數(shù)的函數(shù),也叫高階函數(shù)(返回值高階函數(shù))
def test2(n):
sum1 =1
? ? for xin range(1, n+1):
sum1 *= x
return sum1
re = test2(5) +10
print(re)
# =================================
def get_operation(char):
# char = '+'? ? (不能使用單行注釋)
"""
根據(jù)不同的符號(hào)返回不同的功能(函數(shù)功能的描述)
? ? :paramchar: 運(yùn)算符符號(hào)
? ? :return: 不同運(yùn)算符對應(yīng)的功能的函數(shù)
"""
? ? if char =='+':
# 求和的功能
? ? ? ? def sum(*args, **kwargs):
# args = (10,20,30)
"""求多個(gè)數(shù)的和"""
? ? ? ? ? ? sum1 =0
? ? ? ? ? ? for item1in args:
sum1 += item1
for keyin kwargs:
sum1 += kwargs[key]
print('yt')
return sum1
return sum
elif char =='*':
def mul(*args, **kwargs):
sum1 =1
? ? ? ? ? ? for item1in args:
sum1 *= item1
for keyin kwargs:
sum1 *= kwargs[key]
return sum1
return mul
elif char =='-':
def diff(*args):
"""求多個(gè)數(shù)的差"""
# (10, 20, 30)
? ? ? ? ? ? sum1 = args[0]
for indexin range(1,len(args)):
sum1 -= args[index]
return sum1
return diff
else:
print('暫時(shí)不支持這個(gè)運(yùn)算符')
return None
# re是一個(gè)函數(shù)
re = get_operation('+')
# re(10, 20, 30) - 調(diào)用函數(shù)獲取返回值
print(re(10,20,30))# 60? = 10+20+30
# get_operation('*')? - 這個(gè)整體是一個(gè)函數(shù)
# get_operation('*')(1, 2, 3)? - 調(diào)用求乘積的那個(gè)函數(shù),并且獲取返回值
re = get_operation('*')(1,2,3)
print(re)
# 10 - 20 - 30
print(get_operation('-')(100,20,30))
"""
四绣檬、迭代器
1足陨、什么是迭代器(iter)
迭代器是python中的容器類型數(shù)據(jù),同時(shí)可以存儲(chǔ)多個(gè)數(shù)據(jù)河咽。
取迭代器中的數(shù)據(jù)只能一個(gè)一個(gè)取钠右,而且取出來的數(shù)據(jù),在迭代器中就不存在
2忘蟹、迭代器中數(shù)據(jù)的來源
a.將其他數(shù)據(jù)類型轉(zhuǎn)換成迭代器
b.使用生成式飒房、生成器取產(chǎn)生數(shù)據(jù)
3、將數(shù)據(jù)轉(zhuǎn)換成迭代器
所有的序列都可以轉(zhuǎn)換成迭代器
"""
# 將字符串轉(zhuǎn)換成迭代器
iter1 =iter('abcd')
print(iter1)
iter2 =iter([1,10,100,1000])
print(iter2)
iter3 =iter({'name':'小明','age':20})
print(iter3)
"""
4媚值、獲取迭代器中的元素
a.
next(迭代器)/迭代器next() - 取出迭代器中第一個(gè)元素(已經(jīng)去出來的元素再也會(huì)不到迭代器中了)
"""
iter1 =iter('abcd')
print(iter1)
print(next(iter1))
print(next(iter1))
print(next(iter1))
print(next(iter1))
# print(next(iter1))? # 當(dāng)?shù)魇强盏臅r(shí)候狠毯,使用next獲取元素,會(huì)出現(xiàn)StopIteration異常
print(iter2.__next__())
print(next(iter2))
# b.通過for循環(huán)取出迭代器中每個(gè)元素
for xin iter2:
print('==:', x)
# print(next(iter2))? # 出現(xiàn)異常StopIteration褥芒,因?yàn)閒or循環(huán)已經(jīng)將這個(gè)迭代器中的元素取完了
"""
四嚼松、生成器
1、什么是生成器
迭代器就是生成器锰扶;迭代器不一定是生成器
調(diào)用帶有yield關(guān)鍵字的函數(shù)献酗,拿到的結(jié)果就是一個(gè)生成器。生成器中元素就是yield關(guān)鍵字后面的值坷牛。
2罕偎、生成器怎么產(chǎn)生數(shù)據(jù)
只要函數(shù)種有yield關(guān)鍵字,調(diào)用函數(shù)不會(huì)再執(zhí)行函數(shù)體獲取返回值京闰,而是創(chuàng)建一個(gè)生成器颜及。
當(dāng)獲取生成器的元素的時(shí)候,才會(huì)執(zhí)行函數(shù)的函數(shù)體,執(zhí)行到y(tǒng)ield語句為止,
并且將yield后面的值作為結(jié)果返回蹂楣;并且保存當(dāng)前執(zhí)行的位置俏站。
獲取下一個(gè)元素的時(shí)候,就從上次結(jié)束的位置接著往下去執(zhí)行函數(shù)痊土,直到函數(shù)結(jié)束或者遇到y(tǒng)ield為止;
如果遇到y(tǒng)ield就將yield后面的值作為結(jié)果返回肄扎,并且保存當(dāng)前執(zhí)行的位置。
如果函數(shù)結(jié)束了施戴,就出現(xiàn)StopIteration異常反浓。
生成器對應(yīng)的函數(shù),執(zhí)行完成遇到y(tǒng)ield的次數(shù)赞哗,決定了生成器能產(chǎn)生的數(shù)據(jù)的個(gè)數(shù)