进击のpython

*****

生成器


上来说个这,就有点抽象了!

我们先整点活儿

宁,准备好了吗?

直接相位猛冲!


  • 列表生成器

    需求来了,老弟!我有一个数组

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

    我想把列表里每个元素加一,怎么办呢?

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    b = []
    for i in a:
    b.append(i+1) print() b

    还有吗?

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    for index, i in enumerate(a):
    a[index] += 1
    print(a)

    还有吗?

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    a = list(map(lambda x:x+1,a))
    print(a)

    还有吗?

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    a = [i + 1 for i in a]
    print(a)

    最后一种的方式就是列表生成式(是不是很像三目运算??)


  • 生成器

    生成器,比如说我要是输出1~100

    怎么输出呢?

    for i in range(1,101):
    print(i)

    这大家都知道(不知道的滚回去看基础知识去,别在这捣乱)

    那有没有想过,range(1,100) 是什么呢?

    在py2.x系统下,我们可以看出来

    range(1,101)实际上是生成了一个从1~100的数字的列表

    那我要是有个这种句子呢?

    for i in range(1, 101):
    if i < 20:
    print(i)

    可以看出来我只需要20个数字,但是range给我生成了一个带有很多元素的列表

    即使里面大部分我都用不上,但是还是生成了。(while也行,别在这艮)

    那就会出现一个浪费空间的问题

    那我就要想了,能不能先生成一个我先用着,然后用完了再传下一个

    这个东西 就是 生成器

    做呢?有两种方式!


    将列表推导式的中括号变成小括号

    f = (x + 1 for x in range(10))
    
    print(f)                        # <generator object <genexpr> at 0x05681EF0>

    只是生成了生成规则,还没有产生数值

    那我要怎么产生数值呢?

    利用函数next()

    f = (x + 1 for x in range(10))
    
    print(next(f)) # 1
    print(next(f)) # 2
    print(next(f)) # 3
    print(next(f)) # 4
    print(next(f)) # 5
    print(next(f)) # 6

    如果值取完了就会报错:

    要是想再使用这个生成器,那你就需要重新调用


    用循环来取

    这样就不会报错,会把值全都取出来

    f = (x + 1 for x in range(10))
    
    for i in f:
    print(i)

  • 函数生成器

    在做函数生成器之前,我们先试试输出100以内的斐波那契数列

    # 1 1 2 3 5 8 13 ... ...
    
    li = [1, 1]
    
    for i in range(2, 101):
    if li[i - 2] + li[i - 1] < 101:
    li.append(li[i - 2] + li[i - 1])
    else:
    break
    print(li)

    或者也可以这么写:

    # 0 1 1 2 3 5 8 13 ... ...
    
    a = 0
    b = 1
    count = 0
    while count < 20:
    tep = a
    a = b
    b = tep + b
    print(a,end=" ")
    count += 1

    那要是把这个东西改成函数怎么写??

    那很简单啊!

    # 0 1 1 2 3 5 8 13 ... ...
    
    def fib(n):
    a = 0
    b = 1
    count = 0
    while count < n:
    tep = a
    a = b
    b = tep + b
    print(a, end=" ")
    count += 1

    那函数生成器呢???更简单了

    看到print()没有?把 print()⇨ yield()

    大功告成!

    # 0 1 1 2 3 5 8 13 ... ...
    
    def fib(n):
    a = 0
    b = 1
    count = 0
    while count < n:
    tep = a
    a = b
    b = tep + b
    # print(a, end=" ")
    yield a
    count += 1 print(fib(20))

    拿到了什么结果??(<generator object fib at 0x033A1EF0>)

    这是不是个生成器?(当然是!那么大个generator看不到啊)

    yield 暂停 你可以把它理解成 return 但是他后面的语句还是会执行的函数没有退出

    生成器是不是有 next() 函数啊,试试用 next() 打印这个结果

    有啥用???

    可太有用了!

    你没发现这个yield将函数进行中断操作了吗?

    什么意思呢?就是你可以执行着函数,然后停住他,执行点别的,再执行函数

    给你个例子,自己体会!

    # 0 1 1 2 3 5 8 13 ... ...
    
    def fib(n):
    a = 0
    b = 1
    count = 0
    while count < n:
    tep = a
    a = b
    b = tep + b
    # print(a, end=" ")
    yield a
    count += 1 f = fib(20)
    print(next(f))
    print(next(f))
    print('-----"下面是上两个的和"-----')
    print(next(f))
    print(next(f))
    print(next(f))
    print(next(f))


这个东西还是比较抽象的,但是很重要的熬,所以建议多练习

自己试试输出一下斐波那契数列

好好看看!很重要的!!!!!!!!!!!!!!


迭代器


回想一下啊,都有什么可以用for这个方法来循环呢?

list tuple dict set str

还有什么?

嗯!上面写的生成器 genterator

那就出来了┗|`O′|┛ 嗷~~

我们把这些可以用for方法循环的对象称为可迭代对象 iterable

这个词的意思就是可以遍历,可以循环的

# 西瓜:三天之后,大家就知道什么是迭代了
# 读者:A,他是别人的老师,现在又成了你的朋友。你给翻译翻译,什么叫迭代?翻译翻译,什么叫迭代?
# A:这还用翻译,都说了。
# 读者:我让你翻译给我听,什么叫迭代?
# A:不用翻译,这就是迭代啊。
# 西瓜:难道你听不懂什么叫迭代?
# 读者:我就想让你翻译翻译,什么叫迭代!
# A:迭代嘛
# 读者:翻译出来给我听,什么他妈的叫迭代!什么他妈的叫他妈的迭代!
# A:什么他妈的叫惊喜啊?
# 西瓜:迭代就是可以用for方法循环的对象!明白了吗?
# A:这就是迭代啊
# 读者:翻译翻译 翻译翻译!
# A:迭代就是可以用for方法循环的对象!
# 读者:哈,大哥这他妈的就是迭代啊!小弟懂了
# 西瓜:好

可以被next()函数调用并不断返回下一个值的对象成为迭代器 :iterator

而 生成器都可以迭代,而且还有next()方法

所以生成器就可以约等于迭代器


*真的重要*
*必须康康*

~~函数基础(七):生成器&迭代器~~的更多相关文章

  1. python基础(八)生成器,迭代器,装饰器,递归

    生成器 在函数中使用yield关键字就会将一个普通的函数变成一个生成器(generator),普通的函数只能使用return来退出函数,而不执行return之后的代码.而生成器可以使用调用一个next ...

  2. python基础之生成器迭代器

    1 生成器: 为什么要有生成器? 就拿列表来说吧,假如我们要创建一个list,这个list要求格式为:[1,4,9,16,25,36……]这么一直持续下去,直到有了一万个元素的时候为止.如果我们要创建 ...

  3. python基础知识7——迭代器,生成器,装饰器

    迭代器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器 ...

  4. Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle

    目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...

  5. Python开发【第一篇】Python基础之生成器和迭代器

    生成器和迭代器 1.生成器 一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator):如果函数中包含yield语法,那这个函数就会变成生成器: def func(): yield 1 ...

  6. python基础篇_005_迭代器和生成器

    Python迭代器和生成器 1.迭代器 迭代:可以将某个数据集内的数据“一个挨着一个的取出来” for i in range(1, 10, 2): # in 后面的对象必须是一个可迭代的 print( ...

  7. 【笔记】Python基础四:迭代器和生成器

    一,迭代器协议和for循环工作机制 (一),迭代器协议 1,迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能往 ...

  8. py3.0第四天 函数,生成器迭代器等

    1.列表生成式,迭代器&生成器 孩子,我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加1,你怎么实现?你可能会想到2种方式 > ...

  9. 11-Python3从入门到实战—基础之生成器和迭代器

    Python从入门到实战系列--目录 切片 Python提供切片(Slice)操作符用来获取列表.元组等数据中的部分元素:如,读取列表 list[m:n]:表示获取m-n区间的元素 list[m:n: ...

随机推荐

  1. Win8 Metro(C#)数字图像处理--2.62图像对数增强

    原文:Win8 Metro(C#)数字图像处理--2.62图像对数增强  [函数名称]   对数增强      WriteableBitmap LogenhanceProcess(Writeabl ...

  2. GIS基础软件及操作(十二)

    原文 GIS基础软件及操作(十二) 练习十二. ArcMap制图-地图版面设计 设置地图符号-各种渲染方式的使用 使用ArcMap Layout(布局)界面制作专题地图 将各种地图元素添加到地图版面中 ...

  3. UWP入门(八)--几个简单的控件

    原文:UWP入门(八)--几个简单的控件 每天看几个,要不聊几天我就可以看完啦,加油! 看效果 1. CheckBox <TextBlock Grid.Row="0" Tex ...

  4. Zookeeper zkui-zookeeper图形化管理工具

    zkui zkui是一个Zookeeper可视化管理工具. Github:https://github.com/DeemOpen/zkui zkui安装 1.Git拉取代码 #git clone ht ...

  5. SIP:用Riverbank的SIP创建C++库的Python模块(把自己的C++库包装成Python模块)

    我们发现PyQt做的Python版的PyQt是如此好用,如果想把自己的C++库包装成Python模块该如何实现呢? 这里介绍下用SIP包装C++库时值得参考的功能实现: 需要Python模块中实现C+ ...

  6. 开源项目 RethinkDB 关闭,创始人总结失败教训(市场定位错误)

    当我们宣布RethinkDB关闭时,我答应写一个调查分析.我花了一些时间来整理所得的教训和经验,现在可以清楚地写出来. 在HN讨论贴中,人们提出了许多关于为什么RethinkDB失败的原因,从莫名的人 ...

  7. qobject_cast<QPushButton*>(sender()) 简化信号与槽的编写(sender()取得发信号的对象后,就取得了它的全部信息,为所欲为)

    当你觉得写代码是一件重复性极高的工作时,这时你就应该考虑换个方式来实现了. 提高代码效率,减少代码量. 代码片: void Widget::onClicked() { QPushButton* but ...

  8. Qt VS版本添加调试器

    Qt的VS版本默认是不带调试器的,可以去百度一个WinDbg,如下图所示. 将其中的cdb.exe添加到Qt Creator构建和运行的Debuggers标签页即可,如下图所示. http://blo ...

  9. 使用Hibernate连接Oracle 无法识别生成的SQL问题

    问题: 在JAVA工程中,数据库使用的是OracleXE(Oracle10g Express Edition). 使用hibernate.reveng.xml创建了实体类及其DAO类,如: tt.my ...

  10. PWN菜鸡入门之函数调用栈与栈溢出的联系

    一.函数调用栈过程总结 Fig 1. 函数调用发生和结束时调用栈的变化 Fig 2. 将被调用函数的参数压入栈内 Fig 3. 将被调用函数的返回地址压入栈内 Fig 4. 将调用函数的基地址(ebp ...