python--动态传参,作用域,函数嵌套

一 . 动态传参(重点)  * ,  **

  * 与 **

复制代码
* 在形参位置. * 表示不定参数, 接收的是位置参数
接收到的位置参数的动态传参: 都是元组
def eat(*food): # 在形参这里把传递过来的实参进行了聚合,聚合成了元组
    print(food)
eat("小米粥")
eat("小米粥", "咸鸭蛋")
eat("小米粥", "爆米花", "咸鸭蛋", "蒜茄子")
复制代码
**在形参表示动态传参-关键字参数
关键字动态传参接收到的是字典
def func(**kwargs):  # 也是聚合. ** 聚合成字典
    print(kwargs)
func(a=1, b=2, c=3, haha="呵呵", good="not bad")

  无敌传参

# 无敌传参
def func(*args, **kwargs): # 参数没有限制. 随便传递
    print(args)
    print(kwargs)
func(1,2,3,4, a=3,b=5)

  聚合与打散

复制代码
def chi(*food):  # 这里是形参  聚合
    print(food)
lst = ["胡萝卜", "大白菜", "大萝卜", "草", "果冻"]  # 这里要输入列表或元组
chi(*lst)   # 这里的*是打散 形成元组

def chi(**food): # 聚合, 聚合成字典
    print(food)
dic = {"主食":'面条', "副食":"土豆泥", "汤":"疙瘩汤"} # 这里要输入字典
chi(**dic, 甜点="冰激凌") # 打散. 打散成关键字, 甜点 = '冰激凌' 可加可不加

#  * 与 ** 放在形参是聚合, 放在实参是打散
复制代码

  传参顺序

位置参数, *args, 默认值, **kwargs

二 . 作用域与名称空间

复制代码
名称空间顾名思义就是装名称的,比如我定义一个a = 10,那么这个a 所在的空间就是名称空间
作用域可以理解为起作用的区域,全局作用域就是在全局都起作用的,是内置+全局名称空间, print , input 就是内置,局部作用域就是在局部起作用的区域.  

globals() 查看全局作用域
locals() 查看当前作用域
复制代码

三 . 函数的嵌套

  函数的嵌套: 在函数中声明函数

    函在内部函数中使用变量的时候, 查找顺序: 先找自己 -> 上一层 -> 上一层..全局 -> 内置 

复制代码
def outer():
    def inner():
        print("我的天哪")
    print("还可以这样写???")
    inner()
outer()
复制代码

四 . nonlocal 和 global关键字

  global: 在局部引入全局变量

  nonlocal: 在局部..内层函数引入外层理他最近的那个变量

复制代码
# 全局变量一般是不能随意的修改的
a = 10
def func():
    # 慎用.
    global a  # global 表示从全局把一个变量引入到局部, 后面使用的a都是全局变量
    a += 10 # ?? a = a + 10 # 现在的a是全局的, 你现在试图改全局变量
    print("里面的打印",a)
func()
print("外面的打印", a)

# nonlocal  在局部, 寻找离他最近的外层的一个变量
a = 50
def func1():
    # a = 10 # 局部
    def func2():
        nonlocal a # 不找全局, global找全局
        a += 10 # a = a + 10 python不让这么干
        print("func2", a)
    func2()
    print(a)
func1()
print(a)
复制代码
原文地址:https://www.cnblogs.com/uiys/p/10673132.html