1. 程式人生 > >python三之預設函式(及字典)

python三之預設函式(及字典)

#coding:utf-8
def selfAdd(a):
   a = a + a
   return a   #返回
def selfAdd1(a):
   a  += a

a_list = [ 1,2]
print(selfAdd(a_list)) #賦值回來
selfAdd(a_list)
print a_list
selfAdd1(a_list)
print a_list
"""
在python中,a=a+a是先建立一個新的物件並讓變數a引用這個物件,
a+=a是讓a所引用的物件的值變成a+b的值
賦引數在python是用assignment (分配)不是reference(參考),
所以你賦a過去函式賦的是a的值,而不是a本身。 若你要改動a本身就需要用return賦值回來 分配的地址似乎一直在改變。 原因在於,Python中的資料結構分為可變(mutable)和不可變(immutable)。 對於可變型別,=和+=有著明顯的不同,如上面的list: +表示連線操作,+=表示追加 對於不可變型別,=和+=就是一樣的操作,如上面的tuple 可變型別與不可變型別的本質在於記憶體空間是否可變 """
#coding:utf-8
def fun (a,b,*args,**kwargs):
  print('a',2)
  print('b',3)
  print('args',args)
  print('kwargs',kwargs)
  for x in kwargs:
		print(x,kwargs[x])
  print(x)

"""
我們會發現執行結果p顯示在最前面,注意到細節可知,字典的遍歷結果的顯示順序是隨機的。
Python的字典實現其實就是個雜湊表(當然裡面有一些優化),
每次賦值其實就是計算key的雜湊值然後放到雜湊表的指定位置中。
遍歷的話就是從前向後遍歷整個雜湊表。
這裡不講處理衝突,就說最簡單的往一個空字典中插入兩個值。
"""
fun(1,2,3,4,5,0,n=6,m=7,p=9)
fun(1,2,3,4,5,0,m=6,n=7,o=9)
fun(1,2,3,4,5,0,m=6,n=7 )
fun(1,2,3,4,5,0,o=6,n=7 )#執行結果O在前面
fun(1,2,3,4,5,0,n=6,o=7 )
fun(1,2,3,4,5,0,m=6,n=7,p=9)

'''
fun(1,2,3,4,5,m=6,n=7,p=9,0)
這樣寫是錯誤的,因為最後一類的型別需要是字典,
並且不定長元祖引數需要放在不定長字典引數之前
'''
c=(9,10,11)
d={'m':12,'n':13,'p':14}
fun(1,2,*c,**d)

#coding:utf-8
def int (name,age = 20 ):
	print("name",name)
	print("age",age) 
int(name='kouys') #print("********************8888")
def int (name,age = 20):
print("name",name)
print("age",age)
print int(name='kouys') 
#只輸入了name的初值,因此輸出時age輸出預設值,name輸出給定值
#print int(name='kouys',2)這樣寫會報錯,因為前面name用了關鍵詞鎖定,而age沒有用,在python這裡是不被允許的
#print int(name='kouys',age=2) or print int('kouys',2)這樣寫是正確的,格式統一
print("********************8888")
def int (name,age = 20):
return name 
#此處用了函式返回值return
return age
print int(name='kouys')
print("********************8888")
def int (name,age = 20):
return name
return age
print int('kouys',2) #此時name,age都輸入了初值,因此輸出的name為kouys,age為2
print("********************8888")
這裡給出兩個引數的不同輸出,輸入方法,以及一些相關性質,還有一些注意事項,具體看一下上例應該會明白一點。
接下來,我們會針對不確定引數個數,所以我們要用特殊的方法符號來表達自己的函式,例如*args、*kwargs,這兩個是特殊的符號,前者代表元組,後者代表字典,將後期不定長引數進行總合輸出。在此給出一個例子,本人也有不懂之處,有錯望指出。此處摘自別人指點(Python的字典實現其實就是個雜湊表(當然裡面有一些優化),每次賦值其實就是計算key的雜湊值然後放到雜湊表的指定位置中。遍歷的話就是從前向後遍歷整個雜湊表。這裡不講處理衝突,就說最簡單的往一個空字典中插入兩個值。)
   關於字典的輸出,是根據key值,而不是根據value值。話說隨機,但是看到每次的輸出結果又莫名感覺有點規律,但是又說不出其中緣由,看程式碼中的fun(1,2,3,4,5,0,n=7,m=6,p=9)以及fun(1,2,3,4,5,0,m=6,n=7,p=9)可知p.m.n即便數值不同位置顯示一致