一再扭、集合
1.1 集合的特征
集合是無序的,集合中的元素是唯一的,集合一般用于元組或者列表中的元素去重
1.2 集合的格式
格式
變量名=set()
變量名.add(元素)
# 必須不能初始化值
或
變量名={元素奄喂,元素婆赠,绵脯,,}
注意:下面寫法為一個(gè)空字典,為空默認(rèn)是字典蛆挫,如果有數(shù)據(jù)在根據(jù)格式判斷為字典還是集合
name={}
1.3 添加元素
1.3.1 add
- 案例
nums = {11,24,45,96,28}
nums.add(42)
print(nums)
#{96, 42, 11, 45, 24, 28}
1.3.2 update
- 案例
nums = {11,24,45,96,28}
nums2=["anfly","tom"]
nums.update(nums2)
print(nums)
#{96, 'anfly', 11, 45, 24, 28, 'tom'}
1.4:刪除元素
remove赃承,pop,discard
1.4.1 remove
使用remove刪除集合中的元素 如果有直接刪除 如果沒有程序報(bào)錯(cuò)
- 案例:該元素存在
nums = {11,24,45,96,28}
nums.remove(24)
print(nums)
#{96, 11, 45, 28}
- 案例:該元素不存在
nums = {11,24,45,96,28}
nums.remove(245)
print(nums)
#KeyError: 245
1.4.2 pop
1悴侵、如果集合的元素都是數(shù)字, 刪除時(shí), 刪掉的是最小的數(shù)字, 其余數(shù)字升序排列
2瞧剖、如果集合的元素是非數(shù)字, 刪除時(shí), 刪掉的是隨機(jī)的元素, 其余元素隨機(jī)排列
3、如果集合里既有數(shù)字又有非數(shù)字元素, 刪除時(shí):
若刪掉的是數(shù)字, 則一定是刪掉了最小的, 其他數(shù)字升序排列, 非數(shù)字元素隨機(jī)排列;
若刪掉的非數(shù)字, 則一定是隨機(jī)刪掉了一個(gè), 其他數(shù)字升序排列, 非數(shù)字則隨機(jī)排列.
如果集合沒有元素程序報(bào)錯(cuò)
- 案例:有元素
nums = {11,24,45,96,28}
nums.pop()
print(nums)
#{11, 45, 24, 28}
- 案例:無元素
nums = {}
nums.pop()
print(nums)
#TypeError: pop expected at least 1 arguments, got 0
1.4.3 discard
使用discard刪除 如果元素存在直接刪除 如果元素不存在不做任何操作
- 案例:該元素存在
nums = {11,24,45,96,28}
nums.discard(24)
print(nums)
#{96, 11, 45, 28}
- 案例:該元素不存在
nums = {11,24,45,96,28}
nums.discard(242)
print(nums)
#{96, 11, 45, 24, 28}
1.5:集合的交集和并集
1.5.1:交集
使用&連接多個(gè)集合,得到相同的元素
- 案例:存在相同元素
set1 = {"anfly","tom","haha"}
set2 = {"anfly","susala"}
set3= set1 & set2
print(set3)
返回值:{'anfly'}
- 案例:存在相同元素
set1 = {"anfly","tom","haha"}
set2 = {"anfly2","susala"}
set3= set1 & set2
print(set3)
返回值:set()
1.5.2:并集
使用|連接多個(gè)集合,得到全部集合中全部的元素
- 案例:
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
new_set = set1 | set2
print(new_set)
#{1, 2, 3, 4, 5, 6}
1.6 公共方法
1.6.1:運(yùn)算符
(1)加法
(2)乘法
[圖片上傳失敗...(image-3e9eb6-1618241534738)]
(3)in
1.6.2:python中的內(nèi)置函數(shù)
(1)長度:len()
(2)最大值:max()
(3)刪除:del()
二可免、函數(shù)
2.1 什么是函數(shù)
在開發(fā)程序時(shí)抓于,需要某塊代碼多次,但是為了提高編寫的效率以及代碼的重用浇借,所以把具有獨(dú)立功能的代碼塊組織為一個(gè)小模塊捉撮,這就是函數(shù)
2.2 函數(shù)定義和調(diào)用
格式
def 函數(shù)名():
執(zhí)行語句
函數(shù)名() #調(diào)用函數(shù)
- 案例
def hello():
print("hello word")
hello()
注意:
定義了函數(shù)之后,就相當(dāng)于有了一個(gè)具有某些功能的代碼妇垢,想要讓這些代碼能夠執(zhí)行呕缭,需要調(diào)用它
調(diào)用函數(shù)很簡單的,通過 函數(shù)名() 即可完成調(diào)用
每次調(diào)用函數(shù)時(shí)修己,函數(shù)都會(huì)從頭開始執(zhí)行恢总,當(dāng)這個(gè)函數(shù)中的代碼執(zhí)行完畢后,意味著調(diào)用結(jié)束了
當(dāng)然了如果函數(shù)中執(zhí)行到了return也會(huì)結(jié)束函數(shù)
2.3 函數(shù)參數(shù)
思考:現(xiàn)在需要定義一個(gè)函數(shù)睬愤,這個(gè)函數(shù)能夠完成2個(gè)數(shù)的加法運(yùn)算片仿,并且把結(jié)果打印出來,該怎樣設(shè)計(jì)尤辱?
- 案例
def add2num():
a = 11
b = 22
c = a+b
print c
思考:如果為了讓一個(gè)函數(shù)更通用砂豌,即想讓它計(jì)算哪兩個(gè)數(shù)的和,就讓它計(jì)算哪兩個(gè)數(shù)的和光督,在定義函數(shù)的時(shí)候可以讓函數(shù)接收數(shù)據(jù)?
引入:參數(shù)傳遞
2.3.1:位置參數(shù)
格式
def 函數(shù)名(參數(shù)1,參數(shù)2):
代碼塊
函數(shù)名(值1,值2)
- 案例:
def fun(a,b):
print("a:",a)
print("b:",b)
fun(2,3)
結(jié)果:a: 2 b:3
小總結(jié)
定義時(shí)小括號(hào)中的參數(shù)阳距,用來接收參數(shù)用的,稱為 “形參”
調(diào)用時(shí)小括號(hào)中的參數(shù)结借,用來傳遞給函數(shù)用的筐摘,稱為 “實(shí)參”
2.3.2 關(guān)鍵字參數(shù)
格式
def 函數(shù)名(參數(shù)1,參數(shù)2):
代碼塊
函數(shù)名(參數(shù)1=值1,參數(shù)2=值2)
案例:
def fun(a,b):
print("a:",a)
print("b:",b)
fun(a=2,b=3)
結(jié)果:a: 2 b:3
注意:參數(shù)調(diào)用時(shí),可以改變傳參順序,如果有位置參數(shù)需要位置參數(shù)放在關(guān)鍵字參數(shù)前面
案例:
def fun(a,b):
print("a:",a)
print("b:",b)
fun(3,b=2)
結(jié)果:a: 3 b:2
如果關(guān)鍵字參數(shù)傳參要在位置參數(shù)之前船老,將會(huì)報(bào)錯(cuò)
案例:錯(cuò)誤
def fun(a,b):
print("a:",a)
print("b:",b)
fun(a = 3,2)
#SyntaxError: positional argument follows keyword argument
2.3.3:缺省參數(shù)
在形參中默認(rèn)有值的參數(shù)咖熟,稱之為缺省參數(shù)
案例:調(diào)用函數(shù)時(shí),缺省參數(shù)的值沒有傳入
def printinfo(name,age=20):
print("name:",name)
print("age:",age)
printinfo(name="anfly")
#name: anfly
#age: 20
案例:調(diào)用函數(shù)時(shí)柳畔,缺省參數(shù)的值傳入
def printinfo(name,age=20):
print("name:",name)
print("age:",age)
printinfo(name="anfly",age=10)
#name: anfly
#age: 10
案例
def printinfo(age=20,name):
print("name:",name)
print("age:",age)
printinfo(name="anfly",age=10)
#SyntaxError: non-default argument follows default argument
總結(jié)
調(diào)用函數(shù)時(shí)馍管,缺省參數(shù)的值如果沒有傳入,則取默認(rèn)值(形式參數(shù))薪韩,如果傳入确沸,則取實(shí)際參數(shù)
缺省參數(shù)一定要位于位置參數(shù)的最后面
2.3.4 不定長參數(shù)
有時(shí)可能需要一個(gè)函數(shù)能處理比當(dāng)初聲明時(shí)更多的參數(shù), 這些參數(shù)叫做不定長參數(shù)捌锭,聲明時(shí)不會(huì)命名。
格式
def printinfo(*args,**kwargs):
print("args:",args)
print("kwargs:",kwargs)
printinfo(參數(shù))
注意:加了星號(hào)(*)的變量args會(huì)存放所有未命名的變量參數(shù)罗捎,args為元組
而加**的變量kwargs會(huì)存放命名參數(shù)观谦,即形如key=value的參數(shù), kwargs為字典
案例:不定長參數(shù)* args
def printinfo(*args):
print("args:",args)
printinfo(100,200,300,400)
#args: (100, 200, 300, 400)
案例:* args不能接收key=value類型的參數(shù)
def printinfo(*args):
print("args:",args)
printinfo(100,200,300,b = 400)
#TypeError: printinfo() got an unexpected keyword argument 'b'
案例:不定長參數(shù)* * kwargs
def printinfo(**kwargs):
print("kwargs:",kwargs)
printinfo(a=100,b=200,c=300,d= 400)
#kwargs: {'a': 100, 'b': 200, 'c': 300, 'd': 400}
案例:* * kwargs不能接收未命名的變量參數(shù)
def printinfo(**kwargs):
print("kwargs:",kwargs)
printinfo(100,b=200,c=300,d= 400)
#TypeError: printinfo() takes 0 positional arguments but 1 was given
2.3.5:參數(shù)位置順序
格式
def fun(位置參數(shù),*args,缺省參數(shù),**kwargs):
代碼塊
fun(參數(shù)值)
案例
def sun(a,*args,b=22,**kwargs):
print("a:",a)
print("args:",args)
print("b:",b)
print("kwargs:",kwargs)
sun(100,200,300,b=2,m=3,n=4)
返回值:
a: 100
args: (200, 300)
b: 2
kwargs: {'m': 3, 'n': 4}
注意:?如果很多個(gè)值都是不定長參數(shù)宛逗,那么這種情況下坎匿,可以將缺省參數(shù)放到 *args的后面盾剩, 但如果有**kwargs的話雷激,**kwargs必須是最后的
2.4:函數(shù)返回值
場景:?我給兒子10塊錢,讓他給我買包煙告私。這個(gè)例子中屎暇,10塊錢是我給兒子的,就相當(dāng)于調(diào)用函數(shù)時(shí)傳遞到參數(shù)驻粟,讓兒子買煙這個(gè)事情最終的目標(biāo)是根悼,讓他把煙給你帶回來然后給你對(duì)么,蜀撑,挤巡,此時(shí)煙就是返回值
格式
def sum():
代碼塊
return 值
sum()
代碼
def sum(a,b):
return a+b
sum(1,2)
代碼:查看返回值
def sum(a,b):
return a+b
result = sum(1,2) #保存函數(shù)的返回值
print(result)
2.4.1:多個(gè)return
def create_nums(num):
print("---1---")
if num == 100:
print("---2---")
return num+1 # 函數(shù)中下面的代碼不會(huì)被執(zhí)行,因?yàn)閞eturn除了能夠?qū)?shù)據(jù)返回之外酷麦,還有一個(gè)隱藏的功能:結(jié)束函數(shù)
print("return執(zhí)行之后不會(huì)繼續(xù)執(zhí)行")
print(“1231223")
else:
print("---3---")
return num+2
print("---4---")
result1 = create_nums(100)
print(result1) # 打印101
result2 = create_nums(200)
print(result2) # 打印202
注意:一個(gè)函數(shù)中可以有多個(gè)return語句矿卑,但是只要有一個(gè)return語句被執(zhí)行到,那么這個(gè)函數(shù)就會(huì)結(jié)束了沃饶,因此后面的return沒有什么用處
2.4.2:返回多個(gè)數(shù)據(jù)
代碼
def divid(a, b):
shang = a//b #取模
yushu = a%b #取余
return shang, yushu #默認(rèn)是元組
result = divid(5, 2)
print(result)
# 輸出(2, 1)
總結(jié):return后面可以是元組母廷,列表、字典等糊肤,只要是能夠存儲(chǔ)多個(gè)數(shù)據(jù)的類型琴昆,就可以一次性返回多個(gè)數(shù)據(jù)
2.5:函數(shù)類型
分類:
1\. 無參數(shù),無返回值
2\. 無參數(shù)馆揉,有返回值
3\. 有參數(shù)业舍,無返回值
4\. 有參數(shù),有返回值
2.5.1:無參數(shù)升酣,無返回值的函數(shù)
此類函數(shù)勤讽,不能接收參數(shù),也沒有返回值拗踢,一般情況下脚牍,打印提示燈類似的功能,使用這類的函數(shù)
def printMenu():
print('--------------------------')
print(' xx涮涮鍋 點(diǎn)菜系統(tǒng)')
print('')
print(' 1\. 羊肉涮涮鍋')
print(' 2\. 牛肉涮涮鍋')
print(' 3\. 豬肉涮涮鍋')
print('--------------------------')
2.5.2:無參數(shù)巢墅,有返回值的函數(shù)
?此類函數(shù)诸狭,不能接收參數(shù)券膀,但是可以返回某個(gè)數(shù)據(jù),一般情況下驯遇,像采集數(shù)據(jù)芹彬,用此類函數(shù)
def getTemperature():
# 這里是獲取溫度的一些處理過程
# 為了簡單起見,先模擬返回一個(gè)數(shù)據(jù)
return 24
2.5.3:有參數(shù)叉庐,無返回值的函數(shù)
?此類函數(shù)舒帮,能接收參數(shù),但不可以返回?cái)?shù)據(jù)陡叠,一般情況下玩郊,對(duì)某些變量設(shè)置數(shù)據(jù)而不需結(jié)果時(shí),用此類函數(shù)
2.5.4:有參數(shù)枉阵,有返回值的函數(shù)
?此類函數(shù)译红,不僅能接收參數(shù),還可以返回某個(gè)數(shù)據(jù)兴溜,一般情況下侦厚,像數(shù)據(jù)處理并需要結(jié)果的應(yīng)用,用此類函數(shù)
# 計(jì)算1~num的累積和(案例需實(shí)際演示)
def calculateNum(num):
result = 0
i = 1
while i<=num:
result = result + i
i+=1
return result
2.6:函數(shù)的嵌套
一個(gè)函數(shù)里面又調(diào)用了另外一個(gè)函數(shù)拙徽,這就是所謂的函數(shù)嵌套調(diào)用
案例
def testb():
print("testb start")
print("testb testb 執(zhí)行")
print("testb end")
def testa():
print("testa start")
testb()
print("testa end")
返回值
testa start
testb start
testb testb 執(zhí)行
testb end
testa end
注意:如果函數(shù)A中刨沦,調(diào)用了另外一個(gè)函數(shù)B,那么先把函數(shù)B中的任務(wù)都執(zhí)行完畢之后才會(huì)回到上次 函數(shù)A執(zhí)行的位置
課堂作業(yè)
寫一個(gè)函數(shù)求三個(gè)數(shù)的和膘怕,并返回結(jié)果
寫一個(gè)函數(shù)求三個(gè)數(shù)的平均值想诅,并返回結(jié)果
再寫一個(gè)函數(shù)求每個(gè)數(shù)與平均值之間的差,并返回結(jié)果
寫一個(gè)函數(shù)打印一條橫線
打印自定義行數(shù)的橫線
# 打印一條橫線
def printOneLine():
print("-"*30)
# 打印多條橫線
def printNumLine(num):
i=0
# 因?yàn)閜rintOneLine函數(shù)已經(jīng)完成了打印橫線的功能淳蔼,
# 只需要多次調(diào)用此函數(shù)即可
while i<num:
printOneLine()
i+=1
printNumLine(3)
2.8:匿名函數(shù)
lambda函數(shù)也叫匿名函數(shù)侧蘸,即函數(shù)沒有具體的名稱
代碼
g = lambda x :x+1
print(g(1))
def g(x):
return x + 1
print(g(1))
注意:lambda函數(shù)可以賦值給變量,默認(rèn)是返回的鹉梨,所以不用再加return關(guān)鍵字
注釋:例如g = lambda x:x+1,可以看成如下函數(shù)讳癌,冒號(hào)前是參數(shù),可以有多個(gè)存皂,用逗號(hào)隔開晌坤,冒號(hào)右邊的返回值
三、變量
3.1:局部變量
定義
局部變量旦袋,就是在函數(shù)內(nèi)部定義的變量
約束
其作用范圍是這個(gè)函數(shù)內(nèi)部骤菠,即只能在這個(gè)函數(shù)中使用,在函數(shù)的外部是不能使用的
代碼
def test1():
a = 120
print("我是局部變量a:",a)
a = 240
print("修改之后的局部變量a:",a)
def test2():
a =360
print("我是test02函數(shù)中的局部變量a",a)
test1()
test2()
返回值
我是局部變量a: 120
修改之后的局部變量a: 240
我是test02函數(shù)中的局部變量a 360
注意:局部變量的作用疤孕,為了臨時(shí)保存數(shù)據(jù)需要在函數(shù)中定義變量來進(jìn)行存儲(chǔ)
當(dāng)函數(shù)調(diào)用時(shí)商乎,局部變量被創(chuàng)建,當(dāng)函數(shù)調(diào)用完成后這個(gè)變量就不能夠使用了
3.2:全局變量
定義
在函數(shù)外邊定義的變量叫做全局變量
約束
全局變量能夠在所有的函數(shù)中進(jìn)行訪問
代碼
a = 100
def test1():
print(a) # 雖然沒有定義變量a但是依然可以獲取其數(shù)據(jù)
def test2():
print(a) # 雖然沒有定義變量a但是依然可以獲取其數(shù)據(jù)
# 調(diào)用函數(shù)
test1()
test2()
返回值: 100 100
3.2.1 全局變量和局部變量名字相同
代碼
a = 100 #全局變量
def test1():
a= 300
print("修改后的a:",a)
def test2():
print(a)
# 調(diào)用函數(shù)
test1()
test2()
返回值: 修改后的a:300 100
注意:函數(shù)中的變量修改不會(huì)導(dǎo)致全局變量改變
3.2.2:全局變量的修改
代碼:global的使用
a = 100 #全局變量
def test1():
global a #將a變成全局變量
a= 300
print("修改后的a",a)
def test2():
print(a)
# 調(diào)用函數(shù)
test1()
test2()
注意:在函數(shù)中出現(xiàn)global 全局變量的名字 那么這個(gè)函數(shù)中即使出現(xiàn)和全局變量名相同的變量名 = 數(shù)據(jù) 也理解為對(duì)全局變量進(jìn)行修改祭阀,而不是定義局部變量
擴(kuò)展
在一個(gè)函數(shù)中需要對(duì)多個(gè)全局變量進(jìn)行修改鹉戚,那么可以使用
global a, b
# 還可以用多次global聲明都是可以的
global a
global b