资讯专栏INFORMATION COLUMN

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

Keagan / 2920人阅读

摘要:迭代器可以直接作用于循环的对象统称为可迭代对象。可以被函数调用并不断返回下一个值的对象称为迭代器。这个高阶函数,关键在于正确实现一个筛选函数。

又是日常唠嗑的一小段

真的是非常话唠的在下,日常给自己打点鸡血吧。
昨晚和老妈聊了一整晚,所以昨天并没有更新
然后因为很快要开始算个税减免的部分,对于温饱线的在下而言,其实减免的可能就只是奶茶钱吧。
工作的本质是赚钱,我也很想在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是惰性计算的数列,所以可以简洁的输出全体素数,自然数等。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42886.html

相关文章

  • 小李飞刀:做题第六弹!

    摘要:给定的字符串只含有小写英文字母,并且长度不超过。其他这题了,要重做看了其他的人的题解,使用的是无限逼近中位值的办法,理论基础应该是泰勒公式。万万没想到居然用到了泰勒公式手工执行了下算法,反而理解的更快,但是泰勒公式还得再复习下。 写在前面的话 今天持续做题ing,python有意思~今天的题有点虐心...兴许是我太笨了...会努力学习的!动态规划我来啦~ 开始做题 第一题 459. 重...

    BigNerdCoding 评论0 收藏0
  • 小李飞刀python我来做题啦

    摘要:好久不见最近都在忙年底的年会,还沉迷于学习统计学,教程还停留在基础语法。做题做题无论如何,数据结构还是很重要的,所以准备每天刷的题目啦。第一题移除元素给定一个数组和一个值,你需要原地移除所有数值等于的元素,返回移除后数组的新长度。 好久不见 最近都在忙年底的年会,还沉迷于学习统计学,python教程还停留在基础语法。但是仔细规划了下,还是要好好的瞄准目标前行。所以准备呢,实战走起来。 ...

    nevermind 评论0 收藏0
  • 小李飞刀python新年第一杀

    摘要:新年快乐年终于来了,突然觉得有点如释重负。大概年实在是太沉重了吧。年应该是要充满拼劲的一年希望可以成功转型自己喜欢的职业。开始认真学习了鸡血一波。建议类的属性名和实例属性名不要重复,否则类的属性名会覆盖。 新年快乐 2019年终于来了,突然觉得有点如释重负。大概2018年实在是太沉重了吧。2019年应该是要充满拼劲的一年!!!!希望可以成功转型自己喜欢的职业。 开始认真学习了 鸡血一波...

    glumes 评论0 收藏0
  • 小李飞刀python请与我一起愉快的玩耍吧!

    摘要:属性,可以函数的名字在代码运行期间动态增加功能的方式,称之为装饰器。本质上,就是一个返回函数的高阶函数。比如,定义一个能打印日志的。接受函数作为参数,要放置在函数定义处。一个完整的的代码如下记录的是传入的的值,位置在嵌套内或者带参数的如下。 又是一段叨叨 如果总是担心能不能做到的话,那就干脆不要做了。想做的事情还是一往无前的好,什么都不想,就努力冲冲冲吧! 装饰器 因为函数是一个对象。...

    FuisonDesign 评论0 收藏0
  • 小李飞刀:磨刀霍霍继续向python

    摘要:例如做累加,函数生成整数序列,函数转换成。因为不能重复,所以中没有重复的。创建,需要提供一个作为输入合集。重复元素在中自动被过滤。添加元素,重复添加无效果删除元素 写在前面的一点罗里吧嗦小唠叨昨晚的python看到了快12点吧,然后进度相对来说还算满意,只能说一点点推进,庆幸自己的大学还是一个比较认真的小码农,现在捡起来还算比较得心应手(pia飞自己,算法什么的还没到好吗!)好好学习呗...

    txgcwm 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<