Python 【系列教程】之函數和lambda表達式

一、定義函數和調用函數

在使用函數之前必須先定義函數,定義函數的語法格式如下:

def   函數名(形參列表):
    //由零條到多條可執行語句組成的函數
    [return [返回值]]

      python 的聲明函數必須使用def關鍵字。

# 函數的定義
def my_max(x, y):
    z = x if x > y else y
    return z


def say_hi(name):
    print("====正在執行say_hi()函數====")
    return name + ",您好!"


a = 6
b = 9

print(my_max(a, b))
print(say_hi("段趙旭"))


# 函數說明文檔:只要把一段字符串放在函數聲明之後,函數體之前,這段字符串將被作爲函數的部分,這個文檔就是
# 函數的說明文檔
# 程序即可通過help()函數查詢函數的說明文檔,也可通過函數的_doc_屬性訪問函數的說明文檔。下面程序示範了爲函數
# 編寫說明文檔
def my_max(x, y):
    """
    獲取兩個數值之間較大數的函數
    :param x:
    :param y:
    :return:
    """
    # 定義一個變量z,該變量等於x,y中較大的值
    z = x if x > y else y
    return z


help(my_max)
print(my_max.__doc__)


# 多個返回值,被自動封裝成元組的形式返回
def sum_and_avg(list):
    sum = 0
    count = 0
    for e in list:
        if isinstance(e, int) or isinstance(e, float):
            count += 1
            sum += e
    return sum, count


my_list = [20, 15, 2.8, 'a', 35, 5.9, -1.8]
# 元組的形式
tp = sum_and_avg(my_list)
print(tp)
# 使用序列解包的形式
s, avg = sum_and_avg(my_list)
print(s)
print(avg)


# 遞歸函數
def fn(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return n * fn(n - 1)


print("fn(10)的結果是:", fn(3))


# 函數關鍵字的使用
def grith(width, height):
    print("width:", width)
    print("height:", height)
    return 2 * (width + height)


print(grith(3.5, 4.8))
print(grith(width=3.5, height=4.8))
print(grith(height=4.8, width=3.5))
print(grith(3.5, height=4.8))


# 關鍵字參數必須位於位置參數之後,否則報錯
# print(grith(width=3.5,4.8))

# 參數默認值
def say_hi(name="孫悟空", message="歡迎來到瘋狂軟件"):
    print(name, ",您好")
    print("消息是:", message)


# 全部使用默認參數
say_hi()
# 只有message參數使用默認值
say_hi("白骨精")
# 兩個參數都不使用默認值
say_hi("白骨精", "123")
# 只有name參數使用默認值
say_hi(message="歡迎學習python")


# 定義函數的時候也是一樣,默認值參數必須放到位置參數之後
# def test(name="zhangsan",age):


# 個數可變的參數
def test(a, *books):
    print(books)
    for b in books:
        print(b)
    print(a)


test(5, "瘋狂ios講義", "瘋狂android講義")
"""輸出可以看到可變參數傳入到函數之後封裝成了元組
('瘋狂ios講義', '瘋狂android講義')
瘋狂ios講義
瘋狂android講義
5"""


# 定義了支持參數收集的函數
def test(x, y, z=3, *books, **scores):
    print(x, y, z)
    print(books)
    print(scores)


test(9, 8, 3, "asd", "asd", 語文="sad", 數學="math")
"""輸出
9 8 3
('asd', 'asd')  可變長參數變成了元組
{'語文': 'sad', '數學': 'math'}  可變長關鍵字參數變成了字典
"""


def test(name, message):
    print()
    print()


my_list = ['孫悟空', '歡迎來到瘋狂軟件']
test(*my_list)


# 逆向參數收集
def foo(name, *nums):
    print("name參數:", name)
    print("nums參數:", nums)


my_tuple = (1, 2, 3)
foo("asd", *my_tuple)


# 字典關鍵字參數:程序使用逆向收集即可將my_dict包含的三個kv對以關鍵字參數的形式傳給
# bar()函數
def bar(book, price, desc):
    print(book, "這本書的價格是:", price)
    print('描述信息', desc)


my_dict = {'price': 89, 'book': '瘋狂python講義', 'desc': '這是一本系統全面的python學習圖書'}
bar(**my_dict)

# 變量作用域
"""python提供瞭如下的三個工具函數來獲取指定範圍內的變量字典
globals() 該函數返回全局範圍內所有變量組成的變量字典
locals() 該函數返回當前局部範圍內所有變量組成的變量字典
vars(object) 獲取在指定對象範圍內所有變量組成的變量字典,如果不傳入object
參數,vars()和locals()的作用完全相同
"""

# 在函數中聲明全局變量
name = 'Charlie'


def test():
    # 聲明name是全局變量,後面的賦值語句不會重新定義局部變量
    global name
    # 直接訪問name全局變量
    print(name)  # charlie
    name = "孫悟空"


test()
print(name)
"""增加了global name聲明之後,程序會把name變量當成全局變量,這意味着test()函數後面對name賦值的語句只是對
全局變量賦值,而不是重新定義局部變量"""


# 局部函數
def get_math_func(type, nn):
    def square(n):
        return n * n

    def cube(n):
        return n * n * n

    def factorial(n):
        result = 1
        for index in range(2, n + 1):
            result *= index
        return result

    if type == 'square':
        return square(nn)
    elif type == 'cube':
        return cube(nn)
    else:
        return factorial(nn)


print(get_math_func('square', 3))
print(get_math_func('cube', 3))
print(get_math_func('factorial', 3))


def foo():
    # 局部變量name
    name = 'Charlie'
    def bar():
        #bar函數中就不必在重新定義name變量,就可以直接訪問foo函數中的name變量了
        nonlocal name
        # 訪問bar()函數所在foo()函數內的name局部變量
        print(name)
        name = '孫悟空'
        print(name)
    bar()
foo()
"""nonlocal和前面的global功能大致類似,區別是global用於聲明訪問全局變量,而
nonlocal用於聲明訪問當前函數所在函數內的局部變量"""

二、函數的高級內容

# 使用函數變量
def pow(base, exponent):
    result = 1
    for i in range(1, exponent + 1):
        result *= base
    return result
my_fun = pow
print(my_fun(3, 4))
def area(x, y):
    return x * y
my_fun = area
print(my_fun(3, 4))


def map(data,fn):
    return fn(data,data)
print(map(5,my_fun))
#函數可以作爲變量,參數,以及函數的返回值


#局部函數沒有太大的意義,那麼就考慮使用lambda表達式來簡化局部函數的寫法。
def get_math_func(type):
    result = 1
    #該函數返回的是lambda表達式
    if type == 'sq':
        return lambda n:n*n
    elif type == 'cube':
        return lambda n:n*n*n
    else:
        return lambda n:(1+n)*n/2
"""lambda表達式只能是單行表達式,不允許使用更加複雜的函數形式,
lambda表達式的語法格式如下:
lambda [參數列表]: 表達式
"""
x=map(lambda x:x*x,range(8))
print([e for e in x])
y=map(lambda m:m*m if m%2==0 else 0,range(8))
print([e for e in y])

 

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