1. 程式人生 > >Python之旅.第三章.函數3.30

Python之旅.第三章.函數3.30

幹什麽 需要 not item 依賴 做出 索引 cond 信息

一、叠代器

1、什麽是叠代?:叠代是一個重復的過程,並且每次重復都是基於上一次的結果而來

2、要想了解叠代器到底是什麽?必須先了解一個概念,即什麽是可叠代的對象?
可叠代的對象:在python中,但凡內置有__iter__方法的對象,都是可叠代的對象
num=1

以下都是可叠代的對象
str1=‘hello‘
list1=[1,2,3]
tup1=(1,2,3)
dic={‘x‘:1}
s1={‘a‘,‘b‘,‘c‘}
f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘)

3、叠代器:叠代取值工具,可叠代的對象執行__iter__方法得到的返回值就是叠代器對象
dic={‘x‘:1,‘y‘:2,‘z‘:3}
iter_dic=dic.__iter__()
print(iter_dic.__next__())
print(iter_dic.__next__())

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

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

4、可叠代的對象vs叠代器對象?
‘‘‘
可叠代的對象:str,list,tuple,dict,set,file
1、獲取可叠代對象的方式:無須獲取,python內置str,list,tuple,dict,set,file都是可叠代對象
2、特點:
內置有__iter__方法的都叫可叠代的對象,執行該方法會拿到一個叠代器對象

叠代器對象:文件對象本身就是叠代器對象
1、獲取叠代器對象的方式:
執行可叠代對象的__iter__方法,拿到的返回值就是叠代器對象
2、特點:
內置有__next__方法,執行該方法會拿到叠代器對象中的一個值
內置有__iter__方法,執行該方法會拿到叠代器本身

‘‘‘

x=‘hello‘

iter_x=x.__iter__()
iter_x.__next__
print(iter_x.__iter__().__iter__() is iter_x)


文件本身就是叠代器對象
str1=‘hello‘
list1=[1,2,3]
tup1=(1,2,3)
dic={‘x‘:1}
s1={‘a‘,‘b‘,‘c‘}
f=open(‘a.txt‘,‘w‘,encoding=‘utf-8‘)
f.__next__()


5、叠代器的優缺點分析
5.1 叠代器的優點:
5.1.1、提供了一種可不依賴於索引的取值方式
l=open(‘a.txt‘,‘r‘,encoding=‘utf-8‘)
iter_l=l.__iter__()
while True:
try:
print(iter_l.__next__())
except StopIteration:
break

5.1.2 叠代器更加節省內存
item=range(0,100000000000000000000000000000000000000000000)
print(item)


5.2叠代器的缺點:
5.2.1、取值麻煩,只能一個一個取,只能往後取,
5.2.2、並且是一次性的,無法用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

6. for循環原理分析:
6.1、for 循環稱之為叠代器循環,in後跟的必須是可叠代的對象
6.2、for循環會執行in後對象的__iter__方法,拿到叠代器對象
6.3、然後調用叠代器對象的__next__方法,拿到一個返回值賦值給line,執行一次循環體
6.4、周而復始,直到取值完畢,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

obj=chicken()
print(obj)
生成器本質就是叠代器,也就是說生成器的玩法其實就是叠代器的玩法
print(obj.__iter__() is obj)
res=obj.__next__()
print(res)

res1=obj.__next__()
print(res1)

res2=obj.__next__()
print(res2)

obj.__next__()

1、iter_obj=obj.__iter__(),拿到叠代器
2、出發iter_obj.__next__(),拿到該方法的返回值,賦值給item
3、周而復始,直到函數內不在有yield,即取值完畢
4、for會檢測到StopIteration異常,結束循環
for item in obj:
print(item)


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

def my_range():
print(‘start........‘)
n=0
while True:
yield n
n+=1

obj=my_range()
print(obj)

print(obj.__next__())
print(obj.__next__())

for i in my_range():
print(i)

def my_range(start,stop,step=1):
n=start
while n < stop:
yield n #yield 4
n+=step #5


obj=my_range(3,7,2) #3,5,
print(obj.__next__())
print(obj.__next__())

for item in my_range(5,10,2):
print(item)

三、生成器之yield的表達式


def eat(name):
print(‘%s ready to eat‘ %name)
food_list=[]
while True:
food=yield food_list # food=‘骨頭‘
food_list.append(food) #food_list=[‘泔水‘,‘骨頭‘]
print(‘%s start to eat %s‘ %(name,food))


dog1=eat(‘alex‘)

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) #寫入文件

Python之旅.第三章.函數3.30