函数参数与名称空间
函数
函数参数之位置参数
位置参数
位置形参和位置实参必须保持位置一致,按照从左往右依次填写的顺序
位置形参
函数定义阶段括号内从左往右一次填写的变量名
def func1(name, age):
print(name, age)
func1('tank', 28)
------------------------------------------------------------------------------------
位置实参
函数调用阶段括号内从左往右一次性填写的数据值
func1('tank', 28)
------------------------------------------------------------------------------------
位置形参和位置实参在绑定位置的时候就按照从左往右依此绑定, 个数必须相同, 多一个不行,少一个也不行。
位置实参也可以传绑定了数据值的变量名。
def func2(a, b):
print(a, b)
func2(1, 2) # 1, 2
func2(1, 2, 3) # 报错
s = 111
func2(s, 3) # 111,3
同一个形参数不能多次赋值。
------------------------------------------------------------------------------------
使用注意
"""越短的和越简单的越靠前
越长的越复杂的越靠后
"""
默认参数(关键字参数)
默认参数也称为关键字参数,别名叫默认参数。
形参和实参可以不一样,当我们不想用默认参数的时候,就需要在实参处重新传参。
默认参数也是遵循 越短的越简单的越靠前, 越长的越复杂的越靠后
def func1(a, gender='male'):
print(a, gender)
func1(1,) # 1, male
func1(1, 'female') # 1, female
------------------------------------------------------------------------------------
def func1(job, age,gender='male'):
print(f"""
职位:{job}
年龄:{age}
性别:{gender}
""")
func1('无业游民', 28, 'female')
"""
职位:无业游民
年龄:28
性别:female
"""
在我们修改默认参数时也可以直接用 关键字传参 eg: gender = ‘famale’
-----------------------------------------------------------------------------------
关键字参数
func1(job='无业游民', age=28, gender='female')
说白了就是指名道姓的传参 可以不按顺序。 按照形参名传参
"""关键字参数和位置参数组合使用时不可把关键字参数放在位置参数前"""
可变长参数(重要)
在参数中带有一个* 或者两个**的(*后面跟着变量名 **也是如此) 我们称为可变参数。
*后面变量名可以随意写,但是一般是由*args **kwargs 因为常用所以一般人都能看懂。
def func1(*args, **kwargs):pass
------------------------------------------------------------------------------------
*号在形参中用于接收多余的位置参数,组成元组赋值给*号后面的变量名
def func(*args):
print(args)
func(1, 2, 3, 4) # (1,2,3,4)
如果和位置参数组合使用那么要注意必须给到位置形参一个实参,不然会报错
def func(a, *args):
print(a, args)
func(1, 2, 3, 4) # 1 (2,3,4,)
同理如果位置形参(短的简单的)在*args可变长参数后 数据会被*全部接收。位置形参没有数据就会报错
def func(*args, a):
print(a, args)
func(1, 2, 3, 4) # 报错
如果func()为空的话 直接是一个空元组 必须只有*args形参 因为位置参数必须绑定数据值
------------------------------------------------------------------------------------
**号在形参中用于接收多余的关键字参数,组成字典的方式赋值给**后面的变量名
def func(*args, **kwargs):
print(args, kwargs)
func(1, 2, 3, 4, name='tank', age=28) # (1, 2, 3, 4) {'name': 'tank', 'age': 28}
func() #() {}
组合使用
def func(a, *args, **kwargs):
print(a, args, kwargs)
func(1, 2, 3, 4, name='tank', age=28) # 1 (2, 3, 4) {'name': 'tank', 'age': 28}
可变长实参(重要)
*和 ** 不仅可以在形参中使用也可以在实参中使用
def func(a, b, c):
print(a, b, c)
l1 = [1, 2, 3]
l2 = [11, 22, 33]
func(*l1) # 1 2 3
func(*l2) # 11 22 33
*在实参中可以把列表里的数据取出来传给函数,类似与for循环 把数据取出来按照位置参数一次性传输函数
def func(a, b, c):
print(a, b, c)
l1 = (1, 2, 3)
l2 = {11, 22, 33}
func(*l1) # 1 2 3
func(*l2) # 33 11 22
*在实参可以操作 的数据类型很多,其中字典只能取出来键值,集合取出来后是无序的
l1 = {'name': 'jack', 'age': 18, 'salary': 20000}
func(*l1) # name age salary
------------------------------------------------------------------------------------
**在是实参中则是可以把字典打散成关键字参数 传给函数
def func(name, age, salary):
print(name, age, salary)
l1 = {'name': 'jack', 'age': 18, 'salary': 20000}
func(**l1) # jack 18 20000
也可以打乱关键字形参顺序
def func(age, name, salary):
print(age, name, salary)
l1 = {'name': 'jack', 'age': 18, 'salary': 20000}
func(**l1) # 18 jack 20000
名称空间
名称空间的含义
名称空间就是用来存放变量名和数据值绑定关系的地方。
名称空间的分类
1.内置名称空间
python解释器已经定义好了,里面包含很多文字我们可以直接拿来用。
eg: len() print() open()
----------------------------------------------------------------------------------- 2.全局名称空间
打开py文件时产生,里面存放文件级别的名字(编写代码产生的名字都会存在全局名称空间里)
name = 'tank' # 变量名name存入全局名称空间
age = '28' # 变量名age存入全局名称空间
while True:
job = 'ceo' # 变量名 job存入全局名称空间
if True:
salary = 10000 # 变量名 salary存入全局名称空间
def func(): # 函数名 func 存入全局名称空间
pass
-----------------------------------------------------------------------------------
3 .局部名称空间
函数体代码运行时产生的空间
def func():
name = 'tank' # 变量名 name 存入局部名称空间
名称空间存活周期与作用范围
存活周期
1.内置名称空间
python解释器运行>>>>>创建
python解释器关闭>>>>>销毁
------------------------------------------------------------------------------------
2.全局名称空间
py文件打开>>>>>创建
py文件关闭>>>>>销毁
------------------------------------------------------------------------------------
3.局部名称空间
函数体代码执行>>>>>创建
函数体代码结束>>>>>销毁
作用范围
1.内置名称空间
解释器全局有效
------------------------------------------------------------------------------------
2.全局名称空间
py文件内全局有效
------------------------------------------------------------------------------------
3.局部名称空间
函数体代码中有效
名字的查找顺序
存放在名称空间的名字我们去哪里找呢
当我们查找名字的时候一定要先确定自己现在在哪个空间里
当我们在全局名称空间时
全局名称空间>>>内置名称空间
当我们在局部名称空间时
局部名称空间>>>全局名称空间>>>内置名称空间
len = '我是全局空间中的len'
def func():
len = '我是局部空间中的len'
print(len) # 我是局部空间的len
func() # 调用函数时就会产生局部内存空间
print(len) # 我是全局空间中的len
实操
相互独立的局部名称空间默认不能够互相访问
x = '你还好吗'
def func1():
x = '有点不好'
def func2():
x = '怎么搞得'
def func3():
x = '想打你'
print(x) # 想打你 语法执行到func3里时发现里面有x 变量名
func3()
func2()
func1()
-----------------------------------------------------------------------------------
"""局部名称空间之间如果不是嵌套关系,则他们之间互不干涉""" 面试题
def index1():
name = 'owen'
def index2():
age = 20
print(name) # 在函数名index局部名称空间中没有name,所有会发生报错
index1()
index2()
作业
2.判断下列money的值是多少并说明理由 思考如何修改而不是新增绑定关系
money = 100
def index():
money = 666
print(money) # 100 因为print不在函数体代码中
money = 100
def func1():
money = 666
def func2():
money = 888
func2()
print(money) #100 print 不在上述 任何一个函数体代码中