Day 13 迭代器 三元表示式 列表生成式 字典生成式 生成器 遞迴

blueeeeeeeeeeee發表於2024-11-14

目錄
  • 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

相關文章