摘要:在定義函數(shù)時(shí)給定的名稱稱作形參,在調(diào)用函數(shù)時(shí)你所提供給函數(shù)的值稱作實(shí)參。調(diào)用函數(shù)要調(diào)用一個(gè)函數(shù),需要知道函數(shù)的名稱和參數(shù)。默認(rèn)參數(shù)值可以有效幫助解決這一情況。是默認(rèn)參數(shù)定義默認(rèn)參數(shù)要牢記一點(diǎn)默認(rèn)參數(shù)必須指向不變對象。
關(guān)于數(shù)據(jù)科學(xué)在做什么,我們已經(jīng)在前兩篇文章中進(jìn)行了總結(jié),即專題概述和描述性統(tǒng)計(jì)分析。要進(jìn)行數(shù)據(jù)科學(xué)的探索,需要一個(gè)“好工具”,就是Python。從本篇開始,將總結(jié)學(xué)習(xí)Python的學(xué)習(xí)要點(diǎn)。
官方對 Python 的介紹如下:
“Python 是一款易于學(xué)習(xí)且功能強(qiáng)大的編程語言。 它具有高效率的數(shù)據(jù)結(jié)構(gòu),能夠簡單又有效地實(shí)現(xiàn)面向?qū)ο缶幊?。Python 簡潔的語法與動(dòng)態(tài)輸入之特性,加之其解釋性語言的本質(zhì),使得它成為一種在多種領(lǐng)域與絕大多數(shù)平臺(tái)都能進(jìn)行腳本編寫與應(yīng)用快速開發(fā)工作的理想語言?!?/pre>Python 名字的由來:
“Python 的創(chuàng)造者吉多·范羅蘇姆(Guido van Rossum)采用 BBC 電視節(jié)目《蒙提·派森的飛行馬戲團(tuán)(Monty Python"s Flying Circus,一譯巨蟒劇團(tuán))》的名字來為這門編程語言命名。盡管他本人并不特別喜歡蟒蛇這種通過在獵物身邊卷曲自己的身體以此來碾碎獵物身體來進(jìn)食的動(dòng)物?!?/pre> 基礎(chǔ) 字面常量字面常量(Literal Constants)是諸如 5、1.23 這樣的數(shù)字,或者是如“這是一串文本”或“This is a string”這樣的文本。它們是字面上的,所用的就是它字面意義上的值或是內(nèi)容。
數(shù)字數(shù)字主要分為兩種類型——整數(shù)(Integers)與浮點(diǎn)數(shù)(Floats)。如 2 和 3.23 或 52.3E-4,其中 E 表示 10 的冪。
字符串字符串(String)是字符(Characters)的序列(Sequence)。字符串是不可變的。
格式化方法
一個(gè)字符串可以使用某些特定的格式(Specification),隨后,format 方法將被調(diào)用,使用這一方法中與之相應(yīng)的參數(shù)替換這些格式。即將每個(gè)參數(shù)值替換至格式所在的位置。舉例如下:age = 14 name = "Tom" print("{0} is a {1} years old boy".format(name, age)) print("{0} is a good boy".format(name))”此外,可以指定更詳細(xì)的格式:
# 對于浮點(diǎn)數(shù) "0.333" 保留小數(shù)點(diǎn)(.)后三位 print("{0:.3f}".format(1.0/3)) # 使用下劃線填充文本,并保持文字處于中間位置 # 使用 (^) 定義 "___hello___"字符串長度為 11 print("{0:_^11}".format("hello")) # 基于關(guān)鍵詞輸出 "Jack was confirmed as captain for the rest of the season" print("{name} was confirmed as {position} for the rest of the season".format(name="Jack", position="captain"))每次調(diào)用print將在獨(dú)立的一行中打印,即總是以換行符 結(jié)尾,若有時(shí)需避免這一換行符,可以end指定其結(jié)尾方式。例如以空白結(jié)尾:
print("a", end=" ") print("b", end=" ") print("c")輸出a b c.
轉(zhuǎn)義序列
要輸入如What"s your name?這樣的字符串有兩種方式。一種是使用雙引號(hào)"What"s your name?",另一種需要用到反斜杠來指定單引號(hào)"What"s your name?"。其它需要轉(zhuǎn)義的字符同理,通過反斜杠來轉(zhuǎn)義,包括它自身。原始字符串
變量
在處理正則表達(dá)式時(shí),應(yīng)全程使用原始字符串,即在字符串前增加r或R來指定一個(gè)原始字符串。如"1"可以通過"r1"來實(shí)現(xiàn)。變量的值是可以變化的,即可以用變量儲(chǔ)存任何東西,只需通過一些方式訪問這些變量。
標(biāo)識(shí)符命名標(biāo)識(shí)符(Identifiers)是為某些東西提供的給定名稱。變量是標(biāo)識(shí)符的一個(gè)例子。命名規(guī)則如下:
第一個(gè)字符必須是字母表中的字母(大寫 ASCII 字符或小寫 ASCII 字符或 Unicode 字符)或下劃線(_)。
標(biāo)識(shí)符的其它部分可以由字符(大寫 ASCII 字符或小寫 ASCII 字符或 Unicode 字符)、下劃線(_)、數(shù)字(0~9)組成。
標(biāo)識(shí)符名稱區(qū)分大小寫。
數(shù)據(jù)類型變量可以將各種形式的值保存為不同的數(shù)據(jù)類型(Data Type)?;镜念愋褪?b>數(shù)字與字符串,在面向?qū)ο缶幊讨袑⒔榻B如何通過類來創(chuàng)建我們自己的類型。
對象Python 是強(qiáng)(Strongly)面向?qū)ο蟮?,因?yàn)樗械囊磺卸际菍ο螅?包括數(shù)字、字符串與函數(shù)。
運(yùn)算符與表達(dá)式運(yùn)算符
加+
減-
乘*
乘方**
除/
整除//
取模%
左移<<
右移>>
按位與&
按位或|
按位異或^
按位取反~
小于<
大于>
小于等于<=
大于等于>=
等于==
不等于!=
布爾“非”not
布爾“與”and
布爾“或”or
表達(dá)式
在下面的例子中:length = 5 breadth = 2 area = length * breadth print("Area is", area) print("Perimeter is", 2 * (length + breadth))我們將表達(dá)式 length * breadth 的結(jié)果存儲(chǔ)在變量 area 中并將其通過使用 print 函數(shù)打印出來。在第二種情況中,我們直接在 print 函數(shù)中使用了表達(dá)式 2 * (length + breadth) 的值。
控制流在 Python 中有三種控制流語句,if、for和while。
條件
if age >= 18:注意不要少寫了冒號(hào):。
elif是else if的縮寫,完全可以有多個(gè)elif,所以if語句的完整形式就是:
if <條件判斷1>: <執(zhí)行1> elif <條件判斷2>: <執(zhí)行2> elif <條件判斷3>: <執(zhí)行3> else: <執(zhí)行4>if語句執(zhí)行有個(gè)特點(diǎn),它是從上往下判斷,如果在某個(gè)判斷上是True,把該判斷對應(yīng)的語句執(zhí)行后,就忽略掉剩下的elif和else。
if判斷條件還可以簡寫,比如寫:
if x: print("True")只要x是非零數(shù)值、非空字符串、非空list等,就判斷為True,否則為False。
循環(huán)
Python 的循環(huán)有兩種。第一種是for...in循環(huán),依次把list或tuple中的每個(gè)元素迭代出來
所以for x in ...循環(huán)就是把每個(gè)元素代入變量x,然后執(zhí)行縮進(jìn)塊的語句。
Python 提供一個(gè)range()函數(shù),可以生成一個(gè)整數(shù)序列,再通過list()函數(shù)可以轉(zhuǎn)換為list。比如range(5)生成的序列是從 0 開始小于 5 的整數(shù):
計(jì)算:
第二種循環(huán)是while循環(huán):
在循環(huán)中,break語句可以提前退出循環(huán)。
在循環(huán)過程中,也可以通過continue語句,跳過當(dāng)前的這次循環(huán),直接開始下一次循環(huán)。continue的作用是提前結(jié)束本輪循環(huán),并直接開始下一輪循環(huán)。
要特別注意,不要濫用break和continue語句。break和continue會(huì)造成代碼執(zhí)行邏輯分叉過多,容易出錯(cuò)。大多數(shù)循環(huán)并不需要用到break和continue語句,上面的兩個(gè)例子,都可以通過改寫循環(huán)條件或者修改循環(huán)邏輯,去掉break和continue語句。
有些時(shí)候,如果代碼寫得有問題,會(huì)讓程序陷入“死循環(huán)”,也就是永遠(yuǎn)循環(huán)下去。這時(shí)可以用Ctrl+C退出程序,或者強(qiáng)制結(jié)束 Python進(jìn)程。
函數(shù) 函數(shù)是什么函數(shù)(Functions)是指可重復(fù)使用的程序片段。它們允許你為某個(gè)代碼塊賦予名字,允許你通過這一特殊的名字在你的程序任何地方來運(yùn)行代碼塊,并可重復(fù)任何次數(shù)。這就是所謂的調(diào)用(Calling)函數(shù)。
在 Python 中,函數(shù)可以通過關(guān)鍵字 def 來定義。這一關(guān)鍵字后跟一個(gè)函數(shù)的標(biāo)識(shí)符名稱,再跟一對圓括號(hào),其中可以包括一些變量的名稱,再以冒號(hào)結(jié)尾,結(jié)束這一行。隨后而來的語句塊是函數(shù)的一部分。
在定義函數(shù)時(shí)給定的名稱稱作“形參”(Parameters),在調(diào)用函數(shù)時(shí)你所提供給函數(shù)的值稱作“實(shí)參”(Arguments)。
調(diào)用函數(shù)要調(diào)用一個(gè)函數(shù),需要知道函數(shù)的名稱和參數(shù)。函數(shù)的參數(shù)只是輸入到函數(shù)之中,以便我們可以傳遞不同的值給它,并獲得相應(yīng)的結(jié)果。
Python 內(nèi)置的常用函數(shù)包括數(shù)據(jù)類型轉(zhuǎn)換函數(shù),比如int()函數(shù)可以把其他數(shù)據(jù)類型轉(zhuǎn)換為整數(shù)。用input()讀取用戶的輸入:
因?yàn)?b>input()返回的數(shù)據(jù)類型是str,str不能直接和整數(shù)比較,必須先把str轉(zhuǎn)換成整數(shù)。Python 提供了int()函數(shù)來完成這件事情:
函數(shù)名其實(shí)就是指向一個(gè)函數(shù)對象的引用,完全可以把函數(shù)名賦給一個(gè)變量,相當(dāng)于給這個(gè)函數(shù)起了一個(gè)“別名”:
如果函數(shù)調(diào)用出錯(cuò),一定要學(xué)會(huì)看錯(cuò)誤信息。
定義函數(shù)在 Python 中,定義一個(gè)函數(shù)要使用def語句,依次寫出函數(shù)名、括號(hào)、括號(hào)中的參數(shù)和冒號(hào):,然后,在縮進(jìn)塊中編寫函數(shù)體,函數(shù)的返回值用return語句返回。
在 Python 交互環(huán)境中定義函數(shù)時(shí),注意 Python 會(huì)出現(xiàn)...的提示。函數(shù)定義結(jié)束后需要按兩次回車重新回到>>>提示符下:
如果你已經(jīng)把my_abs()的函數(shù)定義保存為abstest.py文件了,那么,可以在該文件的當(dāng)前目錄下啟動(dòng)Python 解釋器,用from abstest import my_abs來導(dǎo)入my_abs()函數(shù),注意abstest是文件名(不含.py擴(kuò)展名)。
定義一個(gè)什么事也不做的空函數(shù),可以用pass語句:
def nop(): passpass語句什么都不做,實(shí)際上它可以用作為占位符,比如現(xiàn)在還沒想好怎么寫函數(shù)的代碼,就可以先放一個(gè)pass,讓代碼能運(yùn)行起來。
pass還可以用在其他語句里,比如:
if age >= 18: pass缺少了pass,代碼運(yùn)行就會(huì)有語法錯(cuò)誤。
數(shù)據(jù)類型檢查可以用內(nèi)置函數(shù)isinstance()實(shí)現(xiàn)。
Python 的函數(shù)返回多值其實(shí)就是返回一個(gè)tuple;Python 函數(shù)返回的是單一值時(shí),返回值仍然是一個(gè)tuple。但是,在語法上,返回一個(gè)tuple可以省略括號(hào),而多個(gè)變量可以同時(shí)接收一個(gè)tuple,按位置賦給對應(yīng)的值。函數(shù)可以同時(shí)返回多個(gè)值,但其實(shí)就是一個(gè)tuple。
函數(shù)執(zhí)行完畢也沒有return語句時(shí),自動(dòng)return None。
函數(shù)的參數(shù)Python 的函數(shù)定義非常簡單,但靈活度卻非常大。除了正常定義的必選參數(shù)外,還可以使用默認(rèn)參數(shù)、可變參數(shù)和關(guān)鍵字參數(shù),使得函數(shù)定義出來的接口,不但能處理復(fù)雜的參數(shù),還可以簡化調(diào)用者的代碼。
位置參數(shù):
power(x, n)函數(shù)有兩個(gè)參數(shù):x和n,這兩個(gè)參數(shù)都是位置參數(shù),調(diào)用函數(shù)時(shí),傳入的兩個(gè)值按照位置順序依次賦給參數(shù)x和n。
默認(rèn)參數(shù):
對于一些函數(shù)來說,你可能為希望使一些參數(shù)可選并使用默認(rèn)的值,以避免用戶不想為他們提供值的情況。默認(rèn)參數(shù)值可以有效幫助解決這一情況。你可以通過在函數(shù)定義時(shí)附加一個(gè)賦值運(yùn)算符=來為參數(shù)指定默認(rèn)參數(shù)值。要注意到,默認(rèn)參數(shù)值應(yīng)該是常數(shù)。更確切地說,默認(rèn)參數(shù)值應(yīng)該是不可變的。n = 2 是默認(rèn)參數(shù)
定義默認(rèn)參數(shù)要牢記一點(diǎn):默認(rèn)參數(shù)必須指向不變對象。且只有那些位于參數(shù)列表末尾的參數(shù)才能被賦予默認(rèn)參數(shù)值,意即在函數(shù)的參數(shù)列表中擁有默認(rèn)參數(shù)值的參數(shù)不能位于沒有默認(rèn)參數(shù)值的參數(shù)之前。
?可變參數(shù):
有時(shí)你可能想定義的函數(shù)里面能夠有任意數(shù)量的變量,也就是參數(shù)數(shù)量是可變的,這可以通過使用星號(hào)來實(shí)現(xiàn)。即傳入的參數(shù)個(gè)數(shù)是可變的。
我們聲明一個(gè)諸如 *param 的星號(hào)參數(shù)時(shí),從此處開始直到結(jié)束的所有位置參數(shù)(Positional Arguments)都將被收集并匯集成一個(gè)稱為param的元組(Tuple)。
類似地,當(dāng)我們聲明一個(gè)諸如 **param 的雙星號(hào)參數(shù)時(shí),從此處開始直至結(jié)束的所有關(guān)鍵字參數(shù)都將被收集并匯集成一個(gè)名為 param 的字典(Dictionary)。
關(guān)鍵字參數(shù):
如果你有一些具有許多參數(shù)的函數(shù),而你又希望只對其中的一些進(jìn)行指定,那么你可以通過命名它們來給這些參數(shù)賦值——這就是關(guān)鍵字參數(shù)(Keyword Arguments)——我們使用命名(關(guān)鍵字)而非位置來指定函數(shù)中的參數(shù)。關(guān)鍵字參數(shù)允許你傳入 0 個(gè)或任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict。
舉個(gè)例子,擴(kuò)展函數(shù)的功能。試想你正在做一個(gè)用戶注冊的功能,除了用戶名和年齡是必填項(xiàng)外,其他都是可選項(xiàng),利用關(guān)鍵字參數(shù)來定義這個(gè)函數(shù)就能滿足注冊的需求。
和可變參數(shù)類似,也可以先組裝出一個(gè)dict,然后,把該dict轉(zhuǎn)換為關(guān)鍵字參數(shù)傳進(jìn)去:
命名關(guān)鍵字參數(shù):
如果要限制關(guān)鍵字參數(shù)的名字,就可以用命名關(guān)鍵字參數(shù),例如,只接收city和job作為關(guān)鍵字參數(shù)。這種方式定義函數(shù)并調(diào)用:和關(guān)鍵字參數(shù)**kw不同,命名關(guān)鍵字參數(shù)需要一個(gè)特殊分隔符*,*后面的參數(shù)被視為命名關(guān)鍵字參數(shù)。
命名關(guān)鍵字參數(shù)必須傳入?yún)?shù)名,這和位置參數(shù)不同。如果沒有傳入?yún)?shù)名,調(diào)用將報(bào)錯(cuò)。
使用命名關(guān)鍵字參數(shù)時(shí),要特別注意,如果沒有可變參數(shù),就必須加一個(gè)*作為特殊分隔符。如果缺少*,Python 解釋器將無法識(shí)別位置參數(shù)和命名關(guān)鍵字參數(shù),即缺少 *,city和job被視為位置參數(shù)。
參數(shù)組合:
在 Python 中定義函數(shù),可以用必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù),這 5 種參數(shù)都可以組合使用。但是參數(shù)定義的順序必須是:必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)。雖然可以組合多達(dá) 5 種參數(shù),但不要同時(shí)使用太多的組合,否則函數(shù)接口的可理解性很差。
通過一個(gè)tuple和dict,你也可以調(diào)用函數(shù):
對于任意函數(shù),都可以通過類似func(*args, **kw)的形式調(diào)用它,無論它的參數(shù)是如何定義的。
遞歸函數(shù)如果一個(gè)函數(shù)在內(nèi)部調(diào)用自身本身,這個(gè)函數(shù)就是遞歸函數(shù)。理論上,所有的遞歸函數(shù)都可以寫成循環(huán)的方式,但循環(huán)的邏輯不如遞歸清晰。
使用遞歸函數(shù)需要注意防止棧溢出。在計(jì)算機(jī)中,函數(shù)調(diào)用是通過棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,每當(dāng)進(jìn)入一個(gè)函數(shù)調(diào)用,棧就會(huì)加一層棧幀,每當(dāng)函數(shù)返回,棧就會(huì)減一層棧幀。由于棧的大小不是無限的,所以,遞歸調(diào)用的次數(shù)過多,會(huì)導(dǎo)致棧溢出。
通過下面的代碼可以查看你的電腦最大算到多少:
解決遞歸調(diào)用棧溢出的方法是通過尾遞歸優(yōu)化,事實(shí)上尾遞歸和循環(huán)的效果是一樣的,所以,把循環(huán)看成是一種特殊的尾遞歸函數(shù)也是可以的。
尾遞歸是指,在函數(shù)返回的時(shí)候,調(diào)用自身本身,并且,return語句不能包含表達(dá)式。這樣,編譯器或者解釋器就可以把尾遞歸做優(yōu)化,使遞歸本身無論調(diào)用多少次,都只占用一個(gè)棧幀,不會(huì)出現(xiàn)棧溢出的情況。
要改成尾遞歸方式,需要多一點(diǎn)代碼,主要是要把每一步的乘積傳入到遞歸函數(shù)中。Python 標(biāo)準(zhǔn)的解釋器沒有針對尾遞歸做優(yōu)化,任何遞歸函數(shù)都存在棧溢出的問題。
參考鏈接:
簡明Python教程(電子書可閱讀)
廖雪峰Python教程如有不足,歡迎指正。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42167.html
摘要:新的稱為子類,而被繼承的稱為基類父類或超類。繼承最大的好處是子類獲得了父類的全部功能。在繼承關(guān)系中,如果一個(gè)實(shí)例的數(shù)據(jù)類型是某個(gè)子類,那它的數(shù)據(jù)類型也可以被看做是父類。 在上一篇中我們介紹了模塊和數(shù)據(jù)結(jié)構(gòu),這一篇將介紹面向?qū)ο缶幊獭? 面向?qū)ο缶幊?面向?qū)ο缶幊獭狾bject Oriented Programming,簡稱 OOP,是一種程序設(shè)計(jì)思想。OOP 把對象作為程序的基本單元...
摘要:提供了使我們能夠快速便捷地處理結(jié)構(gòu)化數(shù)據(jù)的大量數(shù)據(jù)結(jié)構(gòu)和函數(shù)。結(jié)構(gòu)化數(shù)據(jù),例如多維數(shù)據(jù)矩陣表格行數(shù)據(jù),其中各列可能是不同的類型字符串?dāng)?shù)值日期等?;A(chǔ)數(shù)組和矢量計(jì)算高性能科學(xué)計(jì)算和數(shù)據(jù)分析的基礎(chǔ)包。 本篇內(nèi)容為整理《利用Python進(jìn)行數(shù)據(jù)分析》,博主使用代碼為 Python3,部分內(nèi)容和書本有出入。 利用 Python 進(jìn)行科學(xué)計(jì)算的實(shí)用指南。本書重點(diǎn)介紹了用于高效解決各種數(shù)據(jù)分析問...
摘要:有一些表示常見圖形的對象稱為塊,完整的集合位于。中的繪圖函數(shù)在中,有行標(biāo)簽列標(biāo)簽分組信息。密度圖通過計(jì)算可能會(huì)產(chǎn)生觀測數(shù)據(jù)的連續(xù)概率分布的估計(jì)而產(chǎn)生的。在探索式數(shù)據(jù)分析工作中,同時(shí)觀察一組變量的散布圖是很有意義的。 我們在上一篇介紹了 pandas,本篇介紹 matplotlib。 繪圖和可視化 一個(gè)用于創(chuàng)建出版質(zhì)量圖表的桌面繪圖包。 Matplotlib API入門 Figure ...
閱讀 1601·2021-09-26 09:46
閱讀 2691·2021-09-07 09:59
閱讀 2784·2021-09-07 09:59
閱讀 1916·2019-08-30 14:20
閱讀 963·2019-08-26 13:39
閱讀 3204·2019-08-26 12:24
閱讀 801·2019-08-26 11:55
閱讀 1243·2019-08-23 16:49