愚公移山日记·27
学习进程
今天搞的是迭代器,生成器,然后是自定义列表,还有之前弄过的斐波那契数列。
迭代器
from collections import Iterable
# 可迭代的对象
for value in (4, 5, 6):
print(value)
print('--' * 20)
ret = isinstance([1, 23, 4], Iterable)
print(ret)
# 自定义一个类
class MyClass(object):
# 增加一个__iter__ 方法
# 该方法就是一个迭代器
def __iter__(self):
pass
myclass = MyClass()
ret = isinstance(myclass, Iterable)
print(ret)
print('--' * 20)
# 可遍历对象,就是可迭代对象
# 列表,元组,字典,字符串,都是可以迭代的对象
# 数字和自定义的myclass 默认都是不可以迭代的对象
# 如果myclass对象所属的类 Myclass包含来的__iter__()方法,此时
# myclass是一个可迭代对象
# 可迭代对象的本质是对象的类中包含了--iter--() 方法
# 检测一个对象是否可迭代,用 Iterable()函数检测
-----------------------------------------------------------------------------
# __iter__ 是一个迭代器
# 一个可迭代对象可以提供一个迭代器
# 可迭代对象---》iter(可迭代器)---》next(迭代器)
data_list = [1, 2, 34, 5]
for i in data_list:
print(i)
# 获取迭代器
l1_iterator = iter(data_list)
# 根据迭代器获取下一个元素
i = next(l1_iterator)
print(i)
# 迭代器的特点:
# 记录遍历的位置
# 提供下一个元素的值(配合next()函数)
# for 循环的本质:
# 通过iter(可迭代对象) 获取要遍历的对象迭代器
# next(迭代器)获取下一个元素
# 帮我们捕获了一个异常
# 自定义迭代器的类,满足两点:
# 必须含有__iter__()
# 必须含有__next__()
class Myclass(object)
def __iter__(self):
pass
def __next__(self):
pass
自定义类来解决斐波那契数列
# 自定义迭代器
# 自定义迭代器的类
# 类中必须包含 __iner__()方法
# 类中必须包含 __next__()方法
class Fibnacci(object):
def __init__(self, num):
self.num = num
# 定义斐波那契数列
self.a = 1
self.b = 1
self.current_index = 0
def __iter__(self):
return self
def __next__(self):
# 判断列数是否超出范围
if self.current_index < self.num:
# 定义变量 保存a的值
data = self.a
# a = b, b = a + b
self.a, self.b = self.b, self.a + self.b
# 当前列数加一
self.current_index += 1
# 返回a的值
return data
# 如果超出范围 报错
else:
raise StopIteration
if __name__ == '__main__':
fib_iterator = Fibnacci(8)
i = next(fib_iterator)
print(i)
i = next(fib_iterator)
print(i)
i = next(fib_iterator)
print(i)
i = next(fib_iterator)
print(i)
i = next(fib_iterator)
print(i)
i = next(fib_iterator)
print(i)
#或者直接使用for循环可以得出
# for i in fib_iterator:
# print(i)