Python内置函数iter()、next()、关键字yield与生成器 generator

一、认识几个英文单词

  • iterable 可迭代的 性质,python 中可迭代的对象
  • iterator 迭代器,是一个对象,一次性使用,用了就消失。
  • subscriptable 可下标 即某个对象在python 里面可不可以做索引如即a[0]。

二、内置函数iter()

iter() 是迭代器的意思iterator.
函数里面输入的是一个对象,输出的是一个迭代器对象。
那么iter 可以迭代的对象有哪些呢?

  1. 列表
>>> list_a = [1,2,3]
>>> iter_a = iter(list_a)
>>> type(list_a)
<class 'list'>
>>> type(iter_a)
<class 'list_iterator'>
>>>
  1. 元组
>>> turple_b = (1,2,3)
>>> iter_b = iter(turple_b)
>>> type(turple_b)
<class 'tuple'>
>>> type(iter_b)
<class 'tuple_iterator'>
>>>
  1. 字典
d = {"a":1,"半斤地瓜烧":2}
iter_d = iter(d)
type(d)
<class 'dict'>
type(iter_d)
<class 'dict_keyiterator'>
  1. 字符串
s = "ILOVEPYTHON"
iter_s = iter(s)
type(s)
<class 'str'>
type(iter_s)
<class 'str_iterator'>
  1. 集合
dog = {"二哈","柯基","田园犬"}
iter_set = iter(dog)
type(dog)
<class 'set'>
type(iter_set)
<class 'set_iterator'>
  1. 其他可迭代对象.
    因为对象有很多的,很多都可以用来迭代的。那么如何查看这个对象能不能用来做迭代器呢?
    两种方法!
    法一:对一个对象后如果找到.__iter()__这个函数,那就是一个可迭代对象
object.__iter()__

在这里插入图片描述
并且这个函数的就是用iter(s) 得来。

s = "I love python."
iter_s1 = s.__iter__()
iter_s2 = iter(s)
# iter_s1和iter_s2是获取对象的生成器的用法是等价的

法二
对于一个对象,用内置函数isinstance()直接查看比较。

from collections import Iterable
a = []
isinstance(a,Iterable)
True
isinstance(1111111111,Iterable)
False

三、iter()的一次实用性和next()组合的用法

iterator 有区别于其他可序列化的对象,当读取了一次以后,就不再读取,读完之后,迭代器就停止迭代。

  • 两种读取方式
#next(object)
#object.__next__()
s = "I love python"
iter_s = iter(s)
s1 = next(iter_s)
s2 = iter_s.__next__()
print(s1,s2)

在这里插入图片描述

  • 迭代器不同于索引,按照顺序读取之后不能再次迭代,读取完毕后停止迭代读取。 StopIteration 异常用于标识迭代的完成。
s = "I love python"
iter_s = iter(s)
for i in range(100):
    print(iter_s.__next__())

在这里插入图片描述

  • 不可下标读取,因为它只能是循序迭代(读取),迭代(读取)就消失了,简单地说就是
    阅完即焚,所以不支持像序列对象那种可以下标化来读取。
>>> s = "I love python"
>>> iter_s = iter(s)
>>> s[0]
'I'
>>> iter_s[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str_iterator' object is not subscriptable

四、生成器与关键字yield

python中,函数中有 yield 称为生成器(generator)。只能用于迭代操作,更简单点理解生成器就是一个迭代器。

def square():
    for i in range(10):
        yield i ** 2


kk = square()
print(kk.__next__())
print("for ----")
for i in kk:
    print(i)

print(type(kk))

在这里插入图片描述

总结

以上就是迭代器,可迭代对象,next(),iter(),yield 关键字。的使用和区别。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值