天天看點

python第九課 集合和函數一、集合的基本概念二、集合的使用三、集合的運算四、函數五、函數的參數六、函數的主要傳遞方式七、參數的類型八、不定長參數九、參數的解包

一、集合的基本概念

集合的表現形式:set

集合和清單基本一緻

不同:

1、集合隻能存儲不可變對象

2、集合中存儲的對象是無序的

3、幾何中不能出現重複的元素

##建立集合
#使用{}來建立
s = {10, 1, 5, 8, 5, 7, 6}
print(s, type(s))
           
>>> {1, 5, 6, 7, 8, 10} <class 'set'>
           

#使用set()函數建立 //set()函數可以把序列和字典轉換成集合

#集合中隻能是不可變對象,即元素不能是清單

s = set({1, 2})
print(s, type(s))
s = set([1, 4, 5, 8, 4, 1])
print(s, type(s))
s = set('hello world')
print(s, type(s))
#使用set()函數對字典進行轉換時,隻會包含字典中的鍵
se ={
    'name': '天問',
    'number' : '1',
    'usr' : '秦始皇'
} 
s = set(se)
print(s, type(se), type(s))
           
>>> {1, 2} <class 'set'>
>>> {8, 1, 4, 5} <class 'set'>
>>> {'h', 'e', 'w', 'o', 'd', 'r', ' ', 'l'} <class 'set'>
>>> {'usr', 'name', 'number'} <class 'dict'> <class 'set'>
           

二、集合的使用

# in 和 not in 來檢查集合中含有的元素,結果傳回bool值
s = {1, 4, 5, 8, 4, 1}
print(1 in s)


#len()函數擷取集合元素的個數(長度)
print(len(s))

#add()向集合中添加元素
s.add(7)
s.add('k')
print(s)
#update()将集合中的元素添加到目前集合中
s1 = set('hello')
s.update(s1)
print(s)
#pop()随機删除集合中的一個元素
#remove()删除指定元素
#clear()清空
           
>>> True
>>> 4
>>> {1, 4, 5, 7, 8, 'k'}
           

三、集合的運算

集合在進行運算時,通常是在做交集并集類的運算而不是加減類的運算。

s1 = {1, 2, 3, 5, 4}
s2 = {2, 5, 7, 6, 8}
##交集運算 &
result = s1 & s2
print(result)
##并集運算 “|” 
result2 = s1 | s2
print(result2)
##差集運算  就是在被減集上去掉兩者的交集
result3 = s1 - s2
print(result3)
##亦或運算 ' ^ '  去除交集之後的并集
result4 = s1 ^ s2
print(result4)
           
>>> {2, 5}
>>> {1, 2, 3, 4, 5, 6, 7, 8}
>>> {1, 3, 4}
>>> {1, 3, 4, 6, 7, 8}
           

此外,此外還有子集的判斷。如下

# <= 檢查一個集合是否是另一個集合的子集,結果傳回bool值
a = {1, 2, 3}
b = {1, 2, 3, 4, 5}
print(a <= b)
#< 檢查一個集合是不是另一個集合的真子集
print(a < b)
# >= 檢查一個集合是否是另一個集合的超集,結果傳回bool值
# > 檢查一個集合是不是另一個集合的真超集
           
>>> True
>>> True
           

四、函數

函數也是一個對象 function

#對象是記憶體在中專門用來存儲資料的一塊區域

#建立

#文法:

def 函數名(形參1, 形參2, …):

代碼塊
def fun1(x):
    y = 3 * x + 5
    return y
           

五、函數的參數

#在定義函數的時候,可以在函數名後面的括号裡面定義數量不等是形參

#多個形參之間用“,”隔開

#形參 :形式參數,沒有真正的指派

#實參:實際參數,在調用函數時使用需要跟定義函數時的形參對應上

六、函數的主要傳遞方式

定義函數的時候我們可以為形參定義一個預設值

def funct(a, b, c = 10):
    return(a + b + c)


print(funct(1,1))
print(funct(1,1,1))
           
>>> 12
>>> 3
           

參數的傳遞方式

#位置傳參:按照形參位置在調用函數時根據位置傳參
print(funct(1, 2, 3))
#關鍵字傳參:按照形參進行傳參
print(funct(a = 1, c = 6,  b = 2))
#上述兩者可以混合使用
print(funct(1, 2, c = 3))
           
>>> 6
>>> 9
>>> 6
           
ps:混合使用時位置傳參寫道關鍵字傳參前面

七、參數的類型

#函數再調用的時候,解釋權不會檢查實參的類型

#實參的類型可以是任意對象

形參在執行 的過程中當我們通過形參去改對象時會影響到指向該對象的變量

d = [1, 2, 3]
def f(a):
    a[0] = 10
    print(a)
f(d)
print(d)
           
>>> [10, 2, 3]
>>> [10, 2, 3]
           

通過淺複制,可以解決這個問題

d = [1, 2, 3]
def f(a):
    a = a.copy()
    a[0] = 10
    print(a)
f(d)
print(d)
           
>>> [10, 2, 3]
>>> [1, 2, 3]
           

八、不定長參數

位置參數’ * ’

#定義一個函數來實作任意數的和

#在定義函數的時候在形參前面加“*”這樣這個實參将會擷取到所有的實參

#并且将所有的實參儲存到一個元組中

def fu(a, b, *c):
    print(a)
    print(b)
    print(c)
fu(1,2,3,4,5)
           
>>> 1
>>> 2
>>> (3, 4, 5)
           

對于不定長參數的傳參

def fu(a, *b, c):#加在第b上在傳參時會直接被b所包含
    print(a)
    print(b)
    print(c)
fu(1,2,3,4,5)#使用該方法傳參會報錯如下
fu(1,2,3,4,c=5)#傳參時需要指定c的值

           
>>> TypeError: fu() missing 1 required keyword-only argument: 'c'
>>> 1
>>> (2, 3, 4)
>>> 5
           

特殊傳參要求:

#在形參前面直接寫“*”,表明該函數在調用時隻能使用關鍵字傳參
def fu(*,a, b, c):
    print(a)
    print(b)
    print(c)
fu(a = 1, c = 2, b = 3)
           
>>> 1
>>> 3
>>> 2
           
關鍵字參數’ ** ’

“ ** ”形參可以接收其他的關鍵字參數,他會将這些參數統一儲存到一個字典當中

def fu(**a):
    print(a)
fu(a = 1, c = 3, d = 5)
           
>>> {'a': 1, 'c': 3, 'd': 5}
           

“ ** ”形參隻能有一個,而且必須寫最後一個參數上

def fu(a, b, **c):
    print(a)
    print(b)
    print(c)
fu(a=1,c=2,s=3,e=4,b=5)
           
>>> 1
>>> 5
>>> {'c': 2, 's': 3, 'e': 4}
           

九、參數的解包

#序列在傳遞的過程中加 * 會自動将序列按照參數的方式進行傳遞

#要求序列中的元素個數必須和形參的個數一緻

def fu(a, b, c):
    print(a)
    print(b)
    print(c)
t = (4, 5, 6)
fu(*t)
           
>>> 4
>>> 5
>>> 6
           
使用 ** 對字典進行解包
d = {
    'a': 10,
    'b': 20,
    'c': 1
}
fu(**d)
           
>>> 10
>>> 20
>>> 1