1. 程式人生 > >Python 程式設計語言 筆記(五)

Python 程式設計語言 筆記(五)

(1)函式定義 — def語句,格式如下:

def <name>(<parameters>):
【說明】函式名<name>:任何有效的Python識別符號引數列表<parameters>:呼叫函式時傳遞給函式的值(個數 >= 0,多個引數用”,”分隔)形式引數(形參):定義函式時給函式傳遞的引數形參只在函式內部有效實際引數(實參):呼叫函式時給函式傳遞的引數(可以是實數,變數,函式;必須要初始化)函式體<body>:函式被呼叫時執行的程式碼,由一至多個語句組成

函式呼叫的一般形式:

<name>(<parameters>)
函式返回:① return語句 — 結束函式呼叫並返回結果② return語句是可選的,可以出現在函式體的任意位置③ 若無return語句,函式結束後將控制權返回給呼叫方函式介面 — 返回值和引數函式傳遞資訊的主要途徑:① 通過函式返回值的方式傳遞資訊② 通過引數傳遞資訊例】列印《生日快樂歌》歌詞
  1. # 程式4.1.1
  2. def happy():
  3. print("Happy birthday to you!")
  4. def sing(person):
  5. happy()
  6. happy()
  7. print("Happy birthday to", person + "!")
  8. def main():
  9. sing("Mike")
  10. print()
  11. main()
【執行結果】Happy birthday to you!Happy birthday to you!Happy birthday to Mike!(2)函式的呼叫和返回值① 呼叫過程:② 函式的返回值:函式的返回值可以是變數或表示式三種形式 — 無返回值,單值和多值(用逗號分隔)無返回值 等價於 return None(None是表示沒有任何東西的特殊型別)【例】設計兩點距離函式,求三角形周長
  1. # 程式4.1.2
  2. import math
  3. def square(x):
  4. return x*x
  5. def distance(x1,y1,x2,y2)
    :
  6. dist = math.sqrt(square(x1 - x2) + square(y1 - y2))
  7. return dist
  8. def isTriangle(x1,y1,x2,y2,x3,y3):
  9. flag = ((x1 - x2) * (y3 - y2) - (x3 - x2) * (y1 - y2)) != 0
  10. return flag
  11. def main():
  12. print("Please enter (x,y) of three points in turn:")
  13. # 獲取使用者輸入的三個座標點
  14. x1, y1 = eval(input("Point1: (x, y) = "))
  15. x2, y2 = eval(input("Point2: (x, y) = "))
  16. x3, y3 = eval(input("Point3: (x, y) = "))
  17. # 判斷三個點是否構成三角形
  18. if (isTriangle(x1,y1,x2,y2,x3,y3)):
  19. # 算三角形周長
  20. perim = distance(x1,y1,x2,y2) + distance(x2,y2,x3,y3) + distance(x1,y1,x3,y3)
  21. print("The perimeter of the triangle is : {0:0.2f}".format(perim))
  22. else:
  23. print("Kidding me? This is not a triangle!")
  24. main()
【執行結果】Please enter (x,y) of three points in turn:Point1: (x, y) = 1,3Point2: (x, y) = 2,2Point3: (x, y) = 3,4The perimeter of the triangle is : 5.89(3)改變引數值的函式:① 函式的形參只接受了實參的值,給形參賦值並不影響實參② Python的引數是通過值來傳遞的(賦值)③ 如果變數時可變物件(如列表)返回到呼叫程式後,該物件會呈現被修改後的狀態4.2 函式與程式結構/遞迴(1)函式和程式結構:① 函式可以簡化程式,使程式模組化② 函式可將較長程式分割成短小程式段,提高可讀性(2)遞迴函式:① 遞迴 — 函式定義中使用函式自身的方法。例:階乘 ② 遞迴的定義特徵:1. 有一或多個基例是不需要再次遞迴的2. 所有的遞迴鏈都要以一個基例結尾 ③ 注意:1. 遞迴每次呼叫都會引起新函式的開始2. 遞迴有本地值的副本,包括該值的引數3. 階乘遞迴函式中:每次函式呼叫中的相關n值在中途的遞迴鏈暫時儲存,並在函式返回時使用【例1】計算5!
  1. # 程式4.2.1
  2. def fact(n):
  3. if n == 0:
  4. return 1
  5. else:
  6. return n * fact(n-1)</span></span>
【例2】字串反轉Python列表有反轉的內建方法方法1:字元轉換為字元列表,反轉列表,列表轉換回字串方法2:遞迴【IPO】輸入:字串 處理:用遞迴的方法反轉字串 輸出:反轉後的字串【注意】① 構造遞迴函式,需要基例② 基例不進行遞迴,否則遞迴就會無限迴圈執行
  1. # 程式4.2.2
  2. def reverse(s):
  3. if s == "":
  4. return s
  5. else:
  6. return reverse(s[1:]) + s[0]</span>
4.3 函式例項分析【例】繪製如下圖的“二叉樹”【思路】(1)首先學習簡單圖形繪製的指令(2)其次為樹的繪製設計演算法(1)Turtle庫:
  1. turtle.forward(15) # 烏龜沿直線前行15個單位長度
  2. (預設繪製方向為x軸正半軸)
  3. turtle.left(90) # 烏龜角度逆時針旋轉90度(順時針為right)
  4. turtle.penup() # 烏龜提筆(落筆為pendown)
  5. turtle.goto(x,y) # 烏龜到達指定座標位置
  6. turtle.home() # 烏龜返回初始座標
  7. turtle.circle(r) # 烏龜以r為半徑畫圓
  8. turtle.speed(x) # 設定烏龜速度
  9. turtle.pensize(x) # 設定畫筆粗細
  10. turtle.pencolor(str1,str2) # 設定畫筆線條顏色和填充色
  11. turtle.begin_fill() # 開始填充顏色(完成填充用end_fill)
【例】繪製並填充五角星
  1. # 程式4.3.1
  2. from turtle import Turtle
  3. p = Turtle()
  4. p.speed(3)
  5. p.pensize(5)
  6. p.color("black", "yellow")
  7. p.begin_fill()
  8. for i in range(5):
  9. p.forward(200)
  10. p.right(144)
  11. p.end_fill()
(2)程式碼如下:
  1. # 程式4.3.2
  2. # drawtree.py
  3. from turtle import Turtle, mainloop
  4. def tree(plist, l, a, f):
  5. if l > 5:
  6. lst = []
  7. for p in plist:
  8. p.forward(l) # 沿著當前的方向畫畫
  9. q = p.clone()
  10. p.left(a)
  11. q.right(a)
  12. lst.append(p) # 將元素增加到列表的最後
  13. lst.append(q)
  14. tree(lst, l*f, a, f)
  15. def main():
  16. p = Turtle()
  17. p.color("green")
  18. p.pensize(5)
  19. p.hideturtle()
  20. p.speed(100)
  21. p.left(90) # 調整畫筆
  22. p.penup()
  23. p.goto(0,-200)
  24. p.pendown() # 這三條語句是一個組合相當於先把筆收起來
  25. # 再移動到指定位置,再把筆放下開始畫
  26. # 否則turtle一移動就會自動的把線畫出來
  27. t = tree([p], 200, 65, 0.6375)
  28. main()

【執行結果】