Python學習函式,「利用函式修改元組的坑」

2021-08-13 19:49:18 字數 4603 閱讀 6161

def 函式名(引數列表):

函式體

簡單函式例項:

#定義乙個函式名為printname的函式,函式無返回值,只是列印一串字元,()函式呼叫符,可以看出呼叫printname函式後,列印

>>>

defprintname

(): print("best today")

>>> printname()

best today

>>>

#定義乙個待返回值的函式printname,將傳入的值返回給函式名為sendrose的函式,列印輸出語句

>>>

defprintname

(name):

return name

>>>

defsendrose

(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

>>>

defrevisenum

(num):

num = 10

print(num)

>>> revisenum(number)

10>>> print(number)

5>>>

#python中name被識別是string型的資料,我們把name傳進去,可以看做是讓引數name也指向「wang」存放的記憶體空間,修改引數name其實就是讓引數name重新指向新的記憶體空間,而name則還是指向「wang」的這塊記憶體(個人理解)

>>> name = "wang"

>>>

defrevisename

(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')

>>>

defrevisetuple

(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","yun")

>>> t1

(, 'wang', 'yun')

>>>

defrevisetuple

(t):

dict1 = t[0]

dict1["wang"] = "bad"

print(t)

>>> revisetuple(t1)

(, 'wang', 'yun')

>>> t1

(, 'wang', 'yun')

>>>

7、引數傳遞中引數設定

(1).必需引數,我們上面的簡單示例的sendrose(name),name這個引數在呼叫的時候是必須要傳遞的否則會報錯,且必需引數須以正確的順序傳入函式。呼叫時的數量必須和宣告時的一樣

(2).關鍵字引數,使用關鍵字引數允許函式呼叫時引數的順序與宣告時不一致

#傳入引數可以和呼叫的不一致

>>>

defprintnameandage

(str, int):

print("%s : %d" %(str,int))

>>> printnameandage(int =30,str ="wang")

wang : 30

>>>

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

>>> 

defprintnameandage

(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)不定長引數,當你宣告乙個函式,但是不知道需要多少引數合適時,這時不定引數就派上用場了

>>> 

defprintname

(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

yunxiaomi

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等)是不會引入新的作用域的,也就是說這這些語句內定義的變數,外部也可以訪問

>>> 

defprintage

(): num = 10

#區域性》 num

traceback (most recent call last):

file "", line 1, in

numnameerror: name 'num'

isnot defined

>>>

iftrue:

num1 = 20

>>> num1

20

python學習 函式

學習 def my abs x if x 0 return x else return x函式呼叫可以按順序使用預設引數,也可以不按順序提供部分引數但是需要把引數名寫上。def enroll name,gender,age 6,city beijing print name name print g...

Python學習 函式

函式 可以實現乙個功能的 組 自定義函式的定義必須要使用def關鍵字 函式命名通常使用英文結合數字或下劃線,嚴格區分大小寫,不能和關鍵字相同 格式 def 函式名 函式功能語句1 函式功能語句2 函式名 具有引數的函式結構 def 函式 引數名,引數名.函式功能語句1 函式功能語句2 函式名 值,值...

Python學習 函式

函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的 段。函式的使用可以提高 的重用 提高程式設計的效率。def functionname params,函式的文字說明 main fun return 1 函式 塊 是以def開頭,後面接函式名和圓括號 2 圓括號裡面放函式引數,或者說引數的規...