秦农旭
资料精简指南:在公众号对话框发送“py5用法”,即可获得5个10k字高级用法,10段代码,5张图片,9页文章,提高效率-英文翻译。 关键字: , , 地图, , , . 微信被封,自用OAJ电子期刊、科普文章、学术论文转为免费开放获取。
秦农旭 1
I.提高效率的5个高级用法-英文翻译(8k字)1
A.1 的 5 个高级用途
B. 匿名函数 4
材料(5h 字)8
秦农后记8
推特提高效率的5个进阶用法-英文翻译
原来的:
A的5个高级用途。
任何编程语言的高级功能通常只有通过广泛的使用经验才能发现。 例如,您正在编写一个复杂的项目,并在 上寻找某个问题的答案。 然后你突然发现了一个非常优雅的解决方案,它使用了一个你从来不知道存在的功能!
这种学习方式非常有趣:通过探索,通过偶然发现一些东西。
以下是 5 个高级功能以及如何使用它们。
功能
函数是一种较小的匿名函数——匿名意味着它实际上没有函数名。
函数通常使用 def 样式定义,但对于函数我们根本不命名。 这是因为函数的功能是执行某种简单的表达式或操作,而没有完全定义函数。
函数可以接受任意数量的参数,但表达式只能有一个。
x = a, b : a * b
打印(x(5, 6)) # 30
x = a : a*3 + 3
打印(x(3))#12
看看它是多么容易! 我们执行了一些简单的数学运算而没有定义整个函数。 这是使其成为干净、简单的编程语言的众多特性之一。
地图功能
Map 是一个内置函数,可以将函数应用于各种数据结构中的元素,例如列表或字典。 这是执行此类操作的一种非常干净且可读的方式。
定义(一):
一个*一个
x = 地图 (, [1, 4, 7])
打印(x) # [1, 16, 47]
定义 (a, b):
一个 * 乙
x = 地图 (, [1, 4, 7], [2, 5, 8])
打印(x) # [2, 20, 56]
看看上面的例子! 我们可以将函数应用于单个或多个列表。 事实上,您可以使用任何函数作为 map 函数的输入,只要它与您正在操作的序列的元素兼容即可。
功能
内置函数与 map 函数非常相似,它也将函数应用于序列结构(列表、元组、字典)。 两者之间的主要区别在于,只会返回应用函数返回 True 的元素。
详情请看下面的例子:
#我们的
= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
# 找出所有奇数
定义(数字):
如果 num % 2 == 0:
真的
别的:
错误的
= (, )
打印()
# = [2, 4, 6, 8, 10, 12, 14]
我们不仅将每个列表元素评估为 True 或 False,该函数还确保仅返回与 True 匹配的元素。 处理检查表达式和构建返回列表这两个步骤非常方便。
模块
该模块是一组用于处理迭代器的工具。 迭代器是一种可以在 for 循环语句(包括列表、元组和字典)中使用的数据类型。
使用模块中的函数可以执行许多通常需要多行函数和复杂列表理解的迭代器操作。 对于 的魔力,请参见以下示例:
从 *
# 简单的把两个列表变成一个列表
对于 izip([1, 2, 3], [ a , b , c ]) 中的 i:
打印我
# (一, 1)
# ( b , 2)
# (c, 3)
# 那个计数
#,。 这
# 一个非常适合您的列表旁边
# 对于和
for i in izip(count(1), [ Bob , Emily , Joe ]):
打印我
# (1, 鲍勃)
# (2, 艾米丽)
#(3,乔)
#那个那个
# 所有在 a 之后的输入
# 第一次为假。
定义 (x):
打印 : , x
(x > 5)
对于我在 (, [2, 4, 6, 8, 10, 12]) 中:
打印 : , 我
#:2
#:4
#:6
#:8
# : 10
# : 12
# 非常适合
# 其中相同或有
#
一 = ([1, 2, 1, 3, 2, 1, 2, 3, 4, 5])
对于 (a) 中的键、值:
打印(键,值),结束=)
# (1, [1, 1, 1])
# (2, [2, 2, 2])
# (3, [3, 3])
# (4, [4])
# (5, [5])
功能
函数是一种类似迭代器的函数,即它也可以用在 for 循环语句中。 这极大地简化了您的代码,并且与简单的 for 循环相比节省了大量内存。
例如,我们想要将 1 到 1000 之间的所有数字相加,以下代码块的第一部分向您展示了如何使用 for 循环来执行此计算。
如果列表很小,比如 1000 行,计算所需的内存就可以了。 但是如果列表很长,比如十亿个浮点数,这就会出问题。 使用这种 for 循环,内存中会有很多列表,但并不是每个人都有无限的 RAM 来存储这么多东西。 中的范围函数做同样的事情,它在内存中构建列表。
代码的第二部分显示使用函数对数字列表求和。 该函数仅在必要时创建元素并将它们存储在内存中,即一次一个。 这意味着如果你要创建数十亿个浮点数,你一次只能将它们存储在内存中! 2.x 中的函数用于构建列表。
上面的例子说明:如果要生成一个范围很大的列表,那么就需要用到函数。 如果您的内存有限,例如移动设备或边缘计算,这一点尤为重要。
也就是说,如果您想多次遍历列表,并且它足够小以适合内存,最好使用 for 循环或 2.x 中的范围函数。 因为函数和函数每次访问都会产生新的列表值,而2.x的范围函数是静态列表,整数已经放在内存中以便快速访问。
# (1) 使用for循环v
= 列表
对于范围内的我(1000):
.(i+1)
总计 = 总和()
# (2) 使用一个
定义 (n):
数,= 1,[]
而 num < n:
.(数)
数 += 1
总计 = 总和((1000))
# (3) 射程对比
总计 = 总和(范围(1000 + 1))
总计 = 总和((1000 + 1))
今天留言的主题是:文中的五个进阶用法,你用的多的是哪个? 留言内容(不少于15个字符)。
B. 匿名函数
支持匿名函数,其扩展的 BNF 表示法为 ::= "" [] ":" ,即参数序列:表达式。
这是定义函数的便捷方式。 如果把它翻译成一个众所周知的函数形式,它会是这样的:
定义 >():
也就是说,里面的函数是一个可以接收多个参数的函数,返回值是一个表达式。
它最大的优点是单行简洁,不需要函数命名和换行缩进。 不得不说,匿名函数有时候是非常有用的,比如下面会介绍的一些常用用法,所以受到很多人的推崇。
但是,匿名函数通常会使代码难以阅读,容易被滥用,并且只对其提供“禁用”的支持,因此有一些意见不推荐使用匿名函数。
事实上,父亲圭多·范属于“弃儿派”。 他甚至想将其删除(2005 年),但最终妥协了。
来源:post.jsp?=98196
这个由其他开发者贡献的特性(借用了lisp语言)已经存在了十几年,却被语言的创造者(兼首席设计师)否决了,最后奇迹般的活了下来,是不是觉得这个故事挺戏剧化的?
接下来,本文就来详细了解一下这个笨拙却又顽强的匿名函数!
1.如何使用?
函数通常与map, , 等函数结合使用。 这些函数的共同点是它们都可以接收其他函数作为参数。
例如下面的例子:
= [3, 1, 5, 4, 10]
# 所有元素加1,结果:[4, 2, 6, 5, 11]
列表(地图(:我+ 1,))
# 过滤小于10的元素,结果:[3, 1, 5, 4]
列表((:我10,))
# 元素累加,结果:33
(,j:i+j, , 10)
# 字典按值排序,结果:[('b', 1), ('a', 3), ('d', 4), ('c', 5)]
= {'a':3, 'b':1, 'c':5, 'd':4}
(.items, key=:item[1])
初学者可能会觉得代码看不懂,但只要记住“代码中的函数是一等公民”,知道一个函数可以作为另一个函数的参数或返回值,就很容易了了解。
比如map函数的例子,你可以这样理解:
= :i+1
列表(地图(,))
它甚至可以简化为一个普通函数:
定义 (i):
+1
列表(地图(,))
map函数的第一个参数是一个函数,第二个参数是一个可迭代对象。 第一个参数会迭代调用第二个参数中的元素,调用结果以迭代器的形式返回。
本例使用列表是为了方便一次性取出迭代器中的元素并直观显示。 在实际使用中,很可能是基于迭代器的。
从这些用法中,我们可以总结出函数的使用规则:
它出现在预期使用功能的地方
· 适合实现简单的功能
· 一次性使用,不可重复使用
· 一般不独立使用,总是作为其他函数的一部分
2. 有什么问题?
从上面的用法可以看出,使用该函数的代码比较紧凑简洁,所以有人说它体现了“”的优雅思想。 但是功能上有什么缺陷吗?
有! 目前的函数有一个最大的问题,就是只支持单行表达式,无法实现丰富的功能,比如创建函数时不能使用(),if-else的判断条件不能使用,不能使用try-的异常捕获。 机制等,这极大地限制了它的能力,导致它被称为“残疾人”。
从技术实现的角度来看,这个问题可以通过语法层面的设计来解决。
在当年的邮件群讨论中,有人提出了一些解决方案,比如这封邮件:
来源:
它提出了一个支持这样写的args::suite的想法:
ss = (seq, key=(::
尝试:(x)
:))
不过,圭多很快否定了这个想法。
他写了一篇文章《不只是》作为回应:
基本观点是:不能仅仅为了解决一个问题/实现某种功能而引入一个缺少“”的语言设计。
那么,Guido 为什么会认为这是一个糟糕的设计呢? 我试着总结一下,原因是:
这里凭空引入了双冒号“::”,但它与切片语法中的“::”完全不同,它的用法也与C++/Perl中的作用域运算符不同
即使不使用双冒号,使用其他符号(如单冒号)仍然是不可接受的,因为缩进的代码块将嵌入到表达式中。这与使用花括号和开始/结束关键字一样不可接受组语句 ( )
实现其他功能并不重要,这也会使解析器复杂化(需要区分是否有缩进和记录缩进级别),这似乎是一个大问题
总之,他认为简洁友好的用户体验更为重要。 如果简洁的语法不能满足需要,就应该写成命名函数的形式,而不是设计复杂的匿名函数。
3、Guido为什么要除名?
上面提到的多行语句(multi-)事件发生在2006年,我们看到了Guido为什么不想引入复杂的设计。 然而,早在2005年,Guido就曾想将其移除,而他对它的“厌恶”是“由来已久”的传统……
在短文《3000年的命运》中,Guido提出了移除、映射、和。 删除原因如下:
· 对于不熟悉 Lisp 或
很多人误以为匿名函数可以做嵌套函数做不到的事情,其实没有区别; 存在会造成不必要的选择,减少选择可以简化思维
, map and 之后,不需要再写简短的局部函数
回顾上一篇我们总结的4条使用规则,可以发现它和几个高阶函数(可以接收其他函数作为参数的函数)有着很强的“寄生关系”,如果能去掉它们,就有确实是没有独立存在的意义。
那么,为什么 Guido 认为应该删除那些高阶函数呢? 主要原因是:
可以用更清晰的列表理解或生成器表达式代替,例如 (P,S) 可以写成 [x for x in S if P(x)],map(F, S) 可以写成 [F(x ) 对于 S 中的 x]
· 至于,他说这是最烦人的,除了少数使用+和*的用法,其他时候总是要拿出笔和纸画图才能搞清楚。除了显式写循环,他还针对多种用途提出了多种替代方案,包括引入新的 any 和 all 函数
总的来说,Guido 的想法与《The Zen of》中的这篇文章不谋而合:There be one-and only one-way to do it。
但回到现实,出于照顾一些人的习惯和兼容性的考虑,圭多保守地放弃了“清理异端”的计划。 因此,他才得以逃脱至高无上的独裁者之手。 直到一年后,它试图兴风作浪(多行表达),却遭到残酷镇压。 我仿佛听到了Guido内心的OS:我想删东西的时候,你百般阻挠,现在你又想加东西,哼,不行! ...
哈哈,开玩笑的。 Guido 的所有决定都反映了他的设计美学、独立的逻辑连贯性以及对社区声音的权衡。 对于,我很赞同他的观点,通过回溯语法发展史,我觉得自己对语法语言的理解更加丰富了。 不知道你有没有同感?
猫发起读者讨论,谈谈你的看法?特色讨论内容
°宅家式的巧手小姐姐~:高阶函数是一把双刃剑。 使用高阶函数(不损失甚至提高运行效率)可以获得非常极致和无限的接口抽象能力,但巨大的缺点是局部代码非常容易变成“小组合”。 在函数接口的设计上(刻意的,甚至不惜一切代价),避免了高阶函数的使用,削弱了很多函数和数据结构,甚至在极端情况下失去了表达能力,但是带来的好处是非常明显地。 很容易发现,大部分情况下的代码都非常简洁(除非你特意提到一些在实践中几乎不可能出现的情况),而且几乎没有什么用处。 此外,派生文法族也为.的语法简洁增添了妙笔,进一步弱化了. 因此,我认为选择强硬态度拒绝扩张是明智的。
°王楠:我经常用偏函数,比.好用不知道有没有更好的写法
°作者:揭秘:1.了解它的输入参数和返回值2. 换成普通函数
len(x) beats x.len,内置函数角度的设计思路 2.编程语言问题:什么时候借用,什么时候创建? 3.为什么要保留外显自我? 4、为什么要用缩进来划分代码块?
----------------------
材料(5h 字)
2.原创:为什么豌豆花爸爸不喜欢匿名函数? . [EB/OL],猫,, 2020-09-20-Sun. v 访问日期:2020-09-22-星期二。
X。 秦隆基。 西方哲学与人工智能,计算机; 人工智能达特茅斯暑期研究项目提案(1955年8月31日)中英双语版; 人工智能研究现状及教育应用; 计算机操作系统的演变、系谱和产品开发历史; 数据科学与大数据技术概论; 文本数据的可追溯性和简化。 [EB/OL], 数据简化(官号), , , 2017-06-06.
-结尾-
免责声明:公共媒体素材来源可追溯、可监督。 这个数字不代表任何倾向,也不代表对自己的观点或言论的认可。
秦农八
如果没有数学理论支撑的科学认知,只有语言思维才能概括自然和社会现象,就会止于泛泛而肤浅的语言思辨。 数学认知和数据技术随处可见,光有文化教育和专业工作者是不够的。 借助数据相关的数学与科学、算法与程序、资源与化简、机构与活动、政策与新闻,“数据化简”公众号旨在帮助大众从思维方式走近数据的殿堂。 数据简化公众号不持有任何倾向,只提供大家的学术观点; 倡导“理性思考,独立精神”,关注学者、学术界、学术界的发展与进步,不定期向您推荐优秀的人类学者和其他学者。 文章; 欢迎大家分享、投稿、欣赏、支持科普~
数据简化社区相册30篇。其中数据简化论文30篇:
《数据化繁为简》数据技术科普
下载PDF后感谢支持