python之迭代

简介: 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的异常后循环结束。


相关文章
|
7月前
|
开发者 Python 容器
深入理解Python迭代器:迭代机制的核心与应用
本文介绍了Python迭代器的核心概念、工作原理和应用场景。迭代器是遍历容器类型数据结构(如列表、元组、字典和集合)的对象,遵循迭代器协议,具有记忆遍历位置和一次性特点。通过实现迭代器协议,开发者能为自定义类型定义迭代行为,实现高效处理大量数据和与其他迭代工具协同工作。迭代器与可迭代对象的区别在于,可迭代对象实现`__iter__()`方法,返回迭代器,而迭代器实现`__next__()`方法,用于逐个访问元素。理解并运用迭代器能提升Python代码的性能和可读性。
|
7月前
|
Python
Python 教程之控制流(15)可迭代和迭代器之间的区别
Python 教程之控制流(15)可迭代和迭代器之间的区别
53 0
|
2月前
|
Python
【10月更文挑战第18天】「Mac上学Python 29」基础篇10 - 循环结构与迭代控制
在Python中,循环结构是控制程序执行的重要工具。通过学习本篇内容,您将掌握如何使用for循环和while循环来高效地处理重复任务,并了解break、continue和else的使用方式。同时,我们还会探索嵌套循环和典型应用场景中的实际应用。
43 2
|
2月前
|
存储 大数据 数据处理
理解Python中的生成器:高效迭代的秘密
【10月更文挑战第8天】理解Python中的生成器:高效迭代的秘密
42 0
|
3月前
|
Python
Python中的zip:高效处理并行迭代的利器
Python中的zip:高效处理并行迭代的利器
32 0
|
4月前
|
存储 安全 数据库
Python中的可迭代性与迭代器
在Python中,可迭代性和迭代器是非常重要的概念,它们为我们提供了一种优雅且高效的方式来处理序列和集合数据。本文将深入探讨这些概念,包括可迭代协议以及与异步编程相关的可迭代性和迭代器。
|
4月前
|
存储 安全 数据库
Python中的可迭代性与迭代器
在Python中,可迭代性和迭代器是非常重要的概念,它们为我们提供了一种优雅且高效的方式来处理序列和集合数据。本文将深入探讨这些概念,包括可迭代协议以及与异步编程相关的可迭代性和迭代器。
|
4月前
|
Python
【python笔记】使用zip函数迭代多个可迭代对象
【python笔记】使用zip函数迭代多个可迭代对象
|
4月前
|
索引 Python
[python]enumerate迭代
[python]enumerate迭代
|
6月前
|
Python
在Python中,`range()`函数生成一个整数序列,用于循环迭代。
【6月更文挑战第19天】`Python`的`range()`函数生成整数序列,用于迭代。它接受`start`(默认0)、`stop`(不包含,右开)和`step`(默认1)参数。在`for`循环中,`range(5)`会输出0到4。若要包含结束值,需将`stop`设为`end+1`,如`range(1, 6)`将输出1到5。
84 1
下一篇
DataWorks