‫欢迎回来｡
‫在这个视频中, 我想谈一个重要的概念, 那就是回报｡
‫这是Python中的一个关键词, 我们在处理函数时会经常看到它｡
‫让我们来看看｡
‫如果我想创建一个sum函数, 顺便说一下, Python中已经有了,
‫但我们要创建自己的, 我会用1来代替1.
‫第二个, 我们的求和函数是, 把数字一加数字二, 很好很简单的函数｡
‫现在如果我用第四和第五个来运行, 猜猜会发生什么？
‫我要按“运行”键｡
‫什么也没发生, 我的意思是, 这可能不会让你感到惊讶, 因为我们没有打印任何东西｡
‫好吧, 我知道了
‫但如果我在这里查指纹呢？
‫嗯, 这一改｡
‫让我想想｡
‫嗯嗯嗯
‫我一个都没有｡
‫这是你所期望的吗？
‫我们以前也没见过, 对吧？
‫我的意思是, 记得当我们有一个列表, 让我们说一, 二, 三,
‫然后我们做了一些像清除它｡
‫在我们的急诊室｡
‫它给了我们这支小箭, 说什么也没有｡
‫我们讨论过在列表上, 比如clear, 会改变实际的列表, 清除所有内容,
‫清空列表, 但它不会返回新的列表.
‫它只是修改现有的列表, 而不是返回none给我们｡
‫函数就是这样｡
‫它们总是要返回一些东西, 当它们没有返回任何东西时, 比如这里没有return关键字,
‫它会自动返回none｡
‫所以如果我们这里没有return, 它总是什么都不返回.
‫但如果我们加上return, 它会说, 只要我们到了第二行.
‫嘿, 你好
‫我要你退出这个功能｡
‫当你退出这个函数的时候, 我希望你返回这个表达式给我们的结果｡
‫如果我单击“运行”｡
‫我有九个？
‫如果我们把它改成10加5, 我们得到15｡
‫这是一个很好的函数通用规则, 因为函数可以做两件事｡
‫第一, 它可以返回一些东西｡
‫所以在函数的末尾, 不管怎样, 在函数运行之后, 我们返回一些东西,
‫要么是空的, 要么是某种值, 某种数据类型, 或者我们可以有一个函数, 它不返回任何东西,
‫但可能会修改一些东西｡
‫比如说, 我可以打印｡
‫你好, 我是
‫如果我跑到这里来｡
‫我返回none是因为我没有return语句｡
‫然而, 我的函数做了一些修改｡
‫嗯, 这段文字的样子对吗？
‫它会为我们打印hi｡
‫所以一个函数要么修改我们程序中的某个东西, 要么返回某个东西｡
‫这是一个非常高级的话题, 我们会在后面讨论函数式编程的时候再讨论｡
‫但是函数的一个很好的经验法则是函数应该很好地完成一件事｡
‫而且通常函数应该返回一些东西｡
‫这并不意味着, 任何一个函数, 可以做很多事情, 或者任何一个函数, 不返回任何东西,
‫都是坏的｡
‫但是, 通常情况下, 让代码变得简单和可读是一个很好的做法, 这两个规则｡
‫例如, 这里, 如果我有打印和加法, 那么, 这个函数做了很多事情｡
‫它在担心印刷, 同时也在担心一些事情｡
‫和定义｡
‫这个函数称为sum｡
‫我是说, 如果我不知道或者我没看到这个, 而我所做的只是运行一些｡
‫我认为印刷高会令人惊讶, 因为这个名字并没有真正描述它的作用｡
‫我的意思是, 我希望这是总结｡
‫为什么我的程序在打招呼？
‫所以我们要确保我们的函数只做一件事, 而且只做一件事, 因为我们稍后会看到,
‫我们可以联合收割机并一起运行不同的函数｡
‫然后我们还要确保我们返回了一些东西, 因为这样我们就可以把这个返回值赋给一个变量｡
‫例如, 我可以说total等于总和ten｡
‫五个｡
‫因为这个函数会返回一些东西, 当它完成的时候, running的值是15.
‫这和我们现在做的是一样的｡
‫最酷的是｡
‫现在我可以跑大约10多个总数｡
‫现在让我们一个一个来讨论｡
‫我定义了我的函数, Python解释器会说, 好吧, 我知道some是什么了｡
‫现在你已经定义了它｡
‫我会把它记在心里｡
‫它会一直运行, 一直运行到第七行,
‫它会说, 我要一个变量总和, 我要这个变量总和等于105.
‫在我们给total python赋值之前, 解释器会说一些｡
‫又有些什么｡
‫我记得它在内存中, 我给予它10和5个参数.
‫所以它要运行这个函数｡
‫我们一结束这个右括号, 它就会进入求和｡
‫它会说, 数字1等于10, 数字2等于5.
‫现在我们到第二行, 它会说, 嘿, 我要你把10加5, 因为我知道这些变量是什么｡
‫一旦你做完了, 这变成了15, 我要你回来｡
‫所以Python解释器, 最后, 当它完成调用some时, 会说,
‫嘿, 给变量total赋值15, 然后它会转到下一行｡
‫嘿, 我想打印一些东西｡
‫您要打印什么？
‫好吧, 我想把这个打印出来｡
‫它会说, 嘿, 什么是一些？
‫我知道有些是什么｡
‫我有记忆｡
‫再一次, 它会说10｡
‫下一个论点是完全的｡
‫嘿, 咱们合计一下｡
‫让我在记忆中找出, 哦, 是15｡
‫所以就像说15｡
‫这就是函数的力量, 对吧？
‫我可以返回一些东西, 并将它们赋值给变量, 然后像这样调用它们｡
‫如果我想做的话, 我可以继续运行它们, 如果我想让这个更简单,
‫我可以用一些来代替总数｡
‫看看这个｡
‫现在, 我将其全部显示在一行中, 如果单击“运行”｡
‫再来一次｡
‫还能用｡
‫好吧, 我会的
‫但如果我们这样做呢？
‫如果我说定义一些然后我会说在这里定义另一个｡
‫函数, 此函数接受数字1和数字2｡
‫而在这里, 我们终于回归, 一号｡
‫第二个｡
‫嗯嗯嗯
‫让我们来测试一下｡
‫你觉得会发生什么？
‫首先, 我们假设总数等于10加20｡
‫然后我会打印总计｡
‫如果我单击“运行”｡
‫我一个都没有｡
‫现在就去
‫为什么会这样呢？
‫这对你们来说应该是显而易见的, 因为我在这里说, 嘿, 我想让你们定义一些,
‫我们要用这个函数做什么？
‫在这里我会定义另一个函数, 但是这个return语句实际上运行不对｡
‫因为我们在这个代码块里所做的一切｡
‫就是这一部分｡
‫我们正在定义函数, 但从未调用另一个函数｡
‫因此, 这将返回none｡
‫我们已经失去了调用这个函数的能力｡
‫那么我们该如何解决这个问题呢？
‫一个办法就是回去, 对吧？
‫所以在最后, 我们必须确保缩进是正确的, 我们将返回另一个函数｡
‫让我们加上return, 看看会发生什么｡
‫如果我单击“运行”｡
‫好了, 我现在得到这个函数了｡
‫所以Total等于我们返回的这个函数, 它在内存中｡
‫好吧, 我会的
‫但我没有得到我想要的结果｡
‫好吧, 我知道了
‫为什么呢？
‫因为...
‫我们不调用这个函数｡
‫所以我们有几种方法可以做到这一点｡
‫我们可以在这里给予它参数或自变量｡
‫假设是1020, 如果我单击“运行”｡
‫我得到30或者如果我们想保留我们在这里给予它的任何东西, 我可以简单地说另一个函数｡
‫如果我们给予它一号和二号, 然后单击“运行”｡
‫嘿, 看那个｡
‫我得到30｡
‫现在这个视频你可能要一遍又一遍地看, 因为它确实让你的思维有点舒展｡
‫老实说, 这个函数不是很好, 因为它很混乱｡
‫您的函数应该易于理解｡
‫所以我们可能需要稍微修改一下, 这里的参数名可能不一样.
‫只是想澄清一下｡
‫也许我们可以说一和二｡
‫这里我们做一加二, 来说明当我们返回时, 这个函数,
‫我使用了我们在这里调用的参数num1和num2｡
‫因为这个函数的定义并不关心这些东西是什么｡
‫它只关心另一个函数何时被调用｡
‫现在, 如果你需要暂停视频, 看看这个, 也许再练习一下,
‫这是完全可以理解的｡
‫但我想向你展示回归的力量｡
‫你可以有嵌套的函数, 就像你可以有条件一样, 但是你必须小心,
‫你的函数要么返回一些东西, 要么什么都不返回｡
‫大多数情况下, 你会想从函数中返回一些东西, 这样我们就可以这样做,
‫把它赋给一个变量, 这样我们就可以在程序中使用它.
‫下次见｡
‫再见, 再见, 再见
‫最后一件事
‫一个return关键字会自动退出这个函数, 所以如果我在这里添加了另一段代码, 比如print｡
‫你好, 我是
‫甚至可能有五个人在这里｡
‫你会发现它仍然有效｡
‫但如果我运行这个｡
‫我仍然得到30, 因为解释器永远不会到达第五行和第六行, 因为一旦我们从一个函数返回了一些东西,
‫它就退出了那个函数｡
‫这部分没有退出函数的原因是因为, 记住, 在我们定义的函数内部.
‫所以我们并不是真的在运行这个部分｡
‫我们只是说, 嘿, 当我们看到代码中出现另一个函数时, 我们知道它是什么,
‫但我们不会运行它｡
‫它看起来像这样｡
‫一旦它看到return语句, 当它被调用时, 它会说,
‫好吧, 我用这个值退出这个函数｡
‫只是提醒你一下｡