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
      
  • 相关阅读:
    Codeforces 884E E. Binary Matrix
    基础练习 矩形面积交
    蓝桥杯基础练习---矩阵乘法
    C. An impassioned circulation of affection(Round 418)
    B. An express train to reveries(Round 418)
    A. An abandoned sentiment from past (Round 418)
    数学建模培训二 ---- matlab的基本应用
    数学建模培训第一天---线性规划
    基础练习 回形取数
    github初步---将本地代码传到github上面
  • 原文地址:https://www.cnblogs.com/xiaodan1040/p/11857923.html
Copyright © 2011-2022 走看看