1.生成器:

什么是生成器?

它内部封装了一套公式/算法,只有等到需要调用/执行数据时 --> next()函数执行

才会将公式计算得到数据结果,这就是生成器的原理(核心思想);

【注意事项】:

1).生成器中是没有真实数据存在,所以我们是不能直接使用len()函数来尝试得到其长度

如果我们这么做了,会报错:StopIteration

2).生成器中关联的真实数据只能被使用一次,不可逆

格式:两种

执行返回一个generator类型对象

1).

(条件表达式 for 参数列表 in 容器对象)

2).

定义函数,在函数的内部需要使用yield关键字来记录返回的generator对象的数据公式,

【注意】函数此时如果有return,已经无视了/没有作用了,返回的一定是generator

演示生成器的定义和使用:
#格式1:(条件表达式 for 参数列表 in 容器对象)
gen=(x for x in range(5))
print(gen,type(gen)) #generator对象不能配合len()来获取其长度
print(len(gen)) #使用next()函数来得到每一次genexpr中的内容
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen)) #generator对象中的数据内容只能被解析使用一次,不可逆;一旦调用多了,直接报错;
# StopIteration
print(next(gen))
以下是两种解析处理generator对象的方式:
方式一:使用next()函数调用,如果调多了,报错:StopIteration
方式二:使用循环处理,如果调多了,不会报错,什么都看不到-->这样的方式更加友好
print(next(gen))
print(next(gen))
for g in gen:
print('')
print(g)
print(next(g))
print('*'*50) for g in gen:
print(g)

需求:思考如果对于gen对象中的真实数据我需要用到多次,那怎么办?
可以将generator对象gen转换为一个譬如list对象即可
gen=(x for x in range(5))
lt=list(gen)
print(lt,type(lt)) for i in lt:
print(i)
print('*'*50) i=0
while i<len(lt):
print(lt[i])
i+=1
格式2:
定义函数,在函数的内部需要使用yield关键字来记录返回的generator对象的数据公式,
【注意】函数此时如果有return,已经无视了/没有作用了,返回的一定是generator
def func(n):
lt=[]
for i in range(1,n+1):
if i%2==0:
lt.append(i)
yield i
return lt f=func(10)
print(f,type(f)) print(len(f))
print(next(f)) for i in f:
print(i) print(list(f)) gen=(x for x in range(1,11) if x%2==0)
for g in gen:
print(g)
需求:实现全排列
str1='ABC'
str2='XYZ'
def func2(str1,str2):
for s1 in str1:
for s2 in str2:
yield s1 + s2 gen=func2(str1,str2)
print(gen,type(gen)) for g in gen:
print(gen) print('*'*50) gen=(x+y for x in str1 for y in str2)
for g in gen:
print(g)
比较:列表生成式和生成器?

对于生成器而言:

定义执行会得到一个generator对象,

此对象中没有真实数据(第一手没值),它内部封装了一套公式/算法,

一旦需要使用数据了,就会计算公式,得到内容;

就因为这样的特点,所以我们得出结论:

1).生成器比较节省内存资源(好处)

2).在数据运算时比列表生成式效率要慢一点(弊端)

对于列表生成式而言:

定义执行会得到一个列表对象,

在定义执行完毕后,列表中已经确定了真实的数据(进内存了)

就因为这样的特点,所以我们得出结论:

1).列表生成式比较占用内存资源(弊端)

2).在数据运算时比生成器效率要快一点(好处)

python第三十五课——生成器的更多相关文章

  1. NeHe OpenGL教程 第三十五课:播放AVI

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. Python进阶(三十五)-Fiddler命令行和HTTP断点调试

    Python进阶(三十五)-Fiddler命令行和HTTP断点调试 一. Fiddler内置命令   上一节(使用Fiddler进行抓包分析)中,介绍到,在web session(与我们通常所说的se ...

  3. 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容

     孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...

  4. 第三十五课:Ajax详解

    一个完整的Ajax请求: var xhr = new (self.XMLHttpRequest || ActiveXObject)("Microsoft.XMLHTTP");   ...

  5. python第三十五天-----作业完成--学校选课系统

    选课系统:角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. 课程包含, ...

  6. python第三十二课——队列

    队列:满足特点 --> 先进先出,类似于我们生活中的买票.安检 [注意] 对于队列而言:python中有为其封装特定的函数,在collections模块中的deque函数就可以获取一个队列对象; ...

  7. python第四十五课——继承性之多继承

    测试模块 演示多继承的结构和使用: 子类:Child 直接父类(多个):Father.Mother 注意: 由于有多个直接父类,多个父类都要自己给其属性赋值, 避免混淆,我们使用类名.__init__ ...

  8. python第三十八课——面向对象(一)

    1.面向对象:(思想) 面向:看.关注.瞅 对象:个体.实体.实例.结果单词:object在python中一些皆对象 面向过程:(思想) 面向:看.关注.瞅 过程:经过.经历.从头到尾 使用一些生活中 ...

  9. python第三十二课——栈

    栈:满足特点 --> 先进后出,类似于我们生活中的子弹夹 [注意] 对于栈结构而言:python中没有为其封装特定的函数,我们可以使用list(列表)来模拟栈的特点 使用list对象来模拟栈结构 ...

随机推荐

  1. T-SQL建索引

    USE database GO   ------------开始----------- ALTER TABLE [name] DROP CONSTRAINT 主键约束    ----删除主键约束 IF ...

  2. CSS 分类 选择器

      CSS:层叠样式表(英文全称:Cascading Style Sheets)         后缀名:css         标志  style         对网页中元素位置的排版进行像素级精 ...

  3. [android] 轮播图-滑动图片标题焦点

    谷歌提供的v4包,ViewPager 在布局文件中,先添加<android.support.v4.view.ViewPager/>控件,这个只是轮播的区域 在布局文件中,布置标题描述部分 ...

  4. js文字滚动效果

    function (global) { var logo = document.getElementById('logo'); var text = document.createTextNode(' ...

  5. 第一章 深入.NET框架

    一. .NET的过人之处 1..NET框架提高了软件的可重复行 ,可扩展性,可维护行和灵活性. 2.对web应用的强大支撑. 3.对Web Service(Web服务)的支持. 4.实现SOA,支持云 ...

  6. vue Element-UI 分页使用(1)

    最近在使用Element-UI这套框架配合Vue来写前端页面.在用Element-UI来制作表格的时候,遇到了一些小问题,记录方便学习. 其中两个事件是关于切换当前页和切换显示的列表条数的.另外的属性 ...

  7. 使用PeopleSoft 异步操作设置步骤

    在手机端调PS接口或同步数据到中间库等程序中经常用到异步操作. 在主菜单>PeopleTools>集成代理程序>集成设置中添加了服务和服务操作后需要设置以下3步才能完成异步程序: 1 ...

  8. SD从零开始55-56, 风险管理, 付款卡

    [原创] SD从零开始55 风险管理的内容 应收款风险最小化Risk Minimization for Receivables 每个信用政策的目的是减少由客户应收款带来的风险: 连同信用管理,你也有权 ...

  9. JetBrains PhpStorm 2017.2 x64 激活

    使用方法:激活时选择License server 填入http://idea.imsxm.com 点击Active即可

  10. 7.0 FileProvide适配

    7.0 Build.VERSION_CODES.N 24 为什么要适配 在7.0中 ,Uri.from(file),可能会触发FileUriExposedException 和动态权限一样,如果tar ...