日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python可迭代对象 迭代器生成器_Python可迭代对象、迭代器和生成器

發布時間:2023/12/9 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python可迭代对象 迭代器生成器_Python可迭代对象、迭代器和生成器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

8.1 可迭代對象(Iterable)

大部分對象都是可迭代,只要實現了__iter__方法的對象就是可迭代的。

__iter__方法會返回迭代器(iterator)本身,例如:

>>> lst = [1,2,3]

>>> lst.__iter__()

Python提供一些語句和關鍵字用于訪問可迭代對象的元素,比如for循環、列表解析、邏輯操作符等。

判斷一個對象是否是可迭代對象:

>>> from collections import Iterable ?# 只導入Iterable方法

>>> isinstance('abc', Iterable)

True

>>> isinstance(1, Iterable)

False

>>> isinstance([], Iterable)

True

這里的isinstance()函數用于判斷對象類型,后面會講到。

可迭代對象一般都用for循環遍歷元素,也就是能用for循環的對象都可稱為可迭代對象。

例如,遍歷列表:

>>>?lst =?[1, 2, 3]

>>> for i in lst:

...? ?print i

...

1

2

3

博客地址:http://lizhenliang.blog.51cto.com and https://yq.aliyun.com/u/lizhenliang

QQ群:323779636(Shell/Python運維開發群)

8.2 迭代器(Iterator)

具有next方法的對象都是迭代器。在調用next方法時,迭代器會返回它的下一個值。如果next方法被調用,但迭代器沒有值可以返回,就會引發一個StopIteration異常。

使用迭代器的好處:

1)如果使用列表,計算值時會一次獲取所有值,那么就會占用更多的內存。而迭代器則是一個接一個計算。

2)使代碼更通用、更簡單。

8.2.1 迭代器規則

回憶下在Python數據類型章節講解到字典迭代器方法,來舉例說明下迭代器規則:

>>> d = {'a':1, 'b':2, 'c':3}

>>> d.iteritems()

# 判斷是否是迭代器

>>> from collections import Iterator

>>> isinstance(d, Iterator)

False

>>> isinstance(d.iteritems(), Iterator)

True

# 使用next方法。

>>> iter_items = d.iteritems()

>>> iter_items.next()

('a', 1)

>>> iter_items.next()

('c', 3)

>>> iter_items.next()

('b', 2)

由于字典是無序的,所以顯示的是無序的,實際是按照順序獲取的下一個元素。

8.2.2 iter()函數

使用iter()函數轉換成迭代器:

語法:

iter(collection) -> iterator

iter(callable, sentinel) -> iterator

>>> lst =?[1, 2, 3]

>>> isinstance(lst, Iterator)

False

>>> lst.next() ?# 不是迭代器是不具備next()屬性的

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'list' object has no attribute 'next'

>>> iter_lst = iter(lst)

>>> isinstance(iter_lst, Iterator)

True

>>> iter_lst.next()

1

>>> iter_lst.next()

2

>>> iter_lst.next()

3

8.2.3 itertools模塊

itertools模塊是Python內建模塊,提供可操作迭代對象的函數??梢陨傻?#xff0c;也可以生成無限的序列迭代器。

有下面幾種生成無限序列的方法:

count([n]) --> n, n+1, n+2, ...

cycle(p) --> p0, p1, ... plast, p0, p1, ...

repeat(elem [,n]) --> elem, elem, elem, ... endlessly or up to n times

也有幾個操作迭代器的方法:

islice(seq, [start,] stop [, step]) --> elements from

chain(p, q, ...) --> p0, p1, ... plast, q0, q1, ...

groupby(iterable[, keyfunc]) --> sub-iterators grouped by value of keyfunc(v)

imap(fun, p, q, ...) --> fun(p0, q0), fun(p1, q1), ...

ifilter(pred, seq) --> elements of seq where pred(elem) is True

1)count生成序列迭代器

>>> from itertools import *? # 導入所有方法

# 用法 count(start=0, step=1) --> count object

>>> counter = count()

>>> counter.next()

0

>>> counter.next()

1

>>> counter.next()

2

......

可以使用start參數設置開始值,step設置步長。

2)cycle用可迭代對象生成迭代器

# 用法 cycle(iterable) --> cycle object

>>> i = cycle(['a', 'b', 'c'])

>>> i.next()

'a'

>>> i.next()

'b'

>>> i.next()

'c'

3)repeat用對象生成迭代器

# 用法 repeat(object [,times]) -> create an iterator which returns the object,就是任意對象

>>> i = repeat(1)

>>> i.next()

1

>>> i.next()

1

>>> i.next()

1

......

可使用無限次。

也可以指定次數:

>>> i = repeat(1, 2)

>>> i.next()

1

>>> i.next()

1

>>> i.next()

Traceback (most recent call last):

File "", line 1, in

StopIteration

4)islice用可迭代對象并設置結束位置

# 用法 islice(iterable, [start,] stop [, step]) --> islice object

>>> i = islice([1,2,3],2)

>>> i.next()

1

>>> i.next()

2

>>> i.next()

Traceback (most recent call last):

File "", line 1, in

StopIteration

正常的話也可以獲取的3。

5)chain用多個可迭代對象生成迭代器

# 用法 chain(*iterables) --> chain object

>>> i = chain('a','b','c')

>>> i.next()

'a'

>>> i.next()

'b'

>>> i.next()

'c'

6)groupby將可迭代對象中重復的元素挑出來放到一個迭代器中

# 用法 groupby(iterable[, keyfunc]) -> create an iterator which returns

>>> for key,group in groupby('abcddCca'):

...? ?print key,list(group)

...

a ['a']

b ['b']

c ['c']

d ['d', 'd']

C ['C']

c ['c']

a ['a']

groupby方法是區分大小寫的,如果想把大小寫的都放到一個迭代器中,可以定義函數處理下:

>>> for key,group in groupby('abcddCca', lambda c: c.upper()):

...? ?print key, list(group)

...

A ['a']

B ['b']

C ['c']

D ['d', 'd']

C ['C', 'c']

A ['a']

7)imap用函數處理多個可迭代對象

# 用法 imap(func, *iterables) --> imap object

>>> a = imap(lambda x, y: x * y,[1,2,3],[4,5,6])

>>> a.next()

4

>>> a.next()

10

>>> a.next()

18

8)ifilter過濾序列

# 用法 ifilter(function or None, sequence) --> ifilter object

>>> i = ifilter(lambda x: x%2==0,[1,2,3,4,5])

>>> for i in i:

...? ?print i

...

2

4

當使用for語句遍歷迭代器時,步驟大致這樣的,先調用迭代器對象的__iter__方法獲取迭代器對象,再調用對象的__next__()方法獲取下一個元素。最后引發StopIteration異常結束循環。

8.3 生成器(Generator)

什么是生成器?

1)任何包含yield語句的函數都稱為生成器。

2)生成器都是一個迭代器,但迭代器不一定是生成器。

8.3.1 生成器函數

在函數定義中使用yield語句就創建了一個生成器函數,而不是普通的函數。

當調用生成器函數時,每次執行到yield語句,生成器的狀態將被凍結起來,并將結果返回__next__調用者。凍結意思是局部的狀態都會被保存起來,包括局部變量綁定、指令指針。確保下一次調用時能從上一次的狀態繼續。

以生成斐波那契數列舉例說明yield使用:

斐波那契(Fibonacci)數列是一個簡單的遞歸數列,任意一個數都可以由前兩個數相加得到。

#!/usr/bin/python

# -*- coding: utf-8 -*-

def fab(max):

n, a, b = 0, 0, 1

while n < max:

print b

a, b = b, a + b

n += 1

fab(5)

# python test.py

1

1

2

3

5

使用yied語句,只需要把print b改成yield b即可:

#!/usr/bin/python

# -*- coding: utf-8 -*-

def fab(max):

n, a, b = 0, 0, 1

while n < max:

yield b

# print b

a, b = b, a + b

n += 1

print fab(5)

# python test.py

可見,調用fab函數不會執行fab函數,而是直接返回了一個生成器對象,上面說過生成器就是一個迭代器。那么就可以通過next方法來返回它下一個值。

>>> import test

>>> f = test.fab(5)

>>> f.next()

1

>>> f.next()

1

>>> f.next()

2

>>> f.next()

3

>>> f.next()

5

每次fab函數的next方法,就會執行fab函數,執行到yield b時,fab函數返回一個值,下一次執行next方法時,代碼從yield b的嚇一跳語句繼續執行,直到再遇到yield。

8.3.2 生成器表達式

在第四章 Python運算符和流程控制章節講過,簡化for和if語句,使用小括號()返回一個生成器,中括號[]生成一個列表。

回顧下:

# 生成器表達式

>>> result = (x for x in range(5))

>>> result

at 0x030A4FD0>

>>> type(result)

# 列表解析表達式

>>> result = [ x for x in range(5)]

>>> type(result)

>>> result

[0, 1, 2, 3, 4]

第一個就是生成器表達式,返回的是一個生成器,就可以使用next方法,來獲取下一個元素:

>>> result.next()

0

>>> result.next()

1

>>> result.next()

2

......

總結

以上是生活随笔為你收集整理的python可迭代对象 迭代器生成器_Python可迭代对象、迭代器和生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。