Python 3 Fundamentals Week 2 - Python Basics 下 課程筆記

Operator Precedence

  • 順序為次方、先乘除、後加減
  • 若正負號遇到次方( ** )的狀況
    • 正負號在左:先執行次方
    • 正負號在右:先執行正負號
範例
  • 範例一
    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


Boolean Operators

  • 只有 TrueFalse 兩種值

    • 需以大寫開頭
  • 也可以用函式 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

The and Operator

  • a and b
  • 注意:如果 a 是 False ,不論 b 是什麼,結果都會是 False

The or Operator

  • a or b
  • 注意:如果 a 是 True ,不論 b 是什麼,結果都會是 True

Short-Circuited Evaluation

  • 運算元可以是運算式(expression)

  • 給定一個值 x ,判定 sin(x) > 0 and cos(x) < 0 是否為真

    • 完整流程,需五步驟(四步計算 + and 運算子)
      1. 計算 sin(x)
      2. 判定 sin(x) 是否 > 0
        → result_1 ( True / False )
      3. 計算 cos(x)
      4. 判定 cos(x) 是否 <0
        → result_2 ( True / False )
      5. 判定 result_1 和 result_2 是否都為真,返回 True / False

    • 捷徑流程,先決條件: result_1 是 False
      1. 計算 sin(x)
      2. 判定 sin(x) 沒有 > 0,result_1 是 False
      3. 不論 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 an int object
    • 1.0 is a float object

1 和 1.0 是相同的物件嗎? No! :x:
1 和 1.0 有相同的值嗎(數學上來說)? Yes! :heavy_check_mark:

  • 由此區分出兩種「相等」的意義
    • 相同的物件
    • 物件有相同的 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
    

    :bulb: 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

    :bulb: 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)

參考資源

補充一個重要的小觀念,在 Python 所有物件中,所有的物件都有布林值,也就是不論是怎樣的 obj,你都可以跑 bool(obj) 來取得其布林值,而這些其實是源自於內建的 __bool__ function 而來。

bool(obj) => obj.__bool__()

而且更重要的一點,是除了 None 與 False 和 0 ,以及集合物件的空集合以外,其他的物件的布林值都是 True。這一點常常被利用在上面提到的 short-circuit evaluation。因此我們常見到這樣的使用方式 if obj = True: 來作為條件式的條件。這裡有一篇不錯的文章連結跟大家分享: Python Booleans: Use Truth Values in Your Code

1個讚