迭代、可迭代对象、迭代器、生成器、for循环、iter()函数与next()函数

迭代

1.迭代的概念

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

    for value in [1, 2, 4]:
    print(value)

2.可迭代对象

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

3.判断对象是否为可迭代对象

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

from collections import Iterable

4.判断对象是否是指定类型

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)

5.自定义可迭代对象

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

from collections import Iterable

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 
    for value in my_list:
TypeError: iter() returned non-iterator of type 'NoneType'

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

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

迭代器

1.自定义迭代器对象

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
1
2

iter()函数与next()函数

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

for循环的本质

遍历的是可迭代对象

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

迭代器的应用场景

我们发现迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值,如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过按照衣服那个的规律计算生成的,那么也就意味着可以不用再依赖一个已有的数据集合,也就是说不用再将所有迭代的数据都一次性缓存下来供后续一次读取,这样就节省大量的存储(内存)空间。

  • 斐波那契数列(Fibonacci),数列中第一个数为0,第二个数为1,其后每一个数都由前两个数相加得到:

0, 1 , 1, 2, 3, 5, 8, 13, 21, 34

现在通过for…in…循环来遍历迭代斐波那契数列中的前n个数,那么这个斐波那契数列可以

class Fibonacci(object):
	def __init__(self, num):
		num: 表示生成多少fibonacci数字
		self.num = num
		记录Fibonacci前两个值
		self.a = 0
		self.b = 1
		记录当前生成数字的索引
		self.current_index = 0

	def __iter__(self):
		return self

	def __next__(self):
		if self.current_index < self.num:
			result = self.a
			self.a, self.b = self.b, self.a + self.b
			self.cuurent_index += 1
			return result
		else:
			raise StopIteration


fib = Fibonacci(5)

for value in fib:
	print(value)

结果:
0
1
1
2
3
  • 迭代器的作用就是记录当前数据的位置以便获取下一个位置的值。

生成器的概念

生成器是一类特殊的迭代器,它不需要再像上面的类一样写__iter__()和__next__()方法了,使用更加方便,它依然可以使用next函数和for循环取值。

你可能感兴趣的:(Python)