乐趣区

小李飞刀:python请你轻轻轻点虐

又是日常唠嗑的一小段
真的是非常话唠的在下,日常给自己打点鸡血吧。昨晚和老妈聊了一整晚,所以昨天并没有更新。然后因为很快要开始算个税减免的部分,对于温饱线的在下而言,其实减免的可能就只是奶茶钱吧。工作的本质是赚钱,我也很想在 30 岁之前完成财务自由。所以要更加努力的赚钱钱,想变成自由职业者(我妈最看不上的那种),然后尽可能的独立吧。无论是财务还是心理,还是有点太软弱了。
鸡血鸡血,要开始学习啦!
当你觉得辛苦的时候,那就是你在变好的时候!
列表生成式
上一次学到 Python 的高级特性,迭代不同于其他语言的 for 循环中的下标循环。虽然 python 也提供了相应的方式,但是精简才是 python 的精髓。
列表生成式即 List Comprehensions,是 Python 内置的非常简单却强大的可以用来创建 list 的生成式。
列表生成式 –> 将生成式放在 for 循环前,然后 for 循环之后还可以加入 if 判断(真的是相当的简单粗暴了,是一个用方括号的朋友,毕竟是可以从一个 list 到另一个 list。原来需要用循环处理的问题,现在用一句简单的生成式代码解决。

看廖大神的例子,还可以双重循环,可以生成全排列。
[m + n for m in ‘ABC’ for n in ‘XYZ’]
[‘AX’, ‘AY’, ‘AZ’, ‘BX’, ‘BY’, ‘BZ’, ‘CX’, ‘CY’, ‘CZ’]
for 循环其实可以同时使用两个甚至多个变量,比如 dict 的 items()可以同时迭代 key 和 value 列表生成式也可以使用两个变量来生成 list

做个作业

生成器
在 Python 中,这种一边循环一边计算的机制,称为生成器:generator。这样就不必创建完整的 list,从而节省大量的空间。
创建生成器的办法有很多。
把列表生成的 [] 改成(),就创建了一个 generator。
如果要打印 g 的内容,只能用 next()函数,获得下一次的返回值。
generator 保存的是算法,每次调用 next(g),就计算出 g 的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的错误。但是正常来说,我们还是使用 for 循环来进行打印,这样不需要调用 next()函数,也不需要关心 StopInteration 的错误。

generator 非常强大。如果推算的算法比较复杂,用类似列表生成式的 for 循环无法实现的时候,还可以用函数来实现。
比如,斐波那契数列(我还挺喜欢这个名字的,蜜汁 …)
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return ‘done’
#用函数进行打印
此处的赋值语句要注意。
a, b = b, a + b
相当于
t = (b, a + b) # t 是一个 tuple
a = t[0]
b = t[1]
不必显式写出临时变量 t 就可以赋值。此处的 fib()函数逻辑非常类似 generator,此时将 print(b)改成 yield b 就可以把函数变成生成器。

yield 关键词很重要,是变成 generator 的关键。
generator 和函数的执行流程不一样。函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成 generator 的函数,在每次调用 next()的时候执行,遇到 yield 语句返回,再次执行时从上次返回的 yield 语句处继续执行。
杨辉三角的作业后面补上,算法真的是硬伤。
迭代器
可以直接作用于 for 循环的对象统称为可迭代对象:Iterable。
一类是集合数据类型,如 list、tuple、dict、set、str 等;一类是 generator,包括生成器和带 yield 的 generator function。
可以使用 isinstance()判断一个对象是否是 Iterable 对象。
生成器不但可以作用于 for 循环,还可以被 next()函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。可以被 next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
生成器都是 Iterator 对象,但 list、dict、str 虽然是 Iterable,却不是 Iterator。把 list、dict、str 等 Iterable 变成 Iterator 可以使用 iter()函数。
这一章节,emmm,很多概念性的东西。但是还是很厉害的,Iterator 的数据流是有序的,但是可能是无限的。对于 list 而言,不太可能存储无限的数据。
函数式编程
又开始新的大章节啦,因为落后了好几天的进度,所以一定要抓紧学习啦~
高阶函数 Higher-order function
变量可以指向函数
一般而言,abs()是函数,abs(1)是函数调用。我们常常使用 b = abs(1) 将函数结果赋给变量,但是如下
b = abs
则是将函数赋给变量,这个是可行的。且变量指向了函数之后,可以使用变量来调用函数。
函数名也是变量
所以在设定变量赋值的时候,要注意不要覆盖了函数名
传入函数
函数可以接收另一个函数做为参数,这种函数称为高阶函数【十分的抽象了!】
map/reduce
map()和 reduce()是俩 Python 的内建函数。
map()
map()接收两个参数,一个是函数,一个是 Iterable,map()将传入的函数一次作用到序列的每个元素,并将结果做为 Iterator 返回。** 虽然循环也可以完成 map()的操作,但是 map()可以方便看清运算的需求。map()仅仅用一行代码,就完成了复杂的运算。

reduce()
reduce()把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce 把结果继续和序列的下一个元素做累积计算计算效果就是
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
fliter
Python 内建的 filter()函数用于过滤序列。
filter()这个高阶函数,关键在于正确实现一个“筛选”函数。
下面是廖大神的关于素数的示范
其中输出结果是无序数列,所以要有一定限制条件。输出的 Iterator 是惰性计算的数列,所以可以简洁的输出全体素数,自然数等。

退出移动版