什么是纯函数？
纯函数看起来像这样｡
我们有一个功能｡
因此, 我们不必像以前那样把所有这些功能的对象都放在一个盒子里, 而是把它看作一个简单的函数｡
假设我们给予它一个包含1, 2, 3的列表｡
如果我们把这个输入给这个函数, 我们期望对于一个纯函数来说, 这个输入会发生一些事情,
每次都产生同样的结果｡
所以我们把这个乘以2, 我们会得到2, 4和6｡
现在一个纯函数有两个规则｡
一个是给定相同的输入, 它将总是返回相同的输出｡
也就是说, 每次我们给予这个列表1, 2, 3, 我们就给了我们创建的函数｡
它应该始终返回相同的输出｡
所以如果我用同样的输入运行这个函数几百万次, 它应该会得到同样的输出｡
第二点是这个功能的想法不应该产生任何副作用｡
副作用有哪些？
副作用是指函数对外界产生的影响｡
例如, 如果我在这个函数内部打印一些东西, 它会影响外部世界, 对吗？
因为我在屏幕上打印东西｡
屏幕上是外界｡
例如, 如果这个函数接触了一个变量, 而这个变量位于另一个作用域之外, 这就是一个副作用｡
让我们看一下代码, 以便更好地理解这个概念｡
假设我们有一个函数, 这个函数会相乘｡
由至清单｡
所以我们就说是盟友, 这就是我们的名单｡
在这里, 我们要做的是循环遍历项目｡
在名单中｡
然后我们要相乘的每一项都要追加到一个新的列表中｡
因此, 让我们创建一个新的空列表｡
在这里我们会说new list, 点append｡
然后将项乘以2｡
最后, 在这个函数的末尾, 我们要返回新的列表｡
我们来给予试吧｡
如果我说乘以2, 然后给予它1, 2, 3, 然后打印出来｡
在这里输出｡
如果我单击“运行”｡
六块钱买两块？
这是一个纯函数吗？
让我们好好想想｡
第一个规则, 给定相同的输入, 即1､ 2和3｡
它将始终返回相同的输出｡
不管我运行多少次, 它总是会给予我相同的输出｡
所以我们通过了第一个测试｡
第二个测试呢？
它不会产生副作用｡
这是否会产生任何副作用？
这和外界有什么联系吗？
你想想看
不, 不是这样的｡
好吧, 我知道了
外部世界的一切对这个函数都不重要｡
因为一切都包含在这里｡
比如说, 这里没有print, 我们只是有print｡
还有这里
如果我单击“运行”｡
我们得到相同的输出｡
但这有副作用吗？
嗯, 是的, 确实如此｡
它与外部世界相互作用, 这就是打印语句｡
print语句告诉我, 我要在这台机器的任何显示器上打印｡
在我们的例子中, 它将在这里打印, 但我们并不真正知道print语句的作用,
因为它在这一边与屏幕交互｡
所以这个｡
有副作用｡
我们给予控制权交给打印, 但我们不知道打印会做什么｡
另一个例子, 我可以给予你｡
如果我们在这里有一个新的列表, 我们实际上在外面定义了这个列表, 是这样吗？
就像这样｡
这样我们就有了这样的新名单｡
如果我单击“运行”｡
我还是六分之二｡
但这有副作用吗？
嗯, 是的, 确实如此｡
它与外部世界相互作用｡
在函数的外部, 记住, 就是作用域.
它与这个新的列表相互作用｡
它会开启这个新清单｡
所以如果有程序员来了, 也许在我们运行这个函数之前, 我们决定用new list｡
我们将其更改为空字符串｡
当我运行这个函数的时候｡
我得到一个错误, 因为现在这个新列表是一个字符串对象｡
所以这个函数外部的新列表可以被其他开发者或者程序修改, 我们应该知道它｡
当我们运行这个函数时, 它会给予我们一个错误｡
它有副作用｡
所以理想情况下我们包含函数｡
让它们保持纯净, 因为正如你所看到的, 我们的代码中永远不会有bug或错误, 除非我们在这里写错了什么｡
但是因为我们不关心外部世界, 因为给予作为输入的一切总是会产生良好的输出,
它将是纯粹的｡
现在, 如果没有一点工作经验, 很难真正理解为什么这是一个如此强大的概念｡
但是让我告诉你, 当你有纯函数的时候｡
你有更少的错误代码, 你可以更好地测试你的代码｡
这样更容易理解代码和整体｡
您的代码的不同部分不会相互接触和影响, 这使您作为程序员的生活变得更加轻松｡
所以纯函数的概念非常重要｡
但是我想让你们从中了解的一点是, 纯函数更多的是一种指导而不是绝对的｡
不可能到处都有纯函数, 因为如果一个函数根本不影响外部世界, 那么,
我们就不会有任何程序｡
我们就不能展示东西了｡
我们将无法保存诸如游戏配置文件之类的内容｡
所以不可能到处都有纯函数｡
但是, 当你可以的时候, 无论你在哪里, 函数式编程都会告诉我们你的函数是好的｡
尝试创建纯函数, 并且只创建少数可能与外部世界交互的非纯函数,
以便在代码中出现错误时可以返回｡
因为最有可能的是那些会有bug的, 然后是像这样的纯函数｡
最终确定函数式编程的概念｡
例如, 如果这是前面的函数式编程视频中的向导, 我们将有一个向导对象｡
或者有名字巫师字典
就说梅林吧｡
和权力｡
50的｡
而不是把它们包含在一个类中, 我会有不同的方法, 比如attack｡
而且这也不是一种方法｡
它应该是一个函数因为它不在类中.
在函数式程序设计中｡
他们说, 嘿, 我们不需要联合收割机数据和函数结合起来, 让我们把它们分开｡
让我们创建可以传递的纯函数｡
任何像人物的东西｡
通过这种方式, 我们可以将这两件事分开, 这样我们就可以专注于纯函数, 而专注于数据｡
所以这就是区别所在｡
在一天结束的时候, 这一切都是为了保持我们的代码干净, 避免我们的代码中的错误｡
这是程序员一直面临的一个大问题｡
所以这只是一种不同的思考方式｡
让我们在下一个视频中了解更多信息｡