Day06-函数
函數(shù)
一、集合(set)
特點(diǎn):不允許有重復(fù)元素,如果添加重復(fù)元素,則會(huì)自動(dòng)過濾,可以進(jìn)行交集、并集的運(yùn)算。
本質(zhì):無序且無重復(fù)元素的數(shù)據(jù)結(jié)構(gòu)
1 創(chuàng)建集合
s1 = set() #空集合 不能是{},這是字典 s2 = {1,2,3,4} print(s1) print(set([30,40,50])) #通過列表創(chuàng)建 print(set((11,22,33))) #通過元組創(chuàng)建 print(set('hello')) ? ? #通過字符串創(chuàng)建 ? print(set({'name':'大寶','age':20})) ? #通過字典創(chuàng)建,得到一個(gè)鍵的集合 ? #注意:重復(fù)元素在set中會(huì)被自動(dòng)過濾2 集合操作
#1 增加 #add添加不可變?cè)?s1.add(5) # s1.add([6,7]) #不能添加列表,列表和字典都是不可哈希的 s1.add((6,7)) #可以添加元組元素,元組是可哈希的 print(s1) ? #set.update(s) s必須是可迭代的對(duì)象:列表、元組、字符串、字典 #update會(huì)把列表、元組、字符串打碎添加到集合中 s1 = {1,2,3,4} s1.update([5,6]) s1.update((7,8)) s1.update('hello') s1.update({'1':10,'2':20}) #將字典的鍵添加到s1 print(s1) ? #2 刪除 #set.remove(elem) set3 = {1,2,3,4,5,6} set3.remove(4) #直接刪除指定元素 print(set3) ? print(set3.pop()) #刪除任意元素,并返回該元素的值 print(set3) set3.discard(10) #刪除的元素不存在,不會(huì)報(bào)錯(cuò) #set3.remove(10) #如果元素不存在,則報(bào)錯(cuò):KeyError ? #3元素個(gè)數(shù) print(len(set3)) ? #4 成員操作 print(2 in set3) #True ? #5 并、交、差集 s1 = {1,2,3,4,5} s2 = {3,4,5,6,7} print(s1 | s2) #并 print(s1 & s2) #交集 print(s1 - s2) #差集二、補(bǔ)充
2.1數(shù)據(jù)類型的轉(zhuǎn)換
| int(x) | 將x轉(zhuǎn)換為int類型 |
| float(x) | 將x轉(zhuǎn)換成浮點(diǎn)型 |
| str(x) | 將x轉(zhuǎn)換成字符串 |
| bool(x) | 轉(zhuǎn)換成bool類型 的True False |
| dict(x) | 將序列x轉(zhuǎn)換成字典 |
| list(x) | 將序列x轉(zhuǎn)換成列表 |
| set(x) | 將序列x轉(zhuǎn)換成集合 |
| tuple(x) | 將序列x轉(zhuǎn)換成元組 |
###2.2布爾值
在python中,能夠解釋為假的值有:None、0、0.0、False、所有的空容器(空列表、空元組、空字典、空集合、空字符串),其它是真
2.3 zip函數(shù)
zip() 函數(shù)用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的列表。
如果各個(gè)迭代器的元素個(gè)數(shù)不一致,則返回列表長度與最短的對(duì)象相同,利用 * 號(hào)操作符,可以將元組解壓為列表。
語法:zip(iterable1,iterable2, ...)
參數(shù)說明:iterable -- 一個(gè)或多個(gè)可迭代對(duì)象(字符串、列表、元祖、字典)
a = [1,2,3,4] b = [2,3,4] res = zip(a,b) print(list(res)) #[(1, 2), (2, 3), (3, 4)] # 可以使用for-in 遍歷 for x,y in zip(a,b):print(x,y)2.4 列表推導(dǎo)式
運(yùn)用列表推導(dǎo)式,可以快速生成list,可以通過一個(gè)list推導(dǎo)出另一個(gè)list,而代碼卻十分簡(jiǎn)潔。
#列表推導(dǎo)式語法: [exp for iter_var in iterable] 執(zhí)行for-in循環(huán)時(shí),通過iter_var遍歷iterable每一項(xiàng),exp表達(dá)式中可以直接使用iter_var,每遍歷一項(xiàng),產(chǎn)生一個(gè)新的列表元素。 #生成[0,1,4,9,16,25] [x*x for x in range(6)] ? #生成[0,4,16,36,64] l2 = [x*x for x in range(9) if x % 2 ==0] print(l2) ? #可以使用雙重循環(huán) suit = ['?','?','?','?'] face = ['A','2','3','4','5','6','7','8','9','10','J','Q','K'] poke = [(x,y) for x in suit for y in face] ? #字典推導(dǎo)式 #列表生成式可以使用兩個(gè)變量,實(shí)現(xiàn)字典的鍵值交換 d = {"X":"A","Y":"B","Z":"C"} list5 = {v:k for k,v in d.items()} print(list5) ? #集合推導(dǎo)式 print({x for x in range(10)}) ? #練習(xí): 1.將一個(gè)列表中所有的字符串變成小寫l = ["Hello","World","IBM","Apple"] 如果是這樣的列表呢l = ["Hello","World",10,"IBM","Apple"]三、函數(shù)引入
前面我們寫過九九乘法表,但如果我要七七乘法表或五五乘法表的話,你會(huì)看到三者代碼極其類似,只是循環(huán)變量不同,那么如何做到代碼重用,而不是簡(jiǎn)單拷貝黏貼修改呢,其實(shí)可是使用函數(shù)完成這一功能
def table(row,col,sep=3):for i in range(1, row + 1):for j in range(1, col + 1):if j <= i:print("%d*%d = %2d" % (i, j, i * j), end='%*s'%(sep,' '))print('') #一次編碼,到處運(yùn)行 table(8,8) table(5,5,8)函數(shù)的優(yōu)點(diǎn):
-
代碼可復(fù)用
-
代碼可維護(hù)性高
-
容易排錯(cuò)
-
可讀性好
-
利于團(tuán)隊(duì)開發(fā)
1.函數(shù)定義
函數(shù)就是完成特定功能的代碼塊,本質(zhì)上是對(duì)代碼的封裝。 語法格式
def 函數(shù)名([參數(shù)1],[參數(shù)2]....[參數(shù)n]):函數(shù)體-
函數(shù)名命名規(guī)則同變量名,要滿足標(biāo)識(shí)符命名規(guī)則
-
不能和系統(tǒng)函數(shù)重名,否則系統(tǒng)函數(shù)無法使用
-
函數(shù)定義分兩部分函數(shù)頭和函數(shù)體
-
函數(shù)體,就是實(shí)現(xiàn)功能的代碼段,以:開頭,必須縮進(jìn)
-
函數(shù)名的命名風(fēng)格:一般建議用下劃線分隔的小寫單詞組成:say_hello
2 函數(shù)參數(shù)
2.1 實(shí)參和形參
-
形參:就是函數(shù)定義時(shí)小括號(hào)里的變量
-
實(shí)參:函數(shù)調(diào)用的時(shí)候,小括號(hào)里的表達(dá)式
-
函數(shù)可以沒有形參和實(shí)參
2.2 參數(shù)分類
-
位置參數(shù),要求實(shí)參順序必須和形參順序完全一致,由形參順序決定實(shí)參順序
def say_hello(name,age,home):print('大家好,我是{},我今年{}歲了,我來自{}'.format(name,age,home)) ? say_hello('王二妮',18,'湖北武漢') #實(shí)參個(gè)數(shù)、順序必須和形參一致 -
關(guān)鍵字參數(shù),函數(shù)調(diào)用時(shí),實(shí)參可以是鍵值對(duì),鍵就是形參名字,這樣的調(diào)用,實(shí)參不必關(guān)心形參的順序。
def say_hello(name,age,home):print('大家好,我是{},我今年{}歲了,我來自{}'.format(name,age,home)) ? say_hello(name='王二傻',home='大連',age=20) #三個(gè)關(guān)鍵字參數(shù) say_hello('大傻',home='美國',age=30) #兩個(gè)關(guān)鍵字參數(shù) sya_hello('二傻',24,home='何方') ? #一個(gè)關(guān)鍵字參數(shù) -
默認(rèn)值,如果形參在定義的時(shí)候給定一個(gè)值,那么函數(shù)在調(diào)用時(shí)就可以不傳實(shí)參,可以簡(jiǎn)化調(diào)用
-
默認(rèn)值參數(shù)必須放到最右邊
-
如果傳了實(shí)參,那么實(shí)參優(yōu)先,不會(huì)使用默認(rèn)值
-
默認(rèn)值只計(jì)算一次
-
默認(rèn)值必須是不可變對(duì)象
-
-
可變參數(shù),傳入的參數(shù)個(gè)數(shù)是可變的,可以是1個(gè)、2個(gè)到任意個(gè),還可以是0個(gè)。
#使用*接收任意數(shù)量的位置參數(shù)#注意:*的不定長參數(shù)被當(dāng)做元組處理 def demo(a,b,*args):print(a,b,args)demo(12,33,90) demo(1,2,3,4,5) a=(1,2,3) demo(*a)#使用**接收任意數(shù)量的關(guān)鍵字參數(shù) #注意:**的不定長參數(shù)被當(dāng)做字典處理 def demo1(a,**args):print(a,args) demo1(1,name='kk',age=3) b = {'a':20,'b':12,'c':32} demo(**b)
2.3 參數(shù)組合
-
形參順序須按照以下順序:位置參數(shù)、默認(rèn)值參數(shù)、*args,**kwargs
3 函數(shù)調(diào)用
-
函數(shù)調(diào)用必須在函數(shù)定義之后
-
函數(shù)調(diào)用必須能夠正確傳遞實(shí)參
def demo(a,b,c=0,*arg1,**arg2):print(a,b,c,arg1,arg2) demo(1,3,k=4) demo(1,2,3,4,5) demo(1,b=3,c=3,d=5) demo(*(1,2,3),**{'name':12}) #任何函數(shù)都可通過這種形式傳遞參數(shù)
4 返回值
可以通過return語句返回計(jì)算結(jié)果。語法: return 表達(dá)式
-
return的作用一個(gè)是終止函數(shù)的執(zhí)行,所有執(zhí)行了return后,其后的語句不會(huì)被執(zhí)行
-
如果沒有return語句,則默認(rèn)返回的是None
-
return還可以返回給調(diào)用者數(shù)值
-
return可以返回一個(gè)值,如果要返回多個(gè)值,那么返回的是一個(gè)元組
def demo2():return 1 def demo3():return 1,2,3 print(demo2()) print(demo3()) #(1,2,3)
5 文檔字符串
函數(shù)文檔字符串documentation string (docstring)是在函數(shù)開頭,用來解釋其接口的字符串。簡(jiǎn)而言之:幫助文檔
-
包含函數(shù)的基礎(chǔ)信息
-
包含函數(shù)的功能簡(jiǎn)介
-
包含每個(gè)形參的類型,使用等信息
文檔字符串書寫規(guī)則:
-
必須在函數(shù)的首行
-
使用三引號(hào)注解的多行字符串(''' ''') 或(""" """)
-
函數(shù)文檔的第一行一般概述函數(shù)的主要功能,第二行空,第三行詳細(xì)描述。
def test():"""函數(shù)名:test功能:測(cè)試參數(shù):無返回值:無"""print("函數(shù)輸出成功")#使用__doc__屬性查看文檔字符串 print(test.__doc__)
6.參數(shù)傳遞
python的參數(shù)傳遞是簡(jiǎn)單的值傳遞,當(dāng)然這里的值是指變量的引用(地址),不是變量的值。不存在值傳遞和引用傳遞的區(qū)分。簡(jiǎn)而言之,python的參數(shù)傳遞可以稱之為對(duì)象引用傳遞,對(duì)象可以分為:
-
不可變對(duì)象:int、float、None、complex、bool、tuple、str,range
-
在函數(shù)內(nèi)部不可能修改函數(shù)外部的變量
-
-
可變對(duì)象: dict、list
-
可以在函數(shù)內(nèi)部修改
-
7 空函數(shù)
借助于pass語句實(shí)現(xiàn),函數(shù)體不完成任何功能,只有一個(gè)pass語句
def test():pass8 匿名函數(shù)
不再使用def 函數(shù)名()這種形式定義函數(shù),而是使用lambda來創(chuàng)建匿名函數(shù)
特點(diǎn):
-
lambda只是一個(gè)表達(dá)式,函數(shù)體比def簡(jiǎn)單的多
-
lambda的函數(shù)體不再是代碼塊
-
lambda只有一行,增加運(yùn)行效率
語法:
lambda [arg1,arg2....argn]:函數(shù)體 add = lambda a,b:a + b print(add(3,5))9.函數(shù)類型
函數(shù)也是一種類型,我們自定義的函數(shù)就是函數(shù)對(duì)象,函數(shù)名保存了函數(shù)對(duì)象的引用(地址)
def test():print('我是測(cè)試函數(shù)')print(test) #函數(shù)名是變量,指向了函數(shù)對(duì)象 pf = test #pf變量也指向了函數(shù)對(duì)象,所以也可以通過pf調(diào)用test函數(shù) pf()10.傳入函數(shù)
一個(gè)函數(shù)就可以接收另一個(gè)函數(shù)作為參數(shù),這種函數(shù)就稱之為高階函數(shù),也可以稱之為傳入函數(shù)。可以實(shí)現(xiàn)通用編程,排序等復(fù)雜功能
總結(jié)
- 上一篇: php导出excel出现乱码,php导出
- 下一篇: c语言中期报告程序,课题中期报告