zoukankan      html  css  js  c++  java
  • Python课程回顾(day10)

    函数补充

     1.函数的使用原则

    函数的使用应该分为两个明确的阶段,一个是定义阶段,一个是引用阶段。在定义的阶段内,系统只会检测语法,不会执行函数体内的代码,只有在调用的时候才会触发函数体代码实现功能,在使用函数必须要遵循先定义,后引用的原则

    def bar():                
        print('from bar')
    def foo():
        print('from foo')
        bar()
    foo()                  只调用了foo,而foo里才开始调用bar,所以先执行foo代码再执行bar函数体下的代码
    
    def foo():
        print('from foo')
        bar()
    foo()                  在此处调用foo执行foo函数体下的代码块时,bar还未被定义。所以会报错,一定要定义后引用,不能先引用后定义。
    def bar():
        print('from bar')
    

    2.函数分类

    整体来说函数可以分为两大类,内置函数与自定义函数

    内置函数就是py中自带的已经定义好的功能,例如:del,input(),return,while,for

    而自定义函数则需要用户根据自己需求写入功能之后所命名的函数,例如登陆接口,购物车等等。

    3.函数的定义与调用方式

    函数定义的三种形式:

    有参函数:即在函数名后的括号内有相应的参数的成为有参函数。

    无参函数:即在函数名后的括号内没有相应参数的称为无参函数。

    空函数:只定义了一个函数名而函数体下没有代码块的称为空函数,通常用于设计代码结构。

    函数调用的三种形式:

    语句形式 :直接输入函数名加括号调用(login())

    表达式形式:直接将函数名后的参数在末尾输入

    将函数中的处理结果当做另外一个函数的参数

    4.返回值(return)

    我们什么时候需要返回值?或者说我们什么时候不需要返回值?

    在函数体执行完毕之后假如我们需要拿到一个结果,而这个结果也是在以后你需要用到的,这个时候我们就需要用到返回值。通常来说有参函数都是需要用到返回值的。

    而如果我们只是单纯的完整运行这个函数体而不需要拿到任何结果,我们就不需要用到返回值。通常来说无参函数都是不需要用到返回值的。

    需要注意的是:函数的返回值是没有类型和个数限制的,如果返回一个值,那么就是返回值的本身,若返回的是多个值,则会以逗号分割开以元组类型返回到用户。

    而函数不仅只有返回的功能还拥有结束函数执行的功能,若函数体下代码块运行到return则直接结束函数体。

    def func():
        return 123
    res=func()
    print(res,type(res))
    
    123 <class 'int'>


    def func():
    print('from func')
    return 1,1.1,'hello',[1,2,3]
    res=func()
    print(res,type(res))

        from func
       (1, 1.1, 'hello', [1, 2, 3]) <class 'tuple'>

    def func():
    return
    pass 若返回0个值或根本没有返回值则返回None
    res=func()
    print(res)

    None

    5.函数参数的使用

     跟函数的分类一样,函数的参数也可以分为两大类:

    形式参数:在定义阶段,函数名括号内定义的参数或者说是变量名就称之为形参

    实际参数:在调用阶段,函数名括号内传入的值或者说是变量值就称之为实参

    在调用整个函数体的阶段内,函数体会将实参的值与形参的参数建立绑定关系,这个绑定关系只在函数体运行时生效,函数体执行完毕后则自动解除绑定,被python回收。

    强调一点!!:要记住实参就是给形参赋值用的

    def func(x,y):
        print(x,y)
    func(1,2)      这里会将括号内的实参绑定给上面的形参xy
    

    细分的话形参与实参又都有各自不同的两种分类

    形参:默认参数与位置参数

    位置形参:在定义阶段,按照从左到右依次定义的参数就称为位置形参。那么位置形参要接收的值也必须按照顺序来 一 一 对应。而位置形参定义了多少个,值就必须要有多少个,不能多且也不能少。

    默认参数:在定义阶段,直接将默认参数赋值的参数就叫做默认参数,通常用于不需要更改或变化较小的参数,默认参数必须要定义在位置参数后面。

    实参:关键字实参与位置实参

    位置实参:与上面的位置形参形成对应关系,实参要按照吮吸依次赋值给形参,同样数量要对应形参,不能多不能少。

    关键字实参:可以不需要考虑按照顺序依次赋值,只需要根据形参的名称来赋值即可,按照key=value赋值。例:x,y,z     x=1 y=2 z=3,关键字实参则需要在位置参数的后面。否则会报错。

    def func(x,y,z):
        print(x,y,z)
    func(1,2)          报错:需要三个值
    func(1,2,3)
    func(1,2,3,4)      报错:需要三个值

    func(z=3,1,y=2) 报错:1只对应y

    可变长参数:可变长参数是指实参的个数不固定的参数,因为实参有位置实参和关键字实参,如果要传入的参数过多的话,那么使用位置形参就需要根据要接收的值有相等的参数。所以形参根据实参的这种特性就有了相对应的方法。就是*args与**kwargs

    如果要接收多个值的们可以使用*args

    def foo(x, y, *args):
        print(x,y,args)
    foo(1, 2, 3, 4, 5)     溢出的值会以元组类型传入形参

    1,2,(3,4,5)

    同样的传值的时候也可以使用*号键将其他类型的值赋值给*args

      def foo(x,y,*args):
                print(x,y)
                print(args)
            foo(1,2,*[3,4,5])    在列表前加*号键将列表打散形成一个个的值,因为上面的值溢出了所以溢出的值会以元组类型添加到*args

    def foo(x,y,z):
      print(x,y,z)
    foo(*[1,2,3])                此处会将列表打散形成一个个值,若上面形参里的值没有溢出就可以按照位置实参依次赋值。
     

    针对要接收关键字实参的时候我们可以使用**kwargs

    **kwargs会将实参里的关键字实参以字典形式赋值给形参

    def foo(x, y, **kwargs):
        print(x, y)
        print(kwargs)
    
    foo(1, y=2, a=1, b=2, c=3)
    
    1 2
    {‘a’:1,‘b’:2,‘c’:3}

    def foo(x,y,**kwargs):
         print(x,y)
         print(kwargs)
    foo(1,y=2,**{'a':1,'b':2,'c':3})   同样的在字典前加**也可以将字典打散成关键字实参。

    提示:实参里的位置实参与关键字实参是可以混合使用的,但一定要遵循使用规则,否则会报错

    1.位置实参必须要放在关键字实参的前面。

    2.无论位置实参还是关键字实参都不能对同一个形参重复赋值。

  • 相关阅读:
    POJ3159 Candies —— 差分约束 spfa
    POJ1511 Invitation Cards —— 最短路spfa
    POJ1860 Currency Exchange —— spfa求正环
    POJ3259 Wormholes —— spfa求负环
    POJ3660 Cow Contest —— Floyd 传递闭包
    POJ3268 Silver Cow Party —— 最短路
    POJ1797 Heavy Transportation —— 最短路变形
    POJ2253 Frogger —— 最短路变形
    POJ1759 Garland —— 二分
    POJ3685 Matrix —— 二分
  • 原文地址:https://www.cnblogs.com/lefy11-/p/9700479.html
Copyright © 2011-2022 走看看