欢迎回来｡
在这个视频中, 我想谈一个重要的概念, 那就是回报｡
这是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语句, 当它被调用时, 它会说,
好吧, 我用这个值退出这个函数｡
只是提醒你一下｡