函數

函數的概念

  • 帶名字的代碼塊,用於完成具體工作
  • 可以反覆執行

函數命名

1.使用英文字母,不要使用中文
2.使用數字,但不能以數字開頭
3.不使用特殊符號,_除外
4.函數名大小寫敏感
5.避免使用python的關鍵字
6.函數名儘量有意義

函數的定義

  • 使用def定義
  • 注意冒號
  • 形參:定義函數時,定義的函數參數

函數的調用

  • 先定義後調用,調用後函數纔會執行
  • 實參:調用函數時傳遞給函數的參數
def greet_user(username): #username爲形參
    """
    函數說明
    """
    print("Hello! {0}!".format(username.title()))

greet_user("Leo") 
#調用函數,並傳遞實參Leo
#參數傳遞的過程,本質是普通變量賦值;Leo存儲在變量username中

函數參數傳遞

  • 位置參數(普通參數):
    • 形參與實參的位置順序必須一一對應
  • 關鍵字參數:
    • 傳遞給函數的”名稱-值”對
    • 不用考慮參數位置,根據關鍵字指定參數
  • 默認參數:
    • 調用時未傳遞,則使用定義時的默認值
    • 使用默認值時,在形參列表中,默認參數要放在位置參數和關鍵字參數之後
  • 收集參數(*args與**kwargs):
    • *args
    • **kwargs
    • 把沒有位置、不能和定義時的參數位置相對應的參數,放入特定的元組或者字典
def describe_pet(animal_type, pet_name,pet_color='black'):
    '''
    返回寵物信息
    :param animal_type:
    :param pet_name:
    :return:
    '''
    print('I have a {0} {1},My {1}\'s name is {2}'.format(pet_color,animal_type,pet_name.title()))

describe_pet('hamster','harry','brown') #調用傳遞位置參數
describe_pet('dog','willie') #調用時未傳遞pet_color,使用默認參數
describe_pet(pet_color='white',pet_name='jack',animal_type='dog') #調用傳遞關鍵字參數,參數順序不影響結果
def build_profile(first, last, **kwargs):
    profile = {}
    profile['first_name'] = first
    profile['last_name'] = last
    for k,v in kwargs.items():
        profile[k] = v
    return profile

print(build_profile('chen','yang',age=28, high='175cm', weigth='140kg'))
def stu(name='No Name', age=0, addr='No Address'):
    print("I am a student")
    print("我是{0},我今年{1}歲,我住在{2}".format(name,age,addr))

m_name = "Chen Yang"
m_age = 28
m_addr = "GuangZhou"
stu(m_name,m_age,m_addr) #普通調用
stu(addr=m_addr,age=m_age,name=m_name) #關鍵字參數調用,不用關注參數位置
stu(name=m_name,addr=m_addr) #默認參數調用,調用時未指定age,使用默認值0
def stu( *args):
    print("Hi,大家好,我做下自我介紹:")
    print(type(args))
    for i in args:
        print(i)

stu("Chen Yang",28,"GuangZhou","jingjing","single Dog")
stu("CY")
stu()
def stu( **kwargs):
    print("Hi 大家好,我先做下自我介紹:")
    print(type(kwargs))
    for k,v in kwargs.items():
        print(k,':',v)

stu(name="Chen Yang",age=28,addr="GuangZhou",lover="jingjing",worker='IT Dog')
print("*"*20)
stu(name="CY")
stu()

多種參數混合使用時的調用順序問題

按照以下順序
    普通參數、關鍵字參數、收集參數tuple、收集參數dict
def stu(name, age, *args, hobby="沒有", **kwargs):
    print("Hi,我先做下自我介紹")
    print("我是{0},我今年{1}".format(name,age))
    if hobby == "沒有":
        print("我沒有愛好,sorry")
    else:
        print("我的愛好是{0}".format(hobby))
    print("*"*20)
    for i in args:
        print(i)
    print("#"*20)
    for k,v in kwargs.items():
        print(k,":",v)

stu("Chen Yang",19,)
stu("Chen Yang",19,"游泳")
stu("Chen Yang",19,"zhangsan","lisi","wangwu",hobby="游泳",hobby1="發呆",hobby2="撩妹")

收集參數的解包問題

def stu( *args):
    n = 0
    for i in args:
        n += 1
        print(n,":",i)

l = ["zhangsan",19,23,"jingjing"]
stu(l) #此時args=(["zhangsan",19,23,"jingjing"],)
stu(*l) #此時args=("zhangsan",19,23,"jingjing")

**kwargs 與之類似

函數的返回值

1.過程函數,無返回值
2.有返回值的函數,return
3.return爲當前函數返回一個值或一組值,多個值可以返回列表、字典等複雜數據
4.運行return語句後,函數執行結束
5.未寫明,默認return None,None是python中的一個對象,不屬於數字也不屬於字符串
6.一個函數一個return語句,不要使用多個return
def get_formated_name(first_name, last_name):
    '''
    返回完整姓名
    :param first_name:
    :param last_name:
    :return:
    '''
    return {1:first_name.title(),2:last_name.title()} #返回字典

while True:
    f_name = input("(Press 'q' or 'Q' to quit!)\nPlease input your first name:")
    if f_name == 'q' or f_name == 'Q':
        break
    l_name = input("Please input your last name:")
    if l_name == 'q' or l_name == 'Q':
        break
    print('Hi! {0}'.format(get_formated_name(f_name,l_name)))

函數的嵌套

不推薦

函數的遞歸

函數主體內直接或間接的調用自己
遞推:函數體內部調用自己,直到某一級遞歸結束
迴歸:遞歸函數從後往前返回
遞歸函數必須明確定義遞歸結束的條件
每次調用遞歸函數都會賦值函數中的所有變量,再執行遞歸函數,比較消耗資源

階乘

def refunc(n):
    i = 1
    if n > 1:
        i = n
        n = n * refunc(n-1)
    print('{0}!={1}'.format(i,n))
    return n
refunc(10)

漢諾塔

這裏寫代碼片

函數文檔

查看函數文檔

1.help(func),信息顯示自動換行
2.func.__doc__,信息顯示不換行\n

自定義函數文檔

1.'這裏是說明文檔'
2.'''說明文檔'''

匿名函數/lambda函數

print((lambda x:-x)(-2))
print((lambda x,y:x+y)(1,2))
lambda不是函數結構,是一種表達式
書寫簡單
缺點是不適合複雜程序
lambda var1,var2:表達式
匿名函數,函數名未和標識符進行綁定
lambda中只能使用簡單的表達式,無法使用判斷、循環等語句

Generator函數

一次產生一個數據項,並把數據項輸出
yield與return原理不同,return返回值後程序終止,而yield返回值後程序不終止
相比於序列索引,Generator生成器的性能更好
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章