(一)前言
對於零基礎學習Python或者轉行做數據分析的朋友,跟jacky交流最多的問題就是Python網絡爬蟲學習問題;比如說要爬取美團,或者說爬取攜程等等。在爬取的過程中,這些朋友總是會遇到這樣或者那樣的問題,我也看到了很多規範和不規範的代碼,很多朋友都是模仿視頻教學中的代碼遇到了問題,之後來跟jacky探討得;
說說jacky的立場:對於零基礎學習Python的朋友,jacky是反對在基礎不牢的時候,學習爬蟲的。
因爲爬蟲入門容易,但能做到應用還是比較複雜的,這需要我們綜合能力是很高的,如果不是計算機專業的同學,我們還是要把基礎打牢,再去學習爬蟲;
jacky要用十分鐘教你們一個爬蟲的實操也很簡單,但是作爲學習的我們不能自欺欺人,有些網站可以爬取,並不是因爲你會了爬蟲,而是這個網頁根本就沒有爬取的意義;
我們往往是由於一些基礎性的錯誤導致爬取數據不能成功,比如說雖然有BeautifulSoup這個強大的庫,但正則我們還是要會用的,看到太多朋友“流水賬的代碼”(面向過程編程),朋友們總是有些網絡數據可以爬取,那稍微複雜一點的代碼就爬取不了,這一切的原因都是基礎不牢,強行練習爬蟲,導致“走火入魔”。
做任何事,最重要的都是基礎,學習Python,學習數據分析也一樣。在Python中,作爲Python學習中的重中之重,函數、對象和模塊是一定要熟記並且熟練應用的,本次分享,jacky將給大家Python函數的第一部分:經典的永遠是簡單的。
(二)爲什麼Python中要有函數
2.1 函數存在的用意
-
如果Python中不創造出函數,那Python只能是面向過編程,代碼中出現重複功能我們只能再次寫一遍;
-
如果有了函數,Python就可以面向函數編程,我們在函數裏寫相應的功能,在代碼中有同樣功能需求時,我們就可以直接調用函數,免去了重複勞動;
2.2 函數存在的本質
-
函數存在的本質就是實現相應功能,封裝在函數中
2.3 面向過程、面向函數、面向對象的簡單解釋
-
面向對象和麪向過程的簡單解釋:
-
面向過程:和你談業務。把所有的事情都談妥了,開始做項目。一整套項目做下來了,有需求要變,還得整個改變。
-
面向函數:一整套項目,分成了不同獨立的功能組,有需求要改變,只改變相應的功能組,不用改變整個業務。
-
面向對象:邊做業務,邊談需求,這樣就能夠避免上面的問題。
-
(三)創建和調用函數
3.1 創建函數(定義函數)
-
函數創建的組成:
-
關鍵字:def
-
函數名
-
括號
-
返回值
-
#定義函數def xx():
print('jacky')#執行函數xx()
3.2 函數的返回值
比如我們要定義幾個函數,這幾個函數就是用來實現幾個功能的,我們假定這個函數是發郵件的,那發完郵件我們要知道郵件發送的成功還是沒成功,我們需要這樣一個反饋,這是我們就需要函數的返回值
--沒有返回值def email():
print('我們要發郵件了')#調用函數email()
>>>我們要發郵件了
--設定返回值#那問題來了,我們調用的時候,怎麼知道郵件發送成功沒成功?是不是得給我返回一個值,告訴我們一下,否則我怎麼知道這個功能是不是實現了,這時就要用到關鍵字returndef email():
print('我們要發郵件了')
return'我告訴你了,郵件發送了,給你反饋了'
ret = email()#執行函數#函數return後面是什麼值,ret等於返回值
>>>我們要發郵件了
>>>我告訴你了,郵件發送了,給你反饋了
3.3 形式參數與實際參數
-
形式參數和實際參數比較抽象,這裏jacky舉個栗子,來給大家說清楚這兩個概念,假設讓A同學幫我取快遞,我們用代碼和函數的形式來模擬這個過程,來幫助大家理解Python中參數這個概念:
-
我們假設A的職業就是幫別人取快遞的,那我們要委託A給我們取快遞,我們就要給他一定憑證,是吧,有了這個憑證A才能取回我們的快遞;
-
3.3.1 第一階段的設計思路
def qukuaidi():
站起來
轉身
走到快遞的地點
-
我們粗略的用站起來,轉身,走到快遞的地點來模擬取快遞這一個過程
3.3.2 第二階段的設計思路
-
小A取快遞,不光是給你一個人取,不能是給你取一個就寫一個程序,給別人取,在重新再寫一遍這個程序是,是吧,這樣就太繁瑣了,所以呢,在我們創建取快遞這個函數的時候,我們要給函數括號裏一個參數,比如說是anyone,這個anyone可以是取快遞的憑證,比如說只有用你的手機號,或是你的身份證號才能取到你的快遞,那我們模擬的代碼就是:
def qukuaidi(anyone):
#站起來
#轉身
#走到快遞的地點
print(anyone)
return True #返回True就是反饋給我們取成功了
3.3.3 第三階段的設計思路
-
下面就是A要給我特定這個人拿快遞了,那上面那個參數,或者說是憑證anyone,就是特定的了,比如說是這個anyone,用我的名字jacky_zhuyuanlu作爲拿快遞的憑證,我們就可以調用上面我們設計的函數了
def qukuaidi(anyone):
#站起來
#轉身
#走到快遞的地點
print(anyone)
return True
qukuaidi('jacky_zhuyuanlu')
>>> jacky_zhuyuanlu
-
上面的代碼,我們在規範的改進一下:
def qukuaidi(anyone):
#站起來
#轉身
#走到快遞的地點
print(anyone)
return True
ret= qukuaidi('jacky_zhuyuanlu')
if ret:
print('成功')
>>> jacky_zhuyuanlu
>>> 成功
-
以上,anyone就叫形式參數,我們實際傳的值也就參數,jacky_zhuyuanlu就叫實際參數;
我們把上面的過程在引申一下:我們要設計這樣一個程序,就是A取快遞,只給jacky取,不給別人取,那我們的代碼就要這樣實現:
def qukuaidi(anyone):
#站起來
#轉身
#走到快遞的地點
#print(anyone)
if p == 'jacky_zhuyuanlu':
return True
else:
return False
ret2 = qukuaidi('andy')
if ret2:
print('成功')
else:
print('失敗')
>>> 失敗