# 練習19.函數和變量
函數這個概念也許承載了太多的信息量,不過別擔心。只要堅持做這些練習,對照上個練習中的檢查點檢查一遍這次的聯系,你最終會明白這些內容的。
有一個你可能沒有注意到的細節,我們現在強調一下:函數里邊的變量和腳本里邊的變量之間是沒有關系的。下面的這個練習可以讓你對這一點有更多的思考:
~~~
def cheese_and_crackers(cheese_count, boxes_of_crackers):
print "You have %d cheeses!" % cheese_count
print "You have %d boxes of crackers!" % boxes_of_crackers
print "Man that's enough for a party!"
print "Get a blanket.\n"
print "We can just give the function numbers directly:"
cheese_and_crackers(20, 30)
print "OR, we can use variables from our script:"
amount_of_cheese = 10
amount_of_crackers = 50
cheese_and_crackers(amount_of_cheese, amount_of_crackers)
print "We can even do math inside too:"
cheese_and_crackers(10 + 20, 5 + 6)
print "And we can combine the two, variables and math:"
cheese_and_crackers(amount_of_cheese + 100, amount_of_crackers + 1000)
~~~
通過這個練習,你看到我們給函數`cheese_and_crackers`傳遞很多的參數,然后在函數里把它們打印出來。我們可以在函數里用變量名,可以在函數里做運算,甚至可以將變量和運算結合起來。
從一方面來說,函數的參數和我們的生成變量時用的`=`賦值符類似。事實上,如果你可以用`=`給一個東西命名,你也就可以將其作為參數傳遞給一個函數。
## 你看到的結果
你應該研究一下腳本的輸出,和你想象的結果對比一下看有什么不同。
~~~
$ python ex19.py
We can just give the function numbers directly:
You have 20 cheeses!
You have 30 boxes of crackers!
Man that's enough for a party!
Get a blanket.
OR, we can use variables from our script:
You have 10 cheeses!
You have 50 boxes of crackers!
Man that's enough for a party!
Get a blanket.
We can even do math inside too:
You have 30 cheeses!
You have 11 boxes of crackers!
Man that's enough for a party!
Get a blanket.
And we can combine the two, variables and math:
You have 110 cheeses!
You have 1050 boxes of crackers!
Man that's enough for a party!
Get a blanket.
~~~
## 附加題
> 1. 倒著將腳本讀完,在每一行上面添加一行注解,說明這行的作用。
> 1. 從最后一行開始,倒著閱讀每一行,讀出所有的重要字符來。
> 1. 自己編至少一個函數出來,然后用10種方法運行這個函數。
## 常見問題
### Q: 怎么可能有10中方法來運行一個函數?
> 信不信由你,理論上有無數種方法去調用一個函數。看看你對函數、變量、用戶輸入有多少想象力和創造力。
### Q:有沒有一種方法分析一下這個函數是做什么的,這樣能讓我更方便的理解它?
> 有很多種方法可以做到,但是盡量采用給每行增加注釋的方式。另一種方式是大聲的讀出代碼。第三種方式是將代碼打印在紙上,并添加圖片和注釋用來解釋代碼實現了什么功能。
### Q: 如果我希望用戶輸入芝士和餅干的數量,我該怎么做?
> 你可以使用`int()`把你從`raw_input()`獲取的參數轉化為數字。
### Q: 在函數中能否改變變量`cheese_count`和`amount_of_cheese`的值?
> 當然不能, 這些變量是獨立的,在函數體之外。 他們被作為零食變量傳遞給函數是為了保證函數的正常運行,當函數退出的時候,這些臨時變量也就消失了。繼續學習本書,你會更明白這些。
### Q: 定義一個和函數名相同名字的全局變量是不是不好?
> 當然不好, 如果你這么做了,后面你就搞不清你在說變量還是函數了。 但有時候你可能必須要用相同的名字,否則你可能會遇到一些難題。但是不管怎么說,盡量避開這種做法。
### Q: 函數可以限制參數的傳遞個數?
> 這取決于你python的版本以及你用什么電腦,即使有這個限制的數字也是非常大的。為了使函數方便使用,實際的限制大約時5個參數,也就是說當函數參數超過5個的時候,函數就會變得不方便使用。
### Q:你能在一個函數中調用另一個函數嗎?
> 可以,本書后面有一個制作游戲的例子就是這么做的。
- 序言
- 前言
- 簡介
- 0:安裝和準備
- 1:第一個程序
- 2:注釋和“#”井號
- 3:數字和數學計算
- 4:變量和命名
- 5:更多的變量和打印
- 6:字符串和文本
- 7:更多的打印(輸出)
- 8:打印, 打印
- 9:打印, 打印, 打印
- 10:那是什么?
- 11:提問
- 12:提示別人
- 13:參數, 解包, 變量
- 14:提示和傳遞
- 15:讀文件
- 16:讀寫文件
- 17:更多文件操作
- 18:命名, 變量, 代碼, 函數
- 19:函數和變量
- 20:函數和文件
- 21:函數的返回值
- 22:到目前為止你學到了什么?
- 23:閱讀代碼
- 24:更多的練習
- 25:更多更多的練習
- 26:恭喜你,可以進行一次考試了
- 27:記住邏輯
- 28:布爾表達式
- 29:IF 語句
- 30:Else 和 If
- 31:做出決定
- 32:循環和列表
- 33:while循環
- 34:訪問列表元素
- 35:分支和函數
- 36:設計和調試
- 37:復習符號
- 38:列表操作
- 39:字典,可愛的字典
- 40:模塊, 類和對象
- 41:學會說面向對象
- 42:對象、類、以及從屬關系
- 43:基本的面向對象的分析和設計
- 44:繼承Vs.包含
- 45:你來制作一個游戲
- 46:項目骨架
- 47:自動化測試
- 48:更復雜的用戶輸入
- 49:寫代碼語句
- 50:你的第一個網站
- 51:從瀏覽器獲取輸入
- 52:開始你的web游戲
- 來自老程序員的建議
- 下一步
- 附錄A:命令行教程
- 簡介
- 安裝和準備
- 路徑, 文件夾, 名錄 (pwd)
- 如果你迷路了
- 創建一個路徑 (mkdir)
- 改變當前路徑 (cd)
- 列出當前路徑 (ls)
- 刪除路徑 (rmdir)
- 目錄切換(pushd, popd)
- 生成一個空文件(Touch, New-Item)
- 復制文件 (cp)
- 移動文件 (mv)
- 查看文件 (less, MORE)
- 輸出文件 (cat)
- 刪除文件 (rm)
- 退出命令行 (exit)
- 下一步