1. 程式人生 > >3/29 叠代器/生成器/生成器之yield的表達式形式/面向過程的編程思想

3/29 叠代器/生成器/生成器之yield的表達式形式/面向過程的編程思想

程序 英文字母 擴展性 流水線 ati yield 調用函數 一個 功能

1 叠代器

叠代是一個重復的過程,並且每次重復都是基於上一次的結果而來

可叠代的對象:在pytnon,但凡有內置__iter__放法的對象,都是可叠代的對象

以下都是可以叠代的對象

str,list,tup,dic,sl,文件。

叠代器:選代取值的工具,可叠代的對象執行__iter__方法得到的返回值都是叠代對象

dic={‘x‘:1,‘y‘:2,‘z‘:3}
iter_dic=dic.__iter__()
print(iter_dic.__next__())
print(iter_dic.__next__())
print(iter_dic.__next__())

s1={‘a‘,‘b‘,‘c‘}
iter_s1=s1.__iter__()
print(iter_s1.__next__())
print(iter_s1.__next__())
print(iter_s1.__next__())

list1=[1,2,3]
iter_list1=list1.__iter__()
print(iter_list1.__next__())
print(iter_list1.__next__())

可叠代的對象:ste,lsit,tuple,dict,set,file

1獲取可叠代對象的方式:,無須領取,python內置的ste,lsit,tuple,dict,set,file,都是可叠代的對象

2特點:

內置有__list__方法的都叫可叠代的對象,執行該方法會拿到一個叠代器的對象

叠代器對象,文件對象本身就是叠代器對象

1獲取叠代器對象的方式:

執行可叠代的對象__iter__放法,拿到返回值就是叠代器對象。

2 特點:

內置有__next__方法,執行該方法會拿到叠代器對象中的一個值

內置有__iter__方法,執行該方法會拿到叠代器本身

叠代器的優缺點分析

叠代器的缺點

提供了一種可不依賴索引的取值方式

l=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘)
iter_l=l.__iter__()
while True:
try:
print(iter_l.__next__())
except StopIteration:
break

叠代器更加節省內存

叠代器的缺點:

取值麻煩,只能一個一個取值,只能往後取

並且是一次性的,無法用len獲取長度

x=[1,2,3]
iter_x=x.__iter__()
while True:
try:
print(iter_x.__next__())
except StopIteration:
break
print(‘第二次=================================》‘)
iter_x=x.__iter__()
while True:
try:
print(iter_x.__next__())
except StopIteration:
break

for 循環原理分析

for 循環稱之為叠代器循環,in後跟的必須是可叠代的對象

for循環會執行in後對象的__iter__方法,拿到叠代器對象

然後用叠代器對象的__next__方法,拿到一個返回值賦值給line,執行一次循環體

周而復始,直到取值完畢,for循環會檢測到異常自動結束循環

l=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘)
for line in l: #iter_l=l.__iter__()
print(line)

for item in {‘x‘:1,‘y‘:2}:
print(item)


生成器內水內包含有yield關鍵字,再調用函數,就不會執行函數體代碼,拿到的返回值就是一個生成器對象。

def chicken():
print(‘=====>first‘)
yield 1
print(‘=====>sencond‘)
yield 2
print(‘=====>third‘)
yield 3

生成器本質就是叠代器,也就是說生成器的玩法其實就是叠代器的玩法

#總結yield:
#1、為我們提供了一種自定義叠代器的方式,
# 可以在函數內用yield關鍵字,調用函數拿到的結果就是一個生成器,生成器就是叠代器
#2、yield可以像return一樣用於返回值,區別是return只能返回一次值,而yield可返回多次
# 因為yield可以保存函數執行的狀態


#1、必須初始化一次,讓函數停在yield的位置
res0=dog1.__next__()
print(res0)

#2、接下來的事,就是餵狗
#send有兩方面的功能
#1、給yield傳值
#2、同__next__的功能
res1=dog1.send(‘泔水‘)
print(res1)
res2=dog1.send(‘骨頭‘)
print(res2)
res3=dog1.send(‘shit‘)
print(res3)

‘‘‘
1 面向過程的編程思想
核心是‘過程‘二字,過程即解決問題的步驟,即先幹什麽,再幹什麽。。。。
基於面向過程編寫程序就好比在設計一條流水線,是一種機械式的思維方式。


2、示範:

3、總結優缺點:
優點:復雜的問題流程化,進而簡單化
缺點:修改一個階段,其他階段都有可能需要做出修改,牽一發而動全身,即擴展性極差
應用:用於擴展性要求低的場景

‘‘‘
#1、步驟一:拿到用戶輸入的合法的信息:用戶名、密碼、余額、年齡
db_path=‘db.txt‘

def get_uname():
while True:
uname=input(‘用戶名>>:‘).strip()
if not uname.isalpha():
print(‘\033[45m用戶名必須為英文字母...\033[0m‘)
continue
with open(r‘%s‘ %db_path,‘r‘,encoding=‘utf-8‘) as f:
for line in f:
uinfo=line.strip(‘\n‘).split(‘,‘)
if uname == uinfo[0]:
print(‘\033[45m用戶名已存在...\033[0m‘)
break
else:
return uname

def get_pwd():
while True:
pwd1=input(‘請輸入密碼>>: ‘).strip()
pwd2=input(‘再次輸入密碼>>: ‘).strip()
if pwd1 == pwd2:
return pwd1
else:
print(‘\033[45m兩次輸入的密碼不一致,請重新輸入...\033[0m‘)

def get_bal():
while True:
bal=input(‘請輸入余額: ‘).strip()
if bal.isdigit():
# bal=int(bal)
return bal
else:
print(‘\033[45m錢必須是數字,傻叉...\033[0m‘)

def get_age():
pass

#2、步驟二:寫入文件
def file_hanle(uname,pwd,bal,age):
with open(r‘%s‘ %db_path,‘a‘,encoding=‘utf-8‘) as f:
f.write(‘%s,%s,%s,%s\n‘ %(uname,pwd,bal,age))

# 註冊功能
def register():
#步驟1:
uname=get_uname() #拿到合法的用戶名
pwd=get_pwd() #拿到合法的密碼
bal=get_bal() #拿到合法的余額
#步驟2:
file_hanle(uname,pwd,bal) #寫入文件


3/29 叠代器/生成器/生成器之yield的表達式形式/面向過程的編程思想