函數,對于人類來講,能夠發展到這個數學思維層次,是一個飛躍。可以說,它的提出,直接加快了現代科技和社會的發展,不論是現代的任何科技門類,乃至于經濟學、政治學、社會學等,都已經普遍使用函數。
下面一段來自維基百科(在本教程中,大量的定義來自維基百科,因為它真的很百科):[函數詞條](http://zh.wikipedia.org/zh/%E5%87%BD%E6%95%B0)
> 函數這個數學名詞是萊布尼茲在1694年開始使用的,以描述曲線的一個相關量,如曲線的斜率或者曲線上的某一點。萊布尼茲所指的函數現在被稱作可導函數,數學家之外的普通人一般接觸到的函數即屬此類。對于可導函數可以討論它的極限和導數。此兩者描述了函數輸出值的變化同輸入值變化的關系,是微積分學的基礎。中文的“函數”一詞由清朝數學家李善蘭譯出。其《代數學》書中解釋:“凡此變數中函(包含)彼變數者,則此為彼之函數”。
函數,從簡單到復雜,各式各樣。前面提供的維基百科中的函數詞條,里面可以做一個概覽。但不管什么樣子的函數,都可以用下圖概括:

有初中數學水平都能理解一個大概了。這里不贅述。
本講重點說明用python怎么來做一個函數用一用。
## 深入理解函數
在中學數學中,可以用這樣的方式定義函數:y=4x+3,這就是一個一次函數,當然,也可以寫成:f(x)=4x+3。其中x是變量,它可以代表任何數。
~~~
當x=2時,代入到上面的函數表達式:f(2) = 4*2+3 = 11所以:f(2) = 11
~~~
以上對函數的理解,是一般初中生都能打到的。但是,如果看官已經初中畢業了,或者是一個有追求的初中生,還不能局限在上面的理解,還要將函數的理解拓展。
## 變量不僅僅是數
變量x只能是任意數嗎?其實,一個函數,就是一個對應關系。看官嘗試著將上面表達式的x理解為餡餅,4x+3,就是4個餡餅在加上3(單位是什么,就不重要了),這個結果對應著另外一個東西,那個東西比如說是iphone。或者說可以理解為4個餡餅加3就對應一個iphone。這就是所謂映射關系。
所以,x,不僅僅是數,可以是你認為的任何東西。
## 變量本質——占位符
函數中為什么變量用x?這是一個有趣的問題,自己google一下,看能不能找到答案。
我也不清楚原因。不過,我清楚地知道,變量可以用x,也可以用別的符號,比如y,z,k,i,j...,甚至用alpha,beta,qiwei,qiwsir這樣的字母組合也可以。
**變量在本質上就是一個占位符。**這是一針見血的理解。什么是占位符?就是先把那個位置用變量占上,表示這里有一個東西,至于這個位置放什么東西,以后再說,反正先用一個符號占著這個位置(占位符)。
其實在高級語言編程中,變量比我們在初中數學中學習的要復雜。但是,現在我們先不管那些,復雜東西放在以后再說了。現在,就按照初中數學來研究python中的變量
通常使小寫字母來命名python中的變量,也可以在其中加上下劃線什么的,表示區別。
比如:alpha,x,j,p_beta,這些都可以做為python的變量。
## 給變量賦值
打開IDLE,實驗操作如下:
~~~
>>> a = 2 #注1>>> a #注22>>> b = 3 #注3>>> c = 3>>> b3>>> c3>>>
~~~
說明:
* 注1:a=2的含義是將一個變量a指向了2這個數,就好比叫做a是的釣魚的人,通過魚線,跟一條叫做2的魚連接者,a通過魚線就可以導到2
* 注2:相當于要a這個釣魚的人,順著魚線導出那條魚,看看連接的是哪一條,發現是叫做2的那條傻魚
* 注3:b=3,理解同上。那么c=3呢?就是這條叫做3的魚被兩個人同時釣到了。
## 建立簡單函數
~~~
>>> a = 2>>> y=3*a+2>>> y8
~~~
這種方式建立的函數,跟在初中數學中學習的沒有什么區別。當然,這種方式的函數,在編程實踐中的用途不大,一般是在學習階段理解函數來使用的。
別急躁,你在輸入a=3,然后輸入y,看看得到什么結果呢?
~~~
>>> a=2>>> y=3*a+2>>> y8>>> a=3>>> y8
~~~
是不是很奇怪?為什么后面已經讓a等于3了,結果y還是8。
用前面的釣魚理論就可以解釋了。a和2相連,經過計算,y和8相連了。后面a的連接對象修改了,但是y的連接對象還沒有變,所以,還是8。再計算一次,y的連接對象就變了:
~~~
>>> a=3>>> y8>>> y=3*a+2>>> y11
~~~
特別注意,如果沒有先a=2,就直接下函數表達式了,像這樣,就會報錯。
~~~
>>> y=3*a+2Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'a' is not defined
~~~
注意看錯誤提示,a是一個變量,提示中告訴我們這個變量沒有定義。顯然,如果函數中要使用某個變量,不得不提前定義出來。定義方法就是給這個變量賦值。
## 建立實用的函數
上面用命令方式建立函數,還不夠“正規化”,那么就來寫一個.py文件吧。
在IDLE中,File->New window
然后輸入如下代碼:
~~~
#coding:utf-8def add_function(a,b): c = a+b print cif __name__=="__main__": add_function(2,3)
~~~
然后將文件保存,我把她命名為106-1.py,你根據自己的喜好取個名字。
然后我就進入到那個文件夾,運行這個文件,出現下面的結果,如圖:

你運行的結果是什么?如果沒有得到上面的結果,你就非常認真地檢查代碼,是否跟我寫的完全一樣,注意,包括冒號和空格,都得一樣。**冒號和空格很重要。**
下面開始庖丁解牛:
* #coding:utf-8聲明本 文件中代碼的字符集類型是utf-8格式。初學者如果還不理解,一方面可以去google,另外還可放一放,就先這么抄寫下來,以后會講解。
* def add_function(a,b): 這里是函數的開始。在聲明要建立一個函數的時候,一定要使用def(def 就是英文define的前三個字母),意思就是告知計算機,這里要聲明一個函數;add_function是這個函數名稱,取名字是有講究的,就好比你的名字一樣。在python中取名字的講究就是要有一定意義,能夠從名字中看出這個函數是用來干什么的。從add_function這個名字中,是不是看出她是用來計算加法的呢?(a,b)這個括號里面的是這個函數的參數,也就是函數變量。冒號,這個冒號非常非常重要,如果少了,就報錯了。冒號的意思就是下面好開始真正的函數內容了。
* c=a+b 特別注意,這一行比上一行要縮進四個空格。這是python的規定,要牢記,不可丟掉,丟了就報錯。然后這句話就是將兩個參數(變量)相加,結果賦值與另外一個變量c。
* print c 還是提醒看官注意,縮進四個空格。將得到的結果c的值打印出來。
* if?**name**=="**main**": 這句話先照抄,不解釋。注意就是不縮進了。
* add_function(2,3) 這才是真正調用前面建立的函數,并且傳入兩個參數:a=2,b=3。仔細觀察傳入參數的方法,就是把2放在a那個位置,3放在b那個位置(所以說,變量就是占位符).
解牛完畢,做個總結:
## 聲明函數的格式為:
~~~
def 函數名(參數1,參數2,...,參數n): 函數體
~~~
是不是樣式很簡單呢?
## 取名字的學問
有的大師,會通過某個人的名字來預測他/她的吉兇禍福等。看來名字這玩意太重要了。取個好名字,就有好兆頭呀。所以孔丘先生說“名不正,言不順”,歪解:名字不正規化,就不順。這是歪解,希望不要影響看官正確理解。不知道大師們是不是能夠通過外國人名字預測外國人大的吉兇禍福呢?
不管怎樣,某國人是很在意名字的,旁邊有個國家似乎就不在乎。
python也很在乎名字問題,其實,所有高級語言對名字都有要求。為什么呢?因為如果命名亂了,計算機就有點不知所措了。看python對命名的一般要求。
* 文件名:全小寫,可使用下劃線
* 函數名:小寫,可以用下劃線風格單詞以增加可讀性。如:myfunction,my_example_function。_注意_:混合大小寫僅被允許用于這種風格已經占據優勢的時候,以便保持向后兼容。
* 函數的參數:如果一個函數的參數名稱和保留的關鍵字(所謂保留關鍵字,就是python語言已經占用的名稱,通常被用來做為已經有的函數等的命名了,你如果還用,就不行了。)沖突,通常使用一個后綴下劃線好于使用縮寫或奇怪的拼寫。
* 變量:變量名全部小寫,由下劃線連接各個單詞。如color = WHITE,this_is_a_variable = 1。
其實,關于命名的問題,還有不少爭論呢?最典型的是所謂匈牙利命名法、駝峰命名等。如果你喜歡,可以google一下。以下內容供參考:
* [匈牙利命名法](http://zh.wikipedia.org/zh/%E5%8C%88%E7%89%99%E5%88%A9%E5%91%BD%E5%90%8D%E6%B3%95)
* [駝峰式大小寫](http://zh.wikipedia.org/wiki/%E9%A7%9D%E5%B3%B0%E5%BC%8F%E5%A4%A7%E5%B0%8F%E5%AF%AB)
* [帕斯卡命名法](http://zh.wikipedia.org/w/index.php?title=%E5%B8%95%E6%96%AF%E5%8D%A1%E5%91%BD%E5%90%8D%E6%B3%95&variant=zh-cn)
* [python命名的官方要求](http://legacy.python.org/dev/peps/pep-0008/#prescriptive-naming-conventions),如果看官的英文可以,一定要閱讀。如果英文稍遜,可以來閱讀[中文](http://wiki.jiayun.org/PEP_8_--_Style_Guide_for_Python_Code#.E5.91.BD.E5.90.8D.E6.85.A3.E4.BE.8B),不用梯子能行嗎?看你命了。
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于Python的事情
- 為什么要開設本欄目
- 第一部分 積小流,至江海
- Python環境安裝
- 集成開發環境(IDE)
- 數的類型和四則運算
- 啰嗦的除法
- 開始真正編程
- 初識永遠強大的函數
- 玩轉字符串(1):基本概念、字符轉義、字符串連接、變量與字符串關系
- 玩轉字符串(2)
- 玩轉字符串(3)
- 眼花繚亂的運算符
- 從if開始語句的征程
- 一個免費的實驗室
- 有容乃大的list(1)
- 有容乃大的list(2)
- 有容乃大的list(3)
- 有容乃大的list(4)
- list和str比較
- 畫圈還不簡單嗎
- 再深點,更懂list
- 字典,你還記得嗎?
- 字典的操作方法
- 有點簡約的元組
- 一二三,集合了
- 集合的關系
- Python數據類型總結
- 深入變量和引用對象
- 賦值,簡單也不簡單
- 坑爹的字符編碼
- 做一個小游戲
- 不要紅頭文件(1): open, write, close
- 不要紅頭文件(2): os.stat, closed, mode, read, readlines, readline
- 第二部分 窮千里目,上一層樓
- 正規地說一句話
- print能干的事情
- 從格式化表達式到方法
- 復習if語句
- 用while來循環
- 難以想象的for
- 關于循環的小伎倆
- 讓人歡喜讓人憂的迭代
- 大話題小函數(1)
- 大話題小函數(2)
- python文檔
- 重回函數
- 變量和參數
- 總結參數的傳遞
- 傳說中的函數條規
- 關于類的基本認識
- 編寫類之一創建實例
- 編寫類之二方法
- 編寫類之三子類
- 編寫類之四再論繼承
- 命名空間
- 類的細節
- Import 模塊
- 模塊的加載
- 私有和專有
- 折騰一下目錄: os.path.<attribute>
- 第三部分 昨夜西風,亭臺誰登
- 網站的結構:網站組成、MySQL數據庫的安裝和配置、MySQL的運行
- 通過Python連接數據庫:安裝python-MySQLdb,連接MySQL
- 用Pyton操作數據庫(1):建立連接和游標,并insert and commit
- 用Python操作數據庫(2)
- 用Python操作數據庫(3)
- python開發框架:框架介紹、Tornado安裝
- Hello,第一個網頁分析:tornado網站的基本結構剖析:improt模塊、RequestHandler, HTTPServer, Application, IOLoop
- 實例分析get和post:get()通過URL得到數據和post()通過get_argument()獲取數據
- 問候世界:利用GAE建立tornado框架網站
- 使用表單和模板:tornado模板self.render和模板變量傳遞
- 模板中的語法:tornado模板中的for,if,set等語法
- 靜態文件以及一個項目框架
- 模板轉義
- 第四部分 暮然回首,燈火闌珊處
- requests庫
- 比較json/dictionary的庫
- defaultdict 模塊和 namedtuple 模塊
- 第五部分 Python備忘錄
- 基本的(字面量)值
- 運算符
- 常用的內建函數
- 擴展閱讀(來自網絡文章)
- 人生苦短,我用Python