动态参数,作用域

一.函数的动态参数

1.*args 位置参数动态传参

def chi(name,*food, location="北京"): # 参数名是food  *表示动态传参
     print(location)
     print(name+"要吃", food)
chi("刘旺鑫","狗不理","大麻花","天津")
chi("刘旺鑫","大米饭","小米饭")
chi("刘旺鑫","馒头")

2.*kwargs 关键字参数动态传参

形参列表顺序:位置参数  ,   *args   ,  默认值参数 ,   *kwargs

以上参数可以随意搭配使用

def chi(**food): 
     print(food)
chi(good_food="狗不理", no_good_food="汉堡",drink="大梨",ice_cream="巧乐兹")

def func(*food,**food2)  #参数名是food,food2.动态传参*,**

def fun(a, *args, c="哈哈",  **kwargs):
    print(a, args, c, kwargs)
fun(1, 2, 3, c=4,d=5, e=6)#c d e是变量名不能加""
结果:
1 (2, 3) 4 {'d': 5, 'e': 6}#key值加""

def func(*args,*kwargs ):   #使用情况多,  无敌参数

  pass

3函数注释

 def func(a, b):
     """
     这个函数是用来计算a和b的和       
     :param a: 第一个数据
     :param b: 第二个数据
     :return: 返回的是两个数的和
     """
     return a + b

print(func.__doc__) # document文档       打印是不加()的函数名.__doc__
结果:
这个函数是用来计算a和b的和
    :param a: 第一个数据
    :param b: 第二个数据
    :return: 返回的是两个数的和
    

养成写注释的好习惯,能够让我们在工作中更顺利

形参的位置*,**:聚合

实参的位置*,**:打散

def func(*food): # 聚合, 位置参数
     print(food)
lst = ["鸡蛋","煎饼果子","猪蹄","滋滋冒油"]
#  实参: 打散
func(*lst) # 打散. 把list, tuple, set, str 进行迭代打散
# 聚合成关键字参数
def func(**kwargs):
    print(kwargs)
dic = {"name":'alex', 'age':'18'}
func(**dic) # 打散成关键字参数

二.命名空间

1.内置名称空间

2.全局名称空间

3.局部名称空间

a = 10 # 全局名称空间中的内容
def fn(): # fn也在全局名称空间
    b = 20 # 局部名称空间
    print(a)
def gn():
    print(a)
fn()
gn()

作用域:

1.全局作用域:内置名称空间+全局名称空间

2.局部作用域:局部名称空间

3.globals()和locals()的使用

  globals():  查看全局中的内容

  locals(): 查看当前作用域的内容

a = 110 # 全局
def fn(): #
    b = 20 # 局部
    def gn(): # 局部
        print(globals())  # 可以查看全局作用域中的内容
        print(locals())  # 查看当前作用域中的内容
    gn()
fn()

三.函数的嵌套

  函数可以互相嵌套

def outer():
    print("哈哈")
    def inner_1():
        print("呵呵")
        def inner_1_1():
            print("嘻嘻")
        inner_1_1()
        print("吼吼")
    def inner_2():
        print("嘿嘿")
    inner_2()
    inner_1()
outer()

1.在函数嵌套中global和nonlocal的使用

global:在局部中访问全局中的内容

nonlocal: 在局部寻找外层函数中离他最近的那个变量

a = 10 # 全局变量本身就是不安全的, 不能随意修改
def func():
    global a  # 1. 可以把全局中的内容引入到函数内部 , 2. 在全局创建一个变量
    a = 20
    print(a)
func()
print(a)



def outer():
    a = 10
    def inner(): # 在inner中改变a的值
        nonlocal a # 寻找外层函数中离他最近的那个变量
        a = 20
    inner()

outer()

作用域的练习题:

a = 1
def fun_1():
    a = 2
    def fun_2():
        global a
        a = 3
        def fun_3():
            a = 4
            print(a)
        print(a)
        fun_3()
        print(a)
    print(a)
    fun_2()
    print(a)
print(a)
fun_1()
print(a)

总结:综上,函数嵌套后全局和局部的变量要分清,

原文地址:https://www.cnblogs.com/Bug66/p/9449926.html