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“
因此如果我們想進行與之前相同的計算
現在我們就可以使用這個函數
我們所能做的是,用以下的函數
仍然需要輸入,以及我們的函數定義
然後順著看我們的主程序,
我們已經定義了我們的函數
現在我們只需說
”看,從客戶那得到一個非負的整數
並計算它的階乘"
讓我們輸入進去
讓我們把這個變量記作"userinput"
然後我接下來要做的
就是:我將定義另外一個變量
稱爲“factorialofuserinput”
現在這將會變得有趣了
我們將調用這個函數
它將等於
你所輸入的任何數字的階乘
所以,“userinput”的階乘
這個變量的階乘
客戶輸入的數字的階乘
"factorialofuserinput"將會被保存
我想我們應該說
它將指向真正的答案
現在我們必須把它打印出來
那麽現在我們可以打印"factorial of user input"
它看上去像個句子
但其實僅僅是變量名
我這樣子命名
你就能知道變量中到底存的是什麽
或者說變量真正指代的是什麽
那麽"factorial of user input"
現在,你知道在關鍵時刻
要經常保存程序並實際的嘗試運行它
現在讓我們嘗試運行一下看看效果
讓我們看看這裡發生了什麽是
至少現在沒有出什麽錯
那麽再來一次
我想聲明這裡這裡開始的代碼
我們所做的僅僅是定義了它
它沒有創建任何同客戶的交互
所以實際上它還沒有處理任何東西
因此它這裡僅僅是定義了函數
然後開始執行 ”OK,從客戶那裏獲取輸入“
這就是我們現在正在做的
這裡我們輸入一些數字以後
接下來它會真正的調用函數,
並傳遞我們輸入的數字
將會放到”userinput"中
然後它將調用階乘函數
並使用"userinput"作爲參數
讓我們嘗試數字3
它沒起作用!
噢,我知道爲什麽它不起作用
因爲我殘留了一點之前的程序
它現在沒有什麽意義了
那麽讓我去掉它
這是一個很好的教訓
很難第一次嘗試就讓程序完美的運行
讓我們再試一次
真是很荒唐
我沒有留意到下面的部分
那麽讓我們再次嘗試
再一次3
它給了我一個很好的答案
它給了我3的階乘
酷的地方在於
現在我的python解釋器
假定這個定義已經存在
我可以調用從解釋器直接調用階乘函數
如果我有另外的程序
我可以通過多種方式調用它
現在你應該可以領會
爲什麽定義函數這麽酷
因爲我們可以計算
因爲我已經定義了階乘函數,
我可以計算4的階乘
結果爲24
再如5的階乘減去3的階乘
結果是114
我可以獲得12的階乘
你可以告訴計算機
盡管這些只是解釋執行的
(我們以後將深入討論解釋和編譯的代碼)
但它出奇的快
我們甚至感覺不到計算的耗時
所以這是函數的真正威力
我現在不必每次都重寫代碼
我使用不同的參數調用它就可以了
那麽2的階乘,我可以每次都這麽做
我不需要重新運衝程序
如果我寫了其它使用了階乘的程序
比如我用組合來做些計算
我只要使用這個函數
事實上我甚至不必知道
函數內部是怎麽樣的
這也是函數強大的另一面
比如我寫了一些程序
我這裡的程序調用了階乘函數
假如你有了更好的方法
寫函數體裏面的代碼
只要你的程序
調用的是這個函數,即使實現方法不同
終端的客戶不會注意有什麽變化
因此也許你寫了一個更快速
或者更簡單的方法來處理
使用了更少的內存或者更少的CPU計算資源
那麽可以替換它
然後任何調用它的程序
只要階乘函數可以工作
那麽調用它的函數也可以正常工作
並運行得更好