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. ...
随机推荐
- web攻擊
一.dos攻擊 向服務器發送數量龐大的合法數據,讓服務器分不清是不是正常請求,導致服務器接收所有的請求.海量的數據請求會使得服務器停止服務和拒絕服務. 防禦:阿里云或其它資源服務器有專門web應用防火 ...
- nginx rewrite重写
通过官方文档可以看到,rewrite的作用上下文是 server location,可以写在 server里面 亦或location里面; 命令: if (条件) {} 条件判断 set #设置 ...
- AgilePoint数据库模式中当前所有表的列表
表名 描述 WF_ACTIVITY_INSTS 包含有关活动实例的信息. WF_ASSIGNED_OBJECTS 包含有关用户角色的分配对象的信息. WF_AUDIT_TRAILS 包含有关流程模板的 ...
- codeforces525B
Pasha and String CodeForces - 525B Pasha got a very beautiful string s for his birthday, the string ...
- .net core 2.0 MVC区域
区域 创建对应的目录结构 Areas System Controllers Views 在Startup.cs 注册路由 在控制器上方加上`[Area("system")]` // ...
- python之旅六【第六篇】模块
json和pickle 用于序列化的两个模块json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进行转换 json模块提供了四 ...
- Codeforces1101G (Zero XOR Subset)-less 【线性基】【贪心】
题目分析: 考虑到这是一个区间的异或问题,不妨求出前缀和,令$sum[i] = Xor_{j=1}^{i}a[j]$. 对于区间$[l,r]$的异或结果,等于$sum[r] \oplus sum[l- ...
- BZOJ 3261 最大异或和(算竞进阶习题)
可持久化Trie 需要知道一个异或的特点,和前缀和差不多 a[p] xor a[p+1] xor....xor a[n] xor x = a[p-1] xor a[n] xor x 所以我们把a[1. ...
- python+selenium+unnitest写一个完整的登陆的验证
import unittest from selenium import webdriver from time import sleep class lonInTest (unittest.Test ...
- 【XSY2691】中关村 卢卡斯定理 数位DP
题目描述 在一个\(k\)维空间中,每个整点被黑白染色.对于一个坐标为\((x_1,x_2,\ldots,x_k)\)的点,他的颜色我们通过如下方式计算: 如果存在一维坐标是\(0\),则颜色是黑色. ...