python赋值和生成器
在python赋值过程中,对单个变量的赋值,在所有语言中都是通用的,如果是对两个变量同时进行赋值,这个时候,就会出现一点点小的差异。例如在下面的一两行代码中。
a , b = b , a+b
这是同时对两个变量进行赋值,假如当前a=1,b=2,运算之后,a=2,b=3,实际上的运算过程是,先将当前的b和a+b放进一个元祖中,temp = (b,a+b),然后再对a和b进行赋值,a=temp[0],b=temp[1]。
这种运算赋值,最常见的一个算法,就是斐波那契,斐波那契的结果就是当前数的结果,是前两个数之和。正好用到了这种赋值方式。代码如下:
def fib(number):
a = 0
b = 1
n = 1
if number == n:
return a
elif number == b:
return b
else:
while n < number:
a , b = b , a+b
n +=1
return b number_list = [ fib(i) for i in range(1,10)]
print(number_list)
首先要定义两个初始的变量,也就是第1个数为0,第2个数为1,后面的数都是根据这个数字来加。下面还是用了一个列表生产式,将斐波那契的结果放入到该列表生产式中。世界上得到的是一个列表。
虽然这个列表的生成方式比较简单,对于内存来数,还是一次性的生成,然后放入到内存中。如果生产的数较大,也会占用大量的内存,所以这个时候就有一个生成器的东西。生成器是一个内存对象,通过每次生成一个数字,放入内存中,同时覆盖掉之前生成的数字,保证内存中只有一个数字,从而减少内存的占用。
列表生产式和生成器都可以遍历整个列表中的数字,只不过生成器只能够向下取一个,但是生成式可以通过索引进行取值。
修改一下上面的代码,形成一个生成器,一个对象。
def fib(number):
a = 0
b = 1
n = 1
if number == n:
return a
elif number == b:
return b
else:
while n < number:
a , b = b , a+b
n +=1
return b number_list = (fib(i) for i in range(1,100))
print(number_list)
print(number_list.__next__())
print(next(number_list))
生成式和生成器之间的区别,就是一个是列表,一个是内存对象,[]与()的区别。通过调用next方法来取值。
实际上,上述代码只是对斐波那契的结果,进行了生成器的操作,在计算斐波那契的时候,还是需要计算值。能不能想点办法,在计算的时候,不计算那么多值。也就是做一个斐波那契的类表生成器。这个时候用到了yield。生成器对象的关键。
def fib(number):
a ,b ,n = 0 , 1 , 1
if number == n:
return a
elif number == b:
return b
else:
while n < number:
yield b
a , b = b , a+b
n +=1
return b number = fib(10)
# print(number.__next__())
for i in number:
print(i)
使用了yield之后,这个斐波那契函数创建的变量,就变成了一个生成器。生成器就只能通过循环或者next方法来取值。不能进行切片了。
当使用yield时,调用next方法,程序会回到yield,然后开始执行下一个操作,同时将yield后面的值返回。
python赋值和生成器的更多相关文章
- python高级之生成器&迭代器
python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...
- 【python】迭代器&生成器
源Link:http://www.cnblogs.com/huxi/archive/2011/07/01/2095931.html 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素 ...
- 第三篇:python高级之生成器&迭代器
python高级之生成器&迭代器 python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...
- 十三. Python基础(13)--生成器进阶
十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...
- Python 迭代器和生成器(转)
Python 迭代器和生成器 在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的, ...
- (转)python基础学习-----生成器和迭代器
在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了 ...
- python中的生成器函数是如何工作的?
以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函 ...
- python记录_day12 生成器
什么是生成器? 生成器的实质就是迭代器,我们能够从生成器中一个一的拿值 python中获取生成器的方式有三种: 1.通过生成器函数 2.通过生成器表达式 3.通过数据转换也可以获取生成器(某些对象执行 ...
- 十二. Python基础(12)--生成器
十二. Python基础(12)--生成器 1 ● 可迭代对象(iterable) An object capable of returning its members one at a time. ...
随机推荐
- vue自定義指令
自定義指令可以允許代碼複用, 全局自定義指令 vue.directive('指令名',{鉤子函數:指令函數}) 局部自定義指令: vue({ directives:{指令名:{鉤子函數:指令函數} } ...
- VS2017设置背景主题
一.VS2017设置背景主题 1.下载并安装Color Theme Editor for Visual Studio 2017和MoeIDE (图中红圈中的两个插件,工具-扩展和更新-联机-右上角搜索 ...
- Uninstall registry
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
- 【python练习题】程序14
#题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. #我的方法应该比网上的更加简洁,只是递归可能速度慢 n = input('请输入一个正整数:') n = int(n) X ...
- word公式大小
下面给出MathType与Word对应的字体关系,大家可以根据自己的实际需求,调整自己的公式大小. MathType与Word对应的字体关系示例 以上给大家详细介绍了调整MathType公式字体大小 ...
- group by具有去重的功能
group by具有去重的功能
- hdu-2072(字典树)
字典树模板题 代码 #include<iostream> #include<algorithm> #include<cstdio> #include<cstr ...
- ES系列十五、ES常用Java Client API
一.简介 1.先看ES的架构图 二.ES支持的客户端连接方式 1.REST API http请求,例如,浏览器请求get方法:利用Postman等工具发起REST请求:java 发起httpClien ...
- h5 打开 app
目前只支持在浏览器中打开,如果非浏览器,例如 微信 支付宝 钉钉 第三方 app 中会弹出下载页面 schemeUrl 为 和app 约定url openApp() { /* 小希学生端 aoji ...
- spring boot项目基本结构
/==================================Controller @Controller public class SimpleController { @Autowired ...