在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赋值和生成器的更多相关文章

  1. python高级之生成器&迭代器

    python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...

  2. 【python】迭代器&生成器

    源Link:http://www.cnblogs.com/huxi/archive/2011/07/01/2095931.html 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素 ...

  3. 第三篇:python高级之生成器&迭代器

    python高级之生成器&迭代器   python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...

  4. 十三. Python基础(13)--生成器进阶

    十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...

  5. Python 迭代器和生成器(转)

    Python 迭代器和生成器 在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的, ...

  6. (转)python基础学习-----生成器和迭代器

    在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了 ...

  7. python中的生成器函数是如何工作的?

    以下内容基于python3.4 1. python中的普通函数是怎么运行的? 当一个python函数在执行时,它会在相应的python栈帧上运行,栈帧表示程序运行时函数调用栈中的某一帧.想要获得某个函 ...

  8. python记录_day12 生成器

    什么是生成器? 生成器的实质就是迭代器,我们能够从生成器中一个一的拿值 python中获取生成器的方式有三种: 1.通过生成器函数 2.通过生成器表达式 3.通过数据转换也可以获取生成器(某些对象执行 ...

  9. 十二. Python基础(12)--生成器

    十二. Python基础(12)--生成器 1 ● 可迭代对象(iterable) An object capable of returning its members one at a time. ...

随机推荐

  1. com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1035079 -- APPARENT DEADLOCK!!! Complete Status:

    com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1035079 -- APPARENT DEADLOCK!!! C ...

  2. UVA 690 Pipeline Scheduling

    https://vjudge.net/problem/UVA-690 题目 你有一台包含5个工作单元的计算机,还有10个完全相同的程序需要执行.每个程序需要$n(n<20)$个时间片来执行,可以 ...

  3. mysql出现ERROR1698(28000):Access denied for user root@localhost错误解决方法

    我的操作系统是ubuntu18.04,以下是我的mysql版本: 安装完成后,登录mysql的时候就出现了如下错误: 因为安装的过程中没让设置密码,可能密码为空,但无论如何都进不去mysql. 那么该 ...

  4. Xml文件汉化后改变代码页

    源Xml文件代码页为ansi,汉化后要转换为UTF-8,在网上搜素了以下结果,但解释的不都清楚,我找了好一阵才找到相应的操作.   为防止自己以后忘了,补充如下: 经过这样的设置,生成的汉化xml文件 ...

  5. sql server2012学习笔记

    第1章 SQL安装   1-1 [SQL Server基础]前言 (10:44) 1-2 SQL Server安装 (08:29) 1-3 第一次登陆 SQL Server (02:58) 1-4 [ ...

  6. Codeforces997C Sky Full of Stars 【FMT】【组合数】

    题目大意: 一个$n*n$的格子,每个格子由你填色,有三种允许填色的方法,问有一行或者一列相同的方案数. 题目分析: 标题的FMT是我吓人用的. 一行或一列的问题不好解决,转成它的反面,没有一行和一列 ...

  7. 【BZOJ4653】【NOI2016】区间 线段树

    题目大意 数轴上有\(n\)个闭区间\([l_1,r_1],[l_2,r_2],\ldots,[l_n,r_n]\),你要选出\(m\)个区间,使得存在一个\(x\),对于每个选出的区间\([l_i, ...

  8. 【XSY2166】Hope 分治 FFT

    题目描述 对于一个\(1\)到\(n\)的排列\(a_1,a_2,a_3,\ldots,a_n\),我们定义这个排列的\(P\)值和\(Q\)值: 对于每个\(a_i\),如果存在一个最小的\(j\) ...

  9. 【BZOJ3771】Triple 生成函数 FFT 容斥原理

    题目大意 有\(n\)把斧头,不同斧头的价值都不同且都是\([0,m]\)的整数.你可以选\(1\)~\(3\)把斧头,总价值为这三把斧头的价值之和.请你对于每种可能的总价值,求出有多少种选择方案. ...

  10. pax3 quick start guide

    pax3 quick start guide 外观图: 配置:1 * pax3 主机:2 * 吸嘴(一个平的,一个凸的):2 * 底盖(一个烟草的,一个烟膏的):3 * 过滤片:1 * USB充:1 ...