zoukankan      html  css  js  c++  java
  • python基础-生成器

    生成器

    • 概念:但凡在函数内部定义了一个yield,调用函数时,函数体代码不会执行,会返回一个结果,该结果就是生成器。本质上是迭代器,一个自定义的迭代器

      # python内获取迭代器的方式
      def iter_func():
          list1 = [1, 2, 3, 8, 4]
          # 获取一个迭代器
          iter_list = list1.__iter__()
          while True:
              try:  # 捕获异常
                  # 执行__next__取值
                  print(iter_list.__next__())
              except StopIteration:
                  break
      
      # 执行iter_func
      iter_func()
      
      
      # 自定义一个迭代器
      def func():
          print("hello world!")
          yield "dawn"
      
      
      res = func()
      # 直接调用,返回了一个生成器:<generator object func at 0x000002376172F1C8>
      print(res)  
      
      # 如何获取生成器的内容呢?
      # 生成器的本质是迭代器,迭代器对象取值通过.__next__
      # 通过__next__ 取值时,才会执行函数体代码。
      print(res.__next__())
      

      输出结果:

      hello world!
      dawn
      
    • 生成器如何实现:通过yield关键字实现。

      • yield 只能在函数内部定义

      • 每一次yield 都会往生成器传一个值

      • 可以保存函数的暂停状态

      def yield_func():
          print("自定义生成器开始……")
          print("第一个yield:")
          yield "yield--1"
          print("第二个yield:")
          yield "yield--2"
          print("第三个yield:")
          yield "yield--3"
          print("最后一个yield:")
          yield "yield--4"
          print("查看,是否还有yield")
      
      
      res = yield_func()
      print(res.__next__())
      

      输出:

      自定义生成器开始……
      第一个yield:
      yield--1
      
    • yield 和 return

      • 相同点:返回值的个数无限制
      • 不同点:return 有且只能返回一个值;yield 可返回多个值
      # yield
      def yield_func():
          list1 = [2, 3, 4, 1]
          dict1 = {"name": "dawn", "age": 18, "hobby": "read"}
          tuple1 = (1, 'a', 2, 'b')
          set1 = {23, 34, 'e'}
      
          yield list1
          yield dict1
          yield tuple1, set1
          
      # return
      def return_func():
          list1 = [2, 3, 4, 1]
          dict1 = {"name": "dawn", "age": 18, "hobby": "read"}
          tuple1 = (1, 'a', 2, 'b')
          set1 = {23, 34, 'e'}
          
          return list1,tuple1
      	#此处代码执行不到,函数代码题遇到return 以后就结束了
      	return dict1  
      
    • 使用yield 自定义一个range

      """
      python2:range(1,5)  ---→ [1,2,3,4]
      python3:range(1,5)  ---→ range对象 ---→ 生成器 ---→ 迭代器
      
      range(start,stop,step)
      """
      def my_range(start,end,step=1):
          while start < end:
              yield start
              start += move
      
  • 相关阅读:
    报名用户主题看板
    有效线索主题看板 阿善有用 清洗转换具体怎么做
    意向客户主题看板 阿善看到 阿善用到 拉链表
    数据库建模 全量表导入
    git 阿善有用
    IDEA+git+码云
    Cloudera Manager的基本使用 阿善没用
    cloudera manager报错解决方案
    java-多态简述及实例
    java-简述接口及实例
  • 原文地址:https://www.cnblogs.com/xiaodan1040/p/11857923.html
Copyright © 2011-2022 走看看