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

审配
• 阅读 1116

又是日常唠嗑的一小段

真的是非常话唠的在下,日常给自己打点鸡血吧。
昨晚和老妈聊了一整晚,所以昨天并没有更新
然后因为很快要开始算个税减免的部分,对于温饱线的在下而言,其实减免的可能就只是奶茶钱吧。
工作的本质是赚钱,我也很想在30岁之前完成财务自由
所以要更加努力的赚钱钱,想变成自由职业者(我妈最看不上的那种),然后尽可能的独立吧。无论是财务还是心理,还是有点太软弱了。

鸡血鸡血,要开始学习啦!

当你觉得辛苦的时候,那就是你在变好的时候!

列表生成式

上一次学到Python的高级特性,迭代不同于其他语言的for循环中的下标循环。虽然python也提供了相应的方式,但是精简才是python的精髓。

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

列表生成式-->将生成式放在for循环前,然后for循环之后还可以加入if判断(真的是相当的简单粗暴了,是一个用方括号的朋友,毕竟是可以从一个list到另一个list。
原来需要用循环处理的问题,现在用一句简单的生成式代码解决。

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

看廖大神的例子,还可以双重循环,可以生成全排列。

 [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请你轻轻轻点虐


做个作业

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

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

生成器

在Python中,这种一边循环一边计算的机制,称为生成器:generator。
这样就不必创建完整的list,从而节省大量的空间。

创建生成器的办法有很多。

  • 把列表生成的[]改成(),就创建了一个generator。

小李飞刀:python请你轻轻轻点虐
如果要打印g的内容,只能用next()函数,获得下一次的返回值。

generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
但是正常来说,我们还是使用for循环来进行打印,这样不需要调用next()函数,也不需要关心StopInteration的错误。

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

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就可以把函数变成生成器。

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

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()仅仅用一行代码,就完成了复杂的运算。

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

  • reduce()

reduce()把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
计算效果就是

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

fliter

Python内建的filter()函数用于过滤序列。

filter()这个高阶函数,关键在于正确实现一个“筛选”函数。

下面是廖大神的关于素数的示范

小李飞刀:python请你轻轻轻点虐
其中输出结果是无序数列,所以要有一定限制条件。
输出的Iterator是惰性计算的数列,所以可以简洁的输出全体素数,自然数等。

点赞
收藏
评论区
推荐文章
我是阿沐 我是阿沐
4年前
面试系列-2 redis列表场景分析实践
英国弗兰明曾说过一句话:“不要等待运气降临,应该去努力掌握知识。”1前言大家好,我是阿沐!你的收获便是我的喜欢,你的点赞便是对我的认可。上一章节面试官问了我们关于string数据结构的使用场景以及注意的点。虽然我们对答如流,但是毕竟只是redis很基础的知识点,下面面试官即将开始新的一轮面试要点,注重考查我们的日常工作中使用的场景以及怎样解决出现的弊端。
我是阿沐 我是阿沐
4年前
面试系列-3 限流场景实践
英国弗兰明曾说过一句话:“不要等待运气降临,应该去努力掌握知识。”1前言大家好,我是阿沐!你的收获便是我的喜欢,你的点赞便是对我的认可。今天呢,我们就不聊redis面试系列,我们一起来聊一聊限流操作以及使用场景。很奇怪哈,为啥突然转变画风了,之前一篇文章中提到redis的限流操作,并没有实际给小伙伴们演示以及场景的使用演练。所以呢,既然有人私聊问我了,
程序员如何实现财务自由?
好买网(www.goodmai.com)IT技术交易平台我想,很多同学的第一答案就是苦练技术,年薪百万,赢取白富美,走上人生巅峰!如果你把到点发工资也称为挣钱,那我无话可说,做到年薪百万的技术人员当然有,但能有几个?这根本不具有普适性。所以,我这里讲的是兼职赚钱以及副业转正实现财务自由的方法。昨天,在知乎上看到一个非常有意思的帖子,有个名词叫「小镇做题家」我
Easter79 Easter79
3年前
sql中join的理解
前言为什么会突然写这个blog呢?因为之前有只青蛙小姐姐问我,能不能教她join,当时上大学老师怎么教她也不会。然后本来想面对面交流给她说明,后面阴错阳差,就延误到了现在。所以我想,我可以提前准备好我想说的东西,记录下来,顺便自己也回忆下join(ps:为什么我需要回忆?因为之前的公司都是面向互联网的、高并发的业务,用join的话,很容易导致数
李志宽 李志宽
2年前
想学习Web安全,如何入门?
开始前的思考1.我真的喜欢搞安全吗?2.我想通过安全赚钱钱?3.我不知道做什么就是随便?4.一辈子做安全吗?\这些不想清楚会对你以后的发展很不利,与其盲目的学习web安全,不如先做一个长远的计划。否则在我看来都是
可莉 可莉
3年前
2018年蚂蚁金服前端一面总结(校招)
先简短的介绍一下我自己吧,我是一个前端学习者,虽然我基础知识也学了比较好,但是许久不用的知识就像流失的水,很容易就忘。在这次蚂蚁金服的电话面试里面认识到了自己很多不足的地方吧。虽然在阿里内推后的人才观的问题里面我觉得自己做的还是很不错的,但是在真正的编程题里面,才发现自己的编程其实需要更加的提升。接下来就分析一下这次蚂蚁金服的电话面试的题目吧,其
Stella981 Stella981
3年前
Maven搭建SpringMVC+Hibernate项目详解
前言    今天复习一下SpringMVCHibernate的搭建,本来想着将SpringSecurity权限控制框架也映入其中的,但是发现内容太多了,SpringSecurity的就留在下一篇吧,这篇主要搭建SpringMVC4.1.4和Hibernate4.3.8,之前也打了好多SpringMVC的,这部分已经非常的熟悉了,毕竟业开发过
Wesley13 Wesley13
3年前
Java网络爬虫(十三)
先说点题外话吧,在我刚开始学习爬虫的时候,有一次一个学长给了我一个需求,让我把京东图书的相关信息抓取下来。恩,因为真的是刚开始学习爬虫,并且是用豆瓣练得手,抓取了大概500篇左右的影评吧,然后存放到了mysql中,当时觉得自己厉害的不行,于是轻松的接下了这个需求。。。然后信心满满的开始干活。。首先查看网页源代码。。。???我需要的东西源代码里面没有!!!
Wesley13 Wesley13
3年前
JAVA的思考01
人类一思考,上帝就发笑。但是人类不会因为上帝发笑就停止了思考,不是说命运在自己手里吗,那干脆让上帝去他妈的。好吧,那思考是什么?思考是因为我们人类有事情要解决,所以我们要考虑考虑......那么,开始我们的思考吧。 当小老板还是当大老板?首先,请原谅我问这么个貌似世俗的问题,我也知道钱不是万能的,但还是那句套话:没有钱是万万不
Stella981 Stella981
3年前
2018年蚂蚁金服前端一面总结(校招)
先简短的介绍一下我自己吧,我是一个前端学习者,虽然我基础知识也学了比较好,但是许久不用的知识就像流失的水,很容易就忘。在这次蚂蚁金服的电话面试里面认识到了自己很多不足的地方吧。虽然在阿里内推后的人才观的问题里面我觉得自己做的还是很不错的,但是在真正的编程题里面,才发现自己的编程其实需要更加的提升。接下来就分析一下这次蚂蚁金服的电话面试的题目吧,其
Wesley13 Wesley13
3年前
35岁以上的程序员们,后来都干什么去了?
摘要:对于多数程序员来说,40岁之前赚到别人60岁的钱是普遍目标,不过职业的进阶也印证着人生的进阶,所以何时开始思考未来的职业规划,都不算早。知乎上有个话题叫做“程序员的悲哀是什么?”,有个高赞回复直戳大多数程序员的命门:“最大的悲哀就是以为自己挣到了很多钱,其实根本不懂怎么挣钱,随着年龄的增长,工作瓶颈越来越多,越来越容易受到歧视,却不知
审配
审配
Lv1
你在我这里无法保存,因为你过于庞大,内存不足。
文章
4
粉丝
0
获赞
0