一.生成器

  生成器的本质就是迭代器     一个一个的创建对象

    1.创建生成器的方式:

      1.生成器函数

   2.通过生成器表达式来获取生成器

   3.类型转换

  2.优点

    节省内存 ,生成器本身就是代码,几乎不占用内存

  3.特点

    惰性机制,只能向前,不能反复

二.生成器函数

  函数中包含了yield   这个函数就是生成器函数

def func():
print("你叫xxx?")
yield "alex"
print("真的?")
yield "真的"
print("Are you sure?")
yield "那叫我屌丝把"
ret = func() # 拿到的是ret生成器 只是产生一个生成器并不是运行
print(ret) # 只能是打印 生成器的地址 print(ret.__next__()) # 生成器就是迭代器,用next一个一个拿
print(ret.__next__())
print(ret.__next__())
print(ret.__next__()) # 没有下一个了就会出现 StopIteration 错误

  1.yield

    1.yield和return差不多 yield是分段执行一个函数

             return是立即结束这个函数的执行

   2.生成器在执行的时候返回生成器,而不是执行执行此函数 

    2.能向下执行的两个条件

    1.__next__ 执行到下一个yield

   2.send() 执行到下一个yield,给上一个yield位置传值.在第一次执行生成器的时候不能用send(),最后一个yield也不会传值

   

def fn():
print("韭菜盒子")
a = yield "西红柿炒番茄"
print("a",a)
b = yield "西红柿炒鸡蛋"
print("b",b)
c = yield "番茄炒鸡蛋"
print("c",c)
yield "火烧" gen = fn()
# send()可以给上一个yield位置传参
print(gen.__next__())
print(gen.send("番茄"))
print(gen.send("西红柿"))
print(gen.send("鸡蛋"))

  3.获取生成器数据

    1.所有生成器都是迭代器都可以使用for循环

    2.都可以使用list()函数来获取生成器内所有的数据  

  4.生成器的记录

        生成器中记录的是代码而不是函数的运行

    当执行到__next__()  运行此空间中的代码,运行到yield结束

def func():
print("我的天哪 ")
yield "宝宝"
gen = func() # 创建生成器. 此时运行会把生成器函数中的代码记录在内存

三.推导式

  1.列表推导式            [结果             for循环    if]

lst = [ i**2 for i in range(1,101) if i % 2 == 0]
print(lst) 

  2.字典推导式    {结果(k:v)      for循环         if}

把字典的键值互换
dic = {"主食": "炒面", "副食": "小拌菜", "汤":"疙瘩汤"}
dic1 = { v:k for k,v in dic.items()}
print(dic1) 

  3.集合推导式    {结果(k)         for循环         if}

四.生成器表达式

  (结果          for循环           if)

g = (i for i in range(10))    #一次性生成器表达式

print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__()) # 用完就没了 想再次用必须再写一次表达式

五.yield from

def func():
lst = ["衣服%s" %i for i in range(500)]
yield from lst # 可以把一个可迭代对象分别进行yield返回 lst1 = ["python%s期" %i for i in range(1,19)]
yield from lst1 # 只有上面的yield next完才能轮到第二个
g = func()
print(g.__next__())
print(g.__next__()) 

python生成器初步了解的更多相关文章

  1. python——生成器

    python——生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个 ...

  2. Python生成器-博文读后感

    Windows 10家庭中文版,Python 3.6.4, 上午看过了一篇讲Python生成器的博文: 提高你的Python: 解释‘yield’和‘Generators(生成器)’(英文原文) 这篇 ...

  3. 小学生都能学会的python(生成器)

    小学生都能学会的python(生成器) 1. 生成器 生成器的本质就是迭代器. 生成器由生成器函数来创建或者通过生成器表达式来创建 # def func(): # lst = [] # for i i ...

  4. Python 生成器 (generator) & 迭代器 (iterator)

    python 生成器 & 迭代器 生成器 (generator) 列表生成式 列表生成式用来生成一个列表,虽然写的是表达式,但是储存的是计算出来的结果,因此生成的列表受到内存大小的限制 示例: ...

  5. python生成器学习

    python生成器学习: 案例分析一: def demo(): for i in range(4): yield i g=demo() g1=(i for i in g) #(i for i in d ...

  6. 【python之路29】python生成器generator与迭代器

    一.python生成器 python生成器原理: 只要函数中存在yield,则函数就变为生成器函数 #!usr/bin/env python # -*- coding:utf-8 -*- def xr ...

  7. Generator - Python 生成器

    Generator, python 生成器, 先熟悉一下儿相关定义, generator function 生成器函数, 生成器函数是一个在定义体中存有 'yield' 关键字的函数. 当生成器函数被 ...

  8. python生成器原理剖析

    python生成器原理剖析 函数的调用满足"后进先出"的原则,也就是说,最后被调用的函数应该第一个返回,函数的递归调用就是一个经典的例子.显然,内存中以"后进先出&quo ...

  9. 什么是Python生成器?与迭代器的关系是什么?

    生成器是一个特殊的迭代器,它保存的是算法,每次调用next()或send()就计算出下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIteration.生成器有两种类型,一种是生 ...

随机推荐

  1. 重建二叉树(python)

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...

  2. Cookie 和Session 简介

    前言 HTTP是一种无状态的协议,为了分辨链接是谁发起的,需自己去解决这个问题.不然有些情况下即使是同一个网站每打开一个页面也都要登录一下.而Session和Cookie就是为解决这个问题而提出来的两 ...

  3. TOJ 5225: 玩转二叉树

    传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=5225 时间限制(普通/Java): ...

  4. .net 报错access to the path c:\tempimagefiles\msc_cntr_0.txt is denied

    报错信息: 解决方法: 在 Web.Config 的 <System.Web> 里加 <identity impersonate="true"/> 节点即可 ...

  5. spring-mvc.xml 和 application-context.xml的区别

    转自:https://www.cnblogs.com/binlin1987/p/7053016.html application-context.xml是全局的,应用于多个serverlet,配合li ...

  6. TZOJ 二分图练习

    二分图主要是 1.如何建图,谁匹配谁,怎么匹配 2.判断求的是什么:最大匹配=最小点覆盖,最大独立子集=最小路径覆盖=最小边覆盖=图中顶点数-最大匹配 A.2733:棋盘游戏 描述 小希和Gardon ...

  7. android的四种线程池

    使用线程池的好处: 首先通过线程池中线程的重用,减少创建和销毁线程的性能开销.其次,能控制线程池中的并发数,否则会因为大量的线程争夺CPU资源造成阻塞.最后,线程池能够对线程进行管理,比如使用Sche ...

  8. materia官网地址

    https://materializecss.com/autocomplete.html

  9. 前端基础之BOM和DOM day52

    前端基础之BOM和DOM   前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互 ...

  10. JS高级:事件冒泡和事件捕获;

    1.事件:浏览器客户端上客户触发的行为成为时事件:所有的事件都是天生自带的,不需要我们去绑定,只需要我们去触发 当用户触发一个事件时,浏览器的所有详细信息都存在一个叫做event的对象上,我们把它叫做 ...