迭代器与生成器

迭代器

迭代:更新换代,且每次迭代都基于上一次

迭代器:迭代取值的工具(提供了不依赖索引取值的方式)

s = 'hello'
n = 0
while n < len(s):
    print(s(n))
n += 1
 
# 结果依次为h e l l o    ,相当于一个迭代器

 

需要迭代取值的数据类型有:

字符串/列表/元祖/字典/集合

 

可迭代对象

定义:内置有__iter__方法的都叫做可迭代对象(读法:双下+方法名)

Python基本数据类型中,可迭代对象有:str/list/tuple/dict/set

文件对象:本身就是迭代器(执行内置的__iter__之后还是本身,没有任何变化)

 

迭代器对象

可迭代对象执行内置的__iter__方法的得到的就是该对象的迭代器对象.

1.内置有__iter__方法    # 生成一个迭代器对象

2.内置有__next__方法    # 调用迭代器取值的方法;当可迭代对象的值被取完了,会报Stopiteration错

注:迭代器一定是可迭代对象,可迭代对象不一定是迭代器对象

# 补充:异常处理
while True:
    try:
        print(d.__next__())  # d是先经过__iter__之后生成为迭代器对象
    except Stopiteration:
        break

迭代取值特点:

优点:1.不依懒于索引取值.         2.内存中永远只占有一份空间,不会导致内存溢出

缺点:1.只能往后取,不能后退(不能获取指定的元素).       2.取完之后会报错

 

for循环内部原理

d = {'name':'jason','pwd':'123'}
for i in d:
    print(i)
# for循环后面的in后面跟的是一个可迭代对象


# for循环内部的本质:
# 1.将in后面的对象调用__iter__转换为迭代器对象
# 2.调用__next__迭代对象
# 3.内部有异常捕获stopiteration,当__next__报错,自动结束循环

 

生成器

定义:用户自定义的迭代器,本质就是迭代器

关键字:yield   执行了函数,函数内有yield,那么就会将函数变成迭代器(生成器初始化)

           函数内如果有yield关键字,那么加括号执行函数的时候并不会触发函数体代码的运行

            yield后面可返回值,可以是一个也可以是多个,并且以元祖的形式返回

            yield后面跟的值就是调用迭代器__next__方法你能得到的值

yield支持外界为其传参:如:

def boo(k):
    print('%s是个字母'%k)
    while True:
        l = yield  # l接收了yield返回的值,默认为None
        print('%s与%s不一样'%(k,l))
g = boo('o')
g.__next__()  # 必须先将代码运行至yield才能为其传值
g.send('想传啥传啥')  # 给yield左边的变量传参,自动触发__next__方法

 

yield特点:

1.帮你提供了一种自定义生成器的方式

2.会将函数的运行状态暂停住

3.可以返回值

与return的异同点:

相同点:都可以返回值,并且可以返回多个

不同点:yield可以返回多次值,return只能返回一次,然后函数立即结束;yield还可以接受外部传入的值

 

生成器表达式

格式:例子:

res = (i for i in range(1,1222) if i != 5)  # 外部以()包住

# 生成器不会主动执行任何一行代码
# 必须通过__next__触发代码的运行

 

内置函数

 abs()   求绝对值

all()  ()里有一个为false就返回False

any()  ()里有一个为True就返回True

globals()  无论在哪,查看的都是全局名称空间

locals()  当前语句在哪,就会返回哪个位置所存储的所有名字

callable()   可调用的,后面可以跟()的,目前只有函数名可以

chr()   将数字转化成ascii码表对应的字符

ord()   将字符按照ascii码表转换成对应的数字

dir()  获取当前名称空间里面的名字

divmod()   分页器

enumerat()   枚举

eval()   识别字符串里面的简单函数代码

exec()  识别字符串里面复杂逻辑的函数体代码

isinstance()  判断对象是否属于某个数据类型

pow(a,b)    a**b  a的b次方

round()  四舍五入

 

面向过程编程

提前分配好工作,就类似于设计一条流水线

好处:将复杂的问题流程化,从而简单化

坏处:可扩展性差,一旦需要修改,整体都会受到影响

 

posted @ 2019-07-15 21:36  速8赛亚人  阅读(132)  评论(0编辑  收藏  举报