zoukankan      html  css  js  c++  java
  • python之函数

    函数定义

    def functionname( parameters):   #没有参数可以不写()
        "函数_文档字符串"       #存放函数说明
        function_suite
        return [expression]   #没有返回值可以不加[]内容,也可以省略return
    
    •  def是定义函数的关键字
    • 文档字符串使用三个引号括起来
    • 文档字符串下的为函数体

    参数传递

    函数参数的定义方式有4种,位置参数,关键参数,元组参数和字典参数。

    位置参数

    按照函数形式参数的顺序传递参数,一旦改变参数的顺序结果就会不同。

    def func(x,y):
        print("x=%d y=%d"%(x,y))
    
    func(3,4)
    #输出:
    x=3 y=4
    
    func(4,3)
    #输出:
    x=4 y=3

     关键参数

    关键参数指的是在传递参数时,不必考虑形式参数的具体先后顺序,以“形式参数=实际参数”的形式,直接告诉解释器,你想把实际参数传递给哪个实参。

    def func(x,y):
        print("x=%d y=%d"%(x,y))
    
    func(y=3,x=4)
    #output:
    x=4 y=3

     元组传递

    元组参数主要用在实际业务逻辑中存在“可变参数”的情况,也就是说,你不能准确的说出实参的个数。这个时候就要使用“可变参数”的策略了。元组参数的本质其实就是将若干个实参封装成一个元组参数,这样就实现了一次传递参数个数可变的需求。例如:当函数的参数表示的是pisa的配料时,则配料的种类会因为pisa种类的不同而不同。这时就可以使用“元组参数”的策略了。

    def func(*toppings):
        print(toppings)
    
    func('mushrooms','extra','cheese')
    func('mushrooms','extra')
    #output:
    ('mushrooms', 'extra', 'cheese')
    ('mushrooms', 'extra')
    

     字典传递

    这种策略是用来传递字典的,参数的形式是键值对的形式出现。

    def func(**peoples):
        print(peoples)
    
    func(name='aaron',age=25)
    #output:
    {'name': 'aaron', 'age': 25}
    

     从“func(name='aaron',age=25)”这段代码中可以看出,这种方式很容易跟“关键参数”的传参方式混淆。区分开的关键是这里的name表示的是字典里的键,而不是函数中的形参。如果出现了字典里的键和函数的形参一样的情况,那么解释器会将其理解为是“关键参数”,而不是字典传参,因此,在定义字典的键时要避免和其他形参一样。

    def func(name,**people):
        print(name)
        print(people)
    
    func(name='aaron',age='25',city='BeiJing')
    
    #output:
    aaron
    {'age': '25', 'city': 'BeiJing'}
    

     参数传递方式优先级问题

    解释器在解析函数参数时,会以位置参数,关键参数,元组参数,最后是字典参数的顺序来解析参数。这就解释了上述说所的“关键参数”和“字典传参”易混淆的问题。

    def test(x,y=1,*a,**b):
        print(x,y,a,b)
    
    test(1)
    #output:
    1 1 () {}
    
    test(1,2)
    #output:
    1 2 () {}
    
    test(1,2,3)
    #output:
    1 2 (3,) {}
    
    test(1,2,3,4)
    #output:
    1 2 (3, 4) {}
    
    test(x=1,y=2)
    #output:
    1 2 () {}
    
    test(1,a=2)
    #output:
    1 1 () {'a': 2}
    
    test(1,2,3,a=4)
    #output:
    1 2 (3,) {'a': 4}
    
    test(1,2,3,y=4)
    #output:
    Traceback (most recent call last):
    File "<pyshell#52>", line 1, in -toplevel-
    
    test(1,2,3,y=4)
    #output:
    TypeError: test() got multiple values for keyword argument
    

     传递列表问题

    有三种方式,分别是位置参数,关键参数和元组传参。不过在元组传参中,需要利用list方法将元组转化为列表。

    位置参数

    def func(names):
        print(names)
        names[1] = 'jujinyi'
    
    names = ['aaron','jim']
    func(names)
    print(names) 
    #output:
    ['aaron', 'jim']
    ['aaron', 'jujinyi']
    

     以上述的方式传递列表是,传递的是列表的原件,所以会永久性改变列表的值。如果说只想传递列表的附件,那么可以使用切片的方法实现。

    def func(names):
        print(names)
        names[1] = 'jujinyi'
    
    names = ['aaron','jim']
    func(names[:])
    print(names) 
    #output:
    ['aaron', 'jim']
    ['aaron', 'jim']
    

     关键参数

    本质上和位置参数其实是一样的,只不过是显示的传参而已。当然,对于实参的影响也是一样的,会永久性影响实参的值。

    def func(num,names):
          print("num=%d"%num)
          print(names)
          names[1] = 'jujinyi'
    
    names = ['aaron','jim']
    func(names=names,num=25)
    print(names)
    
    #output:
    num=25
    ['aaron', 'jim']
    ['aaron', 'jujinyi']
    

     元组传参

    def func(*toppings):
        toppings = list(toppings)
        print(toppings)
    
    func('mushrooms','extra','cheese')
    func('mushrooms','extra')
    
    #output:
    ['mushrooms', 'extra', 'cheese']
    ['mushrooms', 'extra']
    

    传递字典的问题

    字典的传递同样也有三种方法,分别是位置参数,关键参数和字典传参。

    位置参数

    def func(names):
         print(names)
         names['name'] = 'jujinyi'
    
    people = {'name':'aaron','age':'25'}
    func(people)
    print(people)
    
    #output:
    {'name': 'aaron', 'age': 25}
    {'name': 'jujinyi', 'age': 25}
    

     关键参数

    def func(num,names):
         print("num=%d"%num)
         print(names)
         names['name'] = 'jujinyi'
    
    people = {'name':'aaron','age':'25'}
    func(names=people,num=25)
    print(people)
    
    #output:
    num=25
    {'name': 'aaron', 'age': 25}
    num=25
    {'name': 'jujinyi', 'age': 25}
    

     字典传参

    def func(**people):
         print(people)
    
    func(name='aaron',age='25')
    
    #output:
    {'name': 'aaron', 'age': 25}
    

     返回值

    要想获取函数的执行结果,就可以用return语句把结果返回,注意:

    • 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
    • 如果未在函数中指定return,那这个函数的返回值为None 
  • 相关阅读:
    eval命令的使用
    declare与typeset的使用
    【线型DP模板】最上上升子序列(LIS),最长公共子序列(LCS),最长公共上升子序列(LCIS)
    【线型DP】【LCS】UVA_10635 Prince and Princess
    【经典DP】洛谷 P2782 友好城市
    HDU-1051/POJ-1065 Wooden sticks 木棍子(动态规划 LIS 线型动归)
    BZOJ3659 Which Dreamed It
    CF300D Painting Square
    CF632E Thief in a Shop 和 CF958F3 Lightsabers (hard)
    CF528D Fuzzy Search 和 BZOJ4259 残缺的字符串
  • 原文地址:https://www.cnblogs.com/cjaaron/p/8687541.html
Copyright © 2011-2022 走看看