参数与名称空间概念

今日内容概要

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

image

内容详细

函数参数的两大分类
# 形式参数
	在函数定义阶段括号内的参数 简称'形参'
	def func(a, b):
        pass
	a b 就是函数func的形参
# 实际参数
	在函数调用阶段括号内的参数
	def func()

"""
形参与实参的关系
	形参可以看作是变量名 实参看成是参数
	两者在函数调用阶段临时绑定
	函数运行结束断开绑定

形参的表现形式只有一种 变量名
实参的表现形式有多种 但核心就是 数据(值)
"""

image

位置参数与关键字参数
# 位置参数
	按照从左到右的顺序依次填入的参数
# 位置形参
	在函数定义阶段从左到右依次填入的变量名
# 位置实参
	在函数调用阶段从左到右依次传入的数据值
    
# 关键字参数(只有关键字实参)
	在函数调用阶段通过 形参名=数据值 的形式指名道姓的传入值
"""
1.位置形参与位置实参在函数调用阶段 按照位置一一对应绑定
2.位置参数在绑定的时候多一个不行少一个更不行
"""
'''书写格式 越简单的数据值越靠前 越复杂的数据值越靠后'''

image

默认参数
# 默认参数(只有默认形参)
	函数在定义阶段就可以给形参进行赋值
	1.形参在函数调用阶段如果不给值 则使用默认的
	2.形参在函数调用阶段也可以继续给值 之后使用新给的值
eg:
def register(name, age, gender='male'):
    print('%s:%s:%s' % (name, age, gender))
    
register('jason', 18)  # jason:18:male
register('tony', 28)  # tony:28:male
register('kevin', 38)  # kevin:38:male
register('lili', 18, 'female')  # lili:18:female
register('lili', 18, gender='female')  # lili:18:female

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

image

可变长参数
1.函数无论传入多少位置参数 都可以正常运行
# *号在形参中使用
def func(*a):
     print(a)
func()  # ()
func(1)  # (1,)

def func(x,y,*a):
     print(x,y,a)
func(1, 2, 3, 4, 5, 6, 7)  # (1, 2, 3, 4, 5, 6, 7)
func(1,2)  # 1 2 ()
func(1,2,3,4,5,6,7,8,9)  # 1 2 (3, 4, 5, 6, 7, 8, 9)
func(1,2)  # 1 2 (3, 4, 5, 6, 7, 8, 9)
"""
* 用于接收多余的位置参数 并组织成元组的形式赋值给 *号 后面的变量名
"""


2.函数无论传入多少关键字都可以正常运行
# **号在形参中使用
def index(**b):
    print(b)
index()  # {}


def index(x, y, **b):
    print(x, y, b)
index(1, 2, c=3, d=4)  # 1 2 {'c': 3, 'd': 4}
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
	**kwargs
eg:
	def index(*args, **kwargs):
		pass
"""

4.如果index形参是*args 列表里面有很多元素 如何实现按照位置一一传入
def index(*args):
    print(args)
new_list = [11,22,33,44,55,66,77,88,99]
index(*new_list)  # index1(11,22,33,44,55,66,77,88,99)
"""
*号 在实参中使用
	会将列表、元组内的元素打散成位置参数的形式一一传入
"""

5.如果index形参是**kwargs 字典里面有很多元素 如何实现按照位置一一传入
def index(**kwargs):
    print(kwargs)
new_dict = {'username':'jason','pwd':123}
index(**new_dict)  # index(username='jason',pwd=123)
"""
**号 在实参中使用
	会将字典内的键值对打散成关键字参数一一传入
"""
其他函数参数补充(仅作了解即可)
# 命名关键字参数
  def register(name,age,*,sex,height):
      pass
# register('jason',18,'male',183)  # 错误
# register('lili',18,sex='male',height='1.8m')  # 正确使用
"""
	sex height在传入实参的时候必须以关键字参数的形式
	
	ps:该类型的参数几乎不用 也几乎很少能碰到
"""

image

名称空间概念
# 什么是名称空间
	用于存放变量名和变量值之间绑定关系的地方
    
# 名称空间的分类
1.内置名称空间
	python解释器提前定义好的
  eg;
	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.内置名称空间
	pyth解释器启动与关闭而创建和销毁
2.全局名称空间
	随着py文件的运行与结束而创建和销毁
3.局部名称空间
	随着函数体代码的执行与结束而创建和销毁

image

名字的查找顺序
# 在查找名字的时候 要先确定自己当前在哪
	1.如果你在局部
    	局部》》》全局》》》内置
	2.如果你在全局
    	全局》》》内置
        
# 局部名称空间的嵌套
x = 111
def f1():
    x = 222
    def f2():
        x = 333
        def f3():
            x = 444
            def f4():
                x = 666
                print(x)
               # x = 555    特例 走不到这里
            f4()
        f3()
    f2()
f1()  # 通过调用f1 执行所有的函数
# 555

image

posted @ 2021-11-15 18:33  Deity_JGX  阅读(87)  评论(0)    收藏  举报