【Python】Python学习笔记16

代码笔记:

'''
可迭代对象(Iterable):
遍历:依次从可迭代对象中取出元素的过程。
可迭代对象的条件:
    1.实现了__iter__()方法
    2.__iter__()方法返回了迭代器对象
for循环的工作原理:
    1.先通过__iter__()获取迭代器对象的迭代器
    2.再对迭代器不断调用__next__()方法获取下一个值并赋值给临时变量(i)
isinstance(o,t):判断一个对象是否是已知类型。o:object(对象名),t(type):类型。
'''
from collections.abc import Iterable  # 导入模块

i = [1, 2, 3]
b = 'abcd'
print(isinstance(b, Iterable))
it = iter(i)  # 创建一个迭代器对象(Iterator)
print(next(it))  # 取下一个元素
print(next(it))
print(next(it))
# print(next(it))  # 取出所有元素后,使用next()方法会引发StopIteration异常
'''
可迭代对象(Iterable):可以作用于for循环。
迭代器对象(Iterator):可以调用next()方法。
注意:迭代器对象一定是可迭代对象;可迭代对象可以使用iter()方法强制转换为迭代器对象。
'''
from collections.abc import Iterator, Iterable

c = 'python'
print(isinstance(c, Iterable))  # 判断是否为可迭代对象
print(isinstance(c, Iterator))  # 判断是否为迭代器对象
c1 = iter(c)
print(isinstance(c1, Iterable))  # 判断是否为可迭代对象
print(isinstance(c1, Iterator))  # 判断是否为迭代器对象
for i in range(1, 7):
    print(c1.__next__(), end='\t')
print('\n', dir(c1))
'''
自定义迭代器类:必须具备__iter__()方法和__next__()方法。
'''
class MyIterator(object):
    def __init__(self):  # 构造函数:赋初始值
        self.num = 0  # 实例属性
    def __iter__(self):
        return self  # 返回当前迭代器类的实例本身
    def __next__(self):
        if self.num == 10:  # 当num=10时停止调用__next__()方法并抛出异常
            raise StopIteration("停止迭代")  # 抛出异常
        self.num += 1
        return self.num
mi = MyIterator()  # 实例化对象(实例化的对象为迭代器对象)
print(isinstance(mi, Iterator))
for i in mi:
    print(i, end=' ')
'''
生成器(generator):Python中,边循环边计算的机制叫生成器。
实现方法:生成器表达式和生成器函数。
'''
li = [i * 5 for i in range(5)]  # 列表推导式
gen = (i * 5 for i in range(5))  # 生成器表达式
print(li)
print(gen)
for i in range(5):
    print(gen.__next__())
'''
生成器函数是一种特殊类型的函数(迭代器),它通过 yield 关键字返回值,并能够在每次调用时保留函数的状态。
与普通函数一次性返回所有值不同,生成器函数可以按需生成序列中的值,节省内存和计算资源。
含义:
    懒惰求值:生成器按需生成数据,只有在需要时才计算下一个值。
    状态保持:生成器在每次调用 next() 时会从上一次暂停的地方继续执行,保持内部状态。
'''
def gen():
    yield 'a'
    yield 'b'
    yield 'c'
gen_1 = gen()
a = 0
while a < 3:
    print(a, gen_1.__next__())
    a += 1
def gen2(n):
    li = []
    a = 0
    while a < n:
        li.append(a)
        yield a
        a += 1
    print(li)
for i in gen2(5):
    print(i)

运行结果:

True
1
2
3
True
False
True
True
p	y	t	h	o	n	
 ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']
True
1 2 3 4 5 6 7 8 9 10 [0, 5, 10, 15, 20]
<generator object <genexpr> at 0x000001586B7B5510>
0
5
10
15
20
0 a
1 b
2 c
0
1
2
3
4
[0, 1, 2, 3, 4]

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值