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. 如何查看是否安装.NET Framework、.NET Framework的版本号以及CLR版本号

    查看是否安装.NET Framework→%SystemRoot%\System32→如果有mscoree.dll文件,表明.NET Framework已安装 查看安装了哪些版本的.NET Framw ...

  2. css布局记录之双飞翼布局、圣杯布局

    双飞翼布局和圣杯布局是比较常用的布局方式,都是为了实现一行三列,并且两侧列固定宽度,中间列宽度自适应的效果:直接上代码记录下: <!DOCTYPE html> <html lang= ...

  3. [日常] Go语言圣经-指针对象的方法-bit数组习题2

    练习 6.3: (*IntSet).UnionWith会用|操作符计算两个集合的交集,我们再为IntSet实现另外的几个函数IntersectWith(交集:元素在A集合B集合均出现),Differe ...

  4. Vue: 生命周期, VueRouter

    Vue实例的生命周期: beforeCreate:   实例创建之前除标签外,所有的vue实例需要的数据,事件都不存在 created:  实例被创建之后,data和事件已经被解析到,el还没有找到 ...

  5. Mysql数据库 的库表简易操作

    一. 库的操作 1.创建数据库 创建数据库: create database 库名 charset utf8;   charset uft8  可选项 1.2 数据库命名规范: 可以由字母.数字.下划 ...

  6. vue 笔记

    <div id="root"> <div> <input v-model="inputValue" /> <butto ...

  7. vue 自定义组件的自定义属性

    <auto-com :value="value"></auto-com> //带 : 的属性传入的是动态的值 <auto-com value=&quo ...

  8. 关于ajax 传递的参数

    ajax 发送的数据,默认都是字符串,不能直接传递list(列表),或者dict(字典). 若要 传递list(列表),或者dict(字典),需要进行一些操作. list 需要进行列表序列化,在aja ...

  9. ArcGIS Server + ArcGIS Portal 10.5

    1.安装IE11 2. 域名需要在C:\Windows\System32\drivers\etc\host文件中添加 127.0.0.1  机器名.域名 win2008.smartmap.com 19 ...

  10. Android--根据子控件的大小自动换行的ViewGroup

    1.自定义ViewGroup /** * Created by Administrator on 2016/2/26. * * --------自动换行的ViewGroup----------- */ ...