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