Chapter 2 Python物件運算
一般運算(operation)與method的不同處在於:
method是直接作用在物件上,而operation不是;
operation: 針對一個情境去呈現結果,如: 2+3, 或2>3, 或(a<b and b<c)。
- method: 直接作用在一個物件上可使用的方法,寫法為物件.method(…),如:
listA=[2,3,"b"]
listA.append(5)
listA # 內容改變了 (mutable)
stringA="Hello"
stringA.upper()
stringA # 內容沒有改變 (immutable)
- 只有method有可能「直接改變」物件內容。
2.1 Operations
2.1.1 數值
數學運算
關係邏輯
上述的運算只能針對一維數值物件,不能用在List上,即使List內元素皆為數值。
使用list comprehension:
* 計算numList每個值+3
* 判斷numList每個值是否>10
但list可以和list做+
list可以和整數做*
對數值向量運算會需要使用到NumPy模組,稍後章節會介紹。
2.1.2 字串
「佔」有幾個字(元)的位置:
2.1.2.1 concatenate
2.1.2.2 repeat
2.1.2.3 substring
由於Python將string class的每個字元當成它的每個元素,所以可輕易用元素粹取概念拿出其中的subset
其他常見operators: https://www.w3schools.com/python/python_operators.asp
2.1.3 List
2.1.4 relational operator
is/is not
: 是否相同「物件」(含記憶體位置)
==
: 是否相同「值」
另一個比較兩物件相同的操作是is/is not(不常用): 是否相同「物件」(含記憶體位置)
in
:屬於
以下何者為True:
集合交(|
/&
)聯集
2.1.5 logical operator
and
: 皆為真。 (如:x < 5 and x < 10
)
or
: 其中之一為真。(如:x < 5 or x < 10
)
not
: 將真改偽,偽改真。(如:not(x < 5 and x < 10)
)
有些程式語言的and, or, not是使用&, |, ~,在Python它們有不同的意思(很少會用到,請盡量避免)。
- 判斷第一個元素是否>3
- 判斷第二個元素是否>3
- 使用list comprehension產生一個個別元素是否>3的list
- 使用list comprehension產生一個listG個別元素是否>listF個別元素的list
2.1.5.1 class change
以下是常見函數,非operators
要小心class change並不會將向量物件的每個元素個別做class change
請將listC裡的每個元素轉成字串。
Generator comprehension: (<expression> for <var> in <iterable>)
中的<iterable>
指得是可被一一取出元素的物件。
如以下字串,dict,list:
若我們想建立一個代表物件裡元素index的iterable,可以使用range(start_from,end_before,difference)
list2iter=["a",2,"c"]
[i for i in [0,1,2]]
[i for i in range(0,3)]
[i for i in range(0,len(list2iter))]
[type(list2iter[i]) is str for i in range(0,3)]
產生判斷以下list各元素是否為list class的True/False list:
2.2 Method
2.2.1 字串
常見methods
x="i am steven."
x.capitalize() # 開頭大寫
x.center(20) # 20個字元長度,描述放中間
x.upper() # 全大寫
x.lower() # 全小寫
x.find("steven") # steven開始的位置
注意與list methods不太相同的是,這些string methods並不會更動原始物件內容——因為atomic types, such as string, float, etc, are immutable。
切割字串
合併字串
string.join()
: 用string來合併字串
使用append method比+在記憶體管理會更有效率:
字元/空白移除
Strip of whitespace:
string.strip()
: 移除兩側空白
string.lstrip()
: 移除左側空白
string.rstrip()
: 移除右側空白
格式替換
其他更動
若要更動方式不在string methods,可用以下策略:
改成list of character使用list()。
更動完再用" ".join()。
2.2.2 list
新增一筆
新增「一筆」元素
list0=["a","b","c"]
list0Copy=list0.copy()
# 使用method
list0.append("d") # list0裡新增一筆
list0
# 使用operation
list0Copy+["d"]
list0Copy
operation只有用=回存時才會改變物件值:
append method可否一次加兩個元素?
使用append method新增經濟學成績使其內容如下。
[‘小明’, [‘微積分’, 70], [‘會計學’, 81], [‘經濟學’, 77]]
延伸
延伸串接兩個list
插入
刪除
對任何物件,一般使用del
:
* 若物件mutable, 可刪內容元素
* 若物件immutable, 只可刪除整個物件
使用string-list轉換方式將y[1:3]
刪除。
排序
z = [[3, 5], [2, 9], [2, 3], [4, 1], [3, 2]]
len(z)
print(z)
z.sort() # lexicographic sorting
print(z)
z.sort(key=sum) # based on sum function
print(z)
請將z改由大排到小。
找元素值位置
找出所有“Alex”出現的index
2.2.3 Tuple
tuple為immutable,
一個元素的tuple要放一個逗號,否則會視為atomic type。
2.2.4 Set
移除成員: remove, difference, difference_update
2.3 dictionary
2.3.1 增加元素
dictionary可以直接增加不存在的index
dictionaryA={
"日期": [2001,2002,2003],
"金額": [21000,33000,45880]}
dictionaryA
dictionaryA["數量"]=[100,200,300]
dictionaryA
注意list要增加元素只能使用append, insert或extend methods.
2.3.3 檢視values: values
將dictionaryA的三個values分別存在三個list物件裡(分別叫objDate, objRevenue, objQuantity)
2.3.5 檢查某key值存不存在: in (operation)
2.3.6 取出key下的value: get
取出符合key值的value
找出dict_finStatement中’營業利益(損失)‘為負的’公司名稱’
<!- –>