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.无论位置实参还是关键字实参都不能对同一个形参重复赋值。

posted @ 2018-09-25 19:58  BlackLinks  阅读(91)  评论(0编辑  收藏  举报