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循環。