intumu.com:機器學習(ML)、人工智能(AI)和土木工程的(TM)關系?zhuanlan.zhihu.com

前言
着手開始寫的時候就一直有一個畫面在腦子中出現:小豬佩奇第N級,豬爸爸拿出來一本《混凝土的故事》,打開書的時候說道:混凝土是由砂子、水、水泥組成的,結果其他人都睡着了。于是,我在想,要是給土木人講:python萬法皆對象,對象類型有:數字:int,long,float,complex,bool
字元:str,unicod
清單:list
字典:dict
元組:tuple
檔案:file
其他類型:集合(set),當機集合(frozenset),類類型等。
是不是也有人睡着?相反,如果我直接說砂子、水泥、鋼筋、混凝土,是不是覺得親切?是以接下來将會從一磚一瓦的建築材料說Python。
萬法皆對象:在基建領域,你所看到的構築物就是有以上提到的基礎建材組成;在Python領域對象類型就可以看做基礎建築材料,然後由不同的施工工藝産生不同的單體子產品或構造物。例如:一個函數(施工工藝)所包含的參數(基礎建材),形成一個僞代碼。
僞代碼
#圍牆條形基礎開挖
變量類型:鏟子、䦆頭、羊角碾、塊石、磚頭、水泥、混凝土
#工藝流程:
開挖條形基坑
夯實基礎
抛填塊片石
混凝土填充找平
砌磚
#以上即為面向過程程式設計,下面先說說數字類型。
真代碼
集合
之前看到的清單和字元串都是一種有序序列,而集合 set 是一種無序的序列。
因為集合是無序的,是以當集合中存在兩個同樣的元素的時候,Python隻會儲存其中的一個(唯一性);同時為了確定其中不包含同樣的元素,集合中放入的元素隻能是不可變的對象(确定性)。
集合生成
可以用set()函數來顯示的生成空集合:
a = set()
type(a)
set
也可以使用一個清單來初始化一個集合:
a = set([1, 2, 3, 1])
a
{1, 2, 3}
集合會自動去除重複元素 1。
可以看到,集合中的元素是用大括号{}包含起來的,這意味着可以用{}的形式來建立集合:
a = {1, 2, 3, 1}
a
{1, 2, 3}
但是建立空集合的時候隻能用set來建立,因為在Python中{}建立的是一個空的字典:
s = {}
type(s)
dict
集合操作
假設有這樣兩個集合:
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
并
兩個集合的并,傳回包含兩個集合所有元素的集合(去除重複)。
可以用方法 a.union(b) 或者操作 a | b 實作。
a.union(b)
{1, 2, 3, 4, 5, 6}
b.union(a)
{1, 2, 3, 4, 5, 6}
a | b
{1, 2, 3, 4, 5, 6}
交
兩個集合的交,傳回包含兩個集合共有元素的集合。
可以用方法 a.intersection(b) 或者操作 a & b 實作。
a.intersection(b)
{3, 4}
b.intersection(a)
{3, 4}
a & b
{3, 4}
print(a & b)
set([3, 4])
注意:一般使用print列印set的結果與表示方法并不一緻。
差
a 和 b 的差集,傳回隻在 a 不在 b 的元素組成的集合。
可以用方法 a.difference(b) 或者操作 a - b 實作。
a.difference(b)
{1, 2}
a - b
{1, 2}
注意,a - b 與 b - a并不一樣,b - a 傳回的是傳回 b 不在 a 的元素組成的集合:
b.difference(a)
{5, 6}
b - a
{5, 6}
對稱差
a 和b 的對稱差集,傳回在 a 或在 b 中,但是不同時在 a 和 b 中的元素組成的集合。
可以用方法 a.symmetric_difference(b) 或者操作 a ^ b 實作(異或操作符)。
a.symmetric_difference(b)
{1, 2, 5, 6}
b.symmetric_difference(a)
{1, 2, 5, 6}
a ^ b
{1, 2, 5, 6}
包含關系
假設現在有這樣兩個集合:
a = {1, 2, 3}
b = {1, 2}
要判斷 b 是不是 a 的子集,可以用 b.issubset(a) 方法,或者更簡單的用操作 b <= a :
b.issubset(a)
True
b <= a
True
與之對應,也可以用 a.issuperset(b) 或者 a >= b 來判斷:
a.issuperset(b)
True
a >= b
True
方法隻能用來測試子集,但是操作符可以用來判斷真子集:
a <= a
True
自己不是自己的真子集:
a < a
False
集合方法
add 方法向集合添加單個元素
跟清單的 append 方法類似,用來向集合添加單個元素。
s.add(a)
将元素 a 加入集合 s 中。
t = {1, 2, 3}
t.add(5)
t
{1, 2, 3, 5}
如果添加的是已有元素,集合不改變:
t.add(3)
t
{1, 2, 3, 5}
update 方法向集合添加多個元素
跟清單的extend方法類似,用來向集合添加多個元素。
s.update(seq)
将seq中的元素添加到s中。
t.update([5, 6, 7])
t
{1, 2, 3, 5, 6, 7}
remove 方法移除單個元素
s.remove(ob)
從集合s中移除元素ob,如果不存在會報錯。
t.remove(1)
t
{2, 3, 5, 6, 7}
t.remove(10)
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
in ()
----> 1 t.remove(10)
KeyError: 10
pop方法彈出元素
由于集合沒有順序,不能像清單一樣按照位置彈出元素,是以pop 方法删除并傳回集合中任意一個元素,如果集合中沒有元素會報錯。
t.pop()
{3, 5, 6, 7}
print(t)
set([3, 5, 6, 7])
s = set()
# 報錯
s.pop()
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
in ()
1 s = set()
2 # 報錯
----> 3 s.pop()
KeyError: 'pop from an empty set'
discard 方法
作用與 remove 一樣,但是當元素在集合中不存在的時候不會報錯。
t.discard(3)
t
{5, 6, 7}
不存在的元素不會報錯:
t.discard(20)
t
{5, 6, 7}
difference_update方法
a.difference_update(b)
從a中去除所有屬于b的元素:
土木狗的視角:集合大體上是清單+字典+元組的變種!集合是無序的,是以當集合中存在兩個同樣的元素的時候,Python隻會儲存其中的一個(唯一性);同時為了確定其中不包含同樣的元素,集合中放入的元素隻能是不可變的對象(确定性)。這個特性往往可以用在處理清單的重複資料,比如一個含有重複資料的listA,可以通過list(set(listA))進行強制轉換類型,進而實作去重。
課後作業(可選)
按上一節運作自己的項目,建立一個*.ipynb檔案,将上面代碼敲入運作。
intumu.com:Python資料分析及可視化執行個體目錄zhuanlan.zhihu.com