今天想把上次參考着網上教程寫的scrapy爬蟲改寫成requests和beautifulsoup的普通爬蟲,寫着寫着發現自己對python的自定義函數還不是太熟悉(自己TCL了。。。。。。。。。流淚),趕緊菜鳥教程上復習一下,順便寫篇文章。
0x01:關鍵字
python中,自定義函數使用def關鍵字,后面加函數名和參數列表,如下:
def 函數名(參數列表): 函數體
如果不需要傳參,括號里就不用填,注意,python中不需要定義變量類型。自定義函數除了函數的功能是我們自己編寫代碼實現的外,其他的與python中的函數並無差別,所以在調用函數時,直接使用函數名就行。眼見為實,來看下面的栗子。
def hello(): print("hello world!!") hello()
#輸出如下
hello world!!
現在我們就自定義了一個簡單的函數,他的功能是輸出“hello world!!”,值得注意的是,python中並沒用大括號({})划分代碼塊,python中靠的是相同的縮進,所以在寫python時一定要注意一塊代碼中的縮進
0x02:自定義函數中的變量
在自定義函數時,我們難免會使用到變量,這就關系到了python的局部變量和全局變量,做一個簡單的解釋,局部變量就是在函數內部定義的變量,全局變量就是在函數內部定義的變量。在函數內部可以訪問外面的全局變量,但不可以對全局變量進行修改,但在函數外部,不可以訪問局部變量。
>>> a=3 >>> def test(): ... print(a) #函數內訪問全局變量 ... >>> test() 3
>>> def test4(): ... a=a+1 ... print(a) #函數內修改全局變量會報錯 ... >>> test4() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in test4 UnboundLocalError: local variable 'a' referenced before assignment >>>
>>> def test3(): ... c=5 ... >>> c #外部訪問局部變量也會報錯 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'c' is not defined
其實無論是在外部訪問局部變量還是在函數內修改全局變量都是有方法的,大家可以百度一下。
0x03:帶參數的自定義函數
>>> def test5(m,n): ... print(m*n) ... >>> test5(2,3) 6 >>>
我們定義了一個帶參數的函數,他的功能是計算m*n的值,如果傳入的值無法進行運算,則會報錯
0x04:參數的傳遞
python參數的傳遞分為四種情況:必須參數、關鍵字參數、默認參數、不定長參數。
必需參數須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣,上面的test5()函數的兩個參數就是必須參數,如果我們只傳入一個值,就會報錯。如下:
>>> test5(8) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: test5() missing 1 required positional argument: 'n' >>>
關鍵字參數允許函數調用時參數的順序與聲明時不一致,因為 Python 解釋器能夠用參數名匹配參數值。
>>> def test6(name,age): ... print(name) ... print(age) ... >>> test6(age=50,name="liang") liang 50 >>>
參數的順序是name、age,雖然我們先傳入了age,但因為在傳入時帶上了關鍵字,所以也不會報錯。
默認參數調用函數時,如果沒有傳遞參數,則會使用默認參數。以下實例中如果沒有傳入 age 參數,則使用默認值:
>>> def test7(name,age=50): ... print(name) ... print(age) ... >>> test7('liang') liang 50 >>> test7('liang',100)
liang
100
>>>
第一次調用時只傳入了name參數,所以age參數使用了默認值,第二只調用時對age參數也傳入了值,所以胡覆蓋掉默認的50.
值得注意的是:在默認使用參數,第一個默認參數后的所有參數都要是默認參數,就是說,如果你把第二個參數設為默認,那么后面的第三第四...個參數都要是默認的,要不會出現“non-default argument follows default argument”錯誤.
不定長參數存放所有未命名的變量參數。比如你在函數中值定義了兩個參數,而在調用時你需要傳入四個或者更多,那么從第三個開始的參數都會被存放到不定長參數中。
>>> def test8(n,*var): ... print(n) ... print(var) ... >>> test8(1,2,3,4,5,6) 1 (2, 3, 4, 5, 6) >>>
第一個參數被傳遞給n,后面都以元祖的形式存放在var這個不定長參數中。
(ps:本人太菜,若有錯誤的地方歡迎大佬隨時責罵。。。。xixixii)