迭代器生成器生成式

2021-10-08 10:21:25 字數 4487 閱讀 1042

器 => 工具

迭代:是乙個重複的過程,但每次重複都是基於上一次的結果而來的

**迭代器:**就是一種不依賴於索引的取值工具

特性:

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...