阿里天池:Task 01:Python基礎入門:從變數到例外處理(第1部分)
學習內容:變數、運算子與資料型別到例外處理
Python訓練營內容:

第一天內容:Python入門(上)
-
簡介
-
變數、運算子與資料型別
1. 注釋
2. 運算子
3. 變數和賦值
4. 資料型別與轉換
5. print()函式 -
位運算
1. 原碼、反碼和補碼
2. 按位運算
3. 利用位運算實作快速計算
4. 利用位運算實作整數集合 -
條件陳述句
1. if 陳述句
2. if - else 陳述句
3. if - elif - else 陳述句
4. assert 關鍵詞 -
回圈陳述句
1. while 回圈
2. while - else 回圈
3. for 回圈
4. for - else 回圈
5. range() 函式
6. enumerate()函式
7. break 陳述句
8. continue 陳述句
9. pass 陳述句
10. 推導式 -
例外處理
1. Python 標準例外總結
2. Python 標準警告總結
3. try - except 陳述句
4. try - except - finally 陳述句
5. try - except - else 陳述句
6. raise陳述句
簡介
Python 是一種通用編程語言,其在科學計算和機器學習領域具有廣泛的應用,如果我們打算利用 Python 來執行機器學習,那么對 Python 有一些基本的了解就是至關重要的,本 Python 入門系列體驗就是為這樣的初學者精心準備的,
本實驗包括以下內容:
- 變數、運算子與資料型別
- 注釋
- 運算子
- 變數和賦值
- 資料型別與轉換
- print() 函式
- 位運算
- 原碼、反碼和補碼
- 按位非操作 ~
- 按位與操作 &
- 按位或操作 |
- 按位異或操作 ^
- 按位左移操作 <<
- 按位右移操作 >>
- 利用位運算實作快速計算
- 利用位運算實作整數集合
- 條件陳述句
- if 陳述句
- if - else 陳述句
- if - elif - else 陳述句
- assert 關鍵詞
- 回圈陳述句
- while 回圈
- while - else 回圈
- for 回圈
- for - else 回圈
- range() 函式
- enumerate()函式
- break 陳述句
- continue 陳述句
- pass 陳述句
- 推導式
- 例外處理
- Python 標準例外總結
- Python 標準警告總結
- try - except 陳述句
- try - except - finally 陳述句
- try - except - else 陳述句
- raise陳述句
變數、運算子與資料型別
1. 注釋
- 在 Python 中,
#表示注釋,作用于整行, ''' '''或者""" """表示區間注釋,在三引號之間的所有內容被注釋
2. 運算子
算術運算子
| 運算子 | 名稱 | 示例 |
|---|---|---|
+ |
加 | 1 + 1 |
- |
減 | 2 - 1 |
* |
乘 | 3 * 4 |
/ |
除 | 3 / 4 |
// |
整除(地板除) | 3 // 4 |
% |
取余 | 3 % 4 |
** |
冪 | 2 ** 3 |
比較運算子
| 運算子 | 名稱 | 示例 |
|---|---|---|
> |
大于 | 2 > 1 |
>= |
大于等于 | 2 >= 4 |
< |
小于 | 1 < 2 |
<= |
小于等于 | 5 <= 2 |
== |
等于 | 3 == 4 |
!= |
不等于 | 3 != 5 |
邏輯運算子
| 運算子 | 名稱 | 示例 |
|---|---|---|
and |
與 | (3 > 2) and (3 < 5) |
or |
或 | (1 > 3) or (9 < 2) |
not |
非 | not (2 > 1) |
位運算子
| 運算子 | 名稱 | 示例 |
|---|---|---|
~ |
按位取反 | ~4 |
& |
按位與 | 4 & 5 |
| ` | ` | 按位或 |
^ |
按位異或 | 4 ^ 5 |
<< |
左移 | 4 << 2 |
>> |
右移 | 4 >> 2 |
三元運算子
x, y = 4, 5
if x < y:
small = x
else:
small = y
print(small) # 4
有了這個三元運算子的條件運算式,你可以使用一條陳述句來完成以上的條件判斷和賦值操作,
其他運算子
| 運算子 | 名稱 | 示例 |
|---|---|---|
in |
存在 | 'A' in ['A', 'B', 'C'] |
not in |
不存在 | 'h' not in ['A', 'B', 'C'] |
is |
是 | "hello" is "hello" |
not is |
不是 | "hello" is not "hello" |
注意:
- is, is not 對比的是兩個變數的記憶體地址
- ==, != 對比的是兩個變數的值
- 比較的兩個變數,指向的都是地址不可變的型別(str等),那么is,is not 和 ==,!= 是完全等價的,
- 對比的兩個變數,指向的是地址可變的型別(list,dict,tuple等),則兩者是有區別的,
運算子的優先級
- 一元運算子優于二元運算子,例如
3 ** -2等價于3 ** (-2), - 先算術運算,后移位運算,最后位運算,例如
1 << 3 + 2 & 7等價于(1 << (3 + 2)) & 7, - 邏輯運算最后結合,例如
3 < 4 and 4 < 5等價于(3 < 4) and (4 < 5),
3. 變數和賦值
- 在使用變數之前,需要對其先賦值,
- 變數名可以包括字母、數字、下劃線、但變數名不能以數字開頭,
- Python 變數名是大小寫敏感的,foo != Foo,
4. 資料型別與轉換
| 型別 | 名稱 | 示例 |
|---|---|---|
| int | 整型 <class 'int'> |
-876, 10 |
| float | 浮點型<class 'float'> |
3.149, 11.11 |
| bool | 布爾型<class 'bool'> |
True, False |
除了直接給變數賦值 True 和 False,還可以用 bool(X) 來創建變數,其中 X 可以是
- 基本型別:整型、浮點型、布爾型
- 容器型別:字串、元組、串列、字典和集合
確定bool(X) 的值是 True 還是 False,就看 X 是不是空,空的話就是 False,不空的話就是 True,
- 對于數值變數,
0,0.0都可認為是空的, - 對于容器變數,里面沒元素就是空的,
獲取型別資訊
- 獲取型別資訊
type(object)
注:
type()不會認為子類是一種父型別別,不考慮繼承關系,isinstance()會認為子類是一種父型別別,考慮繼承關系,
如果要判斷兩個型別是否相同推薦使用 isinstance(),
型別轉換
- 轉換為整型
int(x, base=10) - 轉換為字串
str(object='') - 轉換為浮點型
float(x)
5. print() 函式
- 將物件以字串表示的方式格式化輸出到流檔案物件file里,其中所有非關鍵字引數都按
str()方式進行轉換為字串輸出; - 關鍵字引數
sep是實作分隔符,比如多個引數輸出時想要輸出中間的分隔字符; - 關鍵字引數
end是輸出結束時的字符,默認是換行符\n; - 關鍵字引數
file是定義流輸出的檔案,可以是標準的系統輸出sys.stdout,也可以重定義為別的檔案; - 關鍵字引數
flush是立即把內容輸出到流檔案,不作快取,
位運算
1. 原碼、反碼和補碼
二進制有三種不同的表示形式:原碼、反碼和補碼,計算機內部使用補碼來表示,
原碼:就是其二進制表示(注意,有一位符號位),
00 00 00 11 -> 3
10 00 00 11 -> -3
反碼:正數的反碼就是原碼,負數的反碼是符號位不變,其余位取反(對應正數按位取反),
00 00 00 11 -> 3
11 11 11 00 -> -3
補碼:正數的補碼就是原碼,負數的補碼是反碼+1,
00 00 00 11 -> 3
11 11 11 01 -> -3
符號位:最高位為符號位,0表示正數,1表示負數,在位運算中符號位也參與運算,
2. 按位運算
- 按位非操作 ~
~ 1 = 0
~ 0 = 1
~ 把num的補碼中的 0 和 1 全部取反(0 變為 1,1 變為 0)有符號整數的符號位在 ~ 運算中同樣會取反,
00 00 01 01 -> 5
~
---
11 11 10 10 -> -6
11 11 10 11 -> -5
~
---
00 00 01 00 -> 4
- 按位與操作 &
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
只有兩個對應位都為 1 時才為 1
00 00 01 01 -> 5
&
00 00 01 10 -> 6
---
00 00 01 00 -> 4
- 按位或操作 |
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
只要兩個對應位中有一個 1 時就為 1
00 00 01 01 -> 5
|
00 00 01 10 -> 6
---
00 00 01 11 -> 7
- 按位異或操作 ^
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
只有兩個對應位不同時才為 1
00 00 01 01 -> 5
^
00 00 01 10 -> 6
---
00 00 00 11 -> 3
異或操作的性質:滿足交換律和結合律
A: 00 00 11 00
B: 00 00 01 11
A^B: 00 00 10 11
B^A: 00 00 10 11
A^A: 00 00 00 00
A^0: 00 00 11 00
A^B^A: = A^A^B = B = 00 00 01 11
- 按位左移操作 <<
num << i 將num的二進制表示向左移動i位所得的值,
00 00 10 11 -> 11
11 << 3
---
01 01 10 00 -> 88
- 按位右移操作 >>
num >> i 將num的二進制表示向右移動i位所得的值,
00 00 10 11 -> 11
11 >> 2
---
00 00 00 10 -> 2
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
通過 ^ 快速交換兩個整數, 通過 ^ 快速交換兩個整數,
a ^= b
b ^= a
a ^= b
通過 a & (-a) 快速獲取a的最后為 1 位置的整數,
00 00 01 01 -> 5
&
11 11 10 11 -> -5
---
00 00 00 01 -> 1
00 00 11 10 -> 14
&
11 11 00 10 -> -14
---
00 00 00 10 -> 2
4. 利用位運算實作整數集合
一個數的二進制表示可以看作是一個集合(0 表示不在集合中,1 表示在集合中),
比如集合 {1, 3, 4, 8},可以表示成 01 00 01 10 10 而對應的位運算也就可以看作是對集合進行的操作,
元素與集合的操作:
a | (1<<i) -> 把 i 插入到集合中
a & ~(1<<i) -> 把 i 從集合中洗掉
a & (1<<i) -> 判斷 i 是否屬于該集合(零不屬于,非零屬于)
集合之間的操作:
a 補 -> ~a
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a & (~b)
注意:整數在記憶體中是以補碼的形式存在的,輸出自然也是按照補碼輸出,
是不是很顛覆認知,我們從結果可以看出:
- Python中
bin一個負數(十進制表示),輸出的是它的原碼的二進制表示加上個負號,巨坑, - Python中的整型是補碼形式存盤的,
- Python中整型是不限制長度的不會超范圍溢位,
所以為了獲得負數(十進制表示)的補碼,需要手動將其和十六進制數0xffffffff進行按位與操作,再交給bin()進行輸出,得到的才是負數的補碼表示,
條件陳述句
1. if 陳述句
if expression:
expr_true_suite
- if 陳述句的
expr_true_suite代碼塊只有當條件運算式expression結果為真時才執行,否則將繼續執行緊跟在該代碼塊后面的陳述句, - 單個 if 陳述句中的
expression條件運算式可以通過布爾運算子and,or和not實作多重條件判斷,
2. if - else 陳述句
if expression:
expr_true_suite
else:
expr_false_suite
- Python 提供與 if 搭配使用的 else,如果 if 陳述句的條件運算式結果布林值為假,那么程式將執行 else 陳述句后的代碼,
3. if - elif - else 陳述句
if expression1:
expr1_true_suite
elif expression2:
expr2_true_suite
.
.
elif expressionN:
exprN_true_suite
else:
expr_false_suite
- elif 陳述句即為 else if,用來檢查多個運算式是否為真,并在為真時執行特定代碼塊中的代碼,
4. assert 關鍵詞
assert這個關鍵詞我們稱之為“斷言”,當這個關鍵詞后邊的條件為 False 時,程式自動崩潰并拋出AssertionError的例外,
回圈陳述句
1. while 回圈
while陳述句最基本的形式包括一個位于頂部的布爾運算式,一個或多個屬于while代碼塊的縮進陳述句,
while 布爾運算式:
代碼塊
while回圈的代碼塊會一直回圈執行,直到布爾運算式的值為布爾假,
如果布爾運算式不帶有<、>、==、!=、in、not in等運算子,僅僅給出數值之類的條件,也是可以的,當while后寫入一個非零整數時,視為真值,執行回圈體;寫入0時,視為假值,不執行回圈體,也可以寫入str、list或任何序列,長度非零則視為真值,執行回圈體;否則視為假值,不執行回圈體,
2. while - else 回圈
while 布爾運算式:
代碼塊
else:
代碼塊
當while回圈正常執行完的情況下,執行else輸出,如果while回圈中執行了跳出回圈的陳述句,比如 break,將不執行else代碼塊的內容,
3. for 回圈
for回圈是迭代回圈,在Python中相當于一個通用的序列迭代器,可以遍歷任何有序序列,如str、list、tuple等,也可以遍歷任何可迭代物件,如dict,
for 迭代變數 in 可迭代物件:
代碼塊
每次回圈,迭代變數被設定為可迭代物件的當前元素,提供給代碼塊使用,
4. for - else 回圈
for 迭代變數 in 可迭代物件:
代碼塊
else:
代碼塊
當for回圈正常執行完的情況下,執行else輸出,如果for回圈中執行了跳出回圈的陳述句,比如 break,將不執行else代碼塊的內容,與while - else陳述句一樣,
5. range() 函式
range([start,] stop[, step=1])
- 這個BIF(Built-in functions)有三個引數,其中用中括號括起來的兩個表示這兩個引數是可選的,
step=1表示第三個引數的默認值是1,range這個BIF的作用是生成一個從start引數的值開始到stop引數的值結束的數字序列,該序列包含start的值但不包含stop的值,
6. enumerate()函式
enumerate(sequence, [start=0])
- sequence:一個序列、迭代器或其他支持迭代物件,
- start:下標起始位置,
- 回傳 enumerate(列舉) 物件
7. break 陳述句
break陳述句可以跳出當前所在層的回圈,
8. continue 陳述句
continue終止本輪回圈并開始下一輪回圈,
9. pass 陳述句
pass 陳述句的意思是“不做任何事”,如果你在需要有陳述句的地方不寫任何陳述句,那么解釋器會提示出錯,而 pass 陳述句就是用來解決這些問題的,
10. 推導式
串列推導式
[ expr for value in collection [if condition] ]
元組推導式
( expr for value in collection [if condition] )
字典推導式
{ key_expr: value_expr for value in collection [if condition] }
集合推導式
{ expr for value in collection [if condition] }
其它
-
next(iterator[, default]) Return the next item from the iterator. If default is given and the iterator is exhausted, it is returned instead of raising StopIteration.
例外處理
例外就是運行期檢測到的錯誤,計算機語言針對可能出現的錯誤定義了例外型別,某種錯誤引發對應的例外時,例外處理程式將被啟動,從而恢復程式的正常運行,
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轉換錯誤導致的例外
例外體系內部有層次關系,Python例外體系中的部分關系如下所示:

3. try - except 陳述句
try:
檢測范圍
except Exception[as reason]:
出現例外后的處理代碼
try 陳述句按照如下方式作業:
- 首先,執行
try子句(在關鍵字try和關鍵字except之間的陳述句) - 如果沒有例外發生,忽略
except子句,try子句執行后結束, - 如果在執行
try子句的程序中發生了例外,那么try子句余下的部分將被忽略,如果例外的型別和except之后的名稱相符,那么對應的except子句將被執行,最后執行try - except陳述句之后的代碼, - 如果一個例外沒有與任何的
except匹配,那么這個例外將會傳遞給上層的try中,
4. try - except - finally 陳述句
try: 檢測范圍 except Exception[as reason]: 出現例外后的處理代碼 finally: 無論如何都會被執行的代碼
不管try子句里面有沒有發生例外,finally子句都會執行,
5. try - except - else 陳述句
如果在try子句執行時沒有發生例外,Python將執行else陳述句后的陳述句,
try:
檢測范圍
except:
出現例外后的處理代碼
else:
如果沒有例外執行這塊代碼
使用except而不帶任何例外型別,這不是一個很好的方式,我們不能通過該程式識別出具體的例外資訊,因為它捕獲所有的例外,
try: 檢測范圍 except(Exception1[, Exception2[,...ExceptionN]]]): 發生以上多個例外中的一個,執行這塊代碼 else: 如果沒有例外執行這塊代碼,
注意:else陳述句的存在必須以except陳述句的存在為前提,在沒有except陳述句的try陳述句中使用else陳述句,會引發語法錯誤,
6. raise陳述句
Python 使用raise陳述句拋出一個指定的例外,
著作權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 著作權協議,轉載請附上原文出處鏈接和本宣告,
本文鏈接:https://mp.csdn.net/console/editor/html/108455839
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/1524.html
標籤:其他
