有趣的赋值,了解一下

python 随笔

业余 python 爱好者又上线了,离上次发博过去几个月了,真的是懒!
期间完成了一段目前为止最完整、效果良好、800 多行的小游戏代码,由于运维工作忙,抽时间再将其详尽的分享出来。
此次更博,是想把之前的笔记在此做一个简略的记录,还是因为懒。

笔记内容

  1. 不是想象中的赋值
  2. 生成器 与 列表生成式

  1. 不是想象中的赋值
    废话少说,先看代码
# 请看第一段代码
def fibs(n=10):
    a, b = 0, 1
    result = []
    for i in range(n):
        a, b = b, a+b
        result.append(a)
    return result
# 直接调用,验看结果
fibs()
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]  # 结果
# 再看第二段代码
def fibs(n=10):
    a, b = 0, 1
    result = []
    for i in range(n):
        a = b
        b = a + b
        result.append(a)
    return result
# 直接调用,验看结果
fibs()
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512] # 结果

原来我以为 python 迭代的那种赋值方式是为了便捷、美观,看来是和惯性思维是有出入的。

a, b = b, a+b

这种方式是先计算完 “=” 右边的值,再赋给左边的参数,比如这里 a = 0 b = 1 a+b=1 ,赋值后 a = 1 b = 1,所以第一段函数出现正确的斐波那契数列。

a = b
b = a + b

这更简单,其实就是 b 反复和自己相加,最后赋值给 a .不明白自己原来为什么以为这两种赋值方式是一样的,傻~

2 生成器 generator 与 列表生成式
列表生成式对于 Python 患者应该很熟悉了,简约大方又聪明。

[demo ** 2 for demo in range(1, 10) if demo % 2 == 0]
求 10 以内的偶数的平方
[4, 16, 36, 64]

生成器 (generator),引自廖雪峰 Python 生成器 的描述,它可以和列表生成式一样,用一个简单的带 “()” 的式子生成,然后用 next() 来取值,直到超出索引范围,抛出一个停止迭代的报错 StopIteration。

temp = (x ** x for x in range(1, 5))
temp 保存的是个算法,如下:
temp
<generator object <genexpr> at 0x0000000005616AF0>
next(temp)
1
4
27
256
Boom……(此时炸了,不复制了)

另一个重要的语句 yield,常会用这个工具制作生成器。yield 的作用就是把一个函数变成一个 generator,调用函数时返回的是一个可迭代的对象。生成器用 for 循环进行遍历,不会抛出异常。

小记

断断续续学了这么久,还是能看到好多新鲜的知识点,应该保持一个学习并记录的习惯!

原文地址:https://www.cnblogs.com/nimo97/p/9704765.html