磨刀霍霍: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是惰性计算的数列,所以可以简洁的输出全体素数,自然数等。