又是日常唠嗑的一小段
真的是非常话唠的在下,日常给自己打点鸡血吧。
昨晚和老妈聊了一整晚,所以昨天并没有更新。
然后因为很快要开始算个税减免的部分,对于温饱线的在下而言,其实减免的可能就只是奶茶钱吧。
工作的本质是赚钱,我也很想在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是惰性计算的数列,所以可以简洁的输出全体素数,自然数等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。