Python基礎之函數

Python基礎之函數

一、函數基礎

1、函數概念:

函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可

2、函數的作用

(1)減少重複代碼

(2)使程序變的可擴展

(3)使程序變得易維護

3、語法定義

def sayhi(x):               #函數名
      ’’’函數說明’’’
print("Hello, I'mnobody!")
return x                    #函數返回值
sayhi()                     #調用函數

關鍵字說明:                

def:創建函數

sayhi():函數名

print("Hello, I'm nobody!"):函數體

return():返回值

sayhi() #調用函數

4、函數的執行過程

定義函數,在程序執行過程中,函數體不執行,只有當程序調用函數時,函數纔會執行。

函數執行過程:

def f1():
    print(123)
    return "111"   #在函數中,一旦執行return,函數執行過程立即終止
    print(456)
r = f1()           #只有調用函數時,函數纔會執行
print(r)           #打印函數返回值

5、函數的返回值

(1)返回值數量爲0時,返回None

(2)返回值數量等於1時,返回object

(3)返回值數量大於1時,返回tuple

deftest():
    print("first")
                                  #沒有返回值
deftest2():
    print("second")
    return 2                      #返回值數量爲1時
deftest3():
    print("three")
    return3,"dayi123",{"age":18,'name':"yiliu"}    #返回值數量多個時
 
one =test()
two =test2()
three= test3()
 
print(one)
print(two)
print(three)

二、函數的參數

1 函數的基本參數

(1)、普通參數

1)形參:變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變量

2)實參:可以是常量、變量、表達式、函數等,無論實參是何種類型的值,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值

def send(xxoo,content):                   #xxoo、content爲實參
    print(xxoo,content)
    print("發送郵件成功:",xxoo,content)
    return True
send(dayi, is)                           #dayi、is爲形參

(2)、默認參數

def send(xxoo,content,xx="ok"):     #默認參數必須放在參數列表最後,可以有多個默認參數
    print(xxoo,content,xx)
    print("發送郵件成功:",xxoo,content,xx)
    return True
send('dayi','is')                   #如果沒有傳參、則傳遞默認參數
send('dayi','is','niuB')              #如果傳遞參數,則返回結果爲傳遞參數

(3)、制定參數

默認傳遞的參數是根據順序,制定參數,可以打亂參數的順序:

def send(xxoo,content):
    print(xxoo,content)
    print("發送郵件成功:",xxoo,content)
    return True
send(content='dayi',xxoo='is')     #將’dayi’傳遞給conttent,將‘is’換遞給xxoo

2、函數的動態參數

(1)、動態參數:傳參時可以傳一個或任意多個參數

1)、傳參時加一個”*”

作用:會將傳的參數放入元組中、

應用場景:傳的參數有順序

def fl(*args):          # 行參中帶*則表示動態參數
    print(args,type(args))
fl(11)
li = [22,"dayi","liu"]
fl(li)                 # 把 "li"當做一個整體傳到元組裏面
fl(*li)                #加"*"把li中元素傳到元組裏面
fl(li,12)
li2 = "dayi123"
fl(li2)                #不帶*,將li2整體傳進元組,帶"*",將li2中每個字符串分別傳進元組
fl(*li2)

2)、傳參時加兩個”*”

作用:會將傳的參數放入字典中

應用場景:傳的參數沒有順序

def f1(**args):
    print(args,type(args))

f1(n1="dayi123",n2=24)             #傳參時必須傳兩個,一個“KEY”一個“value”
dic = {'name':"dayi",'age':18}
f1(kk=dic)                         #傳參是把字典當做一個整體傳進字典中
f1(**dic)                          #傳參時將字典中的每一個值分別傳進字典中

3)、傳參時既有兩個”*”,又有一個”*”

作用:萬能參數,既可以傳一個”*”的參數,又可以傳”**”的參數

ef f1(*args,**kwargs):
    print(args,type(args))
    print(kwargs)
f1(1,2,3,name="dayi",age=24)
tup = (22,33,44,55)
dic = {'name':"dayi123",'age':23}
f1(*tup,**dic)
f1(yz=tup,cd=dic)

(2)、利用動態參數實現format功能

s1 = "i am {0},age{1}".format("dayi123",18)
print(s1)

s2 = "i am {0},age {1}".format(*["dayi123",24])        #傳遞列表中的參數,前面必須加“*”
print(s2)

s3 = "i am {name},age {age}".format(name="dayi123",age=24)
print(s3)

dic = {'name':'dayi123',"age":24}
s4 = "i am {name},age {age}".format(**dic)              #將字典中參數傳遞給s4,必須加“**”
print(s4)

(3)、函數傳參傳遞的是引用

def f1(a1):
    a1.append(999)     # 函數傳參傳遞的是引用

li = [11,22,33,44]
f1(li)
print(li)

3、全局變量與局部變量

    全局變量針對所有作用域均可讀,局部變量只針對部分作用域可讀,全局變量聲明要用大寫,全局變量可以是列表、字典。全局變量可以通過global修改,如果全局變量是字典、列表,則可以修改,但不能重新賦值。

NAME = "alex"            #全局變量,所有作用域都可讀,全局變量的聲明要大寫
#NAME = [123,456,789]     #如果全局變量是列表字典,則可以修改,但不可重新賦值

def fl():
    age = 18
    global NAME        #修改全局變量,對全局變量重新賦值,需要先global
    NAME = "123"        #局部變量,只對當前作用於生效
    print(age,NAME)

def f2():
    age = 19
    print(age,NAME)

fl()
f2()

定義的字符串、數字格式的全局變量不能再局部變量中直接修改,但定義的列表,字典等全局變量可在局部變量中直接修改:

names= ["dayi",18,"boy"]
defchange_name():
    names[0] = "liu"
    print("inside func",names)
 
print(names)
change_name()
print(names)

例:用函數實現登錄功能

def login(username,password):
    f = open("db",'r')             #打開db.txt文件,’r’代表讀取
    for line in f:
        line_list = line.split("|") #一行一行讀取,使用“|”分隔
        if line_list[0] == username and line_list[1] == password:
            return True

def register(username,password):
    f = open("db",'a')             #打開db.txt文件,’a’代表追加
    temp = "\n" + username + "|" + password
    f.write(temp)                   #向db.txt中寫入
    f.close()                       #關閉並生效

def main():
    t = input("1:登錄;2:註冊")
    if t == "1":
        user = input("請輸入用戶名:")
        pwd = input("請輸入密碼:")
        r = login(user,pwd)
        if r:
            print("登錄成功")
        else:
            print("登錄失敗")
    elif t == "2":
        user = input("請輸入用戶名:")
        pwd = input("請輸入密碼:")
        register(user,pwd)

main()

同時,新建db.txt文件,輸入:dayi123|dayi123

三、三元(三目)運算及lambda表達式

1、三元運算

if 1 ==1:
    name= "liu"
else:
    name= "sb"
#等同於:
name = "liu" if 1 == 1 else "sb"

2、lambda表達式(匿名函數)

def f1(a1,a2):
    return a1 + a2 + 100
ret = f1(10,12)
print(ret)
#等同於 
f2 = lambda a1,a2: a1 +a2 + 100
ret2 = f2(10,12)
print(ret2)

3、中括號中的條件判斷以及循環舉例:

a = range(10)
print([i for i in a if i<5])

輸出結果爲: [0, 1, 2, 3, 4]

四、遞歸

1、遞歸:

遞歸算法是一種直接或者間接地調用自身算法的過程。在計算機編寫程序中,遞歸算法對解決一大類問題是十分有效的,它往往使算法的描述簡潔而且易於理解。

2、遞歸算法特點:

(1)遞歸就是在過程或函數裏調用自身。

(2)在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱爲遞歸出口。

(3)遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運行效率較低。所以一般不提倡用遞歸算法設計程序。

(4)在遞歸調用的過程當中系統爲每一層的返回點、局部量等開闢了棧來存儲。遞歸次數過多容易造成棧溢出等。所以一般不提倡用遞歸算法設計程序。

3、遞歸舉例——階乘

def func(num):
    if num == 1:
        return 1
    return num * func(num-1)

x = func(7)
print(x)

五.高階函數

變量可以指向函數,函數的參數能接收變量,那麼一個函數就可以接收另一個函數作爲參數,這種函數就稱之爲高階函數。

#!/usr/bin/env python
# Author:dayi123
def fuc(a,b,f):
    return f(a)+f(b)     #將a、b的值交給函數f處理後求和再返回

add = fuc(7,-10,abs)      #將內置函數abs傳遞給f
print(add)


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