函数参数

函数参数的两大分类

1.形式参数

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

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

2.实际参数

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

​ func(1,2) 括号内的1和2就是函数dunc的实参

形参于实参的关系

​ 我们可以将形参看成是变量名,实参看成是变量值,两者在函数调用阶段临时绑定,函数运行结束就断开

  • 形参的表现形式只有一种就是变量名
  • 实参的表现形式有很多种。实参可以是常量、变量、表达式的任意组合(但是核心还是数据值)

位置参数

  • 位置参数

​ 按照从左到右的顺序依次填入的参数

  • 位置形参

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

  • 位置实参

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

关键字实参(可以打破位置顺序)

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

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

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

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

默认参数(默认形参)

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

​ 1.该形参在函数调用阶段如果不给值 则使用默认的

​ 2.该形参在函数调用阶段也可以继续给值,给了值则使用你给的

  • 位置形参与默认值形参在定义的时候,位置形参必须在默认值形参的前面

    ​ '''格式越简单的越靠前 格式越复杂的越靠后'''

可变长参数(可变长形参)

1.函数无论传入多少“位置参数”都可以正常运行

"""
*号在形参中的使用
    用于接收多余的位置参数 并组织成元组的形式赋值给*号后面的变量名
"""
def func(*a):
		print(a)
func()  # ()  函数调用结果为空元组
func(1)  # (1,)
func(1,2,3,4,5)  # (1,2,3,4,5)

def func(x,y,*args):
  print(x,y,args) 
func(1,2)  # 1,2,()
func(1,2,3,4,5,6)  # 1 2 (3,4,5,6)

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

"""
**号在形参中的使用
    用于接收多余的关键字参数 并组织成字典的形式赋值给**号后面的变量名
"""
def index(**a):
  print(a)
index()  # 函数调用的结果为空字典

def index(x,y,**kwargs):
		print(x,y,kwargs)
index(1,2)  # 1 2 {}
index(1,2,a=3,b=4,c=5,d=6)  # 1 2 {'a': 3, 'b': 4, 'c': 5, 'd': 6}

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,d=4)  # () {'a': 1, 'b': 2, 'c': 3, 'd': 4}
index(1,2,3,a=1,b=2,c=3,d=4)  # (1, 2, 3) {'a': 1, 'b': 2, 'c': 3, 'd': 4}

"""
墨守成规
    可变长形参 *与**后面的变量名其实是可以随便定义的
    但是python中推荐使用
        *args  
        **kwargs 
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])  # 可以
'''如果index形参是*args 列表里面有很多元素 如何实现按照位置一一传入'''
"""
*号在实参中的使用
    会将列表、元组内的元素打散成位置参数的形式一一传值
"""
def index(*args):
  	print(args)
new_list = [11,22,33,44,55,66,77]
index(*new_list)  # (11, 22, 33, 44, 55, 66, 77)

"""
**号在实参中的使用
    会将字典内的键值对打散成关键字参数传入
"""
def index(**kwargs):
  	print(kwargs)
new_dict = {'name':'tony','age':19,'job':'idol'}
index(**new_dict)  # {'name': 'tony', 'age': 19, 'job': 'idol'}

函数参数补充(了解)

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

    # register('jason',18,'male',183)
    register('lili',18,sex='male',height='1.8m') #正确使用
    """
    sex height在传入实参的时候必须以关键字参数的形式

    ps:该类型的参数几乎不用 也几乎很少能碰到
    * 相当于分隔符号
    """

名称空间

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

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

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

2.1内置名称空间

​ python解释器提前给你定义好的

​ print()、Len()...

2.2 全局名称空间

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

name = 'tony'  # name全局
def func():  # func全局
		pass
if 1:
    a = 123  # a全局
for i in range(10):
    print(i)  # i全局
while True:
    a = 123  # a全局

2.3局部名称空间

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

名称空间的作用域

作用域

​ 名称空间所能够作用的范围

内置名称空间

​ 程序任何阶段任何位置均可以使用(全局有效)

全局名称空间

​ 程序任何阶段任何位置均可以使用(全局有效)

局部名称空间

​ 一般情况下只在各自的局部名称空间中有效

存活周期

​ 1.内置名称空间

​ python解释器启动与关闭而创建和销毁

​ 2.全局名称空间

​ 随着py文件的运行与结束而创建和销毁

​ 3.局部名称空间

​ 随着函数体代码的执行与结束而创建和销毁

名字的查找顺序

​ 在查找名字的时候要先确定自己当前在哪

​ 1.如果你在局部:

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

​ 2.如果你在全局:

​ 全局 >>> 内置

posted @ 2021-11-15 21:11  skuukzky  阅读(283)  评论(0)    收藏  举报