Python入門筆記—第三章【函數】

第三章:函數基礎

1. 函數

1.1 語法

def func():

    語句1

    語句2

    語句3

- def後跟一個空格,冒號不能少,函數的語句首行縮進一致(TAB)

- 命名需要遵循規則,約定俗成,大駝峯一般用來給類命名

- 括號裏參數可以有也可以沒有

1.2 參數及return

參數:(定義同C)

- 形參:形式參數

- 實參:實際參數

return:

- 養成以return爲函數結尾的習慣,如果沒有return,則默認返回None

- 函數執行到return語句則無條件返回,不會再繼續執行後面的語句

使用函數調用99乘法表實例

def chengfa(row):
    for col in range(1,row+1):
        print( row * col,end = " ")
    print(" ")

for row in range(1,10):
    chengfa(row)

return返回實例

def func(person):
    print("我見到{0}了,但是{1}不理我".format(person,person))
    return "我好失望"
    print("我也見到{0}了,{1}跟我打招呼了".format(person,person))
    return "哈哈"
p = "minjie"
rst = func(p)
print(rst)

1.3 help函數

作用:幫助查看函數文檔

如果需要查看Print函數中某個參數的值,則可用:
help(print)

1.4 參數詳解

參考資料

Python參考書籍:流暢的Python

參數分類:

- 普通參數

- 默認參數

- 關鍵字參數

- 收集參數(包括關鍵字收集參數)

1.4.1 普通參數

參數的位置和順序都一一對應

def func(v1,v2):

         語句

#調用函數

func(v1,v2)

def func(p1,p2):
    print("我今天遇見{0},{1}跟我打招呼了".format(p1,p2))

func("xiaoming","daming")

1.4.2默認參數

- 調用的時候形參帶有默認值

- 調動的時候函數沒有對應形式參數賦值,則採用默認值

def func(name = "xiaoming",age = 18,sex = "man"):
    if sex == "woman":
        print("hello everyone,I am {0},{1}歲,a cute girl".format(name,age))
    else:
        print("hello everyone,I am {0},{1}歲,a strong boy".format(name,age))

func("woman")

結果:hello everyone,I am xiaoming,18歲,a cute girl

1.4.3 關鍵字參數

- 可以不用考慮參數的位置

- 語法
    
        def func(p1=v1, p2=v2.....):
            func_body
            
        調用函數:
        func(p1=value1, p2=value2.......)

例:

def func(name = "xiaoming",age = 18, hobby = "basketball"):
    print("hello everyone, I am {0},今年{1}歲,我的愛好是{2}".format(name,age,hobby))

func(age = 18,name = "xiaohong")

結果:hello everyone, I am xiaohong,今年18歲,我的愛好是basketball

注:hobby沒有賦值,則使用默認參數

1.4.4 收集參數

- 不能確定參數的個數

- 一般收集參數用args表示,約定俗成

def func(*args):
    print("hello,各位同學大家好,我簡單的說兩句")
    print(type(args))
    print("*" * 50)
    for item in args:         #注: args後面沒有括號
        print(item)

func("xiaoming","China","18","打籃球")

打印結果:

hello,各位同學大家好,我簡單的說兩句
<class 'tuple'>
**************************************************
xiaoming
China
18
打籃球

——收集參數之關鍵字參數

— 以字典的形式存儲、訪問

— 比收集參數多一個*,

— 一般情況下用kwrags表示,約定俗成,即**

例:

def func(**kwargs):
    print("大家好,我簡單說兩句")
    print(type(kwargs))
    print("*" * 50)
    for k,v in kwargs.items():   #注意,此處爲items,有s,不同與收集參數,沒有複數形式
        print(k,"_____",v) # 注意:中間的橫線字符需要用雙引號“”括起來,兩個逗號不能少

fun("我叫小明","湖南人","今年18歲","喜歡打籃球")

結果:

大家好,我簡單說兩句
<class 'dict'>
**************************************************
name _____ 我叫小明
ad _____ 湖南人
age _____ 今年18歲
hobby _____ 喜歡打籃球

1.4.5 混合實例—普通參數、收集參數、關鍵字收集參數

def func(name,age,*args,hobby = "none",**kwargs):
    #普通參數
    print("大家好,我簡答的做一個自我介紹")
    print("我的名字是:{0},今年{1}歲了".format(name,age))
    #收集參數
    for item in args:        #注意:args後面沒有括號
        print(item)
    if hobby == "none":
        print("我沒有什麼愛好")
    else:
        print("我的愛好是:")
    #關鍵字收集參數
    for k,v in kwargs.items():
        print(k,"____",v)

func("xiaoming","23","很高興認識大家","希望大家能夠多多關照","我不是一個隨便的人,但是隨便起來根本不是人",hobby = "yes",hobby1 = "打籃球",hobby2 ="羽毛球",hobby3 ="乒乓球",hobby4 ="足球")    

1.5 收集參數的解包問題

— 收集參數有時候在調用的時候需要加*來解包

例:

def func(*args):
   
    for item in args:
        
        print(item)

l = ["xiaoming","xiaohong","18sui","baskerball"]
func(l)
    

結果:

['xiaoming', 'xiaohong', '18sui', 'baskerball']

加入解包符之後:

def func(*args):
    
    for item in args:
        
        print(item)

l = ["xiaoming","xiaohong","18sui","baskerball"]
func(*l)
    

結果:

xiaoming
xiaohong
18sui
baskerball

 

### 同理,dict類型收集參數一樣可以解包,但是
- 對dict類型進行解包
- 需要用兩個星號進行解包   (還未弄懂dict類型的解包)

1.6 變量作用域(和C定義一致)

1 全局變量

- 在全局範圍內都能使用

2 局部變量

- 只能在局部範圍內使用

例:

a = 100

def func():
#打印全局變量a
    print(a)
    b = 50
    print(b)

print(a)
print(b) 

結果:

- 100

- 然後會報錯

原因:a是全局變量,b是在函數func裏定義的局部變量

- global 可將局部變量變成全局變量

例:

a = 100

def func():
#打印全局變量a
    print(a)
    global b
    b = 50
    print(b)

print(a)
func()         # 必須將調用的函數放在打印局部變量的前面,否則無法調用局部變量,爲什麼???
print(b)

結果:

100

100

50

50

1.7 golbals,locals函數

- 可通過golbals和locals函數顯示全局變量和局部變量

- 兩個函數都統稱爲內建函數

例:
 

 

a = 3000
def func(c,d):
    e = 111
    print("Locals={0}".format(locals()))

func(100,200)
print("Golbals={0}".format(globals()))
結果:

Locals={'e': 111, 'd': 200, 'c': 100}

Golbals={'a': 3000}(注:應該是這個)

1.8 eval 和exec函數

1.8.1 eval函數

- 將字符串當做表達式來執行,最後返回執行表達式的結果

a = 100
b = 100
c = eval("a + b")

print(c)

結果:200

1.8.2 exec函數

- 功能和eval相似,但是不返回結果

a = 100
b = 100

c = a + b

d = exec("print('a + b =',a +b)")

print(c)
print(d)

結果:

a + b = 200
200
None

1.9 遞歸函數

- 函數直接或者簡介的調用自己

- 優點:簡潔

- 缺點:對遞歸深度有限制,消耗資源多

- Python 會遞歸函數有限制,超過限制會報錯

- 一定要注意函數結束的條件

例:用遞歸函數實現斐波那契數列

f(1)=1,f(2)=1,f(3)=2,f(4)=3,f(5)=5,……………………,f(n)=f(n-1)+f(n-2)

def func(n):
    if n == 1 or n == 2:
        return 1
    else:
        return  func(n-1) + func(n-2)
n = input("請輸入n的值:")
n = int(n)
v = func(n)    
print(v)

例:用遞歸函數解決漢諾塔問題

漢諾塔:

- 有A,B,C三座塔,A上有從上至下,從小打到順序排列的圓圈,通過一定的移動將A上的圓圈移動至C上

規則:

- 每次只能移動一個盤子

- 每次移動都要保證小圓圈在上,大圓圈在下

def hann(n,a,b,c):
    if n == 1:
        print(a,"-->",c)
        return None
    '''
    if n == 2:
        print(a,"-->",b)
        print(a,"-->",c)
        print(b,"-->",c)
        return None
    '''    #一般情況下都會寫到n=2,n=3的情況下,可以看出用Python寫出來非常簡短
    #如果n>3,將a上的n-1個圓圈藉助c,放到輔助柱子b上,具體怎麼放不管
    hann(n-1,a,c,b)
    #再通藉助柱子a,將b上的n-1個圓圈放到柱子c上,即爲完成任務
    hann(n-1,b,a,c)

a = "A"
b = "B"
c = "C"
n = input("請輸入圓圈數量:")
n = int(n)
hann(n,a,b,c)

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章