函数主要分为三个部分,函数名、参数和代码块。函数名没什么可讲的,只要起一个通俗易懂的名称就行了。今天,将重点介绍参数和代码块的内容。
def 函数名(参数):
代码块
参数传递
参数的作用是提供函数实现功能所必备的数据。参数根据传递方式的不同,分为:必备参数、关键字参数、默认参数、不定长参数[1]。
必备参数
它在参数传递时有两个要求:数量相同,顺序一致。任何一个条件不满足就会出错。
def calculate_healthy_index(height, weight):
index = weight/height**2
if index < 18.5:
return "偏瘦"
elif index < 24 and index >= 18.5:
return "正常"
elif index < 27 and index >= 24:
return "偏胖"
elif index >= 27:
return "肥胖"
调用函数calculate_healthy_index时,它的两个参数一个不能少,并且顺序也不能颠倒。当参数的个数缺少时会出现TypeError,提示缺少参数;当顺序颠倒时,函数的工作异常,甚至不能工作。
# 身高的单位是m,体重的单位是kg
>>> calculate_healthy_index(1.8, 75)
正常
# 必备参数缺失,函数不能工作
>>> calculate_healthy_index(1.8)
TypeError: calculate_healthy_index() missing 1
required positional argument: 'weight'
# 必备参数,顺序颠倒,函数工作异常
>>> calculate_healthy_index(75, 1.8)
偏瘦
关键字参数
在传递参数时需要给出参数名称。由于参数可以通过关键字匹配到,它对参数传递只有一个要求:数量相同。
>>> # 关键字参数,顺序可以颠倒
>>> calculate_healthy_index(weight=75, height=1.8)
正常
默认参数
对于默认参数而言,是否传递都没有太大的影响,因为它有一个默认值。
# height和weight都有默认值
def calculate_healthy_index(height=1.8, weight=75):
index = weight/height**2
if index < 18.5:
return "偏瘦"
elif index < 24 and index >= 18.5:
return "正常"
elif index < 27 and index >= 24:
return "偏胖"
elif index >= 27:
return "肥胖"
>>> calculate_healthy_index()
正常
此时的函数calculate_healthy_index()
有了两个默认参数height
和weight
,两者的默认值分别是1.8和75。直接调用calculate_healthy_index()
也不会出错,返回值是“正常”。
不定长参数
不定长参数分为*args
和**kwargs
两种。*args
可以看作一个不定长度的列表,**kwargs
可以看作一个不定长度的字典。下面仅举一个简单的例子,感兴趣的同学可以查阅相关资料。
def add(*args):
total = 0
for index in args:
total = total + index
return total
>>> add(1,2,3,4,5,6,7,8,9,10)
55
>>> add(224, 375, 678, 491)
1768
上面的例子中,不能使用列表传递参数,因为列表被看作一个参数。
如何实现多个返回值
上期我们讲到,不管函数中有多少个return语句,return语句都只能执行一次。显然,如果我们想让函数有多个返回值,用多个return语句的方法是行不通的。
实际上,我们可以换个思路,既然不能多次,能不能靠一个返回值来达成目的呢?答案是可以的,用列表、元组或者字典。
返回字典
# 获得一串数字的平均数和总数
def evaluate(numbers):
total = 0
for i in numbers:
total = total + i
avg = total/len(numbers)
# 返回一个字典,推荐使用,因为可以封装成json数据,用于传输
out = {"average":avg, "total":total}
return out
>>> numbers = [77, 65, 83, 94, 88, 91, 72]
>>> evaluate(numbers)
{'average': 81.42857142857143, 'total': 570}
返回元组
# 获得一串数字的平均数和总数
def evaluate(numbers):
total = 0
for i in numbers:
total = total + i
avg = total/len(numbers)
# 返回一个元组
return avg, total
>>> numbers = [77, 65, 83, 94, 88, 91, 72]
>>> evaluate(numbers)
(81.42857142857143, 570)
匿名函数
前面讲过,函数主要由三个部分组成,函数名,参数和表达式。匿名函数,顾名思义,就是缺少了函数名的函数。实际上,函数名就是一个标记,真正发挥函数功能的是参数和表达式。
匿名函数的标记是lambda,lambda后面接函数的参数,各个参数之间用逗号隔开。和一般的函数相比,匿名函数没有代码块,只有一个表达式,所以功能上较弱。表达式的结果就是匿名函数的返回值[2]。
# 基本形式
lambda 参数: 表达式
# 该函数接受以一个人名,返回hello
>>> fun = lambda person: print("Hello, %s!" % person)
>>> fun("jack")
Hello, jack!
# 该函数接受两个参数,两者之和或两个的连接
>>> fun = lambda x, y: x + y
>>> fun(2,3)
5
在python中,函数也可以赋值给一个变量。至此,我们知道:可以赋值给变量的有:数字、字符串、列表、元组、字典、函数。
匿名函数涉及到了函数式编程。python虽然支持函数式编程,但并不是强项。流行的函数式编程语言有haskell,scala等。
总结
- 函数参数的传递有以下几种:必备参数、关键字参数、默认参数、不定长参数
- 推荐使用字典来返回多个值,有利于封装为json数据传输
- 匿名函数比较精炼,一行就包含了函数的所有要素
思考
# 1.编写一个函数,实现将输入的若干个参数翻倍,
# 倍数由第一个参数决定,结果作为列表输出
# 例如,输入 2,1,2,3,4,5,,则输出[2,4,6,8,10]
# 2.尝试用匿名函数实现上述功能
# 提示:需要用到列表推导式
# 翻倍函数
def convert(times, *args):
output = []
for i in args:
output = output + [i]*times
return output
# 匿名翻倍函数
lambda times, *args : [i*times for i in args]
列表推导式:用一个表达式来处理列表中的数据,生成一个新的列表[3]。一般形式为:
[表达式 for 变量 in 列表]
。举个例子:list_a = [1,2,3,4]
,可以利用列表推导式生成list_b
。推导如下:list_b = [i-1 for i in list_a]
,生成的list_b
就是[0,1,2,3]
。
参考资料
- Python函数中定义参数的四种方式 原文链接:http://www.jb51.net/article/58010.htm
- python 匿名函数 原文链接:http://www.cnblogs.com/ghgyj/p/3997549.html
- Python的列表推导式 原文链接:http://www.cnblogs.com/yupeng/p/3428556.html
扫一扫这个二维码,关注公众号:聪哥python,获取最新python3基础教程
网友评论