python---可迭代对象,迭代器,生成器

介绍:
任何可以用 for 循环遍历的东西都是可迭代的。
对于python每个待循环的变量,并没有对其进行下标索引,而是直接对每个变量进行循环迭代。

1. 可迭代对象iterable

可迭代对象是任何可以用for循环遍历的东西。
可迭代对象有序列和非序列两种类型
序列:
列表,元组,字符串
非序列:
集合,字典,文件,生成器 等
特性:
1.具有的方法: iter,用来实现循环迭代
2.可以用for … in进行循环
所以 for循环迭代的标志: 内部实现了__iter__方法。

(1)查看是否是可迭代对象: 用isinstance(a,Iterable)


from collections import Iterator,Iterable,Generator
# 1.哪些是可迭代对象
str="今天是初雪呀"
list_a=[1,2,3]
tuple_a=(1,3,5,7)
set_a=(4,7,9)
dict_a={"name":"cool","age":8}

print("str是否是可迭代对象:",isinstance(str,Iterable))
print("list是否是可迭代对象:",isinstance(list_a,Iterable))
print("tutle是否是可迭代对象:",isinstance(tuple_a,Iterable))
print("set是否是可迭代对象:",isinstance(set_a,Iterable))
print("dict是否是可迭代对象:",isinstance(dict_a,Iterable))

结果展示:

str是否是可迭代对象: True
list是否是可迭代对象: True
tuple是否是可迭代对象: True
set是否是可迭代对象: True
dict是否是可迭代对象: True

(2)如何遍历可迭代对象:直接使用for循环即可
比如: for a in list:
print(a)

2.(可)迭代器 Iterator

通过next方法封装起来的迭代对象生成器就被称作迭代器。
特性:
1)除了 __iter__方法
2)对可迭代对象添加 next()方法,定制不同的迭代方式
这样通过next方法封装起来的迭代对象生成器就被称作迭代器

(1) 如何将可迭代对象a变为迭代器:

使用iter(a) 或者 a.iter()
代码实现:

print(str.__iter__())  # 返回一个迭代器
print(iter(str))

输出:

<str_iterator object at 0x1015d47d0>
<str_iterator object at 0x1015a2b10>
(2)查看是否是可迭代器: 用isinstance(a,Iterator)
print("str是否是可迭代器:",isinstance(str,Iterator))
print("str是否是可迭代器:",isinstance(iter(str),Iterator))

输出:

str是否是可迭代器: False
str是否是可迭代器: True
(3)如何遍历迭代器a: 使用next(a)

实现一个对迭代器进行遍历:

def loop(iterable):
    iterator=iter(iterable)   # 创建迭代器
    loop=True
    while loop:
        try:
            item=next(iterator)
            print("我是:",item)
        except StopIteration:
            print("元素迭代完了,停止迭代")
            loop=False
        else:
            pass
 dict_a={"name":"cool","age":8}
 loop(dict_a)

输出结果为:

我是: name
我是: age
元素迭代完了,停止迭代

也可以直接不用循环,直接打印:

set_a=(4,7,9)
a=iter(set_a)
print(next(a))
print(next(a))
print(next(a))

打印结果:

4
7
9

注意:这里继续打印print(next(a)) 会报错: StopIteration
这里特别强调一点:next是以单个数据元的方式消耗迭代器,消耗一个就少一个,
即_next__方法:当前要获取的元素没有越界,就返回当前元素,然后自己指向为下一个元素等待返回;如果上次返回了最后一个元素,这一次再调用next的时候已经没有元素了,就抛出StopIteration异常。
所以:不能对迭代器进行二次遍历的,第二次时迭代器已经是空的了

3. 可迭代对象和迭代器之间关系:

因为可迭代器Iterator是在 可迭代对象 iterable 基础上进行扩展,所以可迭代器一定是可迭代对象
iterator(迭代器)必定是iterable(可迭代对象)的,因此其必然含有__iter__方法,此方法保证了iterator是可以迭代的

4. 如何自己生成迭代器:生成器

生成器是什么:

  1. 在python中,边循环边计算的机制就称为生成器(generator)。使用生成器当用到数据的时候在生成,这样可以节约空间,提高效率。
  2. 生成器是一种特殊类型的迭代器,所以也会有__init__()和__next__()两个方法:

我们可以使用生成器来构造迭代器,有以下几种方法:

(1)用yield yield 相当于return

# 生成器1: 用yield    yield  相当于return
def generator():
    yield "今天是"
    yield "初雪"
    yield "呀"
a=generator()
print(a)   # <generator object generator at 0x1026c22d0>
print(next(a))
print(next(a))
print(next(a))

# 或者
def g(n):
    for i in range(n):
        yield (i)
print(g(5))
for i in g(5):
    print("使用yield生成器迭代:",i)

输出结果为:

今天是
初雪
呀
<generator object g at 0x101643750>
使用yield生成器迭代: 0
使用yield生成器迭代: 1
使用yield生成器迭代: 2
使用yield生成器迭代: 3
使用yield生成器迭代: 4

(2) 使用()括号内 放入列表推倒表达式 边生成边使用

b=(x*5  for x in range(6))
for i in b:
    print("使用()括号内 放入列表推倒表达式 生成器迭代:",i)

输出结果为:

使用()括号内 放入列表推倒表达式 生成器迭代: 0
使用()括号内 放入列表推倒表达式 生成器迭代: 5
使用()括号内 放入列表推倒表达式 生成器迭代: 10
使用()括号内 放入列表推倒表达式 生成器迭代: 15
使用()括号内 放入列表推倒表达式 生成器迭代: 20
使用()括号内 放入列表推倒表达式 生成器迭代: 25

(3)使用zip ()

zip就是一个迭代器,
zip()函数可接收任意多个可迭代对象,将可迭代对象中的元素,相对应的打包成一个元组,
参数:
必须是可迭代对象
返回值:
元组

l1, l2, l3 = (1, 2, 3), (4, 5, 6), (7, 8, 9)
d=zip(l1, l2, l3)
print("zip是否是可迭代器:",isinstance(d,Iterator))
print(next(d))
print(next(d))
print(next(d))
print(list(d))

输出结果为:

zip是否是可迭代器: True
(1, 4, 7)
(2, 5, 8)
(3, 6, 9)
[]

总结:
可以使用迭代器来做的唯一有用的事情是将其传递给内置的 next 函数,或者对其进行循环遍历。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值