目錄
1.變數總結
1.1 變數定義
1.2 id()
set不可變物件
在 python 中,「變數」更準確叫法是「名字」,賦值操作 = 就是把乙個名字繫結到乙個物件上。就像給物件新增乙個標籤。
把變數 a 賦值給另外乙個變數 b,相當於在物件 2 上貼了 a,b 兩個標籤,通過這兩個變數都可以對物件 2 進行操作。變數本身沒有型別資訊,型別資訊儲存在物件中,這和c/c++中的變數有非常大的出入(c中的變數是一段記憶體區域)關於深淺拷貝具體看
id方法的返回值就是物件的記憶體位址。python中會為每個出現的物件分配記憶體。
以l --> e --> g -->b的規則查詢,即:在區域性找不到,便會去區域性外的區域性找(例如閉包),再找不到就會去全域性找,再者去內建中找。**規範:全域性變數字母全部大寫,區域性變數變數名小寫。1.3.1 如果函式內部無global關鍵字
global用於宣告全域性變數
優先讀取區域性變數,如果沒有區域性變數則讀取全域性變數,此時無法對全域性變數進行賦值。
1.3.2 函式內部有global關鍵字
如果函式中有global關鍵字,變數本質上就是全域性變數,可讀取可賦值。
nonlocal適用於巢狀函式中內部函式修改外部變數的值,用來宣告外層的區域性變數
如果沒有使用以上關鍵字,對全域性變數或者外部變數進行修改,python會預設將全域性變數隱藏起來
def scope_test():
def do_local():
spam = "local spam"
def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("after local assignment:", spam)
do_nonlocal()
print("after nonlocal assignment:", spam)
do_global()
print("after global assignment:", spam)
scope_test()
print("in global scope:", spam)
輸出結果
after local assignment: test spam
after nonlocal assignment: nonlocal spam
after global assignment: nonlocal spam
in global scope: global spam
1.3.4 閉包closure
閉包的定義:如果在乙個內部函式裡,對在外部函式內(但不是在全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包(closure)
set和dict類似,也是一組key的集合,但不儲存value。由於key不能重複,所以,在set中,沒有重複的key。
要建立乙個set,需要提供乙個list作為輸入集合:
>>> s = set([1, 2, 3])
>>> s
重複元素在set中自動被過濾,並且不一定是有序的
frozenset() 不能追加,不能修改的集合,不能刪除。
s.add(key)
方法可以新增元素到set中,可以重複新增,但不會有效果
s.remove(key)
方法可以刪除指定元素,如果指定的引數原集合沒有則會報錯
s.discard(key
)
方法可以刪除指定元素,指定引數在原集合裡沒有,但是這裡不會報錯
s.clear()
清空集合 字典的清空結果是{},集合的清空結果是set()
s.copy()
s.pop()
隨機刪除
s1.intersection(s2)
交集 s1&s2
s1.union(s2)
並集s1|s2
s1.difference(s2)
差集 s1-s2
s1.symmetric_difference(s2)
交叉補集 s1^s2
s1.isdisjoint(s2)
兩個集合取交集是空集,那麼返回true,不是空集返回false.
s1.issubset(s2)
判斷s1是不是s2的子集
s1.issuperset(s2)
判斷s1是不是包含s2,superset:父集,超集
後續操作將修改s1
s1.difference_update(s2)
將s1更新為s1和s2的差集
s1.intersection_update(s2)
s1 = s1 & s2
s1.symmetric_difference_update(s2)
s1 = s1 ^ s2
s1.update(s2)
將集合s2結果新增集合s1,
與s1.union(s2)的區別在於 修改了s1
add()只能增加單個值, update()可以傳可迭代物件,更新多個值
兩個set可以做數學意義上的交集、並集等操作
交集:
li1 = ["nicholas","pony","robin","jack"]
li2 = ["nicholas","charles","richard "]
s1 = set(li1)
s2 = set(li2)
v = s1.intersection(s2)
#這裡也可以這樣寫
#v = s1&s2
並集v = s1.union(s2)
差集v = s1.difference(s2)
或者v=s1 - s2
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
>>> s1 | s2
交叉補集
li1 = ["nicholas","pony","robin","jack"]
li2 = ["nicholas","charles","richard ","jack"]
s1 = set(li1)
s2 = set(li2)
v = s1.symmetric_difference(s2)
print(v)
print(s1 ^ s2)
輸出
set的原理和dict一樣,所以,同樣不可以放入可變物件,因為無法判斷兩個可變物件是否相等,也就無法保證set內部「不會有重複元素」。
str是不變物件,而list是可變物件
上面我們講了,str是不變物件,而list是可變物件。
對於可變物件
,比如list,對list進行操作,list內部的內容是會變化的,比如:
>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']
對於不可變物件
,比如str,對str進行操作:
>>> a = 'abc'
>>> a.replace('a', 'a')
'abc'
>>> a
'abc'
對於不變物件來說,呼叫物件自身的任意方法,也不會改變該物件自身的內容。相反,這些方法會建立新的物件並返回,這樣,就保證了不可變物件本身永遠是不可變的
集合的元素必須是不可變型別
例子
set1=
print(set1)
輸出typeerror: unhashable type: 'list'
輸出結果報錯,無法對列表進行雜湊化,但在建立集合的時候可以使用列表 python基礎 set集合
set集合是乙個無序且不重複的元素集合 1.set的建立 2種方式 se se set 11,22,33 呼叫的set 的 init 方法進行建立 2.set的常用方法 1.add se se.add 44 print se 因為是無序的,所以執行的結果會不一樣,但是 44確實被增加到了原 set集...
python基礎 集合set
二 集合常用函式 三 集合的新增元素 四 集合的刪除元素 五 集合的複製元素 集合和列表非常相似 不同點 1.集合中只能儲存不可變物件 2.集合中儲存的物件是無序 不是按照元素的插入順序儲存 3.集合中不能出現重複的元素 重複的元素會自動過濾掉 s s typeerror unhashable ty...
Python基礎 set集合
python的set和其他語言類似,是乙個無序不重複元素集,基本功能包括關係測試和消除重複元素.集合物件還支援union 聯合 intersection 交 difference 差 和sysmmetric difference 對稱差集 等數 算.sets 支援 x in set,len set ...