Day 10 函数的进阶

1. 函数的动态参数
    1. *args 位置参数动态传参
  2. **kwargs 关键字参数动态传参
  顺序:位置参数, *args, 默认值, **kwargs

# by luffycity.com
# def chi(good_food, no_good_food, drink, xx, xxx,ice_cream):
#     print(good_food, no_good_food, no_good_food, drink, ice_cream)
#
# chi("盖浇饭","馒头","腊肠", "橙汁","哈根达斯")
#  顺序: 位置参数=>*args(arguments) => 默认值参数
# * 在这里表示接收位置参数的动态传参, 接收到的是元组
# def chi(name,*food, location="北京"): # 参数名是food  *表示动态传参
#     print(location)
#     print(name+"要吃", food)
#
# chi("刘旺鑫","狗不理","大麻花","天津")
# # chi("刘旺鑫","大米饭","小米饭")
# # chi("刘旺鑫","馒头")

def func(*args, **kwargs):
  pass

  形参的位置*,**: 聚合
  实参的位置*,**: 打散

顺序
  位置参数, *args, 默认值参数, **kwargs
  随以上参数可以意搭配使用

 1. 实参:
   位置参数
   关键字参数
   混合参数(位置, 关键字)
 2. 形参:
   位置参数
   默认值参数
 动态传参:
  *args: 位置参数动态传参
  **kwargs: 关键字参数动态传参
顺序: 位置, *args, 默认值, **kwargs
  def fun(a, *args, c="哈哈", **kwargs):
    print(a, args, c, kwargs)

  fun(1, 2, 3, 4,5, 6)

# 单行注释
  '''多行注释'''
  函数注释
def func(a, b):
  """
x这个函数是用来计算a和b的和
  :param a: 第一个数据
  :param b: 第二个数据
  :return: 返回的是两个数的和
  """
  return a + b

   print(func.__doc__) # document文档x

 

# 接收所有参数
# def func(*args, **kwargs):# 无敌 *args相当于一个聚合的作用
print(args, kwargs)
#
# func(1,2,3,4,5,a=6,b=7,c=9)

 

# 形参: 聚合
# def func(*food): # 聚合, 位置参数
# print(food)
# lst = ["鸡蛋","煎饼果子","猪蹄","滋滋冒油"]
# # 实参: 打散
# func(*lst) # 打散. 把list, tuple, set, str 进行迭代打散

 

# 聚合成关键字参数
# def func(**kwargs):
# print(kwargs)
#
# dic = {"name":'alex', 'age':'18'}
# func(**dic) # 打散成关键字参数

# a = 10 # 全局名称空间中的内容
#
# def fn(): # fn也在全局名称空间
#     b = 20 # 局部名称空间
#     print(a)
# def gn():
#     print(a)
# fn()
# gn()
# 1. 内置, 2. 全局 , 3. 局部(函数调用)
# 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()

----------------------------------------------------------------------------------------------------------------------------------------------------

2. 命名空间
  1. 内置名称空间
  2. 全局名称空间
  3. 局部名称空间

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

 

作用域:
 1. 全局作用域: 内置+全局
 2. 局部作用域: 局部(函数被调用)
  globals() 查看全局中的内容
  locals() 查看当前作用域中的内容
3. 函数嵌套
  函数可以互相的嵌套
4. global和nonlocal关键
  global: 在局部访问全局中的内容
  nonlocal: 在局部寻找外层函数中离他最近的那个变量

 

# func()
# print(a)
# a = 10
# def outer():
#
#     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)

 

posted @ 2018-08-09 15:32  一只待宰的程序猿  阅读(146)  评论(0编辑  收藏  举报