可变长参数
*形参
后约定俗称args,简称为(*args ),作用是会将溢出的位置实参全部接受,然后按照存储 元组 的行式,把元组赋值给*后边的参数。
def fa(*args):
#retrun *args不能直接返回,会提示语法错误。
#print(*args)可以直接打印.打印时*可以加也还可以不加。
* 实参
作用是会将*之后的参数循环取出,打散成位置实参,以后只要遇到实参中带有*的,他就是位置实参,应该马上打散成位置实参去看。
def f(x,y,z,*args):
print(x,y,z,*args)
f(1,*(2,3),4,5,6)
#打印结果为:1,2,3,(4,5,6)
注:上述代码块中的*(2,3)是被打散成了位置实参,分给了“y,z”,而*args将实参中剩余的“4,5,6”给集合成一个元组,为(4,5,6)
**形参
形参中的**会将溢出的关键字实参全部接收,然后存储字典的行式,然后把字典赋值给**后的参数,需要注意的是:**后的参数约定俗称为kwargw,即简称为(**kwargw)
def f(**kwargw):
print(kwargw) #打印时**不可以加,打印出来的值为字典格式
**实参
实参中的**会将后边参数的值循环取出,打散成关键字实参,哟吼但凡碰到是惨重带**的,他就是关键字实参,应该马上打散成关键字实参去看。
def func(x, y, z, **kwargs):
print(x, y, z, kwargs)
func(1, 3, 4, **{'a': 1, 'b': 2})
# 输出为:1 3 4 {'a': 1, 'b': 2}
函数的调用
对象:python中一切皆对象(字典,列表,元组,集合,布尔值,所有对象都可以做以下四件事)
1.引用
def f1():
print('hello')
f2 = f1 #如果f1加()会直接引用函数
f1() # 可以调用函数
f2() #也可以调用函数
2.作为容器类型
def f1(x,y):
if x > y:
return x
else:
return y
it = [f1(20,30),40,50,60]
print(it[0])
#输出结果为30,函数可以在列表内做元素来使用,取值的方法与列表取值一至
3.作为函数的实参
def f1():
return 1010
def f2(f3):
return f1
print(f2(f1))
print(f1)
#<function f1 at 0x000002434B62AB70>
<function f1 at 0x000002434B62AB70>
当f1做实参的时候运行f2函数,不会去运行函数f1()
4.作为函数的返回值
def f1():
return 1010
def f2(x):
return f1()
print(f2(10))
#输出结果为 1010,当f2运行的时候f1()会作为返回值,来运行f1()函数
函数嵌套
定义:函数内再定义一个函数。
def f1():
print('hello')
def f2():
print('nihao')
内部定义的函数外部不能使用。
名称空间
名称空间定义
专门用来存储名称的
名称空间的分类
内置名称空间:python解释器自带内置方法(print/len/list......)
全局名称空间:除了内置和局部都叫全局
局部名称空间:函数内部定义的都叫局部
名称空间的执行(生成)顺序
1.内置名称空间:python解释器启动的时候就有了
2.全局名称空间:执行文件代码的时候才会有全局
3.局部内置空间:函数调用的时候才会有局部
注:定义函数的时候,只检测语法,不执行代码
名称空间的搜索顺序
先从当前位置寻找,找不到再按照顺序寻找,不会逆向寻找
1.在局部:局部 -->> 全局 -->> 内置 -->> 报错
(return返回的值在全局名称空内)
2.在全局:全局 -->> 内置 -->> 报错
全局作用域与局部作用域
1.全局作用域的x 和局部作用域的x 没有半毛钱关系.
2.局部作用域1的x 和局部作用域2的x 也没有任何关系,即使局部作用域1和局部作用域在同一个局部作用域下.
例1:全局作用域
x = 10
def f1():
x = 20
f1()
print(x) #输出结果为 10,因为print(x)实在全局作用域进行的只在全局作用域搜索
例2局部作用域
x = 10
def f1():
y = 20
print(x) #输出结果为 10,搜索路径为:局部-->全局-->内置-->报错
f1()
print(x) #输出结果为 10,是在全局作用域下搜索的
例3:全局与局部作用域
x = 10
def f1():
x = 20
print(1,x) #输出结果为(1,1=20)
f1()
print(2,x) #输出结果为(2,10)
例4:返回值后搜索
x = 10
def f1():
return x
f1()
print(x) #输出结果为 10
global与nonlocal
global:打破 (全局作用域的x 和局部作用域的x 没有半毛钱关系) 这条规则,会使global以下的部分变成局部作用域.
nonlocal:让 x 成为顶层函数的局部,不是让他成为局部
it = [10]
def f1():
it[0] =11
f1()
print(it) #输出值为 11
# 所有可变数据类型都可以打破上述一切规则
例1:
def f1(i,it=[]):
it.append(i)
print(it)
for i in range(10):
f1(i)
#输出
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
注:形参具有描述意义
例2:
def f1(i,it):
it.append(i)
print(it)
for i in range(10):
f1(i,[])
#输出
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
注:实参具有实际意义