Python函数的参数与名称空间

Python函数的参数与名称空间

  • 函数参数的两大分类
  • 位置参数与关键字参数
  • 默认参数
  • 可变长参数(重点)
  • 其他函数参数补充(了解)
  • 名称空间的概念

一、函数参数的两大分类

  1. 形式参数

    在函数定义阶段括号内所填写的参数,简称“形参”

def func(a, b):  # a和b就是函数func的形参
    pass

  2. 实际参数

    在函数调用阶段括号内传入的参数,简称“实参”

func(1, 2)  # 数据1和2就是函数func的实参

  3. 形参与实参的关系

    我们可以将形参看成是变量名,实参看成是变量值。

    两者在函数调用阶段临时绑定,函数运行结束时断开。

  4. 形参与实参的表现形式

    形参的表现形式只有一种,就是变量名

    实参的表现形式有很多种(但是把握核心,就是数据值)

二、位置参数

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

  1. 位置形参

    在函数定义阶段括号内按照从左往右的顺序依次填入的变量名

def func(a, b, c):
    pass

  2. 位置实参

    在函数调用阶段括号内按照从左往右的顺序依次填入的数据值

func(a=111, b=222, c=333)

  3.位置参数的注意点

    位置形参与位置实参在函数调用阶段按照位置一一对应绑定

    位置参数在绑定的时候多一个少一个都不行

def func(a, b, c):
    print(a, b, c)
func(a=111, b=222, c=333)

三、关键字参数

  1. 关键字参数的使用

    在函数调用阶段通过形参名 = 数据值的形式指名道姓的传值

def func(name, age):
    print(name, age)
func(age=20, name='aaa')

    关键字参数可以打破位置顺序

  2. 关键字参数与位置参数的连用

    在调用函数阶段,位置实参和关键字实参可以混合使用,但必须保证关键字参数在位置参数的后面

def func(name, age):
    print(name, age)
func('aaa', age=20)

    格式越简单的越靠前,格式越复杂的越靠后

四、默认参数

  1. 默认形参

    函数在定义阶段就可以给形参赋值了

    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(a, b, *c):
    print(a, b, c)
func(1, 2, 3, 4, 5, 6, 7)

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

  2. 可变长关键字参数

    函数无论传入多少关键字参数都可以正常运行

def index(x, y, **b):
    print(x, y, b)
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

        **kwargs

def index(*args, **kwargs):
    pass

   4. *在实参中使用

    会将列表、元组内的元素打散成位置参数的形式一一传入

def index(*args):
    print(args)
list1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
index(*list1)

  5. **在实参中使用

    会将字典内的键值对打散成关键字参数传入

def index(**kwargs):
    print(kwargs)
dict1 = {'name': 'aaa', 'pwd': 123}
index(**dict1)

六、函数参数补充(了解)

  1. 命名关键字参数

def register(name, age, *, sex, height):
    pass
register('aaa', 20, 'male', 180)  # 错误示范
register('bbb', 22, sex='male', height=180)  # 正确使用
# sex和height在传入实参的时候必须以关键字参数的形式传入

    该类型的参数几乎不用,也几乎很少能碰到

七、名称空间

  1. 什么是名称空间(namespaces)

    用于存放变量名与变量值绑定关系的地方

  2. 名称空间的分类(重要)

    1) 内置名称空间

      python解释器提前给你定义好的,如:

print()
len()
...

      python解释器运行产生,关闭销毁。

    2) 全局名称空间

      在py文件中顶格编写的代码运行之后都会存入全局名称空间

name = 'aaa'  # name全局
def func():  # func全局
    pass
if 1:
    a = 111 # a全局
for i in range(10):  # i全局
    print(i)

      py文件运行产生,结束销毁

    3) 局部名称空间

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

def func()
    b = 'bbb'  # b存入局部名称空间

八、变量名的查找顺序

  1. 在查找变量名的时候,要先确定自己当前在哪

    1) 在局部

      局部 >>> 全局 >>> 内置

    2) 在全局

      全局 >>> 内置

  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()

    当x = 555在print(x)后面时会报错

posted @ 2021-11-15 21:35  尤露  阅读(98)  评论(0)    收藏  举报