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. ...
随机推荐
- mobile deeplearning
框架: 腾讯ncnn https://github.com/Tencent/ncnn 百度mobile-deep-learning https://github.com/baidu/mobile-de ...
- luogu2258
题面 sol:先爆搜搜出r行,再在那r行中选c列DP得到最优解 我太菜了,这种题都做了好久,还需锻炼码力啊qwq #include <cstdio> #include <cstrin ...
- bzoj-1191(二分图最大匹配)
解题思路:比较裸的一道题,直接跑匈牙利就行了,但是要注意一点,这个兔崽子是在闯关,一道题回答不出来就没了,直接在题目循环那里加一个else break;就行了!!!; #include<iost ...
- Qt setStyleSheet
Qt中设置按钮或QWidget的外观是,可以使用QT Style Sheets来进行设置,非常方便.可以用setStyleSheet("font: bold; font-size:20px; ...
- springboot 简单搭建
springboot的入门请参考:https://blog.csdn.net/hanjun0612/article/details/81538449 这里就简单看下搭建: 一,看一下项目结构: 创建一 ...
- 前端 -- HTML内容
HTML介绍 Wed服务本质 import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen(5 ...
- P1164 小A点菜
原题链接 https://www.luogu.org/problemnew/show/P1164 此题是一道简单的动规问题 才学两天不是很熟练,我苦思冥想看着题解终于想出来了. 主要的思路如下: 我们 ...
- [HAOI2007] 修筑绿化带
类型:单调队列 传送门:>Here< 题意:给出一个$M*N$的矩阵,每一个代表这一格土地的肥沃程度.现在要求修建一个$C*D$的矩形花坛,矩形绿化带的面积为$A*B$,要求花坛被包裹在绿 ...
- 【XSY2729】欧拉子图 无向图连通性 数学
题目大意 给你一个\(n\)个点\(m\)条边的无向图(可能有重边),对于这个图的边集的子集(一共有\(2^m\)个),如果其导出的子图的每个联通块内都存在欧拉回路,我们就把答案加上这个子图的边数的平 ...
- #SQL1242错误
--------------------- 子查询更新数据时遇到多条数据时,可以使用SUM&MIN等函数解决:如下: //正确的方法一对多 UPDATE `yd_draw_prize_orde ...