不少
python
教程中,對python
的解釋不容易理解,本文記錄本身的理解和體會,是對迭代器和生成器的初步理解python
給定一個列表、元祖、字典、甚至字符串,咱們使用
for
去遍歷,這樣咱們叫迭代函數
一、列表的迭代spa
list1 = ['哈哈', '西西', '嘻嘻']
for x in list1:
print(x)
複製代碼
二、列表中須要迭代出下標使用enumerate
code
list1 = ['哈哈', '西西', '嘻嘻']
for index, value in enumerate(list1):
print(index, value)
複製代碼
三、元祖和字符串的迭代與列表的相似,同樣的可使用enumerate
進行下標迭代對象
四、字典的迭代方式一繼承
dict1 = {'name': '張三', 'age': 20, 'gender': '男'}
for item in dict1:
print(item)
複製代碼
五、字典的迭代方式二教程
dict1 = {'name': '張三', 'age': 20, 'gender': '男'}
for key in dict1.keys():
print(key)
複製代碼
六、字典的迭代方式三字符串
dict1 = {'name': '張三', 'age': 20, 'gender': '男'}
for value in dict1.values():
print(value)
複製代碼
七、字典的迭代方式四get
dict1 = {'name': '張三', 'age': 20, 'gender': '男'}
for k, v in dict1.items():
print(k, v)
複製代碼
一、可迭代通常均可以使用for
來遍歷string
二、迭代器不單單可使用for
遍歷還可使用next()
函數一次獲取一個元素
三、可迭代轉換迭代對象使用iter(可迭代對象)
四、判斷可迭代對象與迭代器的方式
from collections.abc import Iterator, Iterable
# Iterable 表示可迭代對象
# Iterator 表示迭代器
list1 = [1, 2, 3]
print(isinstance(list1, Iterator))
print(isinstance(list1, Iterable))
print(isinstance(iter(list1), Iterator))
複製代碼
五、集合數據類型如list
、dict
、str
等是Iterable
但不是Iterator
,不過能夠經過iter()
函數得到一個Iterator
對象
一、方式一(在類中實現__getitem__
魔法函數)
from collections.abc import Iterator, Iterable
class Company(object):
def __init__(self, employee_list):
self.employee = employee_list
def __getitem__(self, item):
return self.employee[item]
if __name__ == "__main__":
company = Company(['張三', '李四', '王五'])
print(isinstance(company, Iterable))
print(isinstance(company, Iterator))
print(isinstance(iter(company), Iterator))
for item in company:
print(item)
複製代碼
二、方式二(在類中實現__iter__
魔法函數,須要結合__next__
魔法函數)其實已是迭代器
from collections.abc import Iterator, Iterable
class Company(object):
def __init__(self, employee_list):
self.employee = employee_list
self.index = 0
def __iter__(self):
return self
def __next__(self):
try:
current_val = self.employee[self.index]
except IndexError:
raise StopIteration
self.index += 1
return current_val
if __name__ == "__main__":
company = Company(['張三', '李四', '王五'])
print(isinstance(company, Iterable))
print(isinstance(company, Iterator))
for item in company:
print(item)
複製代碼
三、總結
iter
內置函數會調用__iter__
魔法函數,若是沒有__iter__
魔法函數就會去調用__getitem__
魔法函數isinstance(company, Iterable)
判斷對象是否可迭代isinstance(company, Iterator)
判斷對象是否爲迭代器iter()
函數將可迭代的轉換爲迭代器一、最簡單也是最粗暴的方式,直接在類中實現兩個魔法函數__iter__
和__next__
函數
from collections import Iterable, Iterator
class Foo(object):
def __init__(self, start, stop):
self.start = start
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.start > self.stop:
raise StopIteration
self.start += 1
return self.start
if __name__ == "__main__":
foo = Foo(1, 5)
print(isinstance(foo, Iterable))
print(isinstance(foo, Iterator))
複製代碼
二、單獨定義一個類來繼承迭代器,必須實現__next__
魔法函數
from collections.abc import Iterable, Iterator
class MyInterator(Iterator):
""" 定義一個迭代器 """
def __init__(self, employee_list):
self.iter_list = employee_list
self.index = 0
def __next__(self):
try:
word = self.iter_list[self.index]
except IndexError:
raise StopIteration
self.index += 1
return word
複製代碼
class Company(object):
def __init__(self, employee_list):
self.employee = employee_list
self.index = 0
def __iter__(self):
return MyInterator(self.employee)
if __name__ == "__main__":
company = Company(['張三', '李四', '王五'])
print(isinstance(company, Iterator))
print(isinstance(company, Iterable))
複製代碼