python學習筆記(4)--函數

來源:互聯網
上載者:User

標籤: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語句把結果返回,返回的可以是任何資料類型

注意:

  1. 函數在執行過程中只要遇到return語句,就會停止執行並返回結果,so 也可以理解為 return 語句代表著函數的結束
  2. 如果未在函數中指定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)--函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.