zoukankan      html  css  js  c++  java
  • python的函数介绍 位置参数 关键字参数 默认参数 参数组 *args **kwargs

    1、数学意义的函数与python中的函数

    数学意义的函数

    y = 2*3+1

    x =3

    y =7

    x是自变量,y是因变量

    2、python中定义函数的方法

    一个函数往往都是为了完成一个特定的功能而存在的,所以注释信息加上是个好习惯

    def atest(x):
        "The  function definitions"
        x += 1
        return x

    def:     定义函数的关键字

    atest:     函数名

    ():     内可定义形参

    "":    文档描述(非必要,但是强烈建议为你的函数添加描述信息)

    x+=1:   泛指代码块或程序处理逻辑

    return: 定义返回值

    没有return也是可以的,一个函数里面只要运行到return就会退出整个函数,不在继续往下走

    调用运行:可以带参数也可以不带

    函数名()

    3、写一个函数

    def atest(x):
        """
        2*x+1
       
    :param x: 整形数字
       
    :return: 返回计算结果
        """
       
    y=2*x+1
        return y
    print (atest)

    打印出来的是函数的内存地址

    <function test at 0x0000000001556D90>

    调用下函数

    def atest(x):
        """
        2*x+1
        :param x: 整形数字
        :return: 返回计算结果
        """
        y = 2 * x + 1
        return y
    a = atest(3)
    print(a)
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    7

    4.什么情况下调用函数的时候不用加参数呢,就是定义函数的时候括号里面为空

    def atest():
        """
        2*x+1
        :param x: 整形数字
        :return: 返回计算结果
        """
        x = 3
        y = 2 * x + 1
        return y
    a = atest()
    print(a)
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    7

    5、同一个文件里面的函数名不能有相同的函数名,如果有2个相同的函数名,在下面调用代码的时候会先最终调用最下面的函数,因为python执行顺序是从上到下的,上面的函数会被下面的函数覆盖掉

    6.函数的好处 

    函数的好处:

    代码重用

    保持一致性,易维护

    可扩展性

    7.过程定义

    过程就是简单特殊没有返回值的函数

    下面这atest01就是过程,atest02就是函数

    def atest01():
        msg="hello the little green frog"
        print (msg)
    
    def atest02():
        msg="hello beiye"
        print (msg)
        return msg
    t1=atest01()
    t2=atest02()
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    hello the little green frog
    
    hello beiye

    8.return可以返回多个值,其实也是一个值,是一个元组

    def atest01():
        msg="test01"
        print (msg)
    def atest02():
        msg="test02"
        print (msg)
        return msg
    def atest03():
        msg="test03"
        print (msg)
        return 1,2,3,"gou",["beiye"],None,{"name":"gou"}
    t1=atest01()
    t2=atest02()
    t3=atest03()
    print (t1)
    print (t2)
    print (t3)
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    test01
    
    test02
    
    test03
    
    None
    
    test02
    
    (1, 2, 3, 'gou', ['beiye'], None, {'name': 'gou'})

    总结:

    返回参数=0:返回None

    返回参数=1:返回object

    返回值数>1:返回tuple    元组

    9.函数的参数

    分为2种,形参   实参

    (1)形参变量只有在被调用的时候才分配内存单元。因此形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

    (2)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的变量,在进行函数调用时,他们都必须有确定的值,以便把这些值传送给形参,因此预先赋值,输入等办法使参数获得确定值

    上面的说法听不懂,我自己说下,

    形参就是定义函数的时候()里面的定义的参数,还没有被使用,只是定义好

    实参就是函数定义完成了,在下面进行调用的时候传进去的参数

    def cacl(x, y):  #定义了一个函数cacl  形参是x y
        reus = x ** y   #reus = x的y次方
        return reus
    reus = cacl(2, 5)   #把2传值给x,把5传值给y
    print(reus) 
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    32

    (3)位置参数,形参和实参位置必须一一对应,多传参数和少传参数都不行

    这个函数的功能就是传入什么参数就打印出来什么

    def reus(x,y,z): #x y z是3个形参
        print(x)
        print(y)
        print(z)
    reus(1,2,3)#因为形参是三个,所以实参也得是3个,得一一对应,不然就会报错
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    1
    
    2
    
    3

    我们试下形参是3个,实参传2个试试(直接报错了,也就是说少传参数是不行的)

    def reus(x,y,z):
        print(x)
        print(y)
        print(z)
    reus(1,2)
    
    TypeError: reus() missing 1 required positional argument: 'z'

     

    required   [rɪ'kwaɪəd] 必须的

    positional  [pəˈzɪʃənəl]  位置

    (4)关键字参数,传参数的时候给指定的形参赋值,并不需要考虑位置的先后顺序,只要形参和实参的个数是一一对应的就可以,多传参数和少传参数都不行

    def reus(x,y,z):
        print(x)
        print(y)
        print(z)
    reus(y=5,x=4,z=6)
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    4
    5
    6

    (5)位置参数和关键字参数混合使用

    位置参数必须在关键字参数左边
    def reus(x,y,z):
        print(x)
        print(y)
        print(z)
    reus(4,y=5,z=6) #4就是位置参数,y=5,z=6就是关键字参数
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    4
    5
    6 

    这个位置参数也是在关键字参数左边,为什么报错呢?

    因为传参数的时候,第一个参数4赋值给了x,第二个参数6赋值给了y,第三个又传给了y的值等于5, 我们翻译下报错信息就是,这个reus函数的y参数被赋了多个值,所以这里就知道了,一个形参是不能被传参多次的

    def reus(x,y,z):
        print(x)
        print(y)
        print(z)
    reus(4,6,y=5)
    
    TypeError: reus() got multiple values for argument 'y'

    multiple  [ˈmʌltɪpl]  多个

    (6)默认参数

     y="linux"就是默认参数,如果传参的时候不传这个参数就使用默认的,如果传入的话就使用传入的值

    def reus(x,y="linux"):
        print(x)
        print(y)
    reus(4)
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    4
    
    linux

    这里为什么把66也括起来呢,因为上面的默认参数就是一个字符串,下面实参也要是字符串

    def reus(x,y="linux"):
        print(x)
        print(y)
    reus(4,"66")
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    4
    
    66

     

    (7)参数组   **字典   *列表   (也叫可变长参数)

    def atest(x,*args):  #args 是第二个形参 *是一个特殊用法
        print (x)
        print (args)
    atest(1,2,3,4,5,6) #1传入x,剩下的都传给args了当成一个元组的方式打印出来了
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    1
    
    (2, 3, 4, 5, 6)

    (7).1还能按照索引的方式打印,这就是非固定长度的参数

    def atest(x,*args):  #args 是第二个形参 *是一个特殊用法
        print (x)
        print (args)
        print(args[0])
    atest(1,2,3,4,5,6)
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    1
    
    (2, 3, 4, 5, 6)
    
    2

    (7).2也可以传入多个值给args,但是函数中并不处理这个args,也是可以的

    def atest(x,*args):  #args 是第二个形参 *是一个特殊用法
        print (x)
    atest(1,2,3,4,5,6)
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    1

     

    也可不传

    def atest(x,*args):  #args 是第二个形参 *是一个特殊用法
        print (x)
        print(args)
    atest(1)
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    1
    
    ()

    (7).3如果给args传入的是2个列表呢

    他会把这2个列表作为2个整体传给args,然后以元组的方式打印出来,这2个列表作为这个元组的2个元素

    a=[22,33,44,55,66]
    b=["heh","beiye"]
    def atest(x,*args):  #args 是第二个形参 *是一个特殊用法
        print (x)
        print(args)
    atest(1,(a),(b))
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    1
    
    ([22, 33, 44, 55, 66], ['heh', 'beiye'])

    传入2个字典也是一样的

    他会把这2个字典作为2个整体传给args,然后以元组的方式打印出来,这2个字典作为这个元组的2个元素

    a={"name":"gou"}
    b={"age":28}
    def atest(x,*args):  #args 是第二个形参 *是一个特殊用法
        print (x)
        print(args)
    atest(1,(a),(b))
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    1
    
    ({'name': 'gou'}, {'age': 28})

    (7).4问题来了,如果我不想让列表和字典作为一个整体传给args呢,而是遍历一下传给args

    列表的时候应该怎么遍历呢

    传入参数是列表的时候用1个*(传参数是元组也是用一个*就不举例子了)

    下面的第一个实参 "哈哈"传给了x,

    a和b这2个参数是2个列表传给了args,传列表用一个*  这是固定用法,传字典用2个

    a=[1,2,3]
    b=[4,5,6]
    def atest(x,*args):  #args 是第二个形参 *是一个特殊用法
         print (x)
         print(args)
    atest("哈哈",*(a),*(b))
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    哈哈
    
    (1, 2, 3, 4, 5, 6)

    要想取到列表中的6这个元素该怎么取(索引方式就可以取到了)

    a=[1,2,3]
    b=[4,5,6]
    def atest(x,*args):  #args 是第二个形参 *是一个特殊用法
         print (x)
         print(args[5])
    atest("哈哈",*(a),*(b))
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    哈哈
    
    6

    (7).5传入参数是字典的时候用2个*     **kwargs

    a={"name":"gou"}
    b={"age":28}
    def atest(x,**kwargs):  #args 是第二个形参 *是一个特殊用法
        print (x)
        print(kwargs)
    atest(1,**(a),**(b))
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    1
    
    {'name': 'gou', 'age': 28}

    要想取到字典里面的28这个value应该怎么取呢

    a={"name":"gou"}
    b={"age":28}
    def atest(x,**kwargs):  #args 是第二个形参 *是一个特殊用法
        print (x)
        print(kwargs["age"])
    atest(1,**(a),**(b))
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    1
    
    28
    
     
    
    a={"name":"gou"}
    b={"age":28}
    def atest(x,**kwargs):  #args 是第二个形参 *是一个特殊用法
        print (x)
        print(kwargs.get("age"))
    atest(1,**(a),**(b))
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    1
    
    28

     

    要想取到字典里面所有的value呢,就可以用字典的方法了

    a={"name":"gou"}
    b={"age":28}
    def atest(x,**kwargs):  #args 是第二个形参 *是一个特殊用法
        print (x)
        print(kwargs.values())
    atest(1,**(a),**(b))
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    1
    
    dict_values([28, 'gou'])

    也可以这样写,最后也会以字典的方式打印出来

    def atest(x,**args):  #args 是第二个形参 *是一个特殊用法
        print (x)
        print(args)
    atest(1,y=2,z=3)
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    1
    
    {'z': 3, 'y': 2}

    (7).6   *args   **kwargs  两者连接起来使用,无所不能,可以接受任意长度的参数

    def atest(x,*args,**kwargs):
        print (x)
        print(args)
        print (kwargs)
    atest(1,11,22,33,44,y=2,z=3)
    
    C:python35python3.exe D:/pyproject/day14函数/hanshu.py
    
    1
    
    (11, 22, 33, 44)
    
    {'y': 2, 'z': 3}
  • 相关阅读:
    LeetCode-62. Unique Paths
    南大算法设计与分析课程课后习题(3)
    linux-2.6.18源码分析笔记---信号
    南大算法设计与分析课程复习笔记(4)L4
    南大算法设计与分析课程复习笔记(3)L3
    南大算法设计与分析课程复习笔记(2)L2
    南大算法设计与分析课程OJ答案代码(2)最大子序列和问题、所有的逆序对
    【zz】史上最全设计模式导学目录(完整版)
    gtest学习
    全文检索及ElasticSearch框架学习
  • 原文地址:https://www.cnblogs.com/gouguoqilinux/p/9148133.html
Copyright © 2011-2022 走看看