‫什么是纯函数？
‫纯函数看起来像这样｡
‫我们有一个功能｡
‫因此, 我们不必像以前那样把所有这些功能的对象都放在一个盒子里, 而是把它看作一个简单的函数｡
‫假设我们给予它一个包含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｡
‫而且这也不是一种方法｡
‫它应该是一个函数因为它不在类中.
‫在函数式程序设计中｡
‫他们说, 嘿, 我们不需要联合收割机数据和函数结合起来, 让我们把它们分开｡
‫让我们创建可以传递的纯函数｡
‫任何像人物的东西｡
‫通过这种方式, 我们可以将这两件事分开, 这样我们就可以专注于纯函数, 而专注于数据｡
‫所以这就是区别所在｡
‫在一天结束的时候, 这一切都是为了保持我们的代码干净, 避免我们的代码中的错误｡
‫这是程序员一直面临的一个大问题｡
‫所以这只是一种不同的思考方式｡
‫让我们在下一个视频中了解更多信息｡