1. 滚雪球学Python第四季开启,一需三吃,Python 函数式编程初识,面向过程,面向对象,函数式

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"滚雪球学 Python 第四轮,这一番我们要学习点有难度的了,因此,橡皮擦将降低阅读与理解难度,尽量采用大白话为你铺垫。","attrs":{}}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"写在前面","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"这一轮的学习,非常偏理论,因为涉及的一些概念也是借鉴的其它编程语言的风格,而且实际落地中存在部分争议","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"不过多学一点,总是没有坏处的。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"滚雪球学 Python 第四轮,主要学习函数式编程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本系列文章每篇 3000 字左右(包含代码),所以放心享用,不会增大每日学习强度滴","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"滚雪球历史系列,已完成 3 个专栏,更新中 1 个专栏,即第三轮学习更新中,目前到 21 篇~,由于第三轮是项目实践,学 Django 去,所以第四轮概念类同步开启。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://blog.csdn.net/hihell/category_10573584.html","title":"","type":null},"content":[{"type":"text","text":"滚雪球学 Python(完结)","attrs":{}}]}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://blog.csdn.net/hihell/category_10763952.html","title":"","type":null},"content":[{"type":"text","text":"滚雪球学 Python 第二轮(完结)","attrs":{}}]}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://blog.csdn.net/hihell/category_10901284.html","title":"","type":null},"content":[{"type":"text","text":"滚雪球学 Python 第三轮(更新中)","attrs":{}}]}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https://blog.csdn.net/hihell/category_10656235.html","title":"","type":null},"content":[{"type":"text","text":"滚雪球学 Python 番外篇(完结)","attrs":{}}]}]}]}],"attrs":{}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Python 函数式编程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Python 不是纯粹的函数式语言,但你可以使用 Python 进行函数式编程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"典型的听君一席话,如听一席话,说白了就是 Python 具备函数式编程的特性,","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"so,可以借用函数式语言的设计模式和编程技术,把代码写成函数式编程的样子","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一般此时我会吹嘘一下,函数式代码比较","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"简洁和优雅","attrs":{}},{"type":"text","text":"~","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"好了,已经吹嘘完了。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以上内容都属于讲道理的范围,那在 Python 中有哪些适合函数式编程的技能点","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"又有哪些不适的点呢?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下述 2 点先有个印象就行","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"优点:生成器表达式,这个后面咱会反复提及,具备很多高阶函数,例如 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"reduce","attrs":{}}],"attrs":{}},{"type":"text","text":",","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"map","attrs":{}}],"attrs":{}},{"type":"text","text":",","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"filter","attrs":{}}],"attrs":{}},{"type":"text","text":" 三巨头。","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"缺点:没有无限递归等~","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果你去百度 “什么是函数式编程”,很多地方会给出答案","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"函数式编程:允许把函数本身作为参数传入另一个函数,还允许返回一个函数。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有道理!","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其实函数式编程就是","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"在函数中定义表达式和实现表达式的求职","attrs":{}},{"type":"text","text":",说白了就是用函数落地你的代码。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"看起来好像是废话,它还有一个补充的说明,在函数式编程中要避免状态变化和使用可变对象。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"避免状态变化","attrs":{}},{"type":"text","text":" 重点要关注赋值语句以及它如何改变状态,因此你在函数式编程中,不会看到 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"global","attrs":{}}],"attrs":{}},{"type":"text","text":",","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"nolocal","attrs":{}}],"attrs":{}},{"type":"text","text":" 等内容。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"同一案例的不同写法,展示函数式编程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"概念与原理都是比较抽象的,咱还是少说概念,这个留到未来你自己总结就好,直接展示源码差异。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"计算 1~100 内,计算 5 与 7 的倍数之和","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"面向过程的写法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"count = 0\nfor num in range(1, 101):\n if num % 5 == 0 or num % 7 == 0:\n count += num\n\nprint(count)\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在面向过程的写法中,逻辑都是从上向下进行运行的,例如 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"num","attrs":{}}],"attrs":{}},{"type":"text","text":" 从 1 数到 100,如果对 5 或者对 7 取余等于 0,那表示可以整除,然后将 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"count","attrs":{}}],"attrs":{}},{"type":"text","text":" 与对应的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"num","attrs":{}}],"attrs":{}},{"type":"text","text":" 相加,得到最后的余数。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"这种思路是纯面向过程的写法,一般我们学习编程时,首先学会的就是该类写法。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"面向对象的写法","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"该类写法有两种,一种是使用 Python 内置的列表实现,一种是自己声明一个类来实现。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"第一种写法:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"count = list()\nfor num in range(1, 101):\n if num % 5 == 0 or num % 7 == 0:\n count.append(num)\n\nprint(sum(count))\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在上述写法中,变量 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"count","attrs":{}}],"attrs":{}},{"type":"text","text":" 声明一个 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"list","attrs":{}}],"attrs":{}},{"type":"text","text":",即列表对象,但是整理看起来还是有些过程式编程语言的影子。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"例如最后的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"sum(count)","attrs":{}}],"attrs":{}},{"type":"text","text":" 的使用就有些奇怪,看不出来面向对象的影子。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接下来,咱们创建一个自定义的类,进行逻辑实现。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"class My_List_Sum(list):\n def sum(self):\n count = 0\n for n in self:\n count += n\n\n return count\n\n\ncount = My_List_Sum()\nfor num in range(1, 101):\n if num % 5 == 0 or num % 7 == 0:\n count.append(num)\n\nprint(count.sum())\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上述代码,我们自行实现了一个 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"My_List_Sum","attrs":{}}],"attrs":{}},{"type":"text","text":" 类,让它继承自 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"list","attrs":{}}],"attrs":{}},{"type":"text","text":",此时你应该明白,","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"list","attrs":{}}],"attrs":{}},{"type":"text","text":" 就是一个类名,然后在类的内部实现了 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"sum","attrs":{}}],"attrs":{}},{"type":"text","text":" 方法,再调用该对象的 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"sum","attrs":{}}],"attrs":{}},{"type":"text","text":" 方法,完美的应用了面向对象的写法。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"接下来进入正题,函数式编程的落地实现","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在正式编写前,需要回忆一些基础知识,例如 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"lambda","attrs":{}}],"attrs":{}},{"type":"text","text":" 表达式以及列表相加。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"判断一个数字是 5 或者 7 的倍数, ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"lambda","attrs":{}}],"attrs":{}},{"type":"text","text":" 写法如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"multiple = lambda x: x % 5 == 0 or x % 7 == 0\na = multiple(3) # False\nb = multiple(5) # True\nc = multiple(7) # False\nprint(a, b, c)\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"列表相加代码如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"print([1]+[2]) # [1,2]\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有了上述内容,可以编写一个递归函数,实现对应的逻辑,代码的说明已经添加到注释中。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"def tool(n: int, end: int, filter_func) -> list:\n \"\"\"返回一个筛选之后的列表\n :param n: 起始值\n :param end: 终止值\n :param filter_func: 判断表达式\n \"\"\"\n # 如果到达上限,直接返回空列表\n if n == end: return []\n # 如果满足过滤条件,返回该值与下一个值组成的列表\n if filter_func(n):\n return [n] + tool(n + 1, end, filter_func)\n else:\n # 不满足过滤条件,直接返回下一个值\n return tool(n + 1, end, filter_func)\n\n\n# 测试代码\nret = tool(1, 101, lambda x: x % 5 == 0 or x % 7 == 0)\nprint(ret)\nprint(sum(ret))\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上述代码即为求和的函数式实现,其中部分逻辑如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"给定初始值与上限值,当迭代的值等于上限值时,返回空列表,即运行结束;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"传入一个判断条件,本案例中为一个 lambda 表达式,用于判断 5 和 7 的倍数;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","text":"当满足条件时,进行的是相加+迭代工作,当不满足条件时,直接进入下一次迭代。","attrs":{}}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"当然还有一种函数式编程的写法,代码如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"print(sum(n for n in range(1, 101) if n % 5 == 0 or n % 7 == 0))\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"这里用到的生成器后文会进行说明。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"Python 函数式编程的特点","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在 Python 中,函数即对象,例如声明一个函数之后,你可以调用其属性。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下述代码展示的即为函数对象的属性,其余内容可以自行再做测试。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"def my_func(var1, var2, **kw):\n return var1 + var2\n\n\nprint(type(my_func)) # \nprint(my_func.__code__)\nprint(my_func.__dict__)\nprint(my_func.__code__.co_code)\nprint(my_func.__code__.co_filename)\nprint(my_func.__code__.co_argcount)\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"函数式编程之所以高效,其中一个很重要的原因就是延迟计算,也叫做惰性求值,这些在后面都将逐步展开,现在依旧是接收一下印象概念。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"正是因为函数即对象,所有才有本文开篇那段对函数式编程的定义。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"函数可以使用其它函数作为参数,或者返回另一个函数,所以在实际编码过程中,我们将会把函数转换成其它代码中的 “对象”,从而实现函数式编程。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接下来咱们要接触一下 Python 中的纯函数概念以及应用。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"纯函数","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"纯函数是一个概念,也就是让函数不会对函数外作用域产生影响,即作用域为本地。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"说简单点,就是在函数内部避免赋值操作,当然类似 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"global","attrs":{}}],"attrs":{}},{"type":"text","text":" 等关键字也避免使用。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"针对此,","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"lambda","attrs":{}}],"attrs":{}},{"type":"text","text":" 表达式就是纯函数。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"首先查看一个纯函数的例子:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"def my_func(num: int) -> int:\n return num * 100\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上述代码中函数的返回值仅与 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"num","attrs":{}}],"attrs":{}},{"type":"text","text":" 有关,满足下面两个条件:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"没有改变全局变量;","attrs":{}}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"没有更新可变数据结构,例如列表,字典。","attrs":{}}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接触完毕纯函数概念之后,下面了解一下函数作为对象的落地应用。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在 Python 中声明一个类,默认会携带部分内置的方法,例如:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"from typing import Callable\n\n\n# 声明一个类,该类无意义,仅测试使用\nclass Ext:\n # 传入的函数,可携带1~2个参数\n def __init__(self, test_demo: Callable[[int], int]) -> None:\n self.func = test_demo\n\n # 返回结果扩大2倍\n def __call__(self, arg: int) -> int:\n return self.func(arg) * 2\n\n\ndef one_func(var):\n return var + 1\n\n\ndef two_func(var):\n return var * 3\n\n\ndef three_func(var):\n return var\n\n\na = Ext(one_func)\nprint(a(3)) # 8\n\nb = Ext(two_func)\nprint(b(3)) # 18\n\nc = Ext(three_func)\nprint(c(3)) # 6\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上述代码使用了一个新的模块 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"typing","attrs":{}}],"attrs":{}},{"type":"text","text":",该模块是 Python 3.5 之后新增的模块,主要为 Python 提供静态类型的检查 。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本案例中导入的是回调函数 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"Callable","attrs":{}}],"attrs":{}},{"type":"text","text":",格式如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"Callable[[Arg1Type, Arg2Type],ReturnType]\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中内部中括号 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"Arg1Type","attrs":{}}],"attrs":{}},{"type":"text","text":" 是参数类型,","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"ReturnType","attrs":{}}],"attrs":{}},{"type":"text","text":" 为返回值类型。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"上述三个函数的签名都与 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"Callable","attrs":{}}],"attrs":{}},{"type":"text","text":" 定义的一致,所以都可以作为 ","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"test_demo","attrs":{}}],"attrs":{}},{"type":"text","text":" 参数的值去传递。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"写在后面","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"滚雪球学Python第四轮,非常理论的一个系列,跟上大部队的节奏,走起来,有任何问题,都可以在评论区留言,一般1小时之内都能解决。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"今天是持续写作的第 213 / 365 天。可以关注点赞评论收藏。","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"更多精彩","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"太多了,去主页看吧。","attrs":{}}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章