zoukankan      html  css  js  c++  java
  • (11)生成器

    什么是生成器

    生成器就是一种自定义一的迭代器

    为什么要有生成器

    1. 提供一种自定义迭代器的解决方案

     yield 和 return的区别

    相同点:都能返回值,并且返回值没有类型与个数限制
    不同点:yield可以返回值多次值,而return只能返回一次值

    PS:函数只要遇到return就整个程序都结束,而yield只要函数运行遇到yield就会暂停,继续运行一次next才会往下走,next的作用就是将yield唤醒

    如何使用生成器

    在函数内但凡出现yield的关键字,该函数不是生成器

    在函数内但凡出现yoeld的关键字,然后调用函数将不会立即执行函数体代码,该返回值就是生成器,即我们自定义一的迭代器

    yield中send方法是将参数发送到yield函数中

    progress.send(len(data))

    自定义一迭代器

    def func():
      print('first')
      yield 1
      print('second')
      yield 2
      print('third')
      yield 3
      print('fourth')

    g=func() #将返回值赋值给一个变量
    print(g) #打印一个返回值会提示这是一个生成器对象

    next(g) #next的时候生成器才会执行

    res = next(g) #将next(g)的返回值赋值给一个变量

    print(res) #就会得到一个返回值

    PS:生成器对象本质就是迭代器,所以生成器就是一个自定义一迭代器

    PS:生成器的工作原理,当next()时候遇到yield,就会暂停,这时候需要继续next一下运行一次,获取值再遇到到yield暂停,如此往复获取值

    生成器实例

    python3中range()方法已经定义成可迭代对象

    用迭代器模拟range()方法的运行

    def my_range(start,stop,step=1): #start=1(起始位置) stop=7(结束位置) step=2(步长)
      while start < stop: 
        yield start 
        start+=step # start=7


    res=my_range(1,7,2) #调用函数的时候会得到一个返回值,这个返回值就是一个生成器对象,赋值给一个变量

    print(next(res))

    for i in res: #用for循环去打印这个迭代器,就可以一下子得到全部返回值

      print(i)

    PS:生成器打印时候和迭代器一样,用next()得到函数运行的结果

    PS:生成器不触发是不会产生任何值,所以一定要next去触发

    那到底什么时候使用生成器呢?

    当创建列表只是一共中间过程的时候,为了避免创建庞大的列表,我们可以使用生成器表达式来完成。比如,我们要计算一篇txt文本的单词数时,我们没必要先将列表生成再计算单词数。

    1
    2
    3
    = open('*.txt','r')
    len([word for line in for word in line.split()]) #使用列表解析,先生成列表后计数
    len(word for line in for word in line.split())   #使用生成器,对返回的生成器计数,没有生成列表

    所做的只是把方括号去掉,不但少了两个字节,更节省了内存。
    这让我想起了使用xrange()代替range(),道理是一样的。xrange返回一个生成器,而range返回一个列表。

  • 相关阅读:
    Oracle学习笔记--Oracle启动过程归纳整理
    Oracle 11g rac开启归档
    Oracle 11g rac中关于crsctl stop cluster/crs/has的区别
    Linux环境下安装MySQL 5.7.28
    将root用户权限赋予普通用户
    用Navicat Premium 连接mysql数据库时报错 -- 1130 Host xxxx is not allowed to connect to this MySQL server
    PCoIP vs HDX (CITRIX ICA)远程访问协议对比
    systemctl
    组播查询命令
    默认路由ip default-network和ip route 0.0.0.0 0.0.0.0区别
  • 原文地址:https://www.cnblogs.com/shizhengquan/p/10015527.html
Copyright © 2011-2022 走看看