Python3學習(二)-遞歸函數、高級特性、切片

 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的遍歷稱爲迭代。
相關文章
相關標籤/搜索