零基礎學程式設計022:函式的世界
通過《零基礎學程式設計021:獲取股票實時行情資料》的學習,我們已經可以取出“谷歌”股票的開盤價,今天我們要取出GAFATA共6支股票的開盤價。
先回顧上次的程式碼:
import urllib.request as req
with req.urlopen('http://hq.sinajs.cn/list=gb_goog') as f :
hq = f.read().decode('GBK')
v = hq.split(',')
print(v[1])
要獲取6支股票行情,那就先找到GAFATA的股票編碼(gb_goog,gb_aman,gb_fb,gb_aapl,gb_hk00700,gb_baba),然後把這段程式碼複製幾遍,把股票編碼替換一下就可以完成任務了。
import urllib.request as req with req.urlopen('http://hq.sinajs.cn/list=gb_goog') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[1]) with req.urlopen('http://hq.sinajs.cn/list=gb_amzn') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[1]) with req.urlopen('http://hq.sinajs.cn/list=gb_fb') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[1]) with req.urlopen('http://hq.sinajs.cn/list=gb_aapl') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[1]) with req.urlopen('http://hq.sinajs.cn/list=rt_hk00700') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[2]) #注意港股有所不同 with req.urlopen('http://hq.sinajs.cn/list=gb_baba') as f : hq = f.read().decode('GBK') v = hq.split(',') print(v[1])
任務雖然完成,但這種程式碼太重複了,有四行程式碼重複了6次,只是股票編碼不同而已。如果以後我們要取出收盤價,又得把所有語句中帶 v[1] 的地方都換掉,非常不方便。所有程式語言中都提供了“函式function”這個特性來解決重複程式碼的問題。
程式設計新手學習時,可以把程式語言中的函式與數學中的函式進行類比,數學函式中有函式名、變數、公式、函式值,在程式語言中分別對應著函式名、引數、函式體、返回值。數學中有二元函式,程式中有多個引數。
例如:我們在《零基礎學程式設計011:複利資料表問題(總結) 》裡遇到的複利公式就是一個簡單的數學函式。
在Python中定義一個函式非常方便,剛才的複利公式可以這樣寫:
def f(x) :
return (1 + 0.01) ** x
關鍵詞def表示定義一個函式塊,可以用英語單詞define function(定義函式)來助記,定義完成後,以後只需呼叫函式(call function)就可以得到相應的結果。
print( f(100) )
print( f(365) )
函式的一個主要功能就是減少重複的程式碼,便於將來的維護。回到我們的股票程式上,我們定義一個函式,給出股票編碼,返回開盤價。
def price(stock) :
url = 'http://hq.sinajs.cn/list=' + stock
with req.urlopen(url) as f :
hq = f.read().decode('GBK')
v = hq.split(',')
return v[1]
有了函式定義之後,只需要呼叫6次,就可以得到6支股票的行情了。
print( price('gb_goog') )
print( price('gb_amzn') )
print( price('gb_fb') )
print( price('gb_aapl') )
print( price('rt_hk00700') )
print( price('gb_baba') )
其實print也是函式,不過它是python系統自帶的,也叫內建函式(built-in function)。而我們用def定義的函式,稱為自定義函式。
小結:
- 函式function可以減少重複性程式碼,便於將來的維護
- 有內建函式,我們自己寫的叫自定義函式
- python中大量模組中包括了大量函式
- def 關鍵字用於定義一個函式塊
- 冒號之後的各行是函式體,要注意縮排
- 用return返回想要的結果
- 呼叫函式的基本形式:函式名( 函式引數 )
上面的程式中有一個小問題,你能否發現?你能自己解決它嗎?
--- END ---