美文网首页
python入门:你所不知道的函数特性

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

作者: 天涯待归客 | 来源:发表于2017-05-26 15:54 被阅读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

    相关文章

      网友评论

          本文标题:python入门:你所不知道的函数特性

          本文链接:https://www.haomeiwen.com/subject/qqdxfxtx.html