1. 程式人生 > >Python學習函式,“利用函式修改元組的坑”

Python學習函式,“利用函式修改元組的坑”

函式:通俗的講就是將可以重複利用的功能封裝成程式碼塊,供其調取使用,函式能提高應用的模組性,和程式碼的重複利用率,系統內的函式叫做內建函式,使用者也可以自定義函式,叫做使用者自定義函式
1、函式程式碼塊以 def 關鍵詞開頭,後接函式識別符號名稱和圓括號 ()
2、任何傳入引數和自變數必須放在圓括號中間,圓括號之間可以用於定義引數
3、函式的第一行語句可以選擇性地使用文件字串—用於存放函式說明
4、函式內容以冒號起始,並且縮排
5、語法結構:

def 函式名(引數列表):
    函式體

簡單函式例項:

#定義一個函式名為printName的函式,函式無返回值,只是列印一串字元,()函式呼叫符,可以看出呼叫printName函式後,列印
>>> def printName(): print("Best Today") >>> printName() Best Today >>>
#定義一個待返回值的函式printName,將傳入的值返回給函式名為sendRose的函式,列印輸出語句
>>> def printName(name):
    return name
>>> def sendRose(name):
    if name == "yun":
        print("send Rose")
    elif
name == "yue": print("send lily") >>> sendRose(printName("yun")) send Rose

6、傳遞引數有兩種,一是可更改的物件,另一種是不可更改物件,在Python中strings, tuples, 和 numbers 是不可更改的物件,而 list,dict 等則是可以修改的物件,接下來我們看些例子:

#Python中number被識別是number型的資料,我們把number傳進去,可以看做是讓num指向5存放的記憶體空間,修改num其實就是讓num重新指向新的記憶體空間,而number則還是指向5的這塊記憶體(個人理解)
>>> number = 5 >>> def reviseNum(num): num = 10 print(num) >>> reviseNum(number) 10 >>> print(number) 5 >>>
#Python中name被識別是string型的資料,我們把name傳進去,可以看做是讓引數name也指向“wang”存放的記憶體空間,修改引數name其實就是讓引數name重新指向新的記憶體空間,而name則還是指向“wang”的這塊記憶體(個人理解)
>>> name = "wang"
>>> def reviseName(name):
    name = name + "yun" 
    print(name,id(name))

>>> reviseName(name)
wangyun 4590679520
>>> print(name)
wang
>>> id(name)
4591245776
>>> id("wang")
4591245776
>>> id("wangyun")
4591245608
>>>
#特別注意::::我們定義一個reviseTuple可以傳遞一個元組的引數,該元組包含一個列表和兩個字串,我們在函式內修改元組中列表的值,輸出後,元組裡面的資料也發生變化,當我們修改字串時,編譯器會報出“TypeError: 'tuple' object does not support item assignment”,這點有人就該問,我明明修改元組裡面的值,為什麼元組說是不可改變的呢?其實我們可以認為元組裡面存放的時元素的地址,元素改變地址肯定改變,而列表和字典支援原位修改的,修改後只是記憶體大小的改變而地址是不改變的,所以我們修改了列表後,元組也發生了改變,從這點我們也可以看出當我們傳入字典或者列表進行修改,同樣會修改原來的值,原因是一樣,列表和字典支援原位修改,而地址不變(個人理解)

//修改列表
>>> t1 = ([1,2,3],"wang","yun")
>>> t1
([1, 2, 3], 'wang', 'yun')
>>> def reviseTuple(t):
    l1 = t[0]
    l1[0] = 10
    print(t)

>>> reviseTuple(t1)
([10, 2, 3], 'wang', 'yun')
>>> print(t1)
([10, 2, 3], 'wang', 'yun')
>>> 

//修改字典
>>> t1 = ({"wang":"good"},"wang","yun")
>>> t1
({'wang': 'good'}, 'wang', 'yun')
>>> def reviseTuple(t):
    dict1 = t[0]
    dict1["wang"] = "bad"
    print(t)


>>> reviseTuple(t1)
({'wang': 'bad'}, 'wang', 'yun')
>>> t1
({'wang': 'bad'}, 'wang', 'yun')
>>> 

7、引數傳遞中引數設定
(1).必需引數,我們上面的簡單示例的sendRose(name),name這個引數在呼叫的時候是必須要傳遞的否則會報錯,且必需引數須以正確的順序傳入函式。呼叫時的數量必須和宣告時的一樣
(2).關鍵字引數,使用關鍵字引數允許函式呼叫時引數的順序與宣告時不一致

#傳入引數可以和呼叫的不一致
>>> def printNameAndAge(str, int):
    print("%s : %d" %(str,int))
>>> printNameAndAge(int =30,str ="wang")
wang : 30
>>> 

(3).預設引數,呼叫函式時,如果沒有傳遞引數,則會使用預設引數

>>> def printNameAndAge(name, age = 25):  #注意:::預設引數必須放在最後
    print("%s : %d" %(name, age))

>>> printNameAndAge("wang")
wang : 25
>>> printNameAndAge("wang", 16)
wang : 16
#這樣呼叫函式也可以使呼叫引數與宣告的不一致(必須指定引數賦值)
>>> printNameAndAge(age = 16, name = "wang")
wang : 16
>>> 

(4)不定長引數,當你宣告一個函式,但是不知道需要多少引數合適時,這時不定引數就派上用場了

>>> def printName(name1,name2, *randomTuple):
    print(name1,name2)
    for name in randomTuple:
        print(name)


>>> printName("wang", "yun", "xiaomi","iphone")
wang yun
xiaomi
iphone
>>> printName("wang", "yun", "xiaomi","iphone","wang", "yun", "xiaomi","iphone")
wang yun
xiaomi
iphone
wang
yun
xiaomi
iphone
>>> 

8、匿名函式,關鍵字lambda,可以理解為是一個表示式不是程式碼塊,以lambda開頭返回一個函式,但是lambda 函式擁有自己的名稱空間,且不能訪問自己引數列表之外或全域性名稱空間裡的引數
語法結構: lambda [arg1 [,arg2,…..argn]]:expression

#簡單使用
>>> count = lambda num1,num2:num1 * num2
>>> print (count(num2 = 15, num1 = 22))
330
>>> print (count(10, 100))
1000
>>> 

9、Python 中只有模組(module),類(class)以及函式(def、lambda)才會引入新的作用域,其它的程式碼塊(如 if/elif/else/、try/except、for/while等)是不會引入新的作用域的,也就是說這這些語句內定義的變數,外部也可以訪問

>>> def printAge():
    num = 10   #區域性
>>> num
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    num
NameError: name 'num' is not defined
>>> if True:
    num1 = 20
>>> num1
20