默认参数
函数在定义阶段就可以给形参赋值了
1.该形参在函数调用阶段如果不给值 则使用默认的
2.该形参在函数调用阶段也可以继续给值 则使用你给的
# 定义学员注册功能
def register(name, age, gender='male'):
print('%s:%s:%s' % (name, age, gender))
register('jason', 18)
register('tony', 28)
register('kevin', 38)
register('lili', 18, 'female')
register('lili', 18, gender='female')
"""
位置 形参与默认值形参在定义的时候位置形参
必须在默认值形参的前面
"""
’‘’‘格式越简单的月靠前 格式越复杂的越靠后’‘’
可变长参数
#1.函数无论传入多少位置参数都可以正常运行
可变长参数
def func(x, y, *a):
print(x, y, a)
func()
func(1)
func(1, 2, 3, 4, 5, 6, 7) # 1 2 (3, 4, 5, 6, 7)
"""
*号在形参中的使用
用于接收多余的位置 并组织成元组的形式赋值给*号后面的变量名
"""
函数无论传入多少参数都可以正常运行
def index(x, y, **b):
print(x, y, b)
index(y=2, x=1) # 1 2 {}
index(y=2, x=1, u=222, k=111,l=444) #1 2 {'u': 222, 'k': 111, 'l': 444}
"""
**号在形参中的使用
用于接收多余的关键字参数 并组成字典的形式赋值给**号后面的变量名
"""
3.定义一个函数无论传入多少位置参数和关键字参数都可以正常运行
def index(*a, **b):
print(a, b)
index() # () {}
index(1, 2, 3, 4) # (1, 2, 3, 4) {}
index(a=1, b=2, c=3) # () {'a': 1, 'b': 2, 'c': 3}
index(1, 2, 3, 4, a=1, b=2, c=3) # (1, 2, 3, 4) {'a': 1, 'b': 2, 'c': 3}
"""
墨守成规
可变长形参 *与**后面的变量名其实是可以随便定义的
但是python 中推荐使用
*args argument
**kwargs keyword arguments
def index(*args,**kwargs):
pass
"""
def index(a, b ,c):
print(a, b, c)
new_list = [11, 22, 33]
index(new_list) # 肯定不行 列表是一个整体 相当于一个实参
index(new_list[0], new_list[1], new_list[2]) # 可以
'''r如果index形参是*args 列表里面有很多元素 如何实现按照位置一一传入'''
def index1(*args):
print(args)
new_list1 = [11,22,33,44,55,66,77,88,99]
index1(*new_list1) # (11, 22, 33, 44, 55, 66, 77, 88, 99)
"""
*号在实参中的使用
会将列表、元组内的元素打散成位置参数的形式一一传值
"""
def index2(**kwargs):
print(kwargs)
new_dict = {'username': 'jason','pwd': 123}
index2(**new_dict) # index2(username='jason',pwd=123)
{'username': 'jason', 'pwd': 123}
"""
**号在实参中的使用
会将字典内的键值对打散成关键字参数传入
"""
4.函数参数补充
def register(name,age,*,sex,height):
pass
# register('jason',18,'male'183) 错误
register('lili',18,sex='male',height='1.8m') # 正确使用
"""
sex heighut在传入实参的时候必须以关键字参数的形式
ps:该类型的参数几乎不用 也很少能碰到
"""
5.名称空间
1.内置名称空间
python 解释器提前给你定义好的
print()
len()
...
2.全局名称空间
所有在py文件中顶格编写的代码运行之后都会存入全局名称空间
name ='jason' # name 全局
def func(): # func 全局
pass
if i:
a=123 # a全局
for i in range(10):
print(i) # i全局
while True:
a=123 # a 全局
3.局部名称空间
在函数体代码运行之后产生的都是局部名称空间
存货周期
1. 内置名称空间
python 解释器启动于关闭而创建和销毁
2.全局名称空间
随着py文件的运行与结束而创建和销毁n
3.局部名称空间
随着函数体代码的执行与结束而创建和销毁
4.名字的查找顺序
在查找名字的时候 要先确定自己当前位置在哪
1. 如果你在局部
局部>>>全局>>>内置
2.如果你在全局
全局>>>内置
x = 111
def f1():
x = 222
def f2():
x = 333
def f3():
x = 444
def f4():
x=555
print(x)
f4()
f3()
f2()
# 通过发f1 执行所有的函数
f1()
x = 111
def f1():
x = 222
def f2():
x = 333
def f3():
x = 444
def f4():
print(x)
x=555 特列
f4()
f3()
f2()
# 通过发f1 执行所有的函数
f1()
x = 111
def f1():
x = 222
def f2():
x = 333
def f3():
x = 444
def f4():
print(x)
x=555 telie 特列
f4()
f3()
f2()
# 通过发f1 执行所有的函数
f1()