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