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
      
  • 相关阅读:
    CentOS查看CPU信息、位数、多核信息
    Linux常用命令大全
    chmod命令详细用法
    tar命令的详细解释
    yum和rpm命令详解
    LeetCode 241. Different Ways to Add Parentheses
    LeetCode 139. Word Break
    LeetCode 201. Bitwise AND of Numbers Range
    LeetCode 486. Predict the Winner
    LeetCode 17. Letter Combinations of a Phone Number
  • 原文地址:https://www.cnblogs.com/xiaodan1040/p/11857923.html
Copyright © 2011-2022 走看看