Python基礎之列表泻仙,元組糕再,字典,集合饰豺,推導式亿鲜,迭代器

寫這篇文章,是對于平常開發(fā)不是以Python為主冤吨,以便能快速復習Python基礎知識而記錄,以下文章都是基于python 3+

1 列表

1.1 定義

序列Python 中最基本的數(shù)據(jù)結構
序列中的每個值都有對應的位置值饶套,稱之為索引漩蟆,第一個索引是 0,第二個索引是 1妓蛮,依此類推怠李。
Python 有 6 個序列的內置類型,但最常見的是列表元組
列表都可以進行的操作包括索引蛤克,切片捺癞,加,乘构挤,檢查成員髓介。
此外,Python 已經(jīng)內置確定序列的長度以及確定最大和最小的元素的方法筋现。
列表是最常用的 Python 數(shù)據(jù)類型唐础,它可以作為一個方括號內的逗號分隔值出現(xiàn)箱歧。列表的數(shù)據(jù)項 不需要具有相同的類型

創(chuàng)建一個列表,只要把逗號分隔的不同的數(shù)據(jù)項使用方括號括起來即可一膨。如下所示:

list1 = ['Google', 'Test', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]
list4 = ['red', 'green', 'blue', 'yellow', 'white', 'black']

1.2 訪問列表中的值

列表索引從 0開始呀邢,第二個索引是 1,依此類推豹绪。
通過索引列表可以進行截取价淌、組合等操作。

#!/usr/bin/python3
list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print( list[0] )
print( list[1] )
print( list[2] )

結果:
red
green
blue

索引也可以從尾部開始瞒津,最后一個元素的索引為-1输钩,往前一位為 -2,以此類推

image.png

#!/usr/bin/python3

list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print( list[-1] )
print( list[-2] )
print( list[-3] )

結果:
black
white
yellow

使用下標索引來訪問列表中的值仲智,同樣也可以使用方括號 [] 的形式截取字符买乃,如下所示:

image.png

#!/usr/bin/python3
nums = [10, 20, 30, 40, 50, 60, 70, 80, 90]
print(nums[0:4])

結果:
[10, 20, 30, 40]

使用負數(shù)索引值截取:

#!/usr/bin/python3 
list = ['Google', 'Test', "Zhihu", "Taobao", "Wiki"]
 # 讀取第二位
print ("list[1]: ", list[1])
# 從第二位開始(包含)截取到倒數(shù)第二位(不包含)
print ("list[1:-2]: ", list[1:-2])

結果:

list[1]:  Test
list[1:-2]:  ['Test', 'Zhihu']

1.3 更新列表

可以對列表的數(shù)據(jù)項進行修改或更新钓辆,也可以使用 append()方法來添加列表項剪验,如下所示:

#!/usr/bin/python3
 
list = ['Google', 'Test', 1997, 2000]
 
print ("第三個元素為 : ", list[2])
list[2] = 2001
print ("更新后的第三個元素為 : ", list[2])
 
list1 = ['Google', 'Test', 'Taobao']
list1.append('Baidu')
print ("更新后的列表 : ", list1)

結果:
第三個元素為 :  1997
更新后的第三個元素為 :  2001
更新后的列表 :  ['Google', 'Test', 'Taobao', 'Baidu']

1.4 刪除列表元素

可以使用 del 語句來刪除列表的的元素,如下實例:

#!/usr/bin/python3
 
list = ['Google', 'Test', 1997, 2000]
 
print ("原始列表 : ", list)
del list[2]
print ("刪除第三個元素 : ", list)

結果:
原始列表 :  ['Google', 'Test', 1997, 2000]
刪除第三個元素 :  ['Google', 'Test', 2000]

1.5 Python列表腳本操作符

列表對+* 的操作符與字符串相似前联。+ 號用于組合列表功戚,* 號用于重復列表

Python 表達式 結果 描述
len([1, 2, 3]) 3 長度
[1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] 組合
['Hi!'] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!'] 重復
3 in [1, 2, 3] True 元素是否存在于列表中
for x in [1, 2, 3]: print(x, end=" ") 1 2 3 迭代

1.6 Python列表截取與拼接

Python的列表截取與字符串操作類型,如下所示:

L=['Google', 'Test', 'Taobao']

操作:

Python 表達式 結果 描述
L[2] 'Taobao' 讀取第三個元素
L[-2] 'Test' 從右側開始讀取倒數(shù)第二個元素: count from the right
L[1:] ['Test', 'Taobao'] 輸出從第二個元素開始后的所有元素
>>>L=['Google', 'Test', 'Taobao']
>>> L[2]
'Taobao'
>>> L[-2]
'Test'
>>> L[1:]
['Test', 'Taobao']
>>>

列表還支持拼接操作:
>>>squares = [1, 4, 9, 16, 25]
>>> squares += [36, 49, 64, 81, 100]
>>> squares
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>

1.7 嵌套列表

使用嵌套列表即在列表里創(chuàng)建其它列表似嗤,例如:

>>>a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'

1.8 列表比較

列表比較需要引入 operator 模塊的 eq 方法

# 導入 operator 模塊
import operator

a = [1, 2]
b = [2, 3]
c = [2, 3]
print("operator.eq(a,b): ", operator.eq(a,b))
print("operator.eq(c,b): ", operator.eq(c,b))

結果
operator.eq(a,b):  False
operator.eq(c,b):  True

2 元組

2.1 定義

Python元組列表類似啸臀,不同之處在于 元組的元素不能修改
注意:元組使用小括號( ),列表使用方括號[ ]
元組創(chuàng)建很簡單烁落,只需要在括號中添加元素乘粒,并使用逗號隔開即可

>>> tup1 = ('Google', 'Test', 1997, 2000)
>>> tup2 = (1, 2, 3, 4, 5 )
>>> tup3 = "a", "b", "c", "d"   #  不需要括號也可以
>>> type(tup3)
<class 'tuple'>

2.2 創(chuàng)建空元組

創(chuàng)建空元組

tup1 = ()

元組中只包含一個元素時,需要在元素后面添加逗號 ,伤塌,否則括號會被當作運算符使用:

>>> tup1 = (50)
>>> type(tup1)     # 不加逗號灯萍,類型為整型
<class 'int'>

>>> tup1 = (50,)
>>> type(tup1)     # 加上逗號,類型為元組
<class 'tuple'>

元組與字符串類似每聪,下標索引從 0 開始旦棉,可以進行截取,組合等药薯。


image.png

2.3 訪問元組

元組可以使用下標索引來訪問元組中的值绑洛,如下實例:

#!/usr/bin/python3

tup1 = ('Google', 'Test', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
 
print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])

結果:
tup1[0]:  Google
tup2[1:5]:  (2, 3, 4, 5)

2.4 修改元組

元組中的元素值是不允許修改的,但我們可以對元組進行連接組合童本,如下實例:

#!/usr/bin/python3
 
tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
 
# 以下修改元組元素操作是非法的真屯。
# tup1[0] = 100
 
# 創(chuàng)建一個新的元組
tup3 = tup1 + tup2
print (tup3)

結果:
(12, 34.56, 'abc', 'xyz')

2.5 刪除元組

元組中的元素值是不允許刪除的,但我們可以使用del語句來刪除整個元組巾陕,如下實例:

#!/usr/bin/python3
tup = ('Google', 'Test', 1997, 2000)
 
print (tup)
del tup
print ("刪除后的元組 tup : ")
print (tup)

以上實例元組被刪除后讨跟,輸出變量會有異常信息纪他,輸出如下所示:

刪除后的元組 tup : 
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    print (tup)
NameError: name 'tup' is not defined

2.6 元組運算符

與字符串一樣,元組之間可以使用 + 號和 * 號進行運算晾匠。這就意味著他們可以組合復制茶袒,運算后會生成一個新的元組。

Python 表達式 結果 描述
len((1, 2, 3)) 3 計算元素個數(shù)
(1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) 連接
('Hi!',) * 4 ('Hi!', 'Hi!', 'Hi!', 'Hi!') 復制
3 in (1, 2, 3) True 元素是否存在
for x in (1, 2, 3): print (x, end=" ") 1 2 3 迭代

3 字典

3.1 定義

字典是另一種可變容器模型凉馆,且可存儲任意類型對象薪寓。
字典的每個鍵值 key=>value 對用冒號 : 分割,每個對之間用逗號(,)分割澜共,整個字典包括在花括號 {}中 ,格式如下所示:

d = {key1 : value1, key2 : value2, key3 : value3 }

注意:dict 作為 Python 的關鍵字和內置函數(shù)向叉,變量名不建議命名為 dict

鍵必須是唯一的,但值則不必嗦董。
值可以取任何數(shù)據(jù)類型母谎,但鍵必須是不可變的,如字符串京革,數(shù)字奇唤。

3.2 創(chuàng)建空字典

使用大括號 { } 創(chuàng)建空字典:

# 使用大括號 {} 來創(chuàng)建空字典
emptyDict = {}
# 打印字典
print(emptyDict)
# 查看字典的數(shù)量
print("Length:", len(emptyDict))
# 查看類型
print(type(emptyDict))

結果:
{}
Length: 0
<class 'dict'>

使用內建函數(shù) dict()創(chuàng)建字典:

emptyDict = dict()
# 打印字典
print(emptyDict)
# 查看字典的數(shù)量
print("Length:",len(emptyDict))
# 查看類型
print(type(emptyDict))

結果:
{}
Length: 0
<class 'dict'>

3.3 訪問字典里的值

把相應的鍵放入到方括號中,如下實例:

#!/usr/bin/python3
tinydict = {'Name': 'Test', 'Age': 7, 'Class': 'First'}
 
print ("tinydict['Name']: ", tinydict['Name'])
print ("tinydict['Age']: ", tinydict['Age'])

結果:
tinydict['Name']:  Test
tinydict['Age']:  7

如果用字典里沒有的鍵訪問數(shù)據(jù)匹摇,會輸出錯誤如下:

#!/usr/bin/python3
tinydict = {'Name': 'Test', 'Age': 7, 'Class': 'First'}
 print ("tinydict['Alice']: ", tinydict['Alice'])

結果:
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    print ("tinydict['Alice']: ", tinydict['Alice'])
KeyError: 'Alice'

3.4 修改字典

向字典添加新內容的方法是增加新的鍵/值對咬扇,修改或刪除已有鍵/值對如下實例:

#!/usr/bin/python3
tinydict = {'Name': 'Test', 'Age': 7, 'Class': 'First'}
tinydict['Age'] = 8               # 更新 Age
tinydict['School'] = "菜鳥教程"  # 添加信息
 
 
print ("tinydict['Age']: ", tinydict['Age'])
print ("tinydict['School']: ", tinydict['School'])

結果:
tinydict['Age']:  8
tinydict['School']:  菜鳥教程

3.5 刪除字典元素

能刪單一的元素也能清空字典,清空只需一項操作廊勃。
顯式刪除一個字典用del命令懈贺,如下實例:

#!/usr/bin/python3 
tinydict = {'Name': 'Test', 'Age': 7, 'Class': 'First'} 
del tinydict['Name'] # 刪除鍵 'Name'
tinydict.clear()     # 清空字典
del tinydict         # 刪除字典
 
print ("tinydict['Age']: ", tinydict['Age'])
print ("tinydict['School']: ", tinydict['School'])

但這會引發(fā)一個異常,因為用執(zhí)行 del 操作后字典不再存在:
Traceback (most recent call last):
  File "/test-test/test.py", line 9, in <module>
    print ("tinydict['Age']: ", tinydict['Age'])
NameError: name 'tinydict' is not defined

3.6 字典鍵的特性

字典值可以是任何的 python 對象坡垫,既可以是標準的對象圈纺,也可以是用戶定義的缕贡,但鍵不行

  • 不允許同一個鍵出現(xiàn)兩次笼蛛。創(chuàng)建時如果同一個鍵被賦值兩次倘核,后一個值會被記住
  • 鍵必須不可變片拍,所以可以用數(shù)字恨统,字符串或元組充當疯淫,而用列表就不行
#!/usr/bin/python3 
tinydict = {'Name': 'Test', 'Age': 7, 'Name': '小菜鳥'} 
print ("tinydict['Name']: ", tinydict['Name'])

結果:
tinydict['Name']:  小菜鳥
#!/usr/bin/python3
 
tinydict = {['Name']: 'Test', 'Age': 7}
 
print ("tinydict['Name']: ", tinydict['Name'])
以上實例輸出結果:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    tinydict = {['Name']: 'Test', 'Age': 7}
TypeError: unhashable type: 'list'

3.7 字典內置函數(shù)&方法

Python字典包含了以下內置函數(shù):

  • len(dict):計算字典元素個數(shù)歉糜,即鍵的總數(shù)宪卿。
  • str(dict):輸出字典的诵,可以打印的字符串表示。
  • type(variable):返回輸入的變量類型佑钾,如果變量是字典就返回字典類型

3.8 字典優(yōu)勢

為什么dict查找速度這么快西疤?因為dict的實現(xiàn)原理和查字典是一樣的。假設字典包含了1萬個漢字休溶,我們要查某一個字代赁,一個辦法是把字典從第一頁往后翻扰她,直到找到我們想要的字為止,這種方法就是在list中查找元素的方法芭碍,list越大徒役,查找越慢。第二種方法是先在字典的索引表里(比如部首表)查這個字對應的頁碼窖壕,然后直接翻到該頁忧勿,找到這個字,無論找哪個字瞻讽,這種查找速度都非吃快,不會隨著字典大小的增加而變慢速勇。

dict就是第二種實現(xiàn)方式晌砾,給定一個名字,比如'Michael'烦磁,dict在內部就可以直接計算出Michael對應的存放成績的“頁碼”养匈,也就是95這個數(shù)字存放的內存地址,直接取出來个初,所以速度非彻院快。這種key-value存儲方式院溺,在放進去的時候楣嘁,必須根據(jù)key算出value的存放位置,這樣珍逸,取的時候才能根據(jù)key直接拿到value逐虚。

和list比較,dict有以下幾個特點:

  • 查找和插入的速度極快谆膳,不會隨著key的增加而增加叭爱; 需要占用大量的內存,內存浪費多漱病。 而list相反:
  • 查找和插入的時間隨著元素的增加而增加买雾; 占用空間小,浪費內存很少杨帽。 所以漓穿,dict是用空間來換取時間的一種方法。
  • dict可以用在需要高速查找的很多地方注盈,在Python代碼中幾乎無處不在晃危,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變對象老客。
  • 這是因為dict根據(jù)key來計算value的存儲位置僚饭,如果每次計算相同的key得出的結果不同震叮,那dict內部就完全混亂了。這個通過key計算位置的算法稱為哈希算法(Hash)鳍鸵。

4 集合

4.1 定義

集合(set)是一個無序的不重復元素序列苇瓣。
可以使用 set()函數(shù)創(chuàng)建集合,注意:創(chuàng)建一個空集合必須用 set() 而不是{ }权纤,因為{ }是用來創(chuàng)建一個空字典钓简。

創(chuàng)建格式:

parame = {value01,value02,...}
或者
set(value)

集合大致操作如下:

>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket)                      # 這里演示的是去重功能
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket                 # 快速判斷元素是否在集合內
True
>>> 'crabgrass' in basket
False

>>> # 下面展示兩個集合間的運算.
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # 集合a中包含而集合b中不包含的元素
{'r', 'd', 'b'}
>>> a | b                              # 集合a或b中包含的所有元素
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # 集合a和b中都包含了的元素
{'a', 'c'}
>>> a ^ b                              # 不同時包含于a和b的元素
{'r', 'd', 'b', 'm', 'z', 'l'}

遍歷元素:

>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}

4.2 操作集合

4.2.1 添加元素

語法格式如下:

s.add( x )

將元素 x 添加到集合 s 中,如果元素已存在汹想,則不進行任何操作外邓。

>>> thisset = set(("Google", "Test", "Taobao"))
>>> thisset.add("Facebook")
>>> print(thisset)
{'Taobao', 'Facebook', 'Google', 'Test'}

還有一個方法,也可以添加元素古掏,且參數(shù)可以是列表损话,元組,字典等槽唾,語法格式如下:

s.update( x )

x 可以有多個丧枪,用逗號分開。

>>> thisset = set(("Google", "Test", "Taobao"))
>>> thisset.update({1,3})
>>> print(thisset)
{1, 3, 'Google', 'Taobao', 'Test'}
>>> thisset.update([1,4],[5,6])  
>>> print(thisset)
{1, 3, 4, 5, 6, 'Google', 'Taobao', 'Test'}
>>>

4.2.2 移除元素

語法格式如下:

s.remove( x )

將元素 x 從集合 s 中移除庞萍,如果元素不存在拧烦,則會發(fā)生錯誤。

>>> thisset = set(("Google", "Test", "Taobao"))
>>> thisset.remove("Taobao")
>>> print(thisset)
{'Google', 'Test'}
>>> thisset.remove("Facebook")   # 不存在會發(fā)生錯誤
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Facebook'
>>>

此外還有一個方法也是移除集合中的元素钝计,且 如果元素不存在恋博,不會發(fā)生錯誤
格式如下所示:

s.discard( x )
>>> thisset = set(("Google", "Test", "Taobao"))
>>> thisset.discard("Facebook")  # 不存在不會發(fā)生錯誤
>>> print(thisset)
{'Taobao', 'Google', 'Test'}

我們也可以設置隨機刪除集合中的一個元素,語法格式如下:

s.pop() 
thisset = set(("Google", "Test", "Taobao", "Facebook"))
x = thisset.pop()

print(x)
結果:

$ python3 test.py 
Test

多次執(zhí)行測試結果都不一樣私恬。
set 集合的 pop 方法會對集合進行無序的排列债沮,然后將這個無序排列集合的左面第一個元素進行刪除。

4.2.3 計算集合元素個數(shù)

語法格式如下:

len(s)

計算集合 s 元素個數(shù)本鸣。

>>> thisset = set(("Google", "Test", "Taobao"))
>>> len(thisset)
3

4.2.4 清空集合

語法格式如下:

s.clear()

清空集合 s

>>> thisset = set(("Google", "Test", "Taobao"))
>>> thisset.clear()
>>> print(thisset)
set()

4.2.5 判斷元素是否在集合中存在

語法格式如下:

x in s

判斷元素 x 是否在集合 s 中疫衩,存在返回 True,不存在返回 False荣德。

>>> thisset = set(("Google", "Test", "Taobao"))
>>> "Test" in thisset
True
>>> "Facebook" in thisset
False
>>>

5 推導式

Python 推導式是一種獨特的數(shù)據(jù)處理方式闷煤,可以從一個數(shù)據(jù)序列構建另一個新的數(shù)據(jù)序列的結構體

Python支持各種數(shù)據(jù)結構的推導式:

  • 列表(list)推導式
  • 字典(dict)推導式
  • 集合(set)推導式
  • 元組(tuple)推導式

5.1 列表推導式

列表推導式格式為:

[表達式 for 變量 in 列表] 
[out_exp_res for out_exp in input_list]

或者

[表達式 for 變量 in 列表 if 條件]
[out_exp_res for out_exp in input_list if condition]

各個元素說明:

  • out_exp_res:列表生成元素表達式,可以是有返回值的函數(shù)涮瞻。
  • for out_exp in input_list:迭代 input_listout_exp 傳入到 out_exp_res 表達式中曹傀。
  • if condition:條件語句,可以過濾列表中不符合條件的值饲宛。

過濾掉長度小于或等于3的字符串列表,并將剩下的轉換成大寫字母:

>>> names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
>>> new_names = [name.upper()for name in names if len(name)>3]
>>> print(new_names)
['ALICE', 'JERRY', 'WENDY', 'SMITH']

計算 30 以內可以被 3 整除的整數(shù):

>>> multiples = [i for i in range(30) if i % 3 == 0]
>>> print(multiples)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

5.2 字典推導式

字典推導基本格式:

{ key_expr: value_expr for value in collection }

{ key_expr: value_expr for value in collection if condition }

使用字符串及其長度創(chuàng)建字典:

listdemo = ['Google','Test', 'Taobao']
# 將列表中各字符串值為鍵嗜价,各字符串的長度為值艇抠,組成鍵值對
>>> newdict = {key:len(key) for key in listdemo}
>>> newdict
{'Google': 6, 'Test': 4, 'Taobao': 6}

提供三個數(shù)字幕庐,以三個數(shù)字為鍵,三個數(shù)字的平方為值來創(chuàng)建字典:

>>> dic = {x: x**2 for x in (2, 4, 6)}
>>> dic
{2: 4, 4: 16, 6: 36}
>>> type(dic)
<class 'dict'>

5.3 集合推導式

集合推導式基本格式:

{ expression for item in Sequence }

{ expression for item in Sequence if conditional }

計算數(shù)字 1,2,3 的平方數(shù):

>>> setnew = {i**2 for i in (1,2,3)}
>>> setnew
{1, 4, 9}

判斷不是 abc 的字母并輸出:

>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'d', 'r'}
>>> type(a)
<class 'set'>

5.4 元組推導式(生成器表達式)

元組推導式可以利用 range 區(qū)間家淤、元組异剥、列表、字典和集合等數(shù)據(jù)類型絮重,快速生成一個滿足指定需求的元組冤寿。

元組推導式基本格式:

(expression for item in Sequence )

(expression for item in Sequence if conditional )

元組推導式和列表推導式的用法也完全相同,只是元組推導式是用() 圓括號將各部分括起來青伤,而列表推導式用的是中括號 []督怜,另外元組推導式返回的結果是一個生成器對象。

例如狠角,我們可以使用下面的代碼生成一個包含數(shù)字 1~9 的元組:

>>> a = (x for x in range(1,10))
>>> a
<generator object <genexpr> at 0x7faf6ee20a50>  # 返回的是生成器對象

>>> tuple(a)       # 使用 tuple() 函數(shù)号杠,可以直接將生成器對象轉換成元組
(1, 2, 3, 4, 5, 6, 7, 8, 9)

6 迭代器與生成器

6.1 迭代器定義

迭代是Python最強大的功能之一,是訪問集合元素的一種方式丰歌,特點:

  • 迭代器是一個可以記住遍歷的位置的對象姨蟋。
  • 迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束立帖。
  • 迭代器只能往前不會后退眼溶。
  • 迭代器有兩個基本的方法:iter()next()

字符串,列表或元組對象都可用于創(chuàng)建迭代器:

>>> list=[1,2,3,4]
>>> it = iter(list)    # 創(chuàng)建迭代器對象
>>> print (next(it))   # 輸出迭代器的下一個元素
1
>>> print (next(it))
2
>>>

迭代器對象可以使用常規(guī)for語句進行遍歷:

#!/usr/bin/python3
list=[1,2,3,4]
it = iter(list)    # 創(chuàng)建迭代器對象
for x in it:
    print (x, end=" ")

結果:
1 2 3 4

也可以使用 next()函數(shù):

#!/usr/bin/python3 
import sys         # 引入 sys 模塊
 
list=[1,2,3,4]
it = iter(list)    # 創(chuàng)建迭代器對象
 
while True:
    try:
        print (next(it))
    except StopIteration:
        sys.exit()

結果如下:
1
2
3
4

6.2 創(chuàng)建一個迭代器

把一個類作為一個迭代器使用需要在類中實現(xiàn)兩個方法 __iter__()__next__()

類都有一個構造函數(shù)晓勇,Python 的構造函數(shù)為__init__(), 它會在對象初始化的時候執(zhí)行

  • __iter__()方法返回一個特殊的迭代器對象堂飞, 這個迭代器對象實現(xiàn)了 __next__() 方法并通過 StopIteration 異常標識迭代的完成。
  • __next__() 方法(Python 2 里是 next())會返回下一個迭代器對象宵蕉。

創(chuàng)建一個返回數(shù)字的迭代器酝静,初始值為 1,逐步遞增 1:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

結果:
1
2
3
4
5

6.3 StopIteration

StopIteration異常用于標識迭代的完成羡玛,防止出現(xiàn)無限循環(huán)的情況别智,在 __next__()方法中我們可以設置在完成指定循環(huán)次數(shù)后觸發(fā) StopIteration 異常來結束迭代。

例如在 20 次迭代后停止執(zhí)行:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
  print(x)

6.4 生成器

Python 中稼稿,使用了 yield函數(shù)被稱為生成器(generator)
跟普通函數(shù)不同的是薄榛,生成器是一個返回迭代器的函數(shù),只能用于迭代操作让歼,更簡單點理解生成器就是一個迭代器
在調用生成器運行的過程中敞恋,每次遇到 yield 時函數(shù)會暫停并保存當前所有的運行信息,返回 yield 的值, 并在下一次執(zhí)行 next() 方法時從當前位置繼續(xù)運行

調用一個生成器函數(shù)谋右,返回的是一個迭代器對象硬猫。

#!/usr/bin/python3
import sys
def fibonacci(n): # 生成器函數(shù) - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一個迭代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

結果:
0 1 1 2 3 5 8 13 21 34 55
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市啸蜜,隨后出現(xiàn)的幾起案子坑雅,更是在濱河造成了極大的恐慌,老刑警劉巖衬横,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裹粤,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜂林,警方通過查閱死者的電腦和手機遥诉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來噪叙,“玉大人矮锈,你說我怎么就攤上這事」姑校” “怎么了愕难?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惫霸。 經(jīng)常有香客問我猫缭,道長,這世上最難降的妖魔是什么壹店? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任猜丹,我火速辦了婚禮,結果婚禮上硅卢,老公的妹妹穿的比我還像新娘射窒。我一直安慰自己,他們只是感情好将塑,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布脉顿。 她就那樣靜靜地躺著,像睡著了一般点寥。 火紅的嫁衣襯著肌膚如雪艾疟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天敢辩,我揣著相機與錄音蔽莱,去河邊找鬼。 笑死戚长,一個胖子當著我的面吹牛盗冷,可吹牛的內容都是我干的。 我是一名探鬼主播同廉,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼仪糖,長吁一口氣:“原來是場噩夢啊……” “哼柑司!你這毒婦竟也來了?” 一聲冷哼從身側響起乓诽,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤帜羊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鸠天,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡帐姻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年稠集,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饥瓷。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡剥纷,死狀恐怖,靈堂內的尸體忽然破棺而出呢铆,到底是詐尸還是另有隱情晦鞋,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布棺克,位于F島的核電站悠垛,受9級特大地震影響,放射性物質發(fā)生泄漏娜谊。R本人自食惡果不足惜确买,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纱皆。 院中可真熱鬧湾趾,春花似錦、人聲如沸派草。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽近迁。三九已至艺普,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钳踊,已是汗流浹背衷敌。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拓瞪,地道東北人缴罗。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像祭埂,于是被迫代替她去往敵國和親面氓。 傳聞我的和親對象是個殘疾皇子兵钮,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容