Operator Precedence
- 運算子全部的優先順序可參考文件:
6. Expressions — Python 3.12.1 documentation
- 順序為次方、先乘除、後加減
- 若正負號遇到次方(
**
)的狀況- 正負號在左:先執行次方
- 正負號在右:先執行正負號
範例
-
範例一
2 * 2 ** 3
= 2 * ( 2 ** 3 )
= 2 * 8
= 16 -
範例二
-2 ** 4
= - ( 2 ** 4 )
= - 16 -
範例三
2 ** -3
= 2 ** (-3)
= 0.125
- 建議直接用括弧 ()
- 不容易出錯
- 增加可讀性
Integer Division and Modulus
The //
Operator
Integer Division ,又叫 Floor Division
- 定義:除完後,取比結果還小的最大整數
- 也可以使用函式
floor()
The mod
Operator
- 定義:
a % b = a - b ( a // b )
- 推導:
- 可以用來計算負數與浮點數
-
negative number
-
float number
-
- 在計算
//
和%
時要小心,不要太相信"直覺”!
Boolean Operators
-
只有
True
和False
兩種值- 需以大寫開頭
-
也可以用函式
bool()
>>> x = True >>> bool(x) True >>> bool( 3 > 5 ) False
-
Boolean 的預設值
>>> a = int() >>> a 0 >>> b = str() >>> b '' >>> c = bool() >>> c False
- 通常等於0的值為 False
- 通常不等於0的值為 True
The not
Operator
not
is a unary operatornot True
not ( a < b )
- 單純把 Boolean 的值反轉
The and
Operator
a and b
- 若且唯若兩者都為真,則返回 True
- 其餘狀況返回 False
- 注意:如果 a 是 False ,不論 b 是什麼,結果都會是 False
The or
Operator
a or b
- 若且唯若兩者都不為真 ,則返回 False
- 其餘狀況返回 True
- 注意:如果 a 是 True ,不論 b 是什麼,結果都會是 True
Short-Circuited Evaluation
-
運算元可以是運算式(expression)
-
給定一個值 x ,判定
sin(x) > 0 and cos(x) < 0
是否為真- 完整流程,需五步驟(四步計算 +
and
運算子)- 計算 sin(x)
- 判定 sin(x) 是否 > 0
→ result_1 ( True / False ) - 計算 cos(x)
- 判定 cos(x) 是否 <0
→ result_2 ( True / False ) - 判定 result_1 和 result_2 是否都為真,返回 True / False
- 捷徑流程,先決條件: result_1 是 False
- 計算 sin(x)
- 判定 sin(x) 沒有 > 0,result_1 是 False
- 不論 result_2 結果如何,直接給出結論是 False
- 完整流程,需五步驟(四步計算 +
-
相同的狀況也可以套用到 a or b
- 如果 a 是 True ,則結果必為 True ,跳過對 b 的判定
Example
- 條件1:有一個交易演算法,可以計算買訊(True/False),計算很複雜而且非常吃資源
- 條件2:交易所必須是營業狀態
方法A
if calc_signal(symbol) and exchange_open(symbol):
buy(symbol)
方法B
if exchange_open(symbol) and calc_signal(symbol):
buy(symbol)
方法 A 和 B 在邏輯上並無不同,但因為交易所一定要營業才能進行交易,依照 Short-Circuited Evaluation ,方法 B 可以省掉很多計算的資源。
Comparison Operators
又稱作 relational operators
- 比較兩個物件,並產出結果為 Boolean (
bool
) 的資料型態==
: equals!=
: not equals>
: bigger than<
: smaller than>=
: not smaller than (greater then or equal to)<=
: not bigger than (less then or equal to)
==
在進行兩個不可被比較的資料型態時,會回傳False
>
,<
,>=
,<=
比大小的時候,兩個運算元必須是可被比較的,如果不可被比較就會報錯TypeError
- 10.5 < 100 → makes sense
- hello > 100 → doesn’t really make sense
- int 和 float 彼此間可互相比較
>>> 10 <= 10.9 True
- 整數的比較非常直觀
>>> 5 == 5 True >>> 5 == 6 False
- 一般來說,不要用
==
來比較 floats- 理由如上一章節提到的,當遇到無法被二進制精準表示的浮點數會出問題,例如0.1
>>> 0.1 + 0.1 + 0.1 == 0.3 False
What does it mean for two objects to be equal?
- everything in Python is an object
1
is anint
object1.0
is afloat
object
1 和 1.0 是相同的物件嗎? No!
1 和 1.0 有相同的值嗎(數學上來說)? Yes!
- 由此區分出兩種「相等」的意義
- 相同的物件
- 物件有相同的 value (or state)
如果想成郵箱, A 郵箱裡面有 1 封信, B郵箱裡面有 1 封信…
A 郵箱 和 B 郵箱 是同一個郵箱嗎? No!
A 郵箱 和 B 郵箱 有一樣多的信嗎? Yes!
Identity vs Value Equality of Objects
-
==
, 檢查兩個可被比較的物件,是否擁有相同的值 ( in some sense ) -
is
, 檢查兩個物件是否為相同的物件is
純粹與物件的記憶體位置 ( identity ) 相關is
又叫身分運算子 (identity comparison operator)- 可以用
id()
來確認物件儲存在哪個記憶體位置
-
小整數的 id 會相同
>>> a is c True
interning 機制
Python(CPython)啟動時,為了效率更好,會把 -5~256 整數加入到一個 global list 中(類似快取),這些整數稱為 singletons,Python認為這些小整數被使用到的機率較大,於是預先準備好。所以每次我們參考這範圍的整數,就會參考到這些預先產生的物件。
字串的緩存位默認是20位。
- 複數的情況:可以確認是否有相同的值,但不可被比較
>>> a = 1 + 1j >>> b = 1 + 1j >>> c = 2 + 2j >>> a == b True >>> a is b, id(a), id(b) (False, 140663411724400, 140663411724816) >>> a < c TypeError: '<' not supported between instances of 'complex' and 'complex'
自訂義 __eq__
Other Comparison Operators : in
, not in
-
可以作用在 collections types
Python Collections (Arrays)
There are four collection data types in the Python programming language:List
is a collection which is ordered and changeable. Allows duplicate members.Tuple
is a collection which is ordered and unchangeable. Allows duplicate members.Set
is a collection which is unordered, unchangeable*, and unindexed. No duplicate members.Dictionary
is a collection which is ordered** and changeable. No duplicate members.
*Set items are unchangeable, but you can remove and/or add items whenever you like.
**As of Python version 3.7, dictionaries are ordered. In Python 3.6 and earlier, dictionaries are unordered. -
檢查元素是不是存在於集合中
Mutable vs. Immutable
Immutable
- 物件被創造後,其 value 無法被改變
- 若進行運算之後改變了值,則會創建新的物件
- 如: int, float, bool, str, …
>>> a = 257
>>> b = a
>>> id(a), id(b)
(140706804720424, 140706804720424)
>>> a += 1
>>> id(a), id(b)
(140706804720456, 140706804720424)
Mutable
- 物件被創造後,reference 固定,但參照的記憶體內容可改變
- 如: list, set, dic, …
>>> c = [0, 1, 2]
>>> d = c
>>> id(c), id(d)
(3013416742848, 3013416742848)
>>> c += [3]
>>> id(c), id(d)
(3013416742848, 3013416742848)