標籤:pac blog 數字 遞迴調用 擷取 round 參數順序 abs 無限
1.函數
函數是指將一組語句的集合通過一個名字封裝起來.要想執行這個函數,只需調用其函數名即可.
函數的特性:
1.減少重複代碼
2.使程式變的課擴充
3.使程式變得易維護
文法定義:
1 def print_hello() #定義函數2 print("hello")3 4 print_hello() #調用函數2.函數參數與局部變數
形參變數只有在被調用時才分配記憶體單元,在調用結束時,即刻釋放所分配的記憶體單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變數
實參可以是常量、變數、運算式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值
3.預設參數
1 def stu_register(name,age,course,country="CN"):
conntry參數在調用時不指定,那預設就是CN,指定了的話,就用你指定的值。
4.關鍵參數
正常情況下,給函數傳參數要按順序,不想按順序就可以用關鍵參數,只需指定參數名即可,但記住一個要求就是,關鍵參數必須放在位置參數之後。
5.非固定參數
若你的函數在定義時不確定使用者想傳入多少個參數,就可以使用非固定參數
1 def stu_register(name,age,*args): # *args 會把多傳入的參數變成一個元組形式 2 print(name,age,args) 3 4 stu_register("laozhang",22) 5 #輸出 6 #laozhang 22 () #後面這個()就是args,只是因為沒傳值,所以為空白 7 8 stu_register("Jack",32,"CN","Python") 9 #輸出10 # Jack 32 (‘CN‘, ‘Python‘)
還可以有一個**kwargs
1 def stu_register(name,age,*args,**kwargs): # *kwargs 會把多傳入的參數變成一個dict形式 2 print(name,age,args,kwargs) 3 4 stu_register("laozhang",22) 5 #輸出 6 #laozhang 22 () {}#後面這個{}就是kwargs,只是因為沒傳值,所以為空白 7 8 stu_register("Jack",32,"CN","Python",sex="Male",province="ShanDong") 9 #輸出10 # Jack 32 (‘CN‘, ‘Python‘) {‘province‘: ‘ShanDong‘, ‘sex‘: ‘Male‘}6.局部變數
1 name = "laozhang" 2 3 def change_name(name): 4 print("before change:",name) 5 name = "老張.繼老王之後最牛逼的人" 6 print("after change", name) 7 8 9 change_name(name)10 11 print("在外面看看name改了麼?",name)
輸出
1 before change: laozhang2 after change 老張,繼老王之後最牛逼的人3 在外面看看name改了麼? laozhang
7.全域變數與局部變數在子程式中定義的變數稱為局部變數,在程式的一開始定義的變數稱為全域變數。全域變數範圍是整個程式,局部變數範圍是定義該變數的子程式。當全域變數與局部變數同名時:在定義局部變數的子程式內,局部變數起作用;在其它地方全域變數起作用。8.傳回值
要想擷取函數的執行結果,就可以用return語句把結果返回,返回的可以是任何資料類型
注意:
- 函數在執行過程中只要遇到return語句,就會停止執行並返回結果,so 也可以理解為 return 語句代表著函數的結束
- 如果未在函數中指定return,那這個函數的傳回值為None
各種函數1.遞迴
定義:在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞迴函式。
1 def calc(n): 2 print(n) 3 if int(n/2) ==0: 4 return n 5 return calc(int(n/2)) 6 7 calc(10) 8 9 輸出:10 1011 512 213 1
遞迴特性:
1. 必須有一個明確的結束條件
2. 每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
3. 遞迴效率不高,遞迴層次過多會導致棧溢出(在電腦中,函數調用是通過棧(stack)這種資料結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴調用的次數過多,會導致棧溢出)
遞迴函式實際應用案例之二分尋找
1 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] 2 3 4 def binary_search(dataset,find_num): 5 print(dataset) 6 7 if len(dataset) >1: 8 mid = int(len(dataset)/2) 9 if dataset[mid] == find_num: #find it10 print("找到數字",dataset[mid])11 elif dataset[mid] > find_num :# 找的數在mid左面12 print("\033[31;1m找的數在mid[%s]左面\033[0m" % dataset[mid])13 return binary_search(dataset[0:mid], find_num)14 else:# 找的數在mid右面15 print("\033[32;1m找的數在mid[%s]右面\033[0m" % dataset[mid])16 return binary_search(dataset[mid+1:],find_num)17 else:18 if dataset[0] == find_num: #find it19 print("找到數字啦",dataset[0])20 else:21 print("沒的分了,要找的數字[%s]不在列表裡" % find_num)22 23 24 binary_search(data,66)2.匿名函數
匿名函數就是不需要顯式的指定函數
使用方法:
1 #這段代碼2 def calc(n):3 return n**n4 print(calc(10))5 6 #換成匿名函數7 calc = lambda n:n**n8 print(calc(10))
主要配合其他函數搭配使用
1 res = map(lambda x:x**2,[1,5,7,4,8]) 2 for i in res: 3 print(i) 4 5 輸出 6 1 7 25 8 49 9 1610 64
3.高階函數
變數可以指向函數,函數的參數能接收變數,那麼一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數。
1 def add(x,y,f):2 return f(x) + f(y)3 4 5 res = add(3,-6,abs)6 print(res)
4.內建函數
一、數學運算類
| abs(x) |
求絕對值 1、參數可以是整型,也可以是複數 2、若參數是複數,則返回複數的模 |
| complex([real[, imag]]) |
建立一個複數 |
| divmod(a, b) |
分別取商和餘數 注意:整型、浮點型都可以 |
| float([x]) |
將一個字串或數轉換為浮點數。如果無參數將返回0.0 |
| int([x[, base]]) |
將一個字元轉換為int類型,base表示進位 |
| long([x[, base]]) |
將一個字元轉換為long類型 |
| pow(x, y[, z]) |
返回x的y次冪 |
| range([start], stop[, step]) |
產生一個序列,預設從0開始 |
| round(x[, n]) |
四捨五入 |
| sum(iterable[, start]) |
對集合求和 |
| oct(x) |
將一個數字轉化為8進位 |
| hex(x) |
將整數x轉換為16進位字串 |
| chr(i) |
返回整數i對應的ASCII字元 |
| bin(x) |
將整數x轉換為二進位字串 |
| bool([x]) |
將x轉換為Boolean類型 |
二、集合類操作
| basestring() |
str和unicode的超類 不能直接調用,可以用作isinstance判斷 |
| format(value [, format_spec]) |
格式化輸出字串 格式化的參數順序從0開始,如“I am {0},I like {1}” |
| unichr(i) |
返回給定int類型的unicode |
| enumerate(sequence [, start = 0]) |
返回一個可枚舉的對象,該對象的next()方法將返回一個tuple |
| iter(o[, sentinel]) |
產生一個對象的迭代器,第二個參數表示分隔字元 |
| max(iterable[, args...][key]) |
返回集合中的最大值 |
| min(iterable[, args...][key]) |
返回集合中的最小值 |
| dict([arg]) |
建立資料字典 |
| list([iterable]) |
將一個集合類轉換為另外一個集合類 |
| set() |
set對象執行個體化 |
| frozenset([iterable]) |
產生一個不可變的set |
| str([object]) |
轉換為string類型 |
| sorted(iterable[, cmp[, key[, reverse]]]) |
隊集合排序 |
| tuple([iterable]) |
產生一個tuple類型 |
| xrange([start], stop[, step]) |
xrange()函數與range()類似,但xrnage()並不建立列表,而是返回一個xrange對象,它的行為與列表相似,但是只在需要時才計算資料行表值,當列表很大時,這個特效能為我們節省記憶體 |
三、邏輯判斷
| all(iterable) |
1、集合中的元素都為真的時候為真 2、特別的,若為空白串返回為True |
| any(iterable) |
1、集合中的元素有一個為真的時候為真 2、特別的,若為空白串返回為False |
| cmp(x, y) |
如果x < y ,返回負數;x == y, 返回0;x > y,返回正數 |
python學習筆記(4)--函數