函数参数的分类 | 名称空间的概念

内容概要

  • 函数参数的两大分类
  • 位置参数和关键字参数
  • 默认参数
  • 可变长参数
  • 其他函数参数补充
  • 名称空间的概念

形式参数

  • 在函数定义阶段括号内所填写的参数,简称'形参'
    image

  • 实际参数
    在函数调用阶段括号内传入的参数,简称'实参'
    image
    '''
    形参与实参的关系
    我们可以将形参看成是变量名,实参看成是变量值
    形参的表现形式只有一种就是变量名
    实参的表现形式有很多种(但是把握核心,就是数据值)
    '''

位置参数

  • 位置参数
    按照从左到右的顺序依次填入的参数

  • 位置形参
    在函数定义阶段括号内按照从左到右的顺序依次填入的变量名

  • 位置实参
    在函数调用阶段括号内按照从左到右的顺序依次传入的数据值

  • 关键字实参(可以打破位置顺序)
    在函数调用阶段通过形参 = 数据值的形式指名道姓的传值

'''
1.位置形参与位置实参在函数调用阶段,按照位置一一对应绑定
2.位置参数在绑定的时候,多一个不行少一个也不行
'''
"""格式越简单的越靠前,格式越复杂的越靠后"""

默认参数

  • 默认形参
    函数在定义阶段就可以给形参赋值了
    1.该形参在函数调用阶段如果不给值则默认使用的
    2.该形参在函数调用阶段也可以继续给值,则使用你给的

    '''
    位置形参与默认值形参在定义的时候
    位置形参必须在默认值形参的前面
    '''
    '''格式越简单的越靠前 格式越复杂的越靠后'''

可变长参数

1.函数无论传入多少位置参数都可以运行
def func(x, y, *a):
print(x, y, a)

func(1, 2, 3, 4, 5, 6, 7)
func(1, 2)
func(1, 2, 3, 4, 5, 6, 7, 8, 9)
func(1, 2)
image

"""
*号在形参中的使用
用于接收多余的位置参数,并组织成元组的形式赋值给 *号后面的变量名
"""

2.函数无论传入多少关键字参数都可以正常运行
def index(x, y, **b):
print(x, y, b)

index(y=2, x=1)
index(y=2, x=1, u=222, k=111, l=444)
image

"""
**号在形参中的使用
用于接收多余的关键字参数,并组织成字典的形式赋值给 **号后面的变量名

3.定义一个函数无论传入多少位置函数和关键字都可以正常运行
def index(x, y, **b):
print(x, y, b)

index(y=2, x=1)
index(y=2, x=1, u=222, k=111, l=444)

def index(*a, **b):
print(a, b)

index()
index(1, 2, 3, 4)
index(a=1, b=2, c=3)
index(1, 2, 3, 4, a=1, b=2, c=3)
image

"""
墨守成规
可变长形参 *与 *后面的变量名其实是可以随便定义的
但是python推荐使用
args
**kwargs
def index(
args, **kwargs):
pass
"""

def index1(*args):
print(args)

  • new_list1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
    index1(*new_list1)
    image

"""
*号在实参中的使用
会将列表、元组内的元素打散成位置元素的形式一一传值
"""

def index2(**kwargs):
print(kwargs)

  • new_dict = {'username': 'jason', 'pwd': 123}
    index2(**new_dict)
    image

"""
**号在实参中的使用
会将字典内的键值对打散成关键字参数传入
"""

函数参数补充

1.命名关键字参数
def register(name, age, *, sex, height):
pass

register('lili', 18, sex='male', height='1.8m')
image

"""
sex height在传入实参的时候必须以关键字参数的形式
ps:该类型的的参数基本不用,也几乎很少碰到
"""

名称空间

  • 什么是名称空间
    用于存放变量名与变量值绑定关系的地方

  • 名称空间的分类
    1.内置名称空间
    python解释器提前定义好的
    print()
    len()
    ...

2.全局名称空间
在py文件中顶格编写的代码运行之后都会存入全局名称空间
name = 'jason' # name全局

def func(): # func全局
pass

if 1:
a = 123 # a全局

for i in range(10):
print(i) # i全局

while True:
a = 123 # a全局

3.局部名称空间
函数体代码运行之后产生的都是局部空间

  • 存活周期
    1.内置名称空间
    python解释器启动与关闭而创建和销毁

2.全局名称空间
随着py文件的运行与结束而创建和销毁

3.局部名称空间
随着函数体代码的执行与结束而创建和销毁

名字查找的顺序

  • 在查找名字的时候,要确定自己当前在哪
    1.如果你在布局
    布局 >>> 全局 >>>内置

2.如果你在全局
全局 >>> 内置

  • 局部名称空间的嵌套
    '''函数定义阶段名字的查找就已经固定死了(特例)'''
    x = 111
    def f1():
    x = 222
    def f2():
    x = 333
    def f3():
    x = 444
    def f4():
    x = 555
    print(x)
    # x = 555 特例
    f4()
    f3()
    f2()
    # 通过调用f1 执行所有的函数
    f1()

image

posted @ 2021-11-15 19:29  一览如画  阅读(289)  评论(0)    收藏  举报