python基礎 變數總結 set

2021-10-06 06:19:10 字數 4520 閱讀 2462

目錄

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 ...