Python——函數


1、函數定義

(1)函數:完成特定功能的一個語句組,通過調用函數名來完成語句組的功能。

為函數提供不同的參數,可以實現對不同數據的處理

函數可以反饋結果

(2)分類:

自定義函數:用戶自己編寫的

系統自帶函數: Python內嵌的函數(如abs()、eval())、 Python標准庫中的函數(如math庫中的sqrt())、圖形庫中的方法(如myPoint.getX())等

(3)函數定義:使用def語句
def <name>(<parameters>):
      <body>

函數名<name>:可以是任何有效的Python標識符

參數列表<parameters>:是調用函數時傳遞給它的值(可以由多個,一個,或者零個參數組成,當有多個參數時,各個參數用逗號分隔)

 參數個數大於等於零,多個參數由逗號分隔

(4)形參,實參

形式參數:定義函數時,函數名后面圓括號中的變量,簡稱“形參”。形參只在函數內部有效

實際參數:調用函數時,函數名后面圓括號中的變量,簡稱 “實參”。 

2、示例

1 def happy(): 2     print("happy birthday to you!") 3 
4 def sing(person): 5     print("happy birthday to "+person+' !') 6 happy() 7 happy() 8 sing('hanmeimei') 9 happy()

調用兩個函數

1 def sing(person): 2     print("happy birthday to you!") 3     print("happy birthday to you!") 4     print("happy birthday to "+person+' !') 5     print("happy birthday to you!") 6 
7 sing('hanmeimei')

只調用一個函數的程序,明顯比兩個函數要繁瑣,所以重復性質的代碼,定義函數可以減少工作量。

 3、函數的返回值

return語句:程序退出該函數,並返回到函數被調用的地方。return語句返回的值傳遞給調用程序

 

Python函數的返回值有兩種形式:

返回一個值

返回多個值 

(1)無返回值的return語句等價於return None。

(2)返回值可以是一個變量,也可以是一個表達式。

1 def square(x): 2     y=x*x 3     return y 4 def square1(x): 5     return x*x 6 a=square(2) 7 b=square1(3) 8 print(a) 9 print(b)

(3)三角形周長函數

 

 1 import math  2 
 3 def square(x):  4     return x*x  5 def distance(x1,y1,x2,y2):  6     L=math.sqrt(square(x1-x2)+square(y1-y2))  7     return L  8 def isTriangle(x1,y1,x2,y2,x3,y3):  9     flag=((x1-x2)*(y3-y2)-(x3-x2)*(y1-y2))!=0 10     return flag 11 
12 def main(): 13     print("輸入三個點的坐標:") 14     x1,y1=eval(input("x1,y1=")) 15     x2,y2=eval(input("x2,y2=")) 16     x3,y3=eval(input("x3,y3=")) 17     if (isTriangle(x1,y1,x2,y2,x3,y3)): 18         perim=distance(x1,y1,x2,y2)+distance(x1,y1,x3,y3)+distance(x2,y2,x3,y3) 19         print('the primeter is ',perim) 20     else: 21         print('this is not triangle') 22 main()

 

 1 import math  2 
 3 def square(x):  4     return x*x  5 def distance(x1,y1,x2,y2):  6     L=math.sqrt(square(x1-x2)+square(y1-y2)) #嵌套了求平方的函數
 7     return L  8 def isTriangle(x1,y1,x2,y2,x3,y3):  9     if ((x1-x2)*(y3-y2)-(x3-x2)*(y1-y2))!=0: #比例算法,三點在不在一條線
10         return 1
11 
12 def main(): 13     print("輸入三個點的坐標:") 14     x1,y1=eval(input("x1,y1=")) 15     x2,y2=eval(input("x2,y2=")) 16     x3,y3=eval(input("x3,y3=")) 17     if (isTriangle(x1,y1,x2,y2,x3,y3)): 18         perim=distance(x1,y1,x2,y2)+distance(x1,y1,x3,y3)+distance(x2,y2,x3,y3) 19         print('the primeter is:{0:0.3f}'.format(perim)) 20         print('the primeter is %0.3f'%perim)#兩種輸出方法
21     else: 22         print('this is not triangle') 23 main()

 

將簡化后的判斷是否是三角形的布爾語句補充完整了,用了兩種輸出方式來輸出內容;注意將比例式寫成乘法式簡化判斷條件。

4、函數的返回值return

(1)

1 def isTriangle(num): 2     if num!=0: #比例算法,三點在不在一條線
3         return 1
4     else: 5         return 0 6     
7 a=eval(input("輸入數字:")) 8 print(isTriangle(a))

def isTriangle(num): if num!=0: #比例算法,三點在不在一條線
        return 1 a=eval(input("輸入數字:")) print(isTriangle(a))

不符合條件時輸出None。

 

1 def isTriangle(num): 2     length=num!=0 3     return length 4     
5 a=eval(input("輸入數字:")) 6 print(isTriangle(a))

length=num!=0,這個布爾表達式,是先判斷num是否等於0,如果不等於零,則True,如果等於0,則False,length等於這兩種情況。

(2)

1 def addinterest(balance,rate): 2     newBalance=balance*(1+rate) 3     return newBalance 4 def main(): 5     amount=1000
6     rate=0.05
7     amount=addinterest(amount,rate) 8     print(amount) 9 main()

(3)單個數和列表返回數的區別

1 def addinterest(balance,rate): 2     balance=balance*(1+rate) 3     
4 def main(): 5     amount=1000
6     rate=0.05
7  addinterest(amount,rate) 8     print(amount) 9 main()

可以看出函數形參的值並沒有返回給實參,所以最后出來的還是1000,需要像上面的程序一樣,明確表明返回值,才能運行出來1050.

1 def addinterest(balances,rate): 2     for i in range(len(balances)): 3         balances[i]=balances[i]*(1+rate) 4 def main(): 5     amounts=[1000,900,830,400] 6     rate=0.05
7  addinterest(amounts,rate) 8     print(amounts) 9 main()

對比上面,數組類型的值可以直接返回。視頻中介紹說是原來數值被掩蓋,本質原理搞不懂。?????

將這段代碼改為有返回值的情況如下。

 1 def addinterest(balances,rate):  2     for i in range(len(balances)):  3         balances[i]=balances[i]*(1+rate)  4     return balances  5 def main():  6     amounts=[1000,900,830,400]  7     rate=0.05
 8     amounts=addinterest(amounts,rate)  9     print(amounts) 10 main()

(4)函數的拆分

 1 print("this program plots the growth of a 10-years investment")  2 #principal=eval(input("enter the initial principal"))
 3 #apr=eval(input("enter the annualized interest rate"))
 4 principal=1000
 5 apr=0.2
 6 for year in range(1,11):  7     principal=principal*(1+apr)  8     print("%2s"%year,end='')#前面是輸出年份,后者是保留一行
 9     total=int(principal*4/1000) #四個~代表1000
10     print("~"*total)#前面是輸入符號,后面是數量,中間用*鏈接
11 print("0.0k 2.5k 5.0k 7.5k 10.0k")

將部分功能拆分出來,形成單獨函數

 1 def totalnum(principal):  2     total=int(principal*4/1000)  3     return total  4 
 5 def creatTable(principal,rate):  6     for year in range(1,11):  7         principal=principal*(1+rate)  8         print("%d"%year,end="")  9         total=totalnum(principal) 10         print("~"*total,end='') 11         print("%.2f"%principal) 12 
13 def main(): 14     principal=1000
15     apr=0.2
16  creatTable(principal,apr) 17 
18 main()

注意,想要不換行的聯接 end='',輸入符號‘~’*num,的形式

 5、遞歸

(1)遞歸的定義
遞歸不是循環

最后計算基例:0!。 0!是已知值

遞歸定義特征 :有一個或多個基例是不需要再次遞歸的;所有的遞歸鏈都要以一個基例結尾。 

(2)階乘

1 def fact(n):
2     if n==0:
3         return 1
4     else:
5         return n*fact(n-1)
6 n=2
7 print(fact(n))

遞歸和循環不一樣,遞歸時多次調用一個函數,而循環是在一個函數中多次重復計算。

(3)字符串反轉

Python列表有反轉的內置方法

方法1:字符串轉換為字符列表,反轉列表,列表轉換回字符串

方法2:遞歸

1 def reverse(s):
2     if s=="":
3         return s
4     else:
5         return s[1:]+s[0]
6 
7 s='hello'
8 s=reverse(s)
9 print(s)

一定要給遞歸一個初值,要不會造成死循環。

(4)樹

 1 from turtle import *
 2 
 3 def tree(plist,l,a,f):#l 畫的初始長度,a角度
 4     if l>5:
 5          lst=[]
 6          for p in plist:
 7              
 8              p.forward(l)
 9              q=p.clone()#克隆p
10              p.left(a)
11              q.right(a)
12              lst.append(p)
13              lst.append(q)
14          tree(lst,l*f,a,f)
15 
16 def main():
17     p=Turtle()
18     p.color('green')
19     p.pensize(5)
20     p.hideturtle() #隱藏箭頭
21     p.speed(9)
22     #p.getscreen().tracer(3,0)
23     p.left(90)  #向左轉90度,豎直向上
24     p.penup() #提起畫筆
25     p.goto(0,-200) #
26     p.pendown()
27     t=tree([p],110,65,0.6375)
28 
29 main()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM