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