python入门:你所不知道的函数特性

2017-05-26  本文已影响68人  天涯待归客

函数主要分为三个部分,函数名、参数和代码块。函数名没什么可讲的,只要起一个通俗易懂的名称就行了。今天,将重点介绍参数和代码块的内容。

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()有了两个默认参数heightweight,两者的默认值分别是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等。

总结

  1. 函数参数的传递有以下几种:必备参数、关键字参数、默认参数、不定长参数
  2. 推荐使用字典来返回多个值,有利于封装为json数据传输
  3. 匿名函数比较精炼,一行就包含了函数的所有要素

思考

# 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]

参考资料

  1. Python函数中定义参数的四种方式 原文链接:http://www.jb51.net/article/58010.htm
  2. python 匿名函数 原文链接:http://www.cnblogs.com/ghgyj/p/3997549.html
  3. Python的列表推导式 原文链接:http://www.cnblogs.com/yupeng/p/3428556.html

扫一扫这个二维码,关注公众号:聪哥python,获取最新python3基础教程

聪哥python
上一篇下一篇

猜你喜欢

热点阅读