迭代器生成器

回顾:

  函数的递归调用

    函数在调用阶段间接或直接又调用了自己

  递归:

    回溯:重复的过程,但每次重复过程后下一次重复的过程的问题的复杂度会减低,最终要有一个结束条件。

    递推:基于回溯的结果,一步一步往上推

  二分法:

    算法:高效率解决问题的方法

    二分法必须基于一个有顺序的容器类型

    判断某个值在不在容器里面

    每次截取上一次容器类型一半进行比较

  三元表达式:

    结果一 if 条件 else 结果二

    只有结果为2个可能性的情况下就可以用三元表达式

  匿名函数

    没有名字的函数

    关键字lambda

    lambda 形参:返回值

    1.当场定义当场调用

    (lambda 形参:返回值)()

    2.给匿名命名

    func = lanbda 形参:返回值

    func()

    3.匿名函数通常是配合其他函数一起使用的(内置函数,自定义函数)

  常见的内置函数

    max:内部基于for循环的,先一个一个将传入的容器类型的元素一个个取出,如果没有指定key(key对应着一个函数)那么就根据取出的元素一个个进行比较得出最大的值。如果指定了key,那么max会将元素交给这个函数,拿函数的返回值进行比较,但出来的结果还是传入的结果

    min:同上,求出最小值

    sum:求和

    map:映射关系,一个个成对应map(匿名函数,容器对象)

    filter:过滤

    zip:拉链,也是一一对应,返回出来的是一个元祖

    sorted:排序,里面可以指定rerverse=True可以使其反转,默认是False

    reduce:是将多个值变成一个值,reduce(匿名函数,对象,默认值)不指定默认值的话那么就拿容器的第一和第二个进行比较

今日内容:

迭代器:

  迭代:就是更新换代的过程,但迭代有个前提就是每次迭代都是基于上一次迭代的结果

  所以说迭代器就是重复过程的工具

  可迭代对象:

    内置有__iter__方法的对象就是可迭代对象

  迭代器对象:

    内置有__iter__方法和__next__方法的就是迭代器对象

  迭代器对象里面的调用__iter__方法得到的是自身,然后可迭代对象调用__iter__方法得到的结果就是迭代器对象

count =0

while count < 3:

  print(111)

  count+=1

这个就可以说是一个迭代器

迭代器对象调用__next__方法可以进行取值

迭代器对象一定是可迭代对象,但可迭代对象一定不是迭代器对象

迭代器优缺点:

优点:不依赖索引取值,减少内存空间,不会内存溢出

缺点:不能取出指定的元素,取完后会报错,需要try处理。

特点:只能依次往后进行取值,不能后退

迭代器的取值:

ls = [1,2,3,4]

iter_l = ls.__iter__() 生成一个迭代器对象

print(iter_l.__next__())进行取值

print(iter_l.__next__())

print(iter_l.__next__())

print(iter_l.__next__())

print(iter_l.__next__()) 如果已经去完了就会报错stopiteration

for 循环的本质:

for循环的in后面的跟着的是一个可迭代对象

for循环执行的步骤:

  1.将in后面的可迭代对象执行__iter__方法转换成迭代器对象

  2.调用__next__方法进行迭代取值

  3.进行异常处理

生成器:

  其本质上也是一个迭代器,但是一个自定义的迭代器。

  其内部有yield的关键字

  如果在函数内部有yield关键字,那么这个函数在函数名加括号调用的时候,不会执行其函数体代码,会将其转换成一个生成器,这也可以说是,生成器初始化,将函数变成一个迭代器

例子:

def func():
    print('2222')
    yield
    print('33333')
    yield
    ..........


res = func()生成器初始化

这样在res.__next__()就可以进行取值,但会返回一个None,yield后面可以跟值,yield后面跟的值,就是调用__next__()获取到的您可以得到的值。

yield后面可以跟多个值,返回的会打包成一个元祖。

另外yield会暂停函数的运行状态。

yield表达式:

yield支持外界传参
def dog(name):
    print('%s 准备开吃'%name)
    while True:
        food = yield
        print('%s 吃了 %s'%(name,food))


g = dog('owen')
g.__next__()  #必须将代码运行至yield才能够为其传值
然后用关键字send从外界为其传值
g.send('火腿')  #给yield的左边变量传参,触发了__next__方法
g.send('大鸡腿')

yield总结:

  1.能够将自定义的函数变成一个生成器,提供了一种自定义生成器的方式

  2.yield能够将函数的运行状态给暂停住

  3.能够支持外界给其传参,关键字send

  4.yield可以有返回值

与return的异同点:

相同之处:都有返回值,并能够返回多个值

不同点:yield能够暂停函数的运行状态,并且yield可以返回多次值,但return只能返回一次值,并且立即结束函数。yield可以有外界进行传参

内置函数:

chr():是将数字转为ascill表对应的字符

ord():是将字符转为ascill表对应的数字

div():是返回当前对象名称空间的里面的可调用的名字

divmod()是分页器

callable()是可以判断是不是一个可调用(加括号可以执行其相应的功能)的对象

all()里面的对象只要有一个为False那么将为false

any()里面的对象只要有一个为true,那么就都为true

help()查看对象里面的注释内容

exec():字符串执行python代码,支持多行,并且只要是支持python语法的都能够被执行,并且会将执行代码过程中产生的名字放入某个名称空间里面

eval():字符串执行python代码,但不支持语法,只能做简单的表达式

isinterance判断对象是不是什么类型(object,类型)

str()转为字符串

int()转为整型

面向过程概念:

面向过程就是一条流水线式的写代码,就是先干这个在干那个,一步一步往下面走。

优点:就是将复杂的问题流程化,将其简单化了

缺点:可扩展性低,若果后期要加功能,那么的话又要重新来编辑,复用性低,维护性低。

建议是在写好不用去更改的场景下去使用面向过程,如linux的内核,就是写好后不用去更改的场景

posted @ 2019-07-15 17:42  帅气逼人23  阅读(119)  评论(0编辑  收藏  举报