器 => 工具
迭代:是乙個重複的過程,但每次重複都是基於上一次的結果而來的
**迭代器:**就是一種不依賴於索引的取值工具
特性:
1.是一種通用的迭代取值方案
2.惰性計算,節省記憶體
# 對於序列型別 str,list,tuple可以依賴索引來迭代取值
# 對於dict,set,檔案 python必須為我們提供一種不依賴於索引的迭代取值的方式=》迭代器
name=
'egon'
lis=[1
,2,3
]tup=[1
,2,3
]dic=
s=f=
open
('file.txt'
,'r'
,encoding=
'utf-8'
)name.__iter__(
)#字串型別為可迭代物件
lis.__iter__(
)#列表型別為可迭代物件
tup.__iter__(
)#元組型別為可迭代物件
dic.__iter__(
)#字典型別為可迭代物件
s.__iter__(
)#集合為可迭代物件
f.__iter__(
)#檔案型別為可迭代物件
檔案物件即有obj.__iter__()方法也有obj.__next__()方法屬於迭代器物件
name=
'egon'
name_iter=name.__iter__(
)#呼叫obj.__iter__()方法可以使可迭代物件變成迭代器物件
name._iter.__iter__(
)name_iter.__next__(
)
1、可迭代物件不一定是迭代器物件
2、迭代器物件一定是可迭代物件
3、呼叫obj.__iter__(
)方法,得到的是迭代器物件(對於迭代器物件,執行obj.__iter__(
)方法得到的仍然是它本身)
優點:
1.是一種通用的迭代取值方案
2.惰性計算,節省記憶體
缺點:1
.取值不如索引、key的取值方式靈活
2.取值是一次性的,只能往後取,不能預估值得個數
d=
d_iter=d.__iter__(
)#也可以寫成d_iter=iter(d)
#迭代器d_iter沒有值了,就會丟擲異常stopiteration
while
true
:try
: data=d_iter.__next__();
#也可以寫成data=next(d_iter)
print
(d[data]
)except stopiteration:
print
("取值完畢"
)break
dic =
# 1、dic.__iter__()得到乙個迭代器物件
dic_iterator = dic.__iter__(
)while
true
:try
:#2、迭代器物件.__next__()拿到乙個返回值,然後將該返回值賦值給res
res = dic_iterator.__next__(
)print
(res)
# 3、迴圈往復步驟2,直到丟擲stopiteration異常for迴圈會捕捉異常然後結束迴圈
except stopiteration:
break
for k in dic:
print
(k)
但凡是函式內出現了yield關鍵字,呼叫函式將不會執行函式體**,會得到乙個返回值,該返回值就是我們自定義的迭代器,稱之為生成器
def
func()
:print
("hello1"
)yield
111print
("hello2"
)yield
222print
("hello3"
)yield
333# 生成器本質就是迭代器
g = func(
)print
(g)
res=
next
(g)print
(res)
# 執行結果 111
res=
next
(g)print
(res)
res=
next
(g)print
(res)
next
(g)
#1、yield為我們提供了一種自定義迭代器的方法
#2、yield與return的區別:
#1、yield可以返回多次值
#2、函式暫停與再繼續的狀態是由yield幫我們儲存的
def
my_range
(start,end,step=1)
:while start < end:
yield start
start+=step
res=my_range(1,
10)for i in res:
print
(i)
l =
['alex_dsb'
,'lxx_dsb'
,'wxx_dsb'
,"xxq_dsb"
,'egon'
]#1、列表生成式
# 把所有小寫字母全變成大寫
# new_l=[name.upper() for name in l]
# print(new_l)
# 把所有的名字去掉字尾_dsb
# new_l=[name.replace('_dsb','') for name in l]
# print(new_l)
# 2、字典生成式
# keys=['name','age','gender']
# dic=
# print(dic)
# items=[('name','egon'),('age',18),('gender','male')]
# res=
# print(res)
# 3、集合生成式
# keys=['name','age','gender']
# set1=
# print(set1,type(set1))
建立乙個生成器物件有兩種方式,一種是呼叫帶yield關鍵字的函式,另一種就是生成器表示式,與列表生成式的語法格式相同,只需要將換成(),即:
(expression for item in iterable if condition)
# 生成器表示式
# g=(i for i in range(10) if i > 3)
# !!!!!!!!!!!強調!!!!!!!!!!!!!!!
# 此刻g內部乙個值也沒有
# print(g,type(g))
# print(g)
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
#統計檔案中的字元個數
with
open
('筆記.txt'
,mode=
'rt'
,encoding=
'utf-8'
)as f:
# 方式一:
# res=0
# for line in f:
# res+=len(line)
# print(res)
# 方式二:
# res=sum([len(line) for line in f])
# print(res)
# 方式三 :效率最高
# res = sum((len(line) for line in f))
# 上述可以簡寫為如下形式
res =
sum(
len(line)
for line in f)
print
(res)
列表生成式 生成器 迭代器
1 列表生成式,可以在前邊加入表示式或者函式 a x 2 for x in range 10 print a def f n return n n n b f x for x in range 10 print b 2 a.生成器,每次使用得時候才會計算,每次只能取下乙個而不能跳躍取值.生成器就是乙...
列表生成式 生成器 迭代器
列表生成式 可以直接在列表裡進行運算 生成器 一邊迴圈一邊計算的機制,稱為生成器 generator 就是生成乙個不執行的函式或者列表,即資料流 第二句 生成器與列表的區別 生成器你不知道長度,就是乙個資料流 list dict str你知道長度 迭代器 可以被next 函式呼叫並不斷返回下乙個值的...
Python 列表生成式 生成器 迭代器
常見的列表生成方式 1.list list range 1 5 1 2,3 4 2.for迴圈 l for i in range 1 5 l 1 2,3 4 3.列表生成式 在列表生成時加入限制判斷條件 例 1,2,3,4 x for x in range 1 5 可以新增限制條件 2.4 x fo...