函數
面向對象編程: 類----class
面向過程編程:過程---def
函數式編程:函數---def
def test(x):'''描述'''x +=1return x#def是定義函數的關鍵字#test是函數名稱#(x)是參數#x+=1是 函數體,是一段邏輯代碼#return 定義返回值,返回給test函數 ,并結束函數 1.
def func1():'''test'''print ('in the func1')return 0#函數式編程def func2():'''test2'''print ('in the func2')#定義面向過程的函數,沒有return; 過程就是沒有返回值的函數
x = func1()
y = func2()print ('from func1 return is %s' %x)
print ('from func2 return is %s' %y) 
雖然過程函數沒有return,但是python會隱式的給返回一個None,所以兩者差別并不大
2.
def logger():with open('test.txt','a') as f:f.write('end action\n')def test1():print('in the test1')logger()def test2():print('in the test2')logger()def test3():print('in the test3')logger()test1() #執行函數
test2()
test3()#可以看到三個函數都調用了logger這個函數,否則的話,我們需要在每三個函數中都要寫#with open這些代碼; 調用了logger函數的話,就免去寫重復的代碼了。 我們要在三個函數每次寫入的時候都加入時間戳
import timedef logger():time_format = '%Y-%m-%d %X' #定義格式為年、月、日、小時分鐘秒time_current = time.strftime(time_format) #顯示時間,以time_format定義的格式來顯示with open('test.txt','a') as f:f.write('%s end action\n' %time_current)#修改logger函數,這樣test的三個函數就全都被修改了。#時間格式%后面的字母根據大小寫的不同,顯示的格式也不同。 
執行后看到文檔內容
定義函數的好處:
代碼重用
保持一致性(修改代碼不會因為認為的原因導致相同的代碼寫錯后不一致)
可擴展性
3.


return除了會返回值給函數,還終止函數的運行,所以后面的print沒有打印。
s = test()
print (s) 
return 將0返回給了test函數,賦值變量后,這個變量就等于這個return的值。
return幾乎可以返回任何類型
為什么要用return,return的作用是什么: 在編程使用函數時,可能代碼會很多,然后根據不同的結return不同的值,根據不同的值可以用作下面代碼的判斷,然后做不同的動作; 比如根據True或False,下面的代碼執行不同的操作。

定義三個函數,一個沒有return,一個return單個元素數字,一個return多個元素
沒有return默認返回None
return單個元素,會正常返回定義的值
return多個元素,會通過元組返回(相當于一個打包,然后一起返回)
4.

定義帶參數的函數
調用函數時,如果不賦值給參數就會報錯

賦值給參數,位置要對應.
1賦值給了x
2賦值給了y
x與y叫做形參:需要引用、被賦值的參數
1與2叫做實參:實際的參數
1與2是真是存在的,會在內存中占用空間;x與y是形式上的參數,如果x與y沒有引用任何值,則不會占用內存空間。

默認的情況下,賦值參數需要位置一 一對應,否則的話就需要指定參數的賦值

位置參數和關鍵詞參數是可以混寫的,默認參數需要位置對應,1賦值給了x,2賦值給了y


這樣賦值是會報錯的,第一個賦值是y=1(使用的是關鍵詞參數賦值),第二個我們使用的是位置參數賦值,但是第二個參數根據位置應該對應的是y,課時y在前面已經被占用了,所以會報錯。


可以看到關鍵參數在位置后面寫就沒有報錯;
5.

在創建函數時,可以給參數賦值默認的值
在給參數賦值時,如果不從新賦值,那么參數就會使用創建函數時給賦予的默認值

可以通過位置和關鍵詞來修改默認參數值
把參數從新賦值就不會使用默認參數值了,會使用新的賦值來覆蓋默認的參數值
默認參數的用途:比如安裝軟件的默認路徑,或者一些默認勾選的選項; 比如設置某個程序的默認端口等等。
6.參數組
當定義一個函數的參數時,實參不能少于或多于形參,否則執行就會報錯; 有多少個實參,定義函數時就得定義多少個形參,但是如果參數需要一萬個,則不可能去寫一萬個參數。
所以這里我們可以使用參數組;當需要的參數數量過多或者實參所需求的數量不明確時,就可以使用參數組;

定義參數組的關鍵符號是‘*’,后面定義一個組名即可
可以看到定義多少個參數都可以,打印時以元組形式打印出來。
‘*’ 用來接收N個位置參數,轉換成元組;不能接收關鍵字參數。。


傳參數值的時候,也可以使用,比如([1,2,3,4,5]),只不過打印出來的時候會轉換成元組


使用兩個*,表示可以傳入字典參數; 把N個關鍵字參數,轉換成字典的方式。
‘’用來接收N個關鍵字參數,轉換成字典。
test(**{'name':'zhangsan','age':20}) 
傳入參數也可以使用兩個**,只不過字典的寫法稍有差別


打印字典key對應的value
def test3(name,**kwargs):print (name)print (kwargs)test3(123) 
位置參數和參數組一起使用;
這里沒有定義參數組的值,所以打印出來為空的字典
def test3(name,**kwargs):
print (name)
print (kwargs)test3('lisi',age=20,sex='M') 
位置參數和參數組的值,被分開打印了
def test4 (name,age=18,**kwargs): #在寫普通參數和參數組時,要把參數組寫在后面print (name)print (age)print (kwargs)test4('lisi',sex='M',hobby='car') 
使用兩個位置參數和一個參數組;第二個位置參數被打印的是默認值
test4('lisi',sex='M',hobby='car',age=20) 
age位置參數不使用默認值,根據關鍵字參數的方式對其修改
test4('lisi',22,sex='M',hobby='car') 
age根據位置參數的方式對其修改


*args 接收N個位置參數;**kwargs接收N個關鍵字參數; 在賦值個參數時,后面并沒有符合位置參數的值,所以打印位置參數會顯示一個空的元組。
test5 ('lisi',33,44,55,66,sex='M',hobby='car') 
這樣4種參數就都可以體現出來了

函數嵌套函數;


可以看到此處的代碼與上面的一樣,只是logger這個函數在調用函數的下面,執行時就會報錯,所以在調用函數時,一定要在相關函數的下面去掉用,否則是找不到相關內容的。
轉載于:https://blog.51cto.com/daimalaobing/2046665