- 0 上節課回顧
- 0.1 閉包函式
- 0.2 裝飾器
- 1 迭代器
- 2 三元表示式和列表推導式
- 2.1 三元表示式(三目表示式)
- 2.2 列表推導式
- 3 字典生成式
- 4 生成器
- 4.1 yield關鍵字
- 5 遞迴
0 上節課回顧
0.1 閉包函式
函式內部的變數無法被全域性的相同名字的變數修改,區域性變數和全域性變數不是同一種東西
def f1():
x = 1
def f2():
print(1,x)
x = 10
f1()
print(2,x)
0.2 裝飾器
user_dict = {'username':None}
def deco(func):
def wrapper(*args,**kwargs):
if not user_dice.get('username'):
username = input('請輸入使用者名稱>>>')
pwd = input('請輸入密碼>>>')
if username == 'nick' and pwd == '123':
print('登陸成功')
user_dict['username'] = username
res = func(*args,**kwargs)
return res
res = func(*args,**kwargs)
return res
return wrapper
@deco
def shopping():
print('please shopping!')
def withdraw():
print('please withdraw!')
shopping()
withdraw()
1 迭代器
python中一切皆物件 學過的物件:
-
整形:height = 180 無
__iter__
-
浮點型:salary = 3.2 無
__iter__
-
字串:name = 'nick' 有
name.__iter__()
-
列表:hobby_list = ['run','read'] 有
hobby_list.__iter__()
-
元組:hobby_tuple = ('run','read') 有
hobbu_tuple.__iter__()
-
字典:info_dict = {'name':'nick','weight':140} 有
info_dict.__iter__()
-
集合:hobby_set = {'read','run','sleep'} 有
hobby_set.__iter__()
-
函式: 無
__iter__
def func(): pass
-
檔案:
f = open('text.txt','w',encoding = 'utf8') #w和a都會自動生成檔案
有f.__iter__()
只要有__iter__
內建方法的物件就是可迭代物件,。。。
字串/列表/元組/字典/集合/檔案 均為可迭代物件
__next__
就是在遍歷可迭代物件,當遍歷完就會報錯
可迭代物件:擁有__iter__
方法的物件 可迭代物件不一定是迭代器物件
迭代器物件:擁有__iter__
方法,可迭代物件擁有__next__
方法才是迭代器物件,迭代器物件一定是可迭代物件,檔案本身就是迭代器物件
檔案既是可迭代物件,又是迭代器物件
迭代器物件使用__iter__
方法後是迭代器物件本身
2 三元表示式和列表推導式
2.1 三元表示式(三目表示式)
dog_name = 'fenggou'
if dog_name == 'fenggou':
print('遠離它')
else:
print('盤它')
# 等價於 (但不推薦使用,不容易看懂)
print('遠離它') if dog_name == 'fenggou' else print('盤它')
2.2 列表推導式
list = list()
for i in range(100):
list.append(i)
print(list)
# 等價於 記住:傻逼採用的玩意
lis = [i for i in range(100)]
print(lis)
lis = [i*2 if i>50 else i for i in range(100)]
3 字典生成式
dic = {i:i**2 for i in range(10)}
for i in dic.items():
print(i)
res = zip('abcd',[1,2,3,4])
for k,v in res:
print(k,v)
# 終極版 字典生成式 + zip拉鍊函式
res = zip('abcd',[1,2,3,4])
dic = {k:v for k,v in res}
print(dic) #輸出結果:{'a': 1, 'b': 2, 'c': 3, 'd': 4}
#區別於fromkeys
dic = dict.fromkeys('abcd',[1,2,3,4])
print(dic) #輸出結果:{'a': [1, 2, 3, 4], 'b': [1, 2, 3, 4], 'c': [1, 2, 3, 4], 'd': [1, 2, 3, 4]}
4 生成器
生成器:自定義的迭代器
4.1 yield關鍵字
接收值,但不會結束函式,二十繼續執行下一行程式碼,出現yield後不會再返回值,全被接受了,舉個例子
def func():
print(1)
print(2)
print(2)
func() #會輸出 1 2 2
#但若變成
def func():
print(1)
yield 1,2,4
print(2)
yield
print(2)
func() #就不會再輸出值了,而是變成了一個迭代器,即直接用__next__來進行迭代,可進行下面操作
g = func()
for i in g:
print(i) #輸出1 (1, 2, 4) 2 None 2
# 注意 :此時yield後面是可以接收值得,預設為None,也可以接收多個值以元組形式儲存
注意:函式本身不是可迭代物件,但在呼叫之後就成了迭代器
yield:接收值,但不會結束函式,然後繼續下一行程式碼,直到return
return:返回值,直接結束函式,其他特性和yield一摸一樣
5 遞迴
遞迴:函式呼叫函式自己 (重複 函式巢狀)
def f1():
print('from f1')
f1()
f1()
def guess_age(count):
count -= 1
if count == 1:
return 26
return guess_age(count) + 2
res = guess_age(5)
print(res) # 32