前一个帖子介绍了 Python 作为“面向对象编程”(以下简称 OOP)语言的特点,今天来聊一聊 Python 作为“函数式编程”(以下简称 FP)语言的特点。考虑到本系列面向的是 Python 的门外汉或刚入门的新手,故本文仅介绍若干浅显的 FP 特性。
★什么是函数式编程
说实话,“函数式编程语言”是一个很大的话题。由于篇幅有限,本文不可能对这个话题做全面介绍。俺干脆偷一下懒,只简单说说。
从字面上看,所谓的函数式编程,就是以“函数”为中心的“编程范式”。估计有同学又会问了,啥是“编程范式”捏?哎呦,这又是一个很大的话题。通俗来讲,“编程范式”就是指编程的套路。比方说大家很熟悉的 OOP,就是一种“编程范式”。FP 跟 OOP 一样,都是一种编程的套路。做个简单类比:OOP 以“对象/类”作为程序设计的核心,而 FP 以“函数”作为程序设计的核心。
★FP的特点
既然说到 FP,自然要稍微说一下 FP 的特色。
◇函数很牛X
刚才说了,FP 是以函数为中心。既然如此,在支持 FP 的语言中,函数的功能自然十分牛X。通俗地说,OOP 语言中,类/对象能干的事情,FP 语言中的函数也能干。下面做一些对比,以加深大伙儿的印象。
OOP 中,对象可以互相赋值;FP 中,函数可以互相赋值。
OOP 中,对象可以作为函数的参数/返回值,FP 中,函数可以作为函数的参数/返回值。
某些 OOP 中,类可以嵌套定义;FP 中,函数可以嵌套定义。
某些 OOP 中,可以有匿名类;FP 中,可以有匿名函数。
◇避免副作用
在 FP 中,特别强调函数不要有“副作用”(洋文叫“side effect”)。没有副作用的函数,又称之为纯函数(pure function)。其输出完全依赖于输入。换句话说,只要输入一样,输出就一样。
要成为纯函数,函数内部不能读写函数外部变量、不能有设备 I/O(比如读写文件)......
无副作用是 FP 的重要特性。FP的很多优点来自于此特性。
◇避免控制流
在 FP 中,尽量避免用控制流语句(循环语句、判断语句)。对于控制流语句,FP 有另外的替代方式。比如:常用递归或高阶函数来替代循环。如此一来,FP 的代码会显得更简洁,更可读。
◇多态
大部分支持 FP 的语言,也都支持多态。函数参数支持多态化,便可实现非常灵活的功能。
说了这么多,不知道大伙儿明白了没?还是没整明白的同学,请看维基百科的英文词条(中文词条太简单,看不明白滴)。
洋文实在看不下去吗?那不妨看看 IT 大牛 Joel 写的《你的编程语言能这样做吗?》(中文版在“这里”)。此文以 JavaScript 来阐述 FP 的妙处。
★FP 的优点
再稍微说一下 FP 的好处,以强化大伙儿学习的动力。
◇模块化
在 FP 的思想中,函数最好是“纯”的,而且最好只完成“单一”的任务。在这种指导思想下,函数的模块化程度自然就高。
◇可复用性
模块化程度高,直接的好处就是可复用性好。
◇可读性
刚才说了,FP 的思想强调函数又纯又小。这样的函数,代码的可读性自然好,修改起来也方便。
◇易于调试
前面提到了纯函数。如果你的程序中大部分函数都是纯函数,则调试 Bug 会容易很多。像 OOP 中,类的多个成员函数都可以修改类的成员变量,有时候会导致调试极其困难。而纯函数没有此问题。
另外,多线程是调试的一大噩梦。当年俺还专门写过帖子,介绍 C++ 多线程的注意事项(在“这里”)。而纯函数由于没有副作用,不必担心各种“互斥”、“死锁”等问题。
◇易于测试
除了易于调试,纯函数的输出仅仅依赖于输入,这一特点注定了它很容易进行单元测试。
◇适合并行
在 FP 中,由于纯函数无副作用,很适合编写并行处理的代码。最典型并且在工业界获得巨大成功的例子就是 Erlang。
◇其它
当然啦,FP 的好处远不止上述这些(比如还有:利于形式化证明)。限于篇幅,俺就不展开了。
★Python 的函数语法
Python 中,常见的函数定义和函数调用,想必各位都晓得了。下面说几种不太常见的,且跟 FP 有关的语法。
◇函数赋值
Python 可以把函数直接赋值给一个变量。举例如下:
def square(n) : # 这是一个计算平方的小函数,后面会反复用它举例 return n ** 2 f = square # 此处赋值给变量 f f(10) # 此处返回100。注意:对该变量使用小括号,等同于调用函数
◇匿名定义
Python 可以用 lambda 关键字定义【单行】的匿名函数。套用刚才的例子
square = lambda x : x**2 # 定义一个单参数的匿名函数,并把该函数赋值给变量 square(10) # 此处返回 100
◇嵌套定义
Python 支持函数的嵌套定义(请看如下例子)。这种语法,在“闭包”中经常出现(后面会具体介绍“闭包”)。
def outer() : # 外层函数 s = "hello" def inner() : # 内层函数 print(s) # 此处引用的是外层作用域的变量 inner() # 输出 hello s = "world" inner() # 输出 world
★和 FP 相关的内置函数
Python 内置了一大坨用于 FP 的函数,以方便程序猿写出简洁的代码。在接下去聊之前,俺有必要先介绍其中的2个。
◇map(func, iter)
为了省事,俺只介绍2参数的 map(正宗的 map 支持 N 参数)。
参数 func 是个函数,参数 iter 是个迭代器(也可以理解为集合)
map() 会把 iter 的每个元素传给 func,并把每次调用的结果保存到一个 list 中,然后返回此 list。
举例:
挨个计算整数 list 的平方:
map(square, [1, 2, 3]) # 返回 [1, 4, 9]
◇filter(func, iter)
参数含义同 map
filter() 会把 iter 的每个元素传给 func,如果 func 返回结果为 True,就把元素保存在一个 list 中,最后返回此 list。
举例:
要过滤出所有奇数,代码如下:
def odd(n) : return (n%2) == 1 filter(odd, [1, 2, 3]) # 返回[1, 3]
此处可以用上 lambda,把代码简化为一行:
filter(lambda n: (n%2)==1, lst)
★消除控制流
为了让大伙儿更深刻体会 FP 风格同传统风格的差别,俺把刚才两个例子组合一下——要求返回整数 list 中所有奇数的平方。
传统的写法(有控制流):
def func1(old_lst) : new_lst = [] for n in old_lst : if odd(n) : new_lst.append(square(n)) return new_lst
FP 的写法(无控制流):
def func2(lst) : return map(square, filter(odd, lst))
怎么样?是不是更简洁?连 for / if 这两个关键字都不需要了。
★List Comprehension
这个洋文比较难翻译。有人叫做“列表推导”,也有人称为“列表展开”或“列表解析”。(俺比较喜欢头一个翻译——不禁让人联想到“推倒”:)
在 Python 中,这是一个很好吃的语法糖——可以让你写出很简洁、很优雅的代码。
举例1:
还拿刚才过滤奇数的例子。
filter(lambda n: (n%2)==1, lst)
上述写法可以等价替换为列表推导:
[n for n in lst if (n%2)==1]
举例2:
再来一个稍微复杂的例子。假设有两个整数 list,分别存储矩形的宽度和高度。现在想把所有的宽度和高度进行两两组合,把大于 10 的面积打印出来。
传统的写法(2层循环,4行代码)
for w in width : for h in height : if w*h > 10 : print(w*h)
FP 的写法(无循环,1行代码,多精致啊)
print( [w*h for w in width for h in height if w*h > 10] )
除了列表推导,Python 中还有字典推导、集合推导等等。为了省点口水,暂且打住。
★闭包
闭包,洋文叫“closure”,解释在“这里”。它是 FP 的常见手法。那闭包到底有啥用捏?俺举一个微积分中,函数求导的例子。(不懂微积分或者对高数有心理阴影的同学,别担心,请把注意力集中在代码上)
def d(f) : def calc(x) : dx = 0.000001 # 表示无穷小的Δx return (f(x+dx) - f(x)) / dx # 计算斜率。注意,此处引用了外层作用域的变量 f return calc # 此处用函数作为返回值(也就是函数 f 的导数)
现在,假设要计算二次函数 f(x) = x2 + x + 1 的导数,只需如下代码:
f = lambda x : x**2 + x + 1 # 先把二次函数用代码表达出来 f1 = d(f) # 这个f1 就是 f 的一阶导数啦。注意,导数依然是个函数
有了一阶导数,就可以很容易地计算该函数在某点的斜率
比如要计算 x=3 的斜率,只需:
f1(3)
如果要想得到二阶导数(导数的导数),只需依样画葫芦(瞧这代码写得多优雅)
f2 = d(f1)
看到这里,大伙儿不妨设想一下:如果不用 FP,改用 OOP,上述需求该如何实现?俺觉得吧,用 OOP 来求导,这代码写起来多半是又丑又臭。
★结尾
今天聊了不少 FP 的语法特性,可惜还是没聊完。由于俺比较懒,而且怕写得太长没人看,所以一些高级话题(比如:迭代器、生成器、等),今天就不介绍了。假如列位看官对那些玩意儿感兴趣,再抽空单独写一帖。
回到本系列的目录
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想和本文原始地址:
https://program-think.blogspot.com/2012/02/why-choose-python-4-fp.html
有人打算整理一下关于编程随想下落的线索吗?(从正反两个方面来举证)
好多怪事都是人为的,第一在搞邪术如祭鬼封神献祭打call,其次是搞种姓的事,
这帮东西用老外的名义来操控挑拨玩弄这个那个,这也是奇葩的,和叫东土人找阿三还是鬼子去表达册封封禅这皇帝是东土的皇帝一样奇葩, ......
ym蜀人都不愿放手的东西如屁眼套路,幼女,献祭,老单和最高神位是有原因的,很值得去研究的 ......
即使博主能活着出狱,若要看到他更新六四系列,那也是在天朝发生了民主化之后,共产党不再有能力镇压批评者之时。
就算哪天中国情报部门不经司法程序,直接把人暗杀了,我也不会觉得奇怪。
https://www.zaobao.com.sg/realtime/china/story20241226-5649612
https://www.youtube.com/watch?v=ozVq_04XMro
如果出现了自杀场景,多半是政府秘密下令处决,并伪装成了自杀。
来自Firsthack的评论
而且,二审的发改率(发回重审+改判)是一个考核政绩的指标,高层认为这个数字越低说明冤假错案越少,然后下面就越容易升官。 ......
原神UID:310221197410210025
互动热线: 13524626271 上海移动
学历: 硕士
生日: 19741021
身高: 165 ......
周欣身份证310105197106042383
户籍地址 :上海市闵行区吴中路429弄15号501室
同户人 :薛军,男,310106196903180414,1969年03月18日; ......
希望各大媒体都报道这几个名字:审判长周欣,审判员:凌莉、须梅华。
家属贝震颖推特号:Birds_b_r_32309
多谢分享“中药注射剂”等国产医疗行业的相关丑闻。
另外,关于疫情期间的乱象,俺整理了一篇:
《每周转载:白纸抗议年的“动态清零”灾难(网文14篇,多图)》
多年前不记得在哪篇博文的评论区和博主讨论叙利亚的命运,当时叙利亚的局势还未尘埃落定。可惜博主现在大牢内,看不到。
这次叙利亚的民主转型发生在俄国陷入战争的泥沼的背景下。 ......
这个是个邪术,第一个是给上面看(不知什么鬼),其次的就真的会指导目标去实际地去做这么些的犯罪邪恶,侵犯幼女的情节是经常频繁重复地出现地,和侵犯女性,还有就是生命 ......
估计到最高法院也没戏,可能会以9:0判决禁抖音。
欢迎提出不同观点。
你提到的是这二者之间的差异,俺也同意这些差异确实存在。
但是,俺要开始说但是了。从本文,咱们也可以讨论这二者之间的共性,至少包含以下方面: ......
玩邪术玩出个什么结果好歹给公开一下,拼命玩邪术还一声不吭,很危险的,要分享分享,劳资帮你们来研究研究
劳资相信这帮东西是能穿越时空的,现在是2019年的ZS,时空被改变穿越了。穿越时空的套路。这帮东西几千年都一个屌样,来几个十级地震都不会任何改变。 ......
现在的两党是争先比谁对华更强硬,已经通过的制裁法案不会松绑,已经加的关税也不会再降,否则就会被在野党骂成“通敌叛国”。
明年1月19日之前,抖音会被禁。
每天上网的好多人都在聊政治呢,难道你要把每一个聊政治的人都抓起来判刑?那也没用。因为年轻人越来越倾向于认为政治制度才是造成他们被困在他那个阶层的重要原因。 ......
这个博客对于政府的批评,大部分都是有理有据。你要是觉得哪里不对,可以反驳博主嘛。判7年是究竟有多心虚? ......
以色列做任何事,都是美国包容范围,和美国民意无关(甚至抗议都无效)。台湾今后也会差不多。
国会一旦提出新的关于台湾的法案,无论是军售,亦或是改善台湾的国际地位等等,都很容易造成近乎【全票通过】。 ......
然而,公报本身只是行政政府的声明,其效力不如法律。 ......
然而,现在的人们,对于不能证明是否为间谍的走线客,也不太宽容。估计人们会支持一律用“有间谍嫌疑”之类的理由,实行一律驱逐的政策。 ......
但是,有些两党已经形成共识的事,其实是不受太大影响的。例如:把台湾武装成以色列。
所以我估计,中共在川普第2任期的前2年之内,就会对台湾动手。
因为这次GOP在众院优势实在太小了,稍微发生一点差错,钟摆效应会让民主党夺回之。
参议院不好说。如果连参议院也丢了,那川普后两年就可能成为跛脚总统,啥事都干不了。
不服者会选择:明着顺从,其实背地里跟共产党对着干。
众议院估计是个险胜。
上次共和党在众议院也是微弱优势,导致议长难产。
这次应该不会难产,因为有川普在,他只要在台上喊几句,就可以让任何一个人当议长,其它共和党议员不会阻挠。 ......
根据NBC新闻:
https://www.nbcnews.com/politics/immigration/trump-may-deport-hundreds-thousands-migrants-biden-allowed-legally-ent-rcna179357 ......
就是先用民调测量其它选举,比如某个地方议员的选举,然后和民调进行对比,看女性候选人是否严重吃亏,是否和民调严重不符。
如果发生该现象,那得出的差额数字,就是该地隐藏的“害羞的性别歧视者”的百分比。 ......
因为“害羞的川粉”等受访者不诚实回答问题的现象,仍然使得民调失真。
贺锦丽连普选票都输了。
你民主党输得这么惨,总不能反思为啥没去迎合那些“黑命贵零元购”之类的种族主义口号吧?反思搞种族平权搞得过头了?
......
美国出了个川贼东。抗战前没做到【攘外必先安内】,这下麻烦大了。
恭喜美国又创造了世界纪录。
估计是川普险胜。
因为大法官的任命是由总统和参议院共同决定,如果总统是川普,那他就会提名非常有争议的保守派大法官。
......
......
川普险胜29%
其它情况基本可以排除。
我的意见是把第13问算成川普+1,他不是国家英雄,但很多人粉川。
然后把第12问算成贺锦丽+1,因为川黑人数太多了,这些人的票会投给贺锦丽。
◇以【川普】为中心展开
◇极化现象
这个没变
......
有一天,我们或许能用类似的思路,找到这些人的把柄,从而有利于清算工作。
只不过在现在,我这种平民可能不够使用AI干这些事的资格。
围观的人多的时候,可以顺便大声质疑警察的做法有无法律依据,给警察造成压力。
即便不说话,而只是去围观,也能造成一点压力。而且围观的风险很低。 ......
我判断他们这些操作主要是为了吓唬人,比如登记这个操作,是为了方便以后搞大清洗时候用的(但概率很小,只有像文革、战争那种特殊时期才会用到)。不过只要敢反抗的人足够多,他们的策略就不会起到太多效果。 ......
对于本案中,已经违反了现有法律的人,比如越权的检察官颜蔚、枉法的董玮、须梅华等人,如果中共已经对其违法行为做出一次处罚,那肯定还不够。到清算的时候,还要【再算一次】,以迫害罪重新起诉之。 ......
防范清算的唯一办法,就是做事的时候要对得起自己的良心;不然的话,光靠威胁那些想要清算你们的人是没用滴。你们抓不完的。
上次一经施压,线索就出来了(当然,威慑的价值是表示反对意见)
至少“RXH屏幕截图”这条线索来得蹊跷
总之,阮晓寰这人是一定要救的。
无论什么办法。哪怕是需要付出1条人命代价的办法都可以提出,因为有人愿意付出这个代价(但前提是这个办法必须靠谱,必须要有效救得了人才行)。
(然而,我认为这个说法是令人难以相信的。)
如果不去尝试改判这条路,就没办法向贝震颖等人证明中国政府的邪恶(远超她的想象)。
另外,我猜测她对反共的人可能还是蛮反感的,比方说,我猜她会认为是反共的人把她丈夫阮晓寰害惨了。 ......
......
找三四到局子里等劳资,怎么不找三四直接来找劳资,又不会发生什么,要找什么来兜这个底 ......
否则,大人物会很高兴,因为他们只需要把责任推给小人物就行了。然后,这个案子就会被某些小人物重判。
反正是零责任嘛,他们不会抵制上级的不合理命令。相反,我们恰好需要小人物【消极抗命】。 ......
陈吉宁是否对一审有责任,这个不好说。毕竟时间太短了。
不过,二审判决的责任很好推定。如果陈吉宁手下的法官维持原判,那我们将来就要抓陈吉宁问罪,无论他将来逃到哪个国家。 ......
一审宣判日2023年2月10日,陈吉宁于2022年10月28日上任。
这期间有大约4个月的时间,陈吉宁作为一把手,有4个月的时间可以影响一审判决。 ......
至于继任的陈吉宁,看二审表现。
办事的小人物也有出庭作证的义务,证明他们背后的老大是幕后黑手,以便减轻自己的罪责。 ......
刚才查到一个,上海政法委书记诸葛宇杰,这个也应该加入该清算的名单。
诸葛宇杰应当是其中一个有能力影响判决的人,如果本案遭到重判,那此人将也应该成为重点追究责任的对象。官职越高,越值得追究。 ......
https://x.com/Suyutong/status/1654760377165438977
@Suyutong ......
新二审法官无需为须梅华法官被撤换之前所羁押的这段时间负责;至于多出来的刑期嘛,超出多少,负责多少。
所以,我建议新二审法官把这个案子改判到3年半以下。 ......
根据法案,总统有权把期限再延长90天。也就是延期到2025年4月
阮晓寰案被多次延期,最近一次是延期至今年12月底审结。 ......
那么,如果能促成一两个有代表性的人物获释(比如编程随想博客博主阮晓寰),那样的话也有改善形象的作用,最终会对抖音将来的法庭判决有好处。 ......
如果按“无罪推定”原则,要求别人先去证明算法推荐有鬼,才肯处罚抖音,就太晚了(比方说,有一天台海战争爆发,年轻人从抖音上看到的到处都是有利于中共、不利于台湾的信息。那美国就会吃亏,援台阻力增加)。 ......
消息源:https://fox59.com/indiana-news/sen-mike-braun-said-interracial-marriage-ruling-should-be-left-to-states/ ......
这些都是在清算之日不能忘记的名字。
引用博主的 原话 :
......
根據我在上海看守所被關押的經歷,陳品霖的待遇很大概率是真的。
我在兩次共計65天的關押期間,沒有任何一次放風的經歷,而可見的放風場(我沒用過)僅是另一個頭頂有小天窗的封閉房間。僅管我是被單獨關押,我也從隔壁監室聽到過關押人數太多、不得不側身睡覺或者睡在地板上的說法 ......
夏巢川 Rei Xia @karasu_ga_warau
⚪️‼️《烏魯木齊中路》被捕導演 #陳品霖 的律師袁茂在9月26日發微博稱,陳品霖在看守所中遭到不人道對待,包括擁擠的睡覺條件,以及一個月才放一次風。在他們前往住所檢察官處反應情況時,檢察官也不見蹤影。 ......
对于阮晓寰案,上海法院要是再不放人,将进一步影响大批年轻人对于中国政治制度的看法。你判他刑,等于向年轻人自证是独裁制度,是专门靠镇压知识分子吃饭的。 ......
这个法律通过后,共产党的成年直系亲属将无法入境,也不能进行某些资产交易。
我建议被制裁对象的家属,赶紧促成释放阮晓寰博主等良心犯。这是你们自救的一个办法。在乌克兰战争期间,俄国寡头就是用类似的办法换取自己免于制裁的。 ......
推文出处 @Birds_b_r_32309
#编程随想 #阮晓寰
这一个多月,张冬硕律师来上海阅卷、会见了阮晓寰多次。基于一审的种种问题,阮晓寰本人、张律师和莫律师都分别于9月初上书高院,要求二审 依法 公开 开庭审理! ......
贝女士现在不锁推了,希望大家都去关注声援
总之,【环境差】就容易引发【癌症】。
这就是为啥我们希望阮晓寰二审获得【轻判】、减刑;降低得癌症的概率。
虽然民主党对非法移民确实更加友善,不过从长远看,我建议走线客对民主党也要留个心眼,同时重视共和党里面支持非法移民的少数派。
......
你可以谷歌搜索“阮晓寰”,这就是博主的真名。不过,本案恰巧还没有审理结束,他妻子@Birds_b_r_32309 在推特X上发声,要求大家多声援它,向当局施压,以便争取二审减刑。 ......
因为最近海地人有恐慌情绪,所以新闻转述了这个海地人所说的6年前车窗玻璃被砸那件事。
1938年,合法定居在德国的犹太人社区的玻璃也被砸碎,史称“水晶之夜”。
想必不久之后,华川粉会要求戴徽章,以便证明自己是合法移民,或者所谓的“良民”;至于那些不肯用这个徽章证明自己是良民的黄皮肤的人,自然就是非法移民了。 ......
关于斯普林菲尔德(Springfield)海地人吃猫的这个谣言,简单聊聊吧。
事情是这样的,起因是一个叫Erika Lee的大妈在脸书上贴了一篇文章,说我邻居丢了自己的宠物猫,怀疑是海地难民偷的。这个帖子被加上了“海地非法移民偷猫偷狗吃,大家赶紧看好宠物”的标题一传,一下子就爆了。 ......
以为非法移民不能投票就好惹是吧?
等到民主党大赦非法移民,2000万非法移民入籍美国获得投票权,你MAGA党就别想再选了。 ......
川普和MAGA大肆散布俄亥俄州Springfield海地人偷当地人宠物吃的谣言,煽动选民对移民的恐惧,反倒是让人关注到这个小城其实是移民帮助建设美国的典范。当地制造业外移造成了经济退化,在海地大地震后大量美国接纳的合法海地移民在此工作,小城重燃经济希望。 ......
美国的非法移民(比如走线客)可以抓住这个机会,帮海地合法移民发声、谴责川普。
记住:帮别人就是帮自己。
因为贺锦丽一旦对同情巴勒斯坦的这一方做出任何承诺,就会失掉另一方的选票(以色列这一方的金主就会放弃民主党,转而去帮川普),最终结果就是川普上台。 ......
当然了,拜登几乎没人粉他,大家当初都是因为讨厌川普才投给他的。
在拜登退选后,大家又去支持贺锦丽,才使她的民调变高。