Python學習第六天---函數與lambda表達式

1、函數與lambda表達式

        *參數名的使用:在定義函數的時候,當我們不知道這個函數要往裏面傳多少個值的時候,我們就需要將參數設定爲(*參數),這樣在傳遞的時候我們可以往裏面傳遞任意個參數,其實內置的是以一個元組的方式傳遞的 , 但是當我們在調用該方法往裏面傳值的時候,當我們想要傳遞一個tuple類型的時候,會發現傳不進去的,我們還需要在傳遞的時候使用(*Tuple_name)這樣的方式進行解包。

      **參數名的使用:(**參數名)相當於字典表的若干個鍵值對!   傳值的話應該按照鍵值鍵值這樣傳!如果想要傳遞字典表的話同樣需要使用 **解包  !

   總結:一個星號的話就是傳的元組 ,兩個星號的話就是傳的字典表這樣的!

   

Lambda表達式:

     當我們臨時使用某些方法的時候,就可以使用lambda表達式。 所謂的lambda表達式,本質上就是定義一個匿名函數!
基本格式:lambda  參數1,.... : 函數。

f = lambda name: print(name)
f('tom')

f1 = lambda x,y:  x+y
print(f1(5,3))

f 是定一個無返回值的!  f1是定義一個有返回值的,f1中不需要寫return就能返回。
 例子:將函數和lambda表達式用在一起,根據不同的語言,來實現打招呼的不同方式。 

def hello_chinese(name):
    print("你好:",name)
def hello_english(name):
    print("hello:",name)

while True:
    name = input('請輸入您的姓名:\n')
    if name == 'stop':
        break
    language =input('請選擇語言:\n c = > 中文版\n  e => 英文版\n j => 日文版\n')
    if language =='c':
        hello_chinese(name)
    elif language =='e':
        hello_english(name)
    elif language =='j':
        (lambda name: print('莫西莫西',name))(name)

這事一個簡單的實現方式,但是很囉嗦! 最後面的用到了lambda表達式!  我們在看一種方式,在C#中叫“委託”,相對簡單一些!

def hello_chinese(name):
    print("你好:",name)
def hello_english(name):
    print("hello:",name)

while True:
    name = input('請輸入您的姓名:\n')
    if name == 'stop':
        break
    language =input('請選擇語言:\n c = > 中文版\n  e => 英文版\n j => 日文版\n')
    if language =='c':
        action = hello_chinese
    elif language =='e':
        action = hello_english
    elif language =='j':
       action =  (lambda name: print('莫西莫西',name))
    action(name)

我們把所有的值都賦值給action這個變量,但是不執行! 在最後調用action的時候在執行!!這就是C#中的委託的概念! 
這樣做的好處就是非常的靈活!

下面這個是一個將函數作爲一個參數傳遞的例子:

def hello_chinese(name):
    print("你好:",name)
def hello_english(name):
    print("hello:",name)
def hello_japanese(name):
    print("hello:",name)

"""action,在這裏實際傳遞的是上面所用定義的三個方法的其中的一個的名字!
這就是講函數作爲參數進行傳遞"""
def hello(action,name):
    action(name)

hello(hello_english,"tom")

他的執行用圖解釋!是這樣的!就是一個委託!

其中action就是委託hello_xxxx函數執行的! 

函數的應用與工具:map、filter

  直接代碼看如何使用 : map(函數,可迭代對象)

l = list(range(1,21))
result = []
#需求3:將l中的所有的偶數放再result中
# 第一種方式:
# for n in l:
#     if n % 2 == 0:
#         result.append(n)
# print(result)
# 第二種方式  推導
# result = [x for x in l if x % 2 == 0]
# print(result)

# 需求2:將列表中的數據每一個都加上5
# 第一種方式
# result = [x+5 for x in l]
# print(result)
# 第二種方式
# for x in l:
#     result.append(x + 5)
# print(result)
# 第三種方式:map()
# def add_number(x):
#     return x + 5
# result = list(map(add_number,l))
# print(result)
# for循環效率最低! 推導底層使用c寫的!效率最高! map最靈活!

# 需求三:求所有數的平方值
# 第一種方法實現:for
# for x in l:
#     result.append(x**2)
# print(result)
# 第二種實現:推導
# result = [x**2 for x in l]
# print(result)
# 第三種方法實現:map
# def lpf(x):
#     return x**2
# result = list(map(lpf,l))
# print(result)
# 第四種方法:lambda表達式
result = list(map((lambda n : n **2),l))
print(result)

    上圖展示了map的使用!

下面查看filter的使用:filter(函數,可迭代對象)

l  =list(range(1,11))
# 需求一:找出l中的偶數
def even_number(x):
    return x % 2 ==0
res = list(filter(even_number,l))
print(res)

同樣的也能使用lambda表達式!還有推導還有for循環。

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