函数先定义后调用,分为定义和调用两个阶段。函数的作用域会在定义时确定,也就是在哪定义,作用域在哪个范围
return函数的返回值:
1.函数都有返回值,但是没有return时,函数返回为None
2.return返回的数据类型没有限制,可以返回多个值,以形式,括号可加也可不加,
return终止函数的运行,当有多个return时只会返回第一个值
函数的参数:
- 位置参数
def func1(x,y): #x,y是形参
return x*y
func1(33,44) #33,44是实参
形参可以理解为变量名,而实参可以理解为变量值
位置参数中的实参和形参是一一对应,按照从左到右的顺序
参数在调用时生效,停止调用就失效
- 关键字参数
def func2(x,y): #按照key=value的形式传值
print(x,y)
func2(x=1,y=2) 或者 func2(y=2,x=10),不受顺序的限制
位置实参和关键字实参可以混用,但是位置实参必须在前,关键字实参在后,一个形参只能被传值一次不能重复传值
- 默认参数
参数在定义阶段就已经被赋值
def func3(x,y=3)
print(x,y)
func3(x=4),实参y可以不输入对应的形参,如果输入了默认参数就会改变为新的参数。
注意的问题:默认参数必须放在位置参数后边
默认参数通常定义为不可变类型
默认参数只在定义时被赋值一次
形参:值经常变化的情况下定义为位置参数,值通常不变的定义为默认参数
- 可变长参数
可变长参数是实参的个数不固定
*定义位置参数
**定义关键字参数
def func4(x,y,*args):
print(x,y)
print(args)
func4(1,2,3,4,5,6) =>func4(1,2,*(3,4,5,6)
def func6(*args,**kwargs): #func6(*(1,2,3),**{‘a’:4,’b’:5,’c’:6})=>func6(1,2,3,b=5,a=4,c=6)
print(args,kwargs)
def func5(x,y,**args):
print(x,y)
print(args)
func5(x=1,y=3,z=4,u=7)
1 3
{'z': 4, 'u': 7}
- 命名关键字参数
*后面定义的形参必须以关键字形式被传值
形参:位置形参,默认参数,*args,命名关键字参数,**ksargs
def register(*args,name='asda',age):
print(args)
print(name)
print(age)
(1, 2, 2, 3)
asda
10
def func(x,*args,z=1,**kwargs):
print(x)
print(args)
print(z)
print(kwargs)
func(1,2,3,4,5,a=1,b=2,c=3)
1
(2, 3, 4, 5)
1
{'a': 1, 'b': 2, 'c': 3}
函数的嵌套:
def f1():
def f2():
def f3():
print('from f3')
print('from f2')
f3()
print('from f1')
f2()
f1()
from f1
from f2
from f3
函数对象:
可以当作参数
可以当作函数的返回值
可以当作容器类型的元素 字典
名称空间:存放名称和值的绑定关系
三种:
1.内置名称空间:python解释器自带的名字,python解释器启动就会生成。
2.全局名称空间:文件级别定义的名字都会存放于全局名称空间,执行
python文件时就会生成。
3.局部名称空间:定义在函数内部的名字,在函数调用时生效。
三者的加载顺序:内置名称空间——>全局名称空间——>局部名称空间
取值顺序:局部名称空间——>全局名称空间——>内置名称空间
作用域:作用范围
全局作用域:内置名称空间与全局名称空间的名字属于全局范围,
在整个文件的任意位置都能被引用,全局有效。
局部作用域:函数调用时
闭包函数:函数内部定义的函数,成为内部函数,该内部函数包含对外部
作用域,而不是对全局作用域名字的,那么该函数成为闭包函数。