python之路 函式迭代,生成器

2022-07-25 04:39:07 字數 3277 閱讀 5942

---恢復內容開始---

① dir(被測物件) 如果它含有 __iter__,那這個物件叫做可迭代物件,遵循可迭代協議。

②  可迭代物件:iterable 可以轉換 迭代器(如何實現:都像內部定義乙個 __iter__()方法)

迭代器(iterator)遵循迭代器協議

1,只含有__iter__方法的資料是課迭代的物件

l = [1,2,3,4]

print('

__iter__

'in dir(l))

2,含有__iter__方法,並且含有__next__方法的資料是迭代器。

print(dir([1,2].__iter__

()))

① 迭代器節省記憶體

② 迭代器有惰性機制

③ 迭代器不能反覆,一直向下執行。

for 可以迴圈有: 字串,列表,元祖,字典,集合,說明它們都是可以被迭代的。

在for迴圈中,就是在內部呼叫了__next__方法才能取到乙個乙個的值。

那接下來我們就用迭代器的next方法來寫乙個不依賴for的遍歷。

l = [1,2,3,4]

l_iter = l.__iter__

()item = l_iter.__next__

()print

(item)

item = l_iter.__next__

()print

(item)

item = l_iter.__next__

()print

(item)

item = l_iter.__next__

()print

(item)

item = l_iter.__next__

()print(item)

這是一段會報錯的**,如果我們一直取next取到迭代器裡已經沒有元素了,就會丟擲乙個異常stopiteration,告訴我們,列表中已經沒有有效的元素了。

這個時候,我們就要使用異常處理機制來把這個異常處理掉

l = [1,2,3,4]

l_iter = l.__iter__

()while

true:

try:

item = l_iter.__next__

()

print

(item)

except

stopiteration:

break

那現在我們就使用while迴圈實現了原本for迴圈做的事情,我們是從誰那兒獲取乙個乙個的值呀?是不是就是l_iter?好了,這個l_iter就是乙個迭代器。

1,內部含有__iter__方法,他會將可迭代物件先轉化成迭代器,然後在呼叫__next__方法。

2,它有異常處理方法

驗證range 是不是迭代器

print('

__next__

'in dir(range(12))) #

檢視'__next__'是不是在range()方法執行之後內部是否有__next__

print('

__iter__

'in dir(range(12))) #

檢視'__next__'是不是在range()方法執行之後內部是否有__next__

from collections import iterable

from collections import

iterator

print(isinstance(range(100000000),iterable))

print(isinstance(range(100000000),iterator)) #

驗證range執行之後得到的結果不是乙個迭代器

2,生成器的特點:

①可以用生成器函式寫

②可以用各種推導式構建迭代器

③可以通過資料轉化

3,return 和 yield 的區別

①  return 返回給呼叫者值,並結束此函式

②  yiled  返回給呼叫者值,並將指標停留在當前位置

import

time

defgenrator_fun1():

a = 1

print('

現在定義了a變數')

yield

a b = 2

print('

現在又定義了b變數')

yield

bg1 =genrator_fun1()

print('

g1 :

',g1) #

列印g1可以發現g1就是乙個生成器

print('

-'*20) #

我是華麗的分割線

print

(next(g1))

time.sleep(1) #

sleep一秒看清執行過程

print(next(g1))

1,給上乙個 yiled 整體傳送乙個值

2, send 不能給最後乙個 yiled 傳送值

3, 獲取第乙個值的時候,不能用 send 只能用 next

def

generator():

print(123)

content = yield 1

print('

*****==

',content)

print(456)

yield2

g =generator()

ret = g.__next__

()print('

***'

,ret)

ret = g.send('

hello

') #

send的效果和next一樣

print('

***',ret)

---恢復內容結束---

Python 函式(迭代器 生成器)

只要能被for迴圈的資料型別,就一定擁有 iter 方法,for迴圈其實就是在使用迭代器 只要是迭代器就一定可以迭代 可迭代物件.iter 迭代器 迭代器中的 next 方法可以乙個乙個的獲取值 迭代器物件可以使用常規for語句進行遍歷 list 1,2,3,4 it iter list 建立迭代器...

python之路 生成器

顧名思義,列表生成式就是通過某種方式來生成乙個列表,那麼 ok,我們可以通過哪幾種方式來生成呢?from collections import iterable list 1 0,1,2,3,4,5,6,7,8,9 defadd x return x 2 result map add,list 1 ...

python生成器函式 Python 生成器函式

一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...