在Python中有一种自定义函数为匿名函数,可以用lambda关键字定义。通过lambda构造的函数可以没有名称,最大的特点是在自定义匿名函数时所有代码只能在一行内完成,语法如下:
lambda parameters : function_expression
lambda为匿名函数的关键起始词;parameters是函数可能涉及的形参,如果有多个参数,需要用英文状态的逗号隔开;function_expression为具体的函数体。如果构造的函数不是很复杂就用lambda匿名函数一气呵成,否则就只能使用def关键字构造有名称的自定义函数。举例描述lambda函数的使用:
# 统计列表中每个元素的频次
list6 = ['A','A','B','A','A','B','C','B','C','B','B','D','C']
# 构建空字典,用于频次统计数据的存储
dict3 = {}
# 循环计算
for i in set(list6):
dict3[i] = list6.count(i)
print(dict3)
# 取出字典中的键值对
key_value = list(dict3.items())
print(key_value)
# 列表排序
key_value.sort()
print(key_value)
# 按频次高低排序
key_value.sort(key = lambda x : x[1], reverse=True)
print(key_value)
统计列表中元素频次,并根据频次从高到低排序。首先在统计元素频次时使用了for循环,其中set函数是构造集合对象,可以实现列表元素的去重;然后直接对存储键值对的列表直接排序,默认顺序是字母排序;在通过构建匿名函数,对列表元素(每一个键值对元组)的第二个元素降序排序。但无法通过lambda函数构建一个多行而复杂的函数。Python中提供了一个关键词def构造复杂的自定义函数,语法如下:
def function_name(parameters):
function_expression
return(result)
第一行结必须要加上英文状态的冒号,第二行开始需要缩进:
# 猜数字
def game(min,max):
import random
number = random.randint(min,max) # 随机生成一个需要猜的数字
while True:
guess = float(input('请在%d到%d之间猜一个数字: ' %(min, max)))
if guess < number:
min = guess
print('不好意思,你猜的的数偏小了!请在%d到%d之间猜一个数!' %(min,max))
elif guess > number:
max = guess
print('不好意思,你猜的的数偏大了!请在%d到%d之间猜一个数!' %(min,max))
else:
print('恭喜你猜对了!')
print('游戏结束!')
break
# 调用函数
game(50,100)
float() 函数用于将整数和字符串转换成浮点数。
自定义函数的集中参数
必选参数
当你调用一个自定义函数时必须给函数中的必选参数赋值,否则程序将会报错。就上面的猜数字游戏为例如果不给game中的min赋值,将会报错。
默认参数
构造自定义函数时就已经给某些参数赋予了各自的初值,当调用函数时,这样的函数可以不用传值。
# 计算1到n的平方和
def square_sum(n, p = 2):
result = sum([i ** p for i in range(1,n+1)])
return(n,p,result)
print('1到%d的%d次方和为%d!' %square_sum(200))
print('1到%d的%d次方和为%d!' %square_sum(200,3))
如上构造的在自定义函数中,n为必选参数,p为默认参数。根据结果显示,在第一次调用函数时,并没有给p赋值且正常运行,第二次调用函数时,给p传递新值3,此时p参数由原来的2换为3。
可变参数
# 任意个数的数据求和
def adds(*args):
print(args)
s = sum(args)
return(s)
print('和为%d!' %adds(10,13,7,8,2))
print('和为%d!' %adds(7,10,23,44,65,12,17))
参数args前面加一个星号*这样的参数就称为可变参数,该参数可以接纳任意多个实参的并捆绑为元组形式。
关键字参数
# 关键字参数
def info_collection(tel, birthday, **kwargs):
user_info = {} # 构造空字典,用于存储用户信息
user_info['tel'] = tel
user_info['birthday'] = birthday
user_info.update(kwargs)
# 用户信息返回
return(user_info)
# 调用函数
info_collection(13612345678,'1990-01-01',nickname='月亮',gender = '女',edu = '硕士',income = 15000,add = '上海市浦东新区',interest = ['游泳','唱歌','看电影'])
在自定义函数info_collection中,tel和birthday都是必选参数kwargs为关键词参数。