阿里云天池 Python训练营Task1:从变量到异常处理
本學(xué)習(xí)筆記為阿里云天池龍珠計(jì)劃Python訓(xùn)練營(yíng)的學(xué)習(xí)內(nèi)容,學(xué)習(xí)鏈接為:https://tianchi.aliyun.com/specials/promotion/aicamppython?spm=5176.22758685.J_6770933040.1.6f103da1tESyzu
目錄
一、學(xué)習(xí)知識(shí)點(diǎn)概要
二、學(xué)習(xí)內(nèi)容
I.變量、運(yùn)算符與數(shù)據(jù)類型
II.位運(yùn)算
III.條件語(yǔ)句
IV.循環(huán)語(yǔ)句?
V.異常處理
三、學(xué)習(xí)問(wèn)題與解答
四、學(xué)習(xí)思考與總結(jié)
一、學(xué)習(xí)知識(shí)點(diǎn)概要
Python 是一種通用編程語(yǔ)言,其在科學(xué)計(jì)算和機(jī)器學(xué)習(xí)領(lǐng)域具有廣泛的應(yīng)用。
本次學(xué)習(xí)包括以下內(nèi)容:
- 變量、運(yùn)算符與數(shù)據(jù)類型
- 位運(yùn)算
- 條件語(yǔ)句
- 循環(huán)語(yǔ)句
- 異常處理
二、學(xué)習(xí)內(nèi)容
I.變量、運(yùn)算符與數(shù)據(jù)類型
1.注釋
在Python中,#表示注釋,作用于整行,''' '''或""" """表示區(qū)間注釋,在三個(gè)引號(hào)之間的信息為注釋,例如:
""" 多行注釋 三個(gè)雙引號(hào) """ print('Hello World!') #單行注釋''' 多行注釋 三個(gè)單引號(hào) '''2.位運(yùn)算符
| 運(yùn)算符 | 含義 | 功能 |
| & | 按位與 | 如果兩個(gè)相應(yīng)的二進(jìn)制位都為1,則該位的結(jié)果值為1;否則為0 |
| | | 按位或 | 兩個(gè)相應(yīng)的二進(jìn)制位中只要有一個(gè)為1,該位的結(jié)果值為1 |
| ^ | 按位異或 | 若參加運(yùn)算的兩個(gè)二進(jìn)制位同號(hào)則結(jié)果為0(假)異號(hào)則結(jié)果為1(真) |
| ~ | 取反 | ~是一個(gè)單目(元)運(yùn)算符,用來(lái)對(duì)一個(gè)二進(jìn)制數(shù)按位取反,即將0變1,將1變0 |
| >> | 左移 | 左移運(yùn)算符是用來(lái)將一個(gè)數(shù)的各二進(jìn)制位全部左移n位,右補(bǔ)0 |
| << | 右移 | 表示將a的各二進(jìn)制位右移n位,移到右端的低位被舍棄,對(duì)無(wú)符號(hào)數(shù),高位補(bǔ)0 |
?
對(duì)位運(yùn)算符的運(yùn)用見(jiàn)后文“位運(yùn)算”部分
3.三目運(yùn)算符
對(duì)分支語(yǔ)句,例如:
a=2 b=5 if a>b:value=a else:value=b print(value) #輸出結(jié)果為5?在Python中可以運(yùn)用更簡(jiǎn)潔的寫(xiě)法:
a=2 b=5 value=a if a>b else b print(value)?使用 if else 實(shí)現(xiàn)三目運(yùn)算符(條件運(yùn)算符)的格式如下:
exp1 if contion else exp2
condition 是判斷條件,exp1 和 exp2 是兩個(gè)表達(dá)式。如果 condition 成立(結(jié)果為真),就執(zhí)行 exp1,并把 exp1 的結(jié)果作為整個(gè)表達(dá)式的結(jié)果;如果 condition 不成立(結(jié)果為假),就執(zhí)行 exp2,并把 exp2 的結(jié)果作為整個(gè)表達(dá)式的結(jié)果。
4.其他運(yùn)算符
| 運(yùn)算符 | 名稱 | 示例 |
| in | 存在 | 1 in [1,2,3] |
| not in | 不存在 | 4 not in [1,2,3] |
| is | 是 | 'hello' is 'hello' |
| is not | 不是 | 'hello' is not 'Hello' |
運(yùn)算結(jié)果為布爾型數(shù)據(jù),以上示例結(jié)果都為T(mén)rue。
注:
- 比較的兩個(gè)變量,指向的都是地址不可變的類型(str等),那么is,is not 和 ==,!= 是完全等價(jià)的。
- 對(duì)比的兩個(gè)變量,指向的是地址可變的類型(list,dict,tuple等),則兩者是有區(qū)別的。
5.基本數(shù)據(jù)類型與轉(zhuǎn)換
基本數(shù)據(jù)類型有整形(int)、浮點(diǎn)型(float)、布爾型(boolean),可通過(guò)type()方法查看對(duì)象的數(shù)據(jù)類型,還可以用isinstance()方法查看兩種數(shù)據(jù)的類型是否相同。
- ? ?整形(int)即為內(nèi)容為整數(shù)的數(shù)據(jù),如:5,112,-32等;
- ? ?浮點(diǎn)型(float)為含有小數(shù)點(diǎn)的數(shù)據(jù),如:1.0,2.3e-07等;
- ? ?布爾型(boolean)數(shù)據(jù)只能取兩個(gè)值,True和False。但布爾型的數(shù)據(jù)參與數(shù)字運(yùn)算時(shí),用1和0分別代表True和False。
如果我們想保留浮點(diǎn)型的小數(shù)點(diǎn)后n位,可以引入decimal包里的Decimal對(duì)象和getcontext()方法來(lái)實(shí)現(xiàn),Decimal對(duì)象的默認(rèn)精度為28位,例如:
import decimal from decimal import Decimal x=Decimal(2)/Decimal(7) print(x)#結(jié)果為0.2857142857142857142857142857,有28位小數(shù)decimal.getcontext().prec=5 x=Decimal(2)/Decimal(7) print(x)#結(jié)果為0.28571,有5位小數(shù)?創(chuàng)建布爾型變量除了直接給變量賦值和用運(yùn)算符之外,還可以用bool(x)方法創(chuàng)建。其中x可以是
- 基本類型:整型、浮點(diǎn)型、布爾型
- 容器類型:字符串、元組、列表、字典和集合
當(dāng)x為整形或浮點(diǎn)型時(shí),若x=0或x=0.0,bool(x)就為False,否則為T(mén)rue;
當(dāng)x為容器類型的數(shù)據(jù)時(shí),若x為空,bool(x)為False,若x 為非空,bool(x)為T(mén)rue。
類型轉(zhuǎn)換
- 轉(zhuǎn)換為整型,用int(x)
- 轉(zhuǎn)換為浮點(diǎn)型,用float(x)
- 轉(zhuǎn)換為字符串,用str(object=' ')
II.位運(yùn)算
位運(yùn)算是直接對(duì)整數(shù)在二進(jìn)制中進(jìn)行操作。我們的電腦電路設(shè)計(jì)都是基于二進(jìn)制的,所以在二進(jìn)制層面效率很高。通常位運(yùn)算多用在對(duì)程序效率要求很高的場(chǎng)景。
1.原碼、反碼、補(bǔ)碼
二進(jìn)制有三種不同的表示形式:原碼、反碼和補(bǔ)碼,計(jì)算機(jī)內(nèi)部用補(bǔ)碼表示。
- 原碼:就是對(duì)象的二進(jìn)制表示。原碼的首位為符號(hào)位,用于表示數(shù)據(jù)的正負(fù),當(dāng)對(duì)象為非負(fù)數(shù)時(shí)符號(hào)位為0,負(fù)數(shù)時(shí)符號(hào)位為1。取該整數(shù)的絕對(duì)值的二進(jìn)制,再加上符號(hào)位。原碼只是為了讓我們看二進(jìn)制更直觀,直接看出正負(fù)數(shù)和比較大小。但原碼不是計(jì)算機(jī)保存的二進(jìn)制,所以不能直接參與計(jì)算。例:
-
整數(shù) 絕對(duì)值 絕對(duì)值的二進(jìn)制值 原碼 5 5 0000101 00000101 -5 5 0000101 10000101 - 反碼:反碼主要是針對(duì)負(fù)數(shù)的處理,非負(fù)數(shù)的反碼就是原碼。在原碼的基礎(chǔ)上,符號(hào)位不變,其他數(shù)值位取反,即把1變成0,把0變成1。反碼是為了在計(jì)算機(jī)中存儲(chǔ)二進(jìn)制,但非真正的二進(jìn)制值,所以也不直接參與計(jì)算。例如:
-
整數(shù) 絕對(duì)值 原碼 反碼 5 5 00000101 00000101 -5 5 10000101 11111010 - 補(bǔ)碼:補(bǔ)碼主要也是針對(duì)負(fù)數(shù)。非負(fù)數(shù)不變,而負(fù)數(shù)是在反碼的基礎(chǔ)上加1。
-
整數(shù) 絕對(duì)值 反碼 補(bǔ)碼 5 5 00000101 00000101 -5 5 11111010 11111011
2.按位運(yùn)算
上文提到的位運(yùn)算符就是對(duì)兩個(gè)數(shù)的補(bǔ)碼直接進(jìn)行操作。主要是在對(duì)應(yīng)的位置上進(jìn)行邏輯運(yùn)算。以5和3為例:
| 運(yùn)算符 | & | | | ^ | ~ | >> | << |
| 表達(dá)式 | 5&3 | 5|3 | 5^3 | ~5 | 5<<2 | 3>>1 |
| 二進(jìn)制表示 | 00000101 & 00000011 | 00000101 | 00000011 | 00000101 ^ 00000011 | ~00000101 | 00000101<<2 | 00000011>>1 |
| 運(yùn)算結(jié)果 | 00000001 1 | 00000111 7 | 00000110 6 | 11111010 -6 | 00010100 20 | 00000001 1 |
?
3.利用位運(yùn)算實(shí)現(xiàn)快速計(jì)算
- 通過(guò) <<,>>?快速計(jì)算2的倍數(shù)問(wèn)題:
- ?通過(guò) ^ 快速交換兩個(gè)整數(shù):
- ?通過(guò) a&(-a) 快速獲取a的最后為 1 位置的整數(shù)
III.條件語(yǔ)句
Python的條件語(yǔ)句為if-elif-else語(yǔ)句,與其他語(yǔ)言的用法相似,此處不多贅述。
assert關(guān)鍵詞
這個(gè)關(guān)鍵詞我們稱之為“斷言”,當(dāng)這個(gè)關(guān)鍵詞后邊的條件為 False 時(shí),程序自動(dòng)崩潰并拋出AssetionError的異常。在進(jìn)行單元測(cè)試時(shí),可以用來(lái)在程序中置入檢查點(diǎn),只有條件為 True 才能讓程序正常工作。
a=5 b=6 assert a>b#AssertionErrorIV.循環(huán)語(yǔ)句?
Python中的While循環(huán)和For循環(huán)與其他語(yǔ)言中的用法相似,此處只寫(xiě)一些不同的地方。
1.while - else循環(huán)
while - else循環(huán)的結(jié)構(gòu)如下:
while? 布爾表達(dá)式:代碼塊 else:代碼塊當(dāng)while循環(huán)正常執(zhí)行完的情況下,執(zhí)行else輸出,如果while循環(huán)中執(zhí)行了跳出循環(huán)的語(yǔ)句(如break),將不執(zhí)行else代碼塊的內(nèi)容。
2.for - else循環(huán)
與while - else循環(huán)類似,當(dāng)for循環(huán)正常執(zhí)行完的情況下,執(zhí)行else輸出,如果在循環(huán)途中執(zhí)行了跳出循環(huán)的語(yǔ)句,則不會(huì)執(zhí)行else的內(nèi)容。例如:
for 循環(huán)變量 in 可迭代對(duì)象:代碼塊 else:代碼塊3.range()方法
range() 返回的是一個(gè)可迭代對(duì)象(類型是對(duì)象),而不是列表類型, 所以打印(print)的時(shí)候不會(huì)打印列表。
range(start=0,stop,step=1),range()方法有三個(gè)參數(shù):start,stop,step
- start: 計(jì)數(shù)從 start 開(kāi)始。默認(rèn)是從 0 開(kāi)始。例如range(5)等價(jià)于range(0, 5);
- stop: 計(jì)數(shù)到 stop 結(jié)束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]沒(méi)有5
- step:步長(zhǎng),默認(rèn)為1。例如:range(0, 5) 等價(jià)于 range(0, 5, 1)
4.enumerate()方法
enumerate(sequence,start=0),參數(shù)start可省略,默認(rèn)為0
- sequence:一個(gè)序列、迭代器或其他支持迭代對(duì)象。
- start:下標(biāo)起始位置。
- 返回 enumerate(枚舉) 對(duì)象
enumerate(X)不僅返回了X中的元素,還順便給該元素一個(gè)索引值 (默認(rèn)從 0 開(kāi)始)。此外,用enumerate(X,j)還可以確定索引起始值為j
enumerate()方法可與for循環(huán)配合使用:
seq=['one', 'two', 'three'] for i, element in enumerate(seq):print(i, element)''' 0 one 1 two 2 three '''?5.continue語(yǔ)句
continue語(yǔ)句用于終止本輪循環(huán)并開(kāi)始下一輪循環(huán),如:
for i in range(1,11):if i != 10:print('i不是10')continueprint('i是10')''' i不是10 i不是10 i不是10 i不是10 i不是10 i不是10 i不是10 i不是10 i不是10 i是10 '''6.pass語(yǔ)句
pass語(yǔ)句的意思是“跳過(guò)”,如果你在需要有語(yǔ)句的地方不寫(xiě)任何語(yǔ)句,那么解釋器會(huì)提示出錯(cuò),pass語(yǔ)句就是用來(lái)解決這個(gè)問(wèn)題的。其作用是為了保持程序結(jié)構(gòu)的完整性。盡管pass語(yǔ)句不做任何操作,但如果暫時(shí)不確定要在一個(gè)位置放上什么樣的代碼,可以先放置一個(gè)pass語(yǔ)句,讓代碼可以正常運(yùn)行。
7.推導(dǎo)式
- 列表推導(dǎo)式
- ?元組推導(dǎo)式
- 字典推導(dǎo)式
- 集合推導(dǎo)式
V.異常處理
異常就是運(yùn)行期檢測(cè)到的錯(cuò)誤。計(jì)算機(jī)語(yǔ)言針對(duì)可能出現(xiàn)的錯(cuò)誤定義了異常類型,某種錯(cuò)誤引發(fā)對(duì)應(yīng)的異常時(shí),異常處理程序?qū)⒈粏?dòng),從而恢復(fù)程序的正常運(yùn)行。
1.Python標(biāo)準(zhǔn)異常總結(jié)
- BaseException:所有異常的?基類
- Exception:常規(guī)異常的?基類
- StandardError:所有的內(nèi)建標(biāo)準(zhǔn)異常的基類
- ArithmeticError:所有數(shù)值計(jì)算異常的基類
- FloatingPointError:浮點(diǎn)計(jì)算異常
- OverflowError:數(shù)值運(yùn)算超出最大限制
- ZeroDivisionError:除數(shù)為零
- AssertionError:斷言語(yǔ)句(assert)失敗
- AttributeError:嘗試訪問(wèn)未知的對(duì)象屬性
- EOFError:沒(méi)有內(nèi)建輸入,到達(dá)EOF標(biāo)記
- EnvironmentError:操作系統(tǒng)異常的基類
- IOError:輸入/輸出操作失敗
- OSError:操作系統(tǒng)產(chǎn)生的異常(例如打開(kāi)一個(gè)不存在的文件)
- WindowsError:系統(tǒng)調(diào)用失敗
- ImportError:導(dǎo)入模塊失敗的時(shí)候
- KeyboardInterrupt:用戶中斷執(zhí)行
- LookupError:無(wú)效數(shù)據(jù)查詢的基類
- IndexError:索引超出序列的范圍
- KeyError:字典中查找一個(gè)不存在的關(guān)鍵字
- MemoryError:內(nèi)存溢出(可通過(guò)刪除對(duì)象釋放內(nèi)存)
- NameError:嘗試訪問(wèn)一個(gè)不存在的變量
- UnboundLocalError:訪問(wèn)未初始化的本地變量
- ReferenceError:弱引用試圖訪問(wèn)已經(jīng)垃圾回收了的對(duì)象
- RuntimeError:一般的運(yùn)行時(shí)異常
- NotImplementedError:尚未實(shí)現(xiàn)的方法
- SyntaxError:語(yǔ)法錯(cuò)誤導(dǎo)致的異常
- IndentationError:縮進(jìn)錯(cuò)誤導(dǎo)致的異常
- TabError:Tab和空格混用
- SystemError:一般的解釋器系統(tǒng)異常
- TypeError:不同類型間的無(wú)效操作
- ValueError:傳入無(wú)效的參數(shù)
- UnicodeError:Unicode相關(guān)的異常
- UnicodeDecodeError:Unicode解碼時(shí)的異常
- UnicodeEncodeError:Unicode編碼錯(cuò)誤導(dǎo)致的異常
- UnicodeTranslateError:Unicode轉(zhuǎn)換錯(cuò)誤導(dǎo)致的異常
2.Python標(biāo)準(zhǔn)警告總結(jié)
- Warning:警告的基類
- DeprecationWarning:關(guān)于被棄用的特征的警告
- FutureWarning:關(guān)于構(gòu)造將來(lái)語(yǔ)義會(huì)有改變的警告
- UserWarning:用戶代碼生成的警告
- PendingDeprecationWarning:關(guān)于特性將會(huì)被廢棄的警告
- RuntimeWarning:可疑的運(yùn)行時(shí)行為(runtime behavior)的警告
- SyntaxWarning:可疑語(yǔ)法的警告
- ImportWarning:用于在導(dǎo)入模塊過(guò)程中觸發(fā)的警告
- UnicodeWarning:與Unicode相關(guān)的警告
- BytesWarning:與字節(jié)或字節(jié)碼相關(guān)的警告
- ResourceWarning:與資源使用相關(guān)的警告
3.try - except語(yǔ)句
''' try - except語(yǔ)句結(jié)構(gòu)如下:try:檢測(cè)范圍 except Exception[as reason]:出現(xiàn)異常后的處理代碼 ''' try:f = open('test.txt')print(f.read())f.close() except OSError:print('打開(kāi)文件出錯(cuò)')# 打開(kāi)文件出錯(cuò)- 首先執(zhí)行try子句(即“檢測(cè)范圍”那塊代碼)
- 若無(wú)異常發(fā)生,則忽視except語(yǔ)句
- 若發(fā)生異常,那try子句的余下部分會(huì)被忽略。同時(shí)如果異常的類型和except后的異常類型相同,則會(huì)執(zhí)行except子句
- 如果一個(gè)異常沒(méi)有與任何的except匹配,這個(gè)異常將會(huì)被傳遞到上層的try中
- 一個(gè)try語(yǔ)句可能包含多個(gè)except子句,分別來(lái)處理不同的特定的異常。最多只有一個(gè)分支會(huì)被執(zhí)行
- 一個(gè)except子句可以同時(shí)處理多個(gè)異常,這些異常將被放在一個(gè)括號(hào)里成為一個(gè)元組。
4.try - except - finally語(yǔ)句
無(wú)論try子句執(zhí)行時(shí)有沒(méi)有發(fā)生異常,最終都會(huì)執(zhí)行finally子句。如果執(zhí)行try子句時(shí)發(fā)生異常,且沒(méi)有任何except語(yǔ)句把異常攔截的話,會(huì)先執(zhí)行finally子句再拋出異常。結(jié)構(gòu)為:
try:檢測(cè)范圍 except:出現(xiàn)異常后的處理代碼 finally:無(wú)論結(jié)果如何都執(zhí)行這塊代碼5.try - except - else語(yǔ)句
如果在執(zhí)行try子句時(shí)沒(méi)有發(fā)生異常,則執(zhí)行else子句。結(jié)構(gòu)為:
try:檢測(cè)范圍 except:出現(xiàn)異常后的處理代碼 else:如果沒(méi)有異常執(zhí)行這塊代碼6.raise語(yǔ)句
raise語(yǔ)句用于拋出一個(gè)指定的異常。例如:
try:raise NameError('HiThere') except NameError:print('An exception flew by!')# An exception flew by!三、學(xué)習(xí)問(wèn)題與解答
在學(xué)習(xí)Task1時(shí),出現(xiàn)的主要問(wèn)題在于對(duì)位運(yùn)算的不了解,例如在用位運(yùn)算實(shí)現(xiàn)整數(shù)集合時(shí),就不知道為什么那些整數(shù)集合可以表示為01的長(zhǎng)串信息。通過(guò)在網(wǎng)上搜索才了解到是以01長(zhǎng)串的位置來(lái)表示這個(gè)整數(shù)位置上的符號(hào)是否是1來(lái)表示這個(gè)整數(shù)在不在集合里,然后那些運(yùn)算也就能看明白了。
四、學(xué)習(xí)思考與總結(jié)
現(xiàn)在還有的問(wèn)題基本上都是例程里出現(xiàn)的一些陌生的函數(shù)方法不知道什么作用,我還需要通過(guò)繼續(xù)學(xué)習(xí)才能弄明白。
總結(jié)
以上是生活随笔為你收集整理的阿里云天池 Python训练营Task1:从变量到异常处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 阿里云天池 金融风控训练营Task1
- 下一篇: 阿里云天池 Python训练营Task