day10-2018-10--30 函数进阶

                                动态传参

# def chi(good_food, good_food1, junk_food, drink, sweet):
#     print(good_food,good_food1, junk_food, drink, sweet)
#
# chi("胡辣汤", "烤全羊", "薯条", "奶茶", "圣代")


# 动态传参
# *表示动态传参. 可以接受所有的位置参数
# 传参的时候自动的把实参打包成元组 交给形参

# def chi(*food):
#     print(food)

# chi() # 动态传参可以不传参数
# chi(good_food = "胡辣汤") # 关键字传参
# chi("胡辣汤", "疙瘩汤", "西红柿鸡蛋汤")
# chi("大猪蹄子","大汉堡","薯条","圣代","雪顶","拿铁")

# ** 表示接收关键字的动态传参
# 接收到的内容放在字典里
# def chi(**food):
#     print(food)
#
# chi(good_food = "哈哈", junk_food="呵呵", drink="吼吼")
# # chi("大猪蹄子","大汉堡","薯条","圣代","雪顶","拿铁")

# 顺序  位置 > *args > 默认值参数 > **kwargs
# 在以上顺序中可以任意的进行搭配

# 实参: 位置 > 关键字
# 位置, *args, 默认值参数, **kwargs
# def chi(a = "男", **kwargs ):
#     print(a, kwargs)
# chi(1, b = "女")

# 无敌传参
# 顺序  位置 > *args > 默认值参数 > **kwargs
# def func(*args, **kwargs):
#     print(args, kwargs)
# func(1,2,"哈哈",3,4,5,a=6,b=7,c=8,d=9, e=18 )


# lst = ["火腿肠","方便面","有调料包","被捏碎了", "韭菜", "大白菜"]
# def chi(*food): #  形参上的* : 动态接收位置参数
#     print(food)
#
# # 把列表中的所有食物传递给chi
# chi(*lst) # 把一个列表或者元组或者字符串.打散成参数. 传递给形参
#
# dic = {"张无忌":"倚天屠龙记", "乔峰":"天龙八部", "郭靖":"射雕"}
#
# def da(**kwargs): # 动态传参. 接收关键字参数
#     print(kwargs)
# # da(张无忌=dic['张无忌'])
# da(**dic)   # 把字典打散成关键字参数

# *, ** : 在形参: 聚合, 实参: 打散

                          名称空间和作用域

# 在我们程序运行的时候, 首先 加载的并不是我们的代码
# 先加载的是内置的一些东西
# a = 10
# def chi():
#     a = 20
#     print(a)
#
# print(a) # 10
# chi()   # 20
# print(a) # 10

# def print(*args):
#     pass
#     # print(args) # maximum recursion depth exceeded
#
# def func():
#     print("呵呵")
#
# func()
def chi():
    p = 30
    print(locals()) # {'p': 30}   locals()可以查看局部作用域中的内容
    print(p)
# chi()
print(locals()) # 查看当前作用域中的名字
print(globals())
# a = 10 # 全局
# b = 20
# print(globals()) # 查看全局作用域中(内置+全局)的内容

                                  函数的嵌套  

# 一个套一个
def outer():
    print("我是outer")
    # 在函数内部声明的函数, 只能在函数内部访问
    def inner():
        print('我是inner')
    inner()
    print("我是outer_end")

outer()



# def fun2():
#     print(222)
#     def fun3():
#         print(666)
#     print(444)
#     fun3()
#     print(888)
# print(33)
# fun2()
# print(555)

# 33 222 444 666 888 555

                                 global和nonlocal

# a = 10
# def func():
#     global a  # 直接从全局把变量引入进来
#     a = 20
#
#
#     # a = 20 # 并没有改变全局变量,   创建了一个自己的变量
#     # 全局变量在局部, 可以用, 但是, 不能改
#     # a = a + 10
#     print(a)
#
# func()
# print(a)


# def func():
#     global a # 可以创建(升华)一个局部变量为全局变量
#     a = 30
# func()
# print(a)



#  nonlocal 在局部, 引入上一层名称空间中的名字. 如果上一层没有, 继续上一层 .....


# def outer():
#     a = 10
#     def inner():
#         nonlocal a
#         a = 20
#         print(a)
#     print(a)  # 10
#     inner()   # 20
#     print(a)  # 20
# outer()


a = 1
def fun_1():
    a = 2
    def fun_2():
        nonlocal 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)

# 1234331
原文地址:https://www.cnblogs.com/VastTry/p/9878972.html