(二)python函數

定義函數
定義一個函數要使用def語句,依次寫出函數名、括號、括號中的參數和冒號:,而後,在縮進塊中編寫函數體,函數的返回值用return語句返回。ide

##定義myabs函數
def my_abs(x):   ## 注意這個函數 不管x 是否大於或者小於零 他都會返回正整數 假設x=9  -x = - -9 = 9
    if x >= 0:
        return x
    else:
        return -x
##函數體內部的語句在執行時,一旦執行到return時函數就執行完畢,並將結果返回

from abstest import my_abs來導入my_abs()函數,注意abstest是文件名(不含.py擴展名):函數

>>> from abstest import my_abs                  
>>> my_abs(-9)                                         
>>> 9                                                       
>>> _

空函數(若是想定義一個什麼事也不作的空函數,能夠用pass語句):測試

def nop():
    pass

參數檢查
調用函數時,若是參數個數不對,Python解釋器會自動檢查出來,並拋出TypeError
對參數類型作檢查,只容許整數和浮點數類型的參數。數據類型檢查能夠用內置函數isinstance()實現:code

def my_abs(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    if x >= 0:
        return x
    else:
        return -x

練習:
請定義一個函數quadratic(a, b, c),接收3個參數,返回一元二次方程 ax^2+bx+c=0 ax +bx+c=0 的兩個解。遞歸

import math

def quadratic(a,b,c):

    t = (b * b - 4 * a * c)

    if t >0:

        x1 = (-b + math.sqrt(t)) / (2 * a)

        x2 = (-b - math.sqrt(t)) / (2 * a)

        print('x1 =',x1,'x2 =',x2)

        return '此方程有兩個解'

    elif t == 0:

        x1 = (-b + math.sqrt(t)) / (2 * a)

        x2 = (-b + math.sqrt(t)) / (2 * a)

        print(x1,'=',x2)

        return '此方程兩個解相等'

    else:

        return '此方程無解'

a = float(input('請輸入a : '))

while a == 0:

    print('a不能爲0')

    a = float(input('請從新輸入a : '))

b = float(input('請輸入b : '))

c = float(input('請輸入c : '))

print(quadratic(a,b,c))

函數的參數
計算x2的函數:ci

def power(x):
    return x * x
#power(x)函數,參數x就是一個位置參數。
#當咱們調用power函數時,必須傳入有且僅有的一個參數x
>>> power(5)
25

默認參數,當定義了默認參數後 能夠少傳一個位置參數input

def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1   
        s = s * x
    return s
##當咱們調用power(5)時,至關於調用power(5, 2) = 25

可變參數:變參數就是傳入的參數個數是可變的,能夠是1個、2個到任意個,還能夠是0個。
請計算a2 + b2 + c2 + ……。it

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
##數前面加了一個*號。在函數內部,參數numbers接收到的是一個tuple,所以,函數代碼徹底不變。可是,調用該函數時,能夠傳入任意個參數,包括0個參數。若是沒有這個*號那麼在傳入參數的時候要先組成一個列表或者元組。

已經有一個list或者tuple,要調用一個可變參數怎麼辦?能夠這樣作:io

##在list或tuple前面加一個*號,把list或tuple的元素變成可變參數傳進去:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14

關鍵字參數:容許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個dict(zi'd)class

def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
>>> person('Michael', 30)
name: Michael age: 30 other: {}

命名關鍵字參數:限制關鍵字參數的名字,就能夠用命名關鍵字參數,例如,只接收city和job做爲關鍵字參數。這種方式定義的函數以下:

def person(name, age, *, city, job):
    print(name, age, city, job)
##命名關鍵字參數須要一個特殊分隔符*,*後面的參數被視爲命名關鍵字參數。

關鍵字參數必須指明傳入 不是就會報錯
調用方式以下:

>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

遞歸函數:在函數內部,能夠調用其餘函數。若是一個函數在內部調用自身自己,這個函數就是遞歸函數。
好比階乘n! = 1 x 2 x 3 x ... x n
fact(n)能夠表示爲n x fact(n-1)

def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)
    #####
===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120

漢諾塔的移動能夠用遞歸函數很是簡單地實現。

請編寫move(n, a, b, c)函數,它接收參數n,表示3個柱子A、B、C中第1個柱子A的盤子數量,而後打印出把全部盤子從A藉助B移動到C的方法

def hanio(n,a,b,c):
    if n ==1:   ## 當只有一個盤子的時候直接將A盤移動到C
        print(a,"-->",c)
    else:     ## 主要 當大於1 時 ,簡化邏輯的思路 咱們把盤子分紅2部分 n,n-1
        hanio(n-1,a,c,b)  ##首先咱們把N-1的部分經過C 移動到B 上 那麼如今 A 還剩下一個底層最大的盤子 
        print(a,"-->",c)  ##把底層最大的盤子 從A 移動到C
        hanio(b,a,c)   ##剩下的 把剛纔移動的B的盤子 經過空閒的A 移動到C  必定要當作一個總體

    測試 hanio(3,a,b,c)
相關文章
相關標籤/搜索