zoukankan      html  css  js  c++  java
  • Python函数

    大多数高级语言都提供了函数这个概念,Python也不例外,有过其他语言学习经验
    的都或多或少了解什么是函数,使用函数有哪些好处。下面首先简要叙述我们为什
    么需要函数,以及使用函数有哪些好处?
    函数之所以被创建出来,我想最根本的原因是程序员的"惰性"。与平常生活一样,
    我们总是需要重复去做一件有意见的事情。而在我们的程序中,我们也需要在许多
    不同的地方实现同一个功能,如果每次都需要将之前的代码重新再写一遍,这不仅
    增加了我们的工作量,同时也使代码变得臃肿。而如果我们将这些功能做成一个个
    独立工具,在需要时之间调用,这不仅减轻了工作量,而且使代码更加简洁,更加
    的易于维护。而我们一般将这些独立工具称作函数。
    函数可以看做是一种代码抽象的方式,借助抽象,我们可以不关心函数的具体实现
    过程,而直接在更高层面上思考问题。

    了解了函数的基本概念后,我们来具体了解一下Python的函数:
    在Python中,可以将函数分为Python内置的函数的与用户自定义的函数。下文主要
    叙述用户如何定义一个函数,以及在定义一个函数时需要注意什么。而对于众多的
    Python内置函数,如果读者希望了解它们的用途,可以使用函数help(函数名)
    查询某个函数的作用。
     
    如何定义一个函数?
    定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然
    后,在缩进中编写函数体,函数的返回值用return语句返回。
    def FunctionName(参数):
        ...
        函数体
        ...
        
        return #

    下面给出一个函数示例,用于计算 n!:

    [wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 expf.py 
    temp =  6
    [wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat expf.py 
    def countN(n):
        result = 1
    
        for i in range(1, n+1):
            result *= i
    
        return result
    
    temp = countN(3)
    print('temp = ', temp)
    从上述的如何定义一个函数中,我们可以看到,函数名与参数的选取、函数体的构
    建都与该函数需要实现的具体功能相关,没有统一标准。但Python对函数参数的设
    置却有着很大的灵活性。除了正常定义的必选参数外,还可以使用默认参数、可变
    参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简
    化调用者的代码。下面我们就来具体看一下这些不同的参数。
     
    位置参数:就是我们正常定义函数时的必选参数,也是我们平时一般意义上的函数
    参数。上述例子中的函数 countN(n) 中的 n 就是位置参数。当我们定义的某个函
    数有多个位置参数,在调用该函数时,传入的值按定义时的顺序从左到右赋给各个
    位置参数。
     
    默认参数:在我们定义某个函数时,预先给某个函数参数一个初值,这个参数就叫
    做默认参数,当用户调用此函数时,如果没有给此函数的默认参数一个传入值,函
    数运行时,默认参数就会使用定义时给定的初始值,如果调用时用户给定了默认参
    数传入值,函数运行时就使用用户的给定值。
    [wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 myPrint.py 
    Happy!
    Hello, World!
    [wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat myPrint.py 
    def myPrint(str = 'Hello, World!'):
        print(str)
        return
    
    myPrint('Happy!')
    myPrint()
    在使用默认参数时需要注意:
    1.必选参数在前,默认参数在后,否则Python的解释器会报错。因为如果默认参数
    在前,当用户调用此函数时,仅给定了必选参数,函数在将用户给定值传给函数参
    数时,无法判定用户是希望使用默认参数的默认值还是调用式错误,丢失了数值。
     
    2.在设置默认参数时,如果函数有多个参数,把变化大的参数放前面,变化小的参
    数放后面。变化小的参数就可以作为默认参数。
     
    3.当调用者希望使用默认参数中的某几个默认参数时,调用时不按顺序提供部分默
    认参数,需要把参数名写上。
    [wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 somevalue.py 
    Hurry in LemonTree ,he is 18 years old and graduated from GreedApple
    [wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat somevalue.py 
    def myPrint(name, school = 'GreedApple', age = 18, hometown = 'Pecato'):
        print(name, 'in', hometown, ',he is', age, 'years old and graduated from', school)
        return
    
    myPrint('Hurry', hometown = 'LemonTree')

    4.定义默认参数时,默认参数必须指向不变对象,否则在多次调用函数时可能产生
    错误的结果。因为,Python函数在定义的时候,默认参数的值就被计算出来了,在
    每次调用该函数时,如果改变了默认参数的内容,则下次调用时,默认参数的内容
    就变了,不再是函数定义时的值了。

    可变参数:调用函数时,可变参数的传入值数量是可变的,类似于传入一个list或
    tuple。只是,定义可变参数和定义一个list或tuple参数相比,仅仅在参数名前面
    加了一个*号。并且Python允许你在list或tuple前面加一个*号,把list或tuple的
    元素变成可变参数用来作为调用函数时的传入值。

    [wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 sum.py 
    10
    10
    10
    10
    [wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat sum.py 
    def sum_one(value):
        sum = 0
    
        for i in value:
            sum += i
    
        return sum
    
    def sum_two(*value):
        sum = 0
    
        for i in value:
            sum += i
    
        return sum
    
    value = [1, 2, 3, 4]
    print(sum_one([1, 2, 3, 4]))
    print(sum_one(value))
    print(sum_two(1, 2, 3, 4))
    print(sum_two(*value))

    关键字参数:与可变参数相比,关键字参数允许你传入0个或任意个含参数名的参
    数,这些关键字参数在函数内部自动组装为一个dict。 只是,定义关键字参数和
    定义一个dict参数相比,仅仅在参数名前面加了两个*号。在调用函数时,Python
    允许dict前加两个*号,将其转换为关键字参数传进去

    [wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 myPrint2.py 
    Name:  Hurry age: 18 {'Number': 12345, 'SchoolID': 54321}
    Name:  Hurry age: 18 {'Number': 12345, 'SchoolID': 54321}
    [wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat myPrint2.py 
    def myPrint(name, age, **other):
        print('Name: ', name, 'age:', age, other)
    
        return 
    
    temp = {'Number': 12345, 'SchoolID': 54321}
    myPrint('Hurry', 18, **temp)
    myPrint('Hurry', 18, Number = 12345, SchoolID = 54321)

    命名关键字参数:可以限制传入值KEY的关键字参数,定义时和关键字参数**kw不
    同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。

    [wangml@iZwz976helaylvgqok97prZ pythoncode]$ python3 myPrint3.py 
    Name:  Hurry age: 18 Number 12345 SchoolID 54321
    Traceback (most recent call last):
      File "myPrint3.py", line 8, in <module>
        myPrint('Hurry', 18, Number = 12345, CardID = 54321)    
    TypeError: myPrint() got an unexpected keyword argument 'CardID'
    [wangml@iZwz976helaylvgqok97prZ pythoncode]$ cat myPrint3.py 
    def myPrint(name, age, *, Number, SchoolID):
        print('Name: ', name, 'age:', age, 'Number', Number, 'SchoolID', SchoolID)
    
        return 
    
    temp = {'Number': 12345, 'SchoolID': 54321}
    myPrint('Hurry', 18, **temp)
    myPrint('Hurry', 18, Number = 12345, CardID = 54321)
    注意:如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再
    需要一个特殊分隔符*了
    例如:def myPrint(name, age, args*, Number, SchoolID):
     
    Tips:
    在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名
    关键字参数,这5种参数都可以组合使用。但是请注意:函数定义时参数定义的顺
    序必须按照:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
     
    如果我们想定义一个什么都不做的空函数,我们可以使用 pass语言 作为函数体。
    实际上pass可以用来作为占位符,假如现在还没想好怎么写函数的代码,则可以先
    放一个pass,让代码能运行起来。
  • 相关阅读:
    export和import实现模块化
    Net Core
    DockerCon 2016
    NET Core 构成体系
    Cloud Engine
    JVM内存结构
    Signalr
    Rabbit.Rpc
    遍历指定包名下所有的类(支持jar)(转)
    httpd的简单配置(转)
  • 原文地址:https://www.cnblogs.com/lnlin/p/9053663.html
Copyright © 2011-2022 走看看