今日内容
函数的基本使用
函数是盛放代码的容器
函数的使用原则:先定义,后调用
def foo(x,y):
print(x,y)
return
x,y可以是任意类型的参数
type hinting 类型提示
可以为函数内x,y和return的值做出提示 # python3.5以上版本才可以
提示不是限制,可以选择不按照提示进行操作
def foo(x:int,y:'请输入整型')->'返回数是整型':
print(x+y)
return 123
定义阶段
函数只检测语法,不执行代码。
函数名和变量名相同,都是指向一个内存地址
但是打印变量名时,py解释器经过处理会直接打印出内存地址的值
打印函数名时py解释器不经过处理,所以只能打印出内存地址
函数的三种格式
1.无参函数
def foo():
print('hello world')
不需要外界传入参数时使用无参函数
2.有参函数
def foo(x,y):
print(x,y)
需要外界传入参数时使用有参函数
3.空函数
def foo():
pass
作用:先占位,罗列这个函数具体的功能,再着手开始写函数
调用阶段
# 如何调用
函数名()
如果调用时报错,xxx object is not callable # xxx不能被调用
问题就很明显了,xxx并不是个函数
1.语句形式
单纯的执行一条命令
foo()
2.表达式形式
加入运算符
res = foo()
3.当成另一个函数的参数
print(foo())
函数的返回值
1.返回none
函数没有写return,或写了return没有值
2.返回单个值
return后接单个值
3.返回元组
return后接多个值,将值组成一个元组
函数的参数
形参:函数定义阶段,括号内指定的参数(变量名)
实参:函数调用阶段,括号内传入的值
二者的关系:在函数调用时,会将实参值绑定给形参名,在函数调用完毕后解除绑定
def foo(x,y): # x y为形参
print(x,y)
foo(1,2) # 1 2为实参
位置形参
在函数定义阶段,按照从左到右的顺序依次定义的形参,称之为位置形参
特点:必须被传值,传的值多或少都不行
def foo(x,y,z):
pass
位置实参
在函数调用阶段,按照从左到右的顺序依次传入的值,称之为位置实参
特点:按照顺序依次为形参赋值
def foo(x,y,z):
pass
foo(1,2,3)
关键字实参
在函数调用阶段,按照key=value的格式来传值,称之为关键字实参
特点:可以打乱顺序,但仍能为指定的形参赋值
def register(name,age):
pass
register(name='egon',age=18)
默认形参
在函数定义阶段,就已经为形参赋值,称之为默认形参
特点:定义阶段就已经就值了,意味着在调用阶段时,值可传可不传
def foo(x,y=100):
pass
foo(111,)
foo(111,222)
# 运算解释
m=100
def foo(x,y=m):
print(x,y)
m=200
foo(1)
# 输出1 100
m -> 100的内存地址
y -> m -> 100的内存地址
m -> 200的内存地址
y不受后一个m的影响,因为它指向的是m一开始指向的100的这个内存地址而不是m这个变量名。
如果m一开始指向的是不可变类型,那y之后不受m的改变影响。
m=[1,2,3]
def foo(x,y=m):
print(x,y)
m.append(4)
foo(1) # 输出1,[1,2,3,4]
如果m一开始指向的是可变类型,例如列表,可变类型是值改变内存地址不变,那y指向的这个内存地址所对应的值会因m的一些操作而进行变化。
# 最好尽量使函数成为一个可控的工具,不被其他的参数影响。
可变长参数*与**
在形参中带*:*会将溢出的位置实参值汇总成元组,然后赋值给紧跟其后的形参名。
def foo(x,*y): # y=(2,3,4,5,6,7)
print(x,y)
foo(1,2,3,4,5,6,7)
在形参中带**:**会将溢出的关键字实参值汇总成字典,然后赋值给紧跟其后的形参名。
def foo(x,**y): # y={a:2,c:3}
print(x,y)
foo(1,a=2,c=3)
在实参中带*:将*后的列表打散
def foo(x,y,z):
print(x,y,z) # 输出11,22,33
foo(*[11,22,33])
在实参中带**:将**后的字典变成键值对形式
def foo(x,y,z):
print(x,y,z) # 输出11,22,33
foo(**{'x':1,'y':2,'z':3})
参数具体使用
1.大多数调用的值都是一样的时,使用默认形参
2.默认形参的值尽可能指向不可变类型
3.默认形参的值只在函数定义阶段赋值一次
4.形参排序:位置形参,有默认值的形参,*形参,命名关键字形参,**形参
def index(a,b,c):
print(a,b,c)
def wrapper(*a,**b):
index(*a,**b)
# 将给wrapper的参数一模一样的传给index的方法