Python之函数(七)生成器与推导式

4.10 生成器

  1. 简介:

    什么是生成器? 生成器的本质就是迭代器
    
    生成器跟迭代器的区别:迭代器都是python给你提供已经写好的工具或者数据转换而来的,生成器需要我们自己用python代码构建的工具
  2. 生成器的构建方式
    • 通过生成器函数

      • def func():
            print(11)
            return 22
        ret=func()
        print(ret)
        #结果为:11 22
        #将函数中的return换成yield,这样func就不是函数了,而是一个生成函数
        def func():
         print(11)
            yield 22
        ret=func()
        print(ret)
        #运行结果:
        <generator object func at 0x000001A575163888>
        #当我们调用函数的时候函数体里的代码会进行执行当执行到yield的关键字的时候,发现我们是想声明一个生成器.程序就会返回一个生成器给咱们
      • 生成器取值
      • def func():
         print("11")
         yieid 222
        gen=func()#这个时候函数不会执行,而是获取到生成器
        ret=gener.__next__()#这时候才会执行
        print(ret)#并且yield会将func生产出来的数据222 给了ret
        #结果:
        #111
        #222
      • 生成器可以写多个yield
      • def func():
         if 3>2:
             yield "你好"
         if 5>4:
             yield "我好"
         yield "大家好"
        g=func()#产生一个生成器
        print(g.__next__())#获取到 "你好"赋值给g 并输出
        #结果为:"你好"
        for i in g:
         print(i)
        #for循环将g里面的元素进行迭代输出
        #结果: 你好 我好 大家好
        
        #生成器的本质
        while True:
         try:
             print(g.__next__())
         except StopIteration:
             break
      • def foo():
            for i in range(10)#进行循环
             pass#占位符 不执行
             yield i# 执行
            count=0
            while True:
                yield count
                count+=1
        g=foo()#产生一个生成器
        print(next(g))#将0赋值给next 并输出 此时指针位置停留在 0
        #结果为:0
        for i in g:
            print(i)
        #循环输出g 生成器的元素
        
        #生成器应用场景
        def func():
            for i in range(100)
             yield i
        g=func()
        for i in range(50):
            print(next(g))
        #输出50次 g生成器的元素
      • 总结:
      • yield与return的区别:
        在函数中将return改写成yield就是一个生成器
        yield会记录执行位置
        return和yield都是返回
        return可以写多个但是只执行一次,yield可以写多个,还可以返回多次
        一个 __next__()对应一个yield
        生成器可以使用for循环获取值
      • send()(备注:了解)
      • #next只能获取yield生成的值,但是不能传递值
        #使用send方法可以传递值
        def gen:
            while 1:
                food=yield
                print(f"sfd{food}")
        dog=gen()#获取生成器
        next(dog)#第一次必须用next让指针停留在第一个yield后面
        dog.send("骨头")#将值传递给上一个yield发送值
        
        #send和next()区别:
        #相同点:send和next()都可以让生成器对应的yield向下执行一次
        #都可以获取到yield生成的值
        
        #不同点:
        #第一次获取yield值只能用next不能用send(可以用send(None))
        #send可以给上一个yield传递值
      • yield from
      • #简介:在python3中提供一种可以直接把可迭代对象中的每一个数据作为生成器的结果进行返回
        #对比yield 和yield from
        def func():
         lst=['卫龙','老冰棍','北冰洋','牛羊配']
            yield lst
        g=func()
        print(g)
        print(next(g))#只是返回一个列表
        
        def func():
            lst = ['卫龙','老冰棍','北冰洋','牛羊配']
            yield from lst
        g=func()
        print(g)#他会将这个可迭代对象每个元素当作迭代器的每个结果进行返回
        for x in g:
            print(x)
        #循环输出g生成器里的元素
        
        
      • yield from 小坑

      • def func():
            lst1 = ['卫龙', '老冰棍', '北冰洋', '牛羊配']
            lst2 = ['馒头', '花卷', '豆包', '大饼']
            yield from lst1
            yield from lst2
        
        g = func()
        for i in g:
            print(i)
        #返回的结果是将第一个列表的元素全部返回后,在返回第二个列表
        #产生两个新的生成器
        print(func().__next__())
        print(func().__next__())
      • 总结:
      • # 在函数中将return改写成yield就是一个生成器
        # yield 会记录执行位置
        # return 和 yield 都是返回,
        # return 可以写多个,但是只执行一次,yield可以写多个,还可以返回多次
        # 一个__next__() 对应 一个yield
        # 生成器可以使用for循环获取值
        # yield from -- 将可迭代对象元素逐个返回
        # 在函数的内部 yield 能将for循环和while循环进行临时暂停
    • 通过生成器推导式
    • #循环模式
      g=(i for i in range(20))
      for i in g:
          print(i)
      #筛选模式
      g=(i for i in range(50) if i %2==1)
      for i in g:
          print(i)
    • python内函数或者模块提供

4.11 推导式

  1. list推导式

    lst=[]
    for i in range(3):
     lst.append(i)
    print(lst)
    #结果为 [0,1,2]
    #推导式
    print([i for i in range(3)])
    #结果为[0,1,2]
  2. 循环模式
    • #[变量 for i in range(20)]
      print[i+1 for i in range(10)]
  3. 筛选模式
    • lst=[]
      for i in range(20):
         if i%2==0:
             lst.append(i)
      print(lst)
      
      print([i for i in range(20) if i%2 ==0])
      #[变量(加工后的变量)for循环 加工方式]
  4. 生成器表达式
    • 循环模式

      # g = (i for i in range(20))
      # print(next(g))
      # print(next(g))
      # print(next(g))
      
      # print(list((i for i in range(20))))
    • 筛选模式
      # g = (i for i in range(50) if i % 2 == 1)
      # for i in g:
      #     print(i)
  5. 字典推导式(了解)
    # print({i:i+1 for i in range(10)})
    # print({i:i+1 for i in range(10) if i % 2 == 0})
    # {键:值 for循环 加工条件}
  6. 集合推导式(了解)
    # print({i for i in range(10)})
    # print({i for i in range(10) if i % 2 == 0})

原文地址:https://www.cnblogs.com/zhangdadayou/p/11415210.html

时间: 2024-10-08 01:10:09

Python之函数(七)生成器与推导式的相关文章

函数生成器、推导式及python内置函数

函数生成器.推导式及python内置函数 函数生成器 生成器的定义 在 Python 中,使用了 yield 的函数被称为生成器(generator). 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器. 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行. 调用一个生成器函数,返回的是一个迭代器对象. 生成器与迭代器的区别 生成

python 【迭代器 生成器 列表推导式】

python [迭代器  生成器  列表推导式] 一.迭代器 1.迭代器如何从列表.字典中取值的 index索引 ,key for循环凡是可以使用for循环取值的都是可迭代的可迭代协议 :内部含有__iter__方法的都是可迭代的迭代器协议 :内部含有__iter__方法和__next__方法的都是迭代器 print(dir([1,2,3])) lst_iter = [1,2,3].__iter__() print(lst_iter.__next__()) print(lst_iter.__ne

python生成器和推导式

一.生成器 什么是生成器.生成器实质就是迭代器. 在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的装换也可以获取生成器 def func(): print("111") return 222 ret = func() print(ret) 结果:111 222 将函数中的return换成yield就是生成器 def func() print("111") yield 222 ret = func() pri

Python的高级特性2:列表推导式和生成器

一.列表推导式 1.列表推导式是颇具python风格的一种写法.这种写法除了高效,也更简短. In [23]: ['i:el' for i,el in enumerate(["one","two","three"])] Out[23]: ['i:el', 'i:el', 'i:el'] enumerate是内建函数,可以让列表获得“下标”的属性.而如果不用列表推导式,上例需要这么写 In [24]: lst = ["one",

Python 生成器和推导式

一.Python生成器和生成器函数1.生成器和生成器函数的概念    1.生成器的本质是迭代器    2.函数中包含yield,就是生成器函数 2.生成器函数的写法    def func():        a =10        yield 20    gen = func()  #没有执行,而是生成一个生成器    普通函数和生成器函数的不同    1.普通函数名()表示函数的的执行    2.生成器函数名()不是函数的执行,而是生成一个生成器 yield和return的不同    1.

(一)Python入门-4控制语句:10推导式创建序列-列表推导式-字典推导式-集合推导式-生成器推导式

推导式创建序列: 推导式是从一个或者多个迭代器快速创建序列的一种方法.它可以将循环和条件判断结合, 从而避免冗长的代码.推导式是典型的Python 风格,会使用它代表你已经超过Python初 学者的水平. 一:列表推导式 列表推导式生成列表对象,语法如下: [表达式 for item in 可迭代对象 ] 或者:{表达式 for item in 可迭代对象 if 条件判断} 1 #列表推导式 2 x = [x for x in range(1,5)] 3 print(x) 4 5 x = [x*

Python---迭代器,生成器,列表推导式

# 02,迭代器# 可迭代对象:内部含有__iter__# 迭代器:可迭代对象.__iter__()# 迭代器:内部含有__iter__且__next__# 判断 __iter__ 在不在dir(对象中)# isinstance()# 节省内存.# 惰性机制.# 单向不可逆.# for循环的机制:# while# pass# 可迭代对象# 迭代器# 两者区别# 模拟for循环机制## 03,生成器# 本质上是迭代器,用python代码构建的.# 生成器定义# 生成器的写法# yield# sen

生成器迭代器推导式

可迭代对象和迭代器 # 可以进行循环更新的一个实实在在值. # 如何判断一个对象是否是可迭代对象: 利用内置函数:dir()可以查看对象内部方法 # 有__iter__方法的对象,都是可迭代对象. # print('__iter__' in dir(str)) # 如何判断一个对象是迭代器: 可更新迭代的工具 # 在python中,内部含有'__iter__'方法并且含有'__next__'方法的对象就是迭代器. # print('__iter__' in dir(str) and '__nex

函数递归、列表推导式

1.递归(函数自己调用自己) #递归的话,最多循环999次 #用递归的话,必须得有一个明确的结束条件 2.列表推导式 =====> eg:1000之内的偶数   原文地址:https://www.cnblogs.com/URNOTBENBEN/p/9278927.html