1 ##import sys 2 ##sys.setrecursionlimit(1000) 3 ###關鍵字參數(**關鍵字參數名) 4 ###與可變參數不一樣的是,關鍵字參數能夠在調用函數時,傳入帶有參數名的參數,這些參數會自動組裝成一個 5 ###dict,參數名爲key,參數值爲value 6 ##def person(name,age,**kv): 7 ## print('name',name,'age',age,'關鍵字參數',kv) 8 ##person('jian',18,tell=174,weight=71)#name jian age 18 關鍵字參數 {'tell': 174, 'weight': 71} 9 ###可見,關鍵字參數能夠傳入一些非必要的參數,擴展功能。 10 ###也能夠像可能參數的函數同樣,把參數組裝成一個dict,而後傳進去。 11 ##extra = {'city':'Beijing','job':'Engineer'} 12 ##person('jian',19,**extra)#name jian age 19 關鍵字參數 {'city': 'Beijing', 'job': 'Engineer'} 13 14 ###命名關鍵字參數(*,參數名1,2......),用'*'號做爲分隔符。 15 ###在關鍵字參數的基礎上,若是要指定傳入參數的名稱,則要用命名關鍵字參數,在*,後寫參數名 16 ##def person1(name,age,*,job,like): 17 ## print(name,age,job,like) 18 ##person1('jian',18,job='bianchen',like='play')#jian 18 bianchen play 19 ###person1('jian',18,like='play')#TypeError: person1() missing 1 required keyword-only argument: 'job' 20 ###上面一行報錯,說明命名關鍵字參數的每一個參數都要傳入參數值,但參數的位置能夠不固定。如: 21 ##person1('jianweiwei',19,like='play',job='learn')#jianweiwei 19 learn play. 22 ###若是命名關鍵字參數有默認值則能夠不用傳參數。 23 24 ###參數定義順序 25 ###python中可變參數不能夠和命名關鍵字參數混合使用,參數定義的順序是:必選參數、默認參數、可變參數/命名關鍵字參數和關鍵字參數 26 ##def f1(a,b,c=0,*args,**kw): 27 ## print('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw) 28 ##def f2(a,b,c=0,*,d,**kw): 29 ## print('a=',a,'b=',b,'c=',c,'d=',d,'kw=',kw) 30 ###在函數調用時,Python解釋器自動按照參數位置和參數名把對應的參數傳進去。 31 ##f1('我是a','我是b','我是c','1',2,3,4,{'name':'jian','age':13}) 32 ###打印結果a= 我是a b= 我是b c= 我是c args= ('1', 2, 3, 4, {'age': 13, 'name': 'jian'}) kw= {} 33 ###能夠看到,關鍵字參數爲空的字典,可變參數爲一個元組,那麼怎麼把列表傳給關鍵字參數,而不是可變參數呢。 34 ##mm = {'name':'jian','age':13} 35 ##f1('我是a','我是b','我是c','1',2,3,4,**mm)#a= 我是a b= 我是b c= 我是c args= ('1', 2, 3, 4) kw= {'age': 13, 'name': 'jian'} 36 ###能夠看到結果,可變參數,組都有數據了,就是經過指定傳入的參數類型,在前面加上*,或**,來區別可變函數與關鍵字參數 37 38 ###參數小結: 39 ###默認參數必定不是可變參數,若是是可變參數,會形成邏輯錯誤,如 40 ##def a1(a,b,c=8): 41 ## print(a,b,c) 42 ###上面默認參數指向不可變參數8,這樣寫正確。 43 ##def a2(a,b,c=[]): 44 ## print(a,b,c) 45 ###上面默認參數指向爲可變的list,寫法錯誤。 46 47 48 ####遞歸函數 49 ###在函數內部,能夠調用其餘函數,若是一個函數在內部調用自身自己,這個函數就是遞歸函數。 50 ##def fact(n): 51 ## if n==1: 52 ## return 1 53 ## return n*fact(n-1)#這裏不是尾遞歸,返回引入了乘法表達式。 54 ##a = fact 55 ##print(a(10)) 56 ###在測試輸入參數值1000時會導入棧溢出,此時經過尾遞歸優化,事實上尾遞歸和循環的效果是同樣的。能夠把 57 ###循環看做是尾遞歸的一種。 58 ###尾遞歸是指:在函數返回的時候,調用自身自己,每一步的乘積傳入到遞歸函數中: 59 ##def fact1(n): 60 ## return fact_iter(n,1) 61 ##def fact_iter(num,product): 62 ## if num == 1: 63 ## return product 64 ## return fact_iter(num-1,num*product) 65 ##print(fact1(1000))#做者好坑,原來最後才說python也沒有作棧優化,我說怎麼總是溢出錯誤。 66 67 #練習 68 #尼麻啊,我不會555555555555555555 69 70 #高級特性:就是實現相同的功能,寫的代碼越少越好。 71 ##L = [] 72 ##i = 1 73 ##while i<=9: 74 ## L.append(i) 75 ## i = i+1 76 ## print(L) 77 78 79 ##切片 80 #所謂的切片有點像java裏的截取。不管正序仍是倒序,下標第一個都是0,或-0. 81 #第一冒號先後的數據是用來 82 L = [1,3,4,5,2,3,4,5,6,67,77,22,33,444,2222,777] 83 #切前3個下來 84 print(L[0:3]) 85 print(L[0:4])#前四個 86 #也能夠每隔2個切一個 87 print(L[::2])# 88 #從切取的範圍中每隔3個切一個 89 print(L[-6:-2:2])#[77, 33],指從倒數下標爲-6切到下標爲-2,再每次隔2個切一個。 90 #字符串也能切片,但切片應該是從新建立一個新的字符串,而不是直接切原來的字符串,由於字符串是不可變的 91 #元組切片是生成一個新的元組。 92 93 ##迭代:對list或tuple的遍歷稱爲迭代。