Tip:
Highlight text to annotate it
X
在之前的一些视频中我在这里写了一些程序
请求用户输入
并计算所输入数字的阶乘
并打印出来
那很不错,但你可以想象
现实中你可能需要在多个地方
或者不同程序中计算阶乘
或者在同一个程序中
多次进行计算阶乘
你不会想在每次计算阶乘的时候
一遍又一遍的
写这些代码
所以我在此视频中要做的
就是定义计算阶乘的函数
然后我们将在每次
计算阶乘的时候使用这个函数
所以本质上函数做的事情
就是把所有的代码
所有这些代码放到一个地方
然后在其它任何
我想要计算阶乘的程序中
我只要调用代码就可以了
不必重写代码
那么让我向你展示一下我所说的
我将定义一个函数
以及Python中的关键字
它是一种特殊的词语
它告诉解释器
一些特别的事情将要发生
Python中定义一个函数的关键字是 “def“
那么我将定义一个函数
我将称它为factorial函数
根据函数实际要做的事情
来命名它,是个很好的主意
有时候初学编程的人会有
取”x245“这样的函数名称的习惯
稍后看到的人对
这个变量或者函数是干什么的
将会毫无头绪
所以你无论如何都要明确的命名它
它的名称会提示函数本身的作用
我的函数命名为factorial
当用户调用factorial函数时
他们需要告诉factorial函数
要计算什么数值的阶乘
那么他们就会传递一个叫做”number“的参数
如果这些描述有些令人困惑的话
我将稍后详细解释
但你完全可以期望:你看这些代码看得越多
你就会越熟悉这些思路
那么他们将传递“number" 变量
我则必须返回至
调用函数
我其实不应该说
用户将传递”number",
是调用程序将传递"number" 这个变量
我则需要将这个数字“number"的阶乘
返回至调用程序.
让我写下这些作为真正的注释
返回参数”number“的阶乘
有时候你会听到parameter这个词
有时候你又会听到argument这个词
当你在定义一个函数时
更为普遍的称为parameter(参数)
”number"就是factorial 函数
其中的一个参数
是传递至函数的实际数值
例如某人调用factorial函数,并在这里填入"3"
正式点说就是并将“3”作为参数
函数就会返回参数“number”的阶乘
这就是参数“number”
我并不是重复的说明number这个词
我只是说这个字面上的number
也许我该说实际参数“number”
也许我该放一个引号以便
更清楚的说明这是一个实际参数
我并不是在说通常所说的”数字“
好,让我们定义这个函数吧
我们基本上将使用相同的代码
就让我直接复制并粘贴
让我复制并粘贴这里写的许多代码
我将剪切出来
并把它粘贴在这里
但我必须小心我的缩进
因为Python用缩进来了解
各部分是什么,它知道如何解释这些代码.
所有定义函数的部分都必须缩进
并且我们使用四个空格来进行缩进
一,二,三,四
这是另外的四个空格
一,二,三,四
这是for循环的部分
一,二,三,四
让我们思考一下到目前为止所做的
它将会传递某些数字
我们定义这个“product”变量,它等于1
我们将深入讨论变量的作用域
这个变量仅能在
定义它的函数内部使用
因为我第一次定义它
就是在函数的内部
未来我们将更深入地讨论变量的作用域
好了,就像我们之前所做的一样
"for i in range(number)"
现在我们不会通过input函数获得”number“
它只会被传递进函数
然后“product”等于“product” 乘以(“i”+1)
同之前一样的逻辑
在你仔细检查这个for循环以后
在你仔细检查它以后,
你本质上会经历“number”次循环
“product”将会保存“number”的阶乘结果
并且,我们不直接输出结果
而是将结果返回
我们将把它返回至调用程序
在下一个视频中我们将把它用图表画出来
以更清楚的进行解释(如果你还有些困惑的话)
我将返回product
这本质上同我们之前的代码相同
但我们将它打包到了函数的内部
我们定义了一个函数
它接受了一个称为“number”的参数
如果你想计算3的阶乘
尝试3的阶乘
3将会是这个函数的实际参数
即是变量“number”这个地方
或者是“number”所引用的数值
你定义“product”变量,并让它等于1
然后进行“number”次
那么对于 "for i in range(number)"
我们在之前的视频中解释过它的逻辑了
阶乘将会从1开始
然后进行1乘以1的计算,这等于1
然后“product”为1
但之后“i”为1.
“i"从0开始
所以会是1乘以(0+1)得到1
之后”i“为2,它将会是1乘以1
抱歉,”i“为1
这里将会是1乘以(1+1)即1乘以2,
所以它会是2
它将通过这种方式自增
我们已经在上个视频中解释
然后最终它返回”product“
因此如果我们想进行与之前相同的计算
现在我们就可以使用这个函数
我们所能做的是,用以下的函数
仍然需要输入,以及我们的函数定义
然后顺着看我们的主程序,
我们已经定义了我们的函数
现在我们只需说
”看,从用户那得到一个非负的整数
并计算它的阶乘"
让我们输入进去
让我们把这个变量记作"user_input"
然后我接下来要做的
就是:我将定义另外一个变量
称为“factorialofuser_input”
现在这将会变得有趣了
我们将调用这个函数
它将等于
你所输入的任何数字的阶乘
所以,“user_input”的阶乘
这个变量的阶乘
用户输入的数字的阶乘
"factorialofuser_input"将会被保存
我想我们应该说
它将指向真正的答案
现在我们必须把它打印出来
那么现在我们可以打印"factorial of user input"
它看上去像个句子
但其实仅仅是变量名
我这样子命名
你就能知道变量中到底存的是什么
或者说变量真正指代的是什么
那么"factorial of user input"
现在,你知道在关键时刻
要经常保存程序并实际的尝试运行它
现在让我们尝试运行一下看看效果
让我们看看这里发生了什么是
至少现在没有出什么错
那么再来一次
我想声明这里这里开始的代码
我们所做的仅仅是定义了它
它没有创建任何同用户的交互
所以实际上它还没有处理任何东西
因此它这里仅仅是定义了函数
然后开始执行 ”OK,从用户那里获取输入“
这就是我们现在正在做的
这里我们输入一些数字以后
接下来它会真正的调用函数,
并传递我们输入的数字
将会放到”user_input"中
然后它将调用阶乘函数
并使用"user_input"作为参数
让我们尝试数字3
它没起作用!
噢,我知道为什么它不起作用
因为我残留了一点之前的程序
它现在没有什么意义了
那么让我去掉它
这是一个很好的教训
很难第一次尝试就让程序完美的运行
让我们再试一次
真是很荒唐
我没有留意到下面的部分
那么让我们再次尝试
再一次3
它给了我一个很好的答案
它给了我3的阶乘
酷的地方在于
现在我的python解释器
假定这个定义已经存在
我可以调用从解释器直接调用阶乘函数
如果我有另外的程序
我可以通过多种方式调用它
现在你应该可以领会
为什么定义函数这么酷
因为我们可以计算
因为我已经定义了阶乘函数,
我可以计算4的阶乘
结果为24
再如5的阶乘减去3的阶乘
结果是114
我可以获得12的阶乘
你可以告诉计算机
尽管这些只是解释执行的
(我们以后将深入讨论解释和编译的代码)
但它出奇的快
我们甚至感觉不到计算的耗时
所以这是函数的真正威力
我现在不必每次都重写代码
我使用不同的参数调用它就可以了
那么2的阶乘,我可以每次都这么做
我不需要重新运行程序
如果我写了其它使用了阶乘的程序
比如我用组合来做些计算
我只要使用这个函数
事实上我甚至不必知道
函数内部是怎么样的
这也是函数强大的另一面
比如我写了一些程序
我这里的程序调用了阶乘函数
假如你有了更好的方法
写函数体里面的代码
只要你的程序
调用的是这个函数,即使实现方法不同
终端的用户不会注意有什么变化
因此也许你写了一个更快速
或者更简单的方法来处理
使用了更少的内存或者更少的CPU计算资源
那么可以替换它
然后任何调用它的程序
只要阶乘函数可以工作
那么调用它的函数也可以正常工作
并运行得更好