0
点赞
收藏
分享

微信扫一扫

python之迭代

1、迭代

1.1 迭代的概念

使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程


# Python 中的迭代

for value in [2, 3, 4]:

   print(value)


1

2

3

4

1.2 可迭代对象

标准概念:在类里面定义__iter__方法,并使用该类创建的对象就是可迭代对象


简单记忆:使用for循环遍历取值的对象叫做可迭代对象, 比如:列表、元组、字典、集合、range、字符串


1.3 判断对象是否是可迭代对象

# 元组,列表,字典,字符串,集合,range都是可迭代对象

from collections import Iterable

# 如果解释器提示警告,就是用下面的导入方式

# from collections.abc import Iterable


# 判断对象是否是指定类型

result = isinstance((3, 5), Iterable)

print("元组是否是可迭代对象:", result)


result = isinstance([3, 5], Iterable)

print("列表是否是可迭代对象:", result)


result = isinstance({"name": "张三"}, Iterable)

print("字典是否是可迭代对象:", result)


result = isinstance("hello", Iterable)

print("字符串是否是可迭代对象:", result)


result = isinstance({3, 5}, Iterable)

print("集合是否是可迭代对象:", result)


result = isinstance(range(5), Iterable)

print("range是否是可迭代对象:", result)


result = isinstance(5, Iterable)

print("整数是否是可迭代对象:", result)


# 提示: 以后还根据对象判断是否是其它类型,比如以后可以判断函数里面的参数是否是自己想要的类型

result = isinstance(5, int)

print("整数是否是int类型对象:", result)


class Student(object):

   pass


stu = Student()

result = isinstance(stu, Iterable)


print("stu是否是可迭代对象:", result)


result = isinstance(stu, Student)


print("stu是否是Student类型的对象:", result)



1


1.4 自定义可迭代对象

在类中实现__iter__方法


自定义可迭代类型代码


from collections import Iterable

# 如果解释器提示警告,就是用下面的导入方式

# from collections.abc import Iterable


# 自定义可迭代对象: 在类里面定义__iter__方法创建的对象就是可迭代对象

class MyList(object):


   def __init__(self):

       self.my_list = list()


   # 添加指定元素

   def append_item(self, item):

       self.my_list.append(item)


   def __iter__(self):

       # 可迭代对象的本质:遍历可迭代对象的时候其实获取的是可迭代对象的迭代器, 然后通过迭代器获取对象中的数据

       pass


my_list = MyList()

my_list.append_item(1)

my_list.append_item(2)

result = isinstance(my_list, Iterable)


print(result)


for value in my_list:

   print(value)



执行结果:


Traceback (most recent call last):

True

 File "/Users/hbin/Desktop/untitled/aa.py", line 24, in <module>

   for value in my_list:

TypeError: iter() returned non-iterator of type 'NoneType'



通过执行结果可以看出来,遍历可迭代对象依次获取数据需要迭代器


总结

在类里面提供一个__iter__创建的对象是可迭代对象,可迭代对象是需要迭代器完成数据迭代的


2、迭代器

2.1 自定义迭代器对象

自定义迭代器对象: 在类里面定义__iter__和__next__方法创建的对象就是迭代器对象


from collections import Iterable

from collections import Iterator


# 自定义可迭代对象: 在类里面定义__iter__方法创建的对象就是可迭代对象

class MyList(object):


   def __init__(self):

       self.my_list = list()


   # 添加指定元素

   def append_item(self, item):

       self.my_list.append(item)


   def __iter__(self):

       # 可迭代对象的本质:遍历可迭代对象的时候其实获取的是可迭代对象的迭代器, 然后通过迭代器获取对象中的数据

       my_iterator = MyIterator(self.my_list)

       return my_iterator


# 自定义迭代器对象: 在类里面定义__iter__和__next__方法创建的对象就是迭代器对象

class MyIterator(object):


   def __init__(self, my_list):

       self.my_list = my_list


       # 记录当前获取数据的下标

       self.current_index = 0


       # 判断当前对象是否是迭代器

       result = isinstance(self, Iterator)

       print("MyIterator创建的对象是否是迭代器:", result)


   def __iter__(self):

       return self


   # 获取迭代器中下一个值

   def __next__(self):

       if self.current_index < len(self.my_list):

           self.current_index += 1

           return self.my_list[self.current_index - 1]

       else:

           # 数据取完了,需要抛出一个停止迭代的异常

           raise StopIteration



my_list = MyList()

my_list.append_item(1)

my_list.append_item(2)

result = isinstance(my_list, Iterable)


print(result)


for value in my_list:

   print(value)




运行结果:


True

MyIterator创建的对象是否是迭代器: True


2.2 iter()函数与next()函数

iter函数: 获取可迭代对象的迭代器,会调用可迭代对象身上的__iter__方法

next函数: 获取迭代器中下一个值,会调用迭代器对象身上的__next__方法

# 自定义可迭代对象: 在类里面定义__iter__方法创建的对象就是可迭代对象

class MyList(object):


   def __init__(self):

       self.my_list = list()


   # 添加指定元素

   def append_item(self, item):

       self.my_list.append(item)


   def __iter__(self):

       # 可迭代对象的本质:遍历可迭代对象的时候其实获取的是可迭代对象的迭代器, 然后通过迭代器获取对象中的数据

       my_iterator = MyIterator(self.my_list)

       return my_iterator


# 自定义迭代器对象: 在类里面定义__iter__和__next__方法创建的对象就是迭代器对象

# 迭代器是记录当前数据的位置以便获取下一个位置的值

class MyIterator(object):


   def __init__(self, my_list):

       self.my_list = my_list


       # 记录当前获取数据的下标

       self.current_index = 0


   def __iter__(self):

       return self


   # 获取迭代器中下一个值

   def __next__(self):

       if self.current_index < len(self.my_list):

           self.current_index += 1

           return self.my_list[self.current_index - 1]

       else:

           # 数据取完了,需要抛出一个停止迭代的异常

           raise StopIteration


# 创建了一个自定义的可迭代对象

my_list = MyList()

my_list.append_item(1)

my_list.append_item(2)


# 获取可迭代对象的迭代器

my_iterator = iter(my_list)

print(my_iterator)

# 获取迭代器中下一个值

# value = next(my_iterator)

# print(value)


# 循环通过迭代器获取数据

while True:

   try:

       value = next(my_iterator)

       print(value)

   except StopIteration as e:

       break




2.3 for循环的本质

遍历的是可迭代对象


for item in Iterable 循环的本质就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。

遍历的是迭代器


for item in Iterator 循环的迭代器,不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。


举报

相关推荐

0 条评论