一阻荒、迭代器
常用三連
1棺弊、什么是迭代器
器>>>>工具
迭代:是一個重復(fù)的過程落包,但每次重復(fù)都是基于上一次的結(jié)果而來的
names=["yan",'aaa','bbb']
count = 1
while count < len(names):
print(names[count])
count+=1
迭代器:就是一種不依賴于索引的取值工具
2俊啼、為何要有迭代器
特性:
1、是一種通用的迭代取值方案
2邑时、惰性計算奴紧,節(jié)省內(nèi)存
3、如何用迭代器
3.1:引入
dic = {"name": "yan", 'age': 18, 'gender': "male"}
dic_iterator = dic.__iter__()
res1 = dic_iterator.__next__()
print(res1)
res2 = dic_iterator.__next__()
print(res2)
res3 = dic_iterator.__next__()
print(res3)
# 取完值再取的話就會報一個StopIteration的錯誤
dic_iterator.__next__() # StopIteration
# 可以使用while循環(huán)取值晶丘,利用try catch捕獲異常
while True:
try:
res = dic_iterator.__next__()
print(res)
except StopIteration:
break
3.2:可迭代對象與迭代器對象
3.2.1 內(nèi)置有iter方法的類型稱之為:可迭代的對象/類型
1黍氮、字典dict
2、集合set
3浅浮、文件對象(也是迭代器對象)
4沫浆、字符串str
5、列表list
6滚秩、元組tuple
3.2.2 迭代器對象: 內(nèi)置有next方法专执、內(nèi)置有iter方法
dic = {"name": "yan", 'age': 18, 'gender': "male"}
dic_iterator1 = dic.__iter__()
dic_iterator1.__next__()
print(dic_iterator1.__iter__().__iter__().__iter__() is dic_iterator1)
dic_iterator2 = dic.__iter__()
3.3:for循環(huán)的工作原理
步驟1 dic_iterator = dic.iter()
步驟2 k=dic_iterator.next(),執(zhí)行循環(huán)體代碼
步驟3 循環(huán)往復(fù),直到拋出異常郁油,for循環(huán)會幫我們捕捉異常結(jié)束循環(huán)
dic = {"name": "yan", 'age': 18, 'gender': "male"}
# 使用while循環(huán)取值
dic_iterator = dic.__iter__()
while True:
try:
res = dic_iterator.__next__()
print(res)
except StopIteration:
break
# for循環(huán)只需兩行代碼就能解決
dic = {"name": "yan", 'age': 18, 'gender': "male"}
dic_iterator = dic.__iter__()
for k in dic_iterator:
print(k)
print(dic_iterator)
3.4:基于同一迭代器的重復(fù)取值
示例1:
dic = {"name": "yan", 'age': 18, 'gender': "male"}
dic_iterator = dic.__iter__()
while True:
try:
res = dic_iterator.__next__()
print(res)
except StopIteration:
break
print('='*20)
dic_iterator = dic.__iter__() # 第二次取值時本股,必須要重新生成迭代器才能取到值
while True:
try:
res = dic_iterator.__next__()
print(res)
except StopIteration:
break
示例2:
dic = {"name": "yan", 'age': 18, 'gender': "male"}
for k in dic: # dic.__iter__()
print(k)
# 使用for循環(huán)就不需要再重新生成迭代器
for k in dic: # dic.__iter__()
print(k)
二、自定義迭代器
自定義迭代器來實現(xiàn)惰性計算桐腌,從而達到節(jié)省內(nèi)存的效果
1拄显、什么是生成器
但凡是函數(shù)內(nèi)出現(xiàn)了yield關(guān)鍵字,調(diào)用函數(shù)將不會執(zhí)行函數(shù)體代碼,會得到一個返回值哩掺,該返回值
就是我們自定義的迭代器凿叠,稱之為生成器
def func():
print("hello1")
yield 111
print("hello2")
yield 222
print("hello3")
yield 333
g = func()
print(g) # 生成器本質(zhì)就是迭代器
res=next(g)
print(res)
res=next(g)
print(res)
res=next(g)
print(res)
next(g)
2涩笤、yield 和 return之間的比較
(1)相同點:都可以用來返回值
(2)不同點:
------------- return只能返回一次值嚼吞,函數(shù)就立即結(jié)束了
------------- yield能返回多次值,yield可以掛起函數(shù)
案例
def func():
res=0
while True:
res+=1
yield res
g=func()
for i in g:
print(i)
總結(jié)迭代器的優(yōu)缺點
優(yōu)點:
1蹬碧、是一種通用的迭代取值方案
2舱禽、惰性計算,節(jié)省內(nèi)存
缺點:
1恩沽、取值不如索引誊稚、key的取值方式靈活
2、取值是一次性的罗心,只能往后取里伯,不能預(yù)估值的個數(shù)
自定義range
def my_range(x, y, z):
while x < y:
x += z
yield x - z
g = my_range(1, 10, 3)
for i in g:
print(i)
三、了解面向過程編程
面向過程:
核心是“過程”二字渤闷,過程指的就是做事的步驟
也就是先干什疾瓮、再干什么、后干什么飒箭。狼电。蜒灰。
基于該思想寫程序就好比設(shè)計一條條的流水線
優(yōu)點:
可以把復(fù)雜的問題流程化,進而簡單化
缺點:
牽一發(fā)而動全身肩碟,擴展性差
四强窖、生成器
1、列表生成式
l=[i**2 for i in range(5) if i > 2]
print(l)
names=['1_sb','2_sb','3_sb','4']
l=[name for name in names if name.endswith('sb')]
print(l)
2削祈、集合生成式
res={i for i in range(5)}
print(res)
3翅溺、字典生成式
res={f'k{i}': i**2 for i in range(5)}
print(res)
4、生成器表達式
res=(i for i in range(5)) # 看似是元組生成式髓抑,其實是生成器表達式
# print(res,type(res))
print(next(res))
nums=(i for i in range(200000)) # 一行代碼搞定循環(huán)取值
res=sum(nums)
print(res)
with open('a.txt', mode='rt', encoding='utf-8') as f:
data=f.read()
print(len(data))
res=0
for line in f:
res+=len(line)
res = sum((len(line) for line in f))
res = sum(len(line) for line in f)
print(res)