zoukankan      html  css  js  c++  java
  • python生成器 Generator

    生成器 Generator

      什么是生成器?
        生成器是能够动态提供数据的可迭代对象
        生成器在程序运行时生成数据,与容器类不同,它通常不会在内存中保存大量的数据,而是现用现生成

      生成器有两种:
        生成器函数
        生成器表达式

      生成器函数
        含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象
        注: yield翻译为(产生或生成)

      yield 语句
        语法:
          yield 表达式
        说明:
          yield 用于 def函数中,目的是将此函数作用生成器函数使用yield 用来生成数据,供迭代器的next(it) 函数使用

        说明:
          生成器函数的调用将返回一个生成器对象,生成器对象是一个可迭代对象
          生成器函数调用return会触发一个StopIteration异常,即生成数据结束

      生成器表达式
        语法:
          ( 表达式 for 变量 in 可迭代对象 [if 真值表达式] )
        说明:
          if 子句可以省略
        作用:
          用推导式形式创建一个新的生成器

        示例:
          gen = (x**2 for x in range(1, 5))
          it = iter(gen)
          next(it) # 1
          next(it) # 4
          next(it) # 9
          next(it) # 16
          next(it) # StopIteration
    View Code

      列表推导式和生成器表达式的区别:
        推导式会创建容器,容器中已有数据
        生成器表达式创建的生成器没有数据,在调用时会自动生成

      示例:
        for x in [x**2 for x in range(1000000000000)]:
          print(x)
    
        for x in (x**2 for x in range(1000000000000)):
          print(x)
    View Code
      看下列函数的输出结果是什么?为什么?
      第一个程序
        L = [2, 3, 5, 7]
        A = [x * 2 for x in L]
        it = iter(A)
        print(next(it)) # 4
        L[1] = 333
        print(next(it)) # 6
      第二个程序
        L = [2, 3, 5, 7]
        A = (x * 2 for x in L)
        it = iter(A)
        print(next(it)) # 4
        L[1] = 333
        print(next(it)) # 666
    View Code

      迭代工具函数
      zip(iter1, iter2, ....) 返回一个zip生成器对象,此对象用于生成一个元组,此元组的数据分别来自于参数中的每个可迭代对象,生成元组的个数由最小的一个可迭代对象大小决定enumerate(iterable, start=0) 返回一个 enumerate生成器对象,此对象生成类型为(索引,值)对的元组,默认索引从0
    开始,也可以用start指定

      zip
    
      numbers = [10086, 10000, 10010, 95588]
      names = ['中国移动', '中国电信', '中国联通']
    
      for t in zip(numbers, names):
        print(t) # 打印 (10086, '中国移动'), .....
    
      for num, name in zip(numbers, names):
        print(name, '的客服电话是:', num)
    
      for t in zip(names, numbers, range(1, 100)):
        print(t) # ('中国移动', 10086, 1), ...
    View Code
      enumerate.py
    
      names = ['中国移动', '中国电信', '中国联通']
    
      for t in enumerate(names):
        print(t) # (0, '中国移动'), (1, '中国电信') ....
    
      for t in enumerate(names, 1111):
        print(t)# (1111, '中国移动'), (1112, '中国电信') ....
    View Code
  • 相关阅读:
    MyGeneration的NHibernate代码生成模版
    ASP.NET页面控制回车触发按钮
    操作NHibernate进行多事务并发处理的一些小经验
    mysql之sql_mode =only_full_group_by 设置问题
    1、一维数组排序
    使用正则表达式构造定制的HTML5输入框
    JavaScript加密库CryptoJS的使用
    安全密码存储,该怎么做,不该怎么做?
    google 站内搜索
    导入导出xls数据
  • 原文地址:https://www.cnblogs.com/zhaoyang1997/p/10585882.html
Copyright © 2011-2022 走看看