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