目录
自定义函数语法
在不满足学习或工作中的需求时,需要自定义函数。另外为了避免重复代码的编写,也可以将常用的代码块封装成函数,在需要时调用函数即可,这样也会使代码简洁易读。
匿名函数lambda
python中有一种自定义函数叫匿名函数,可以用lambda关键字定义,一气呵成。
lambda parameters : function_expression
lambda 为匿名函数的起始关键词;
parameters 为函数可能涉及到的形参,如果有多个参数,需要用英文状态的逗号隔开;
function_expression 为具体的函数体
#统计列表中每个元素的频次
list6=['a','a','b','c','c','c','d','d']
#构建空字典,用于频次统计结果的存储
dict6 = {}
#循环计算
for i in set(list6):
dict6[i]=list6.count(i)
print(dict6)
#取出字典中的键值对
key_value = list(dict6.items())
print(key_value)
#列表排序(默认abcd升序)
key_value.sort()
print(key_value)
#按频次高低排序
key_value.sort(key=lambda x :x[1],reverse=True)
print(key_value)
out:
{'c': 3, 'b': 1, 'd': 2, 'a': 2}
[('c', 3), ('b', 1), ('d', 2), ('a', 2)]
[('a', 2), ('b', 1), ('c', 3), ('d', 2)]
[('c', 3), ('a', 2), ('d', 2), ('b', 1)]
注:首先for 循环计数;set函数是构造集合对象,实现列表元素的去重;然后对列表排序,默认是按照字母排序;构造匿名函数,对列表(每一个键值对元组)的第二个元素降序排序,进而实现输出结果中的最后一行。
def构造匿名函数
def function_name(parameters):
function_expression
return(result)
def 是define的缩写,表示自定义;
function_name为自定义函数名称,parameters为自定义函数的形参,需要放在括号里;注意冒号
function_expression为具体的函数体(注意缩进)
return用于返回函数的计算结果,如果有多个值需要返回,可以全部写在return的括号内,以逗号隔开
#猜数字
def game(min,max):
import random
number=random.randint(min,max)#随机生成一个需要猜的数字
while True:
guess=float(input('请在%d和%d之间猜一个数字'%(min,max)))
if (min<=guess)&(guess<=max): #判断输入是否有效
#用if来判断下一轮的有效范围
if guess<number:
min=guess
print('所猜数据偏小,请在%d和%d之间猜一个数字!\n'%(min,max))
elif guess>number:
max=guess
print('所猜数据偏大,请在%d和%d之间猜一个数字!\n'%(min,max))
else:
print('恭喜你猜对了')
break
else:
print('请重新输入有效数字!')
#调用函数
x=int(input('请输入最小值:\n'))
y=int(input('请输入最大值:\n'))
game(x,y)
out:
请输入最小值:
5
请输入最大值:
8
请在5和8之间猜一个数字9
请重新输入有效数字!
请在5和8之间猜一个数字6
所猜数据偏小,请在6和8之间猜一个数字!
请在6和8之间猜一个数字7
所猜数据偏小,请在7和8之间猜一个数字!
请在7和8之间猜一个数字8
恭喜你猜对了
自定义函数的参数
必选函数
在调用一个自定义函数时,必须给函数中的必选参数赋值,否则程序将会报错,并提醒用户“缺少一些必选的位置参数”。比如上述game中位置参数max。
默认函数
默认参数是指在构造自定义函数的时候已经给某些参数赋予了各自的初值,当调用参数时,这样的参数可以不用传值。
# 计算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))
out:
1到200的2次方和为2686700!
1到200的3次方和为404010000!
n为必选参数,p为默认参数。根据结果显示,第一次调用函数时,并没有给p参数传递任何值,函数正常运行,默认计算平方和;第二次调用函数,给p传递了新值3,此时p参数由原来的2换成了3,进而计算立方和。
可变函数
不确定给自定义函数传入多少个函数值的情况下,此时为可变函数。
# 任意个数的数据求和
def adds(*args):
print(args)
s = sum(args)
return(s)
print('和为%d!' %adds(7,10,23,44,65,12,17))
out:
(7, 10, 23, 44, 65, 12, 17)
和为178!
参数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 = ['游泳','唱歌','看电影'])
out:
{'tel': 13612345678,
'birthday': '1990-01-01',
'nickname': '月亮',
'gender': '女',
'edu': '硕士',
'income': 15000,
'add': '上海市浦东新区',
'interest': ['游泳', '唱歌', '看电影']}
如上结果所示,tel和birthday是必选参数,必须要传入对应的参数。kwargs为关键字参数,凭意愿填写,将这些任意填写的信息组装为字典,如输出的第一行信息;为了把必选参数的值和关键字的参数的值都汇总起来,在自定义函数时初设了空字典user_info,并通过字典元素增加的方法完成用户信息收集。