小学生都能学会的python(函数的进阶)

小学生都能学会的python(函数的进阶)

1. 动态传参
形参:
1. 位置参数
2. 默认值参数
3. 动态传参
*args 动态接收位置参数
**kwargs 动态接收关键字参数
def func(*args, **kwargs):
在形参上用*,** 表示聚合. 实参表示打散

顺序:
位置 *args 默认值 **kwargs

# def chi(*food): # * 表示的是不定参数. 可以传递任意个信息 参数名是food, 接受到的是元组
#     print("我要吃", food)
#
# chi("一锅大米饭", "一箱辣条", "一桶方便面", "4L可乐")
# chi("方便面")
# chi("一大锅米饭", "一小锅小米饭", "一箱辣条", "一桶方便面", "4L可乐")

# * 表接收位置参数的动态传参
# 传参的顺序
# 位置 *args 默认值 **kwargs
#
# 如果默认值参数在*args前面. 如果想让默认值生效. *args将永远接不到值
# def func( a, b, *args,c = 5): # arguments参数
#     print(a, b, c, args)
#
# func(1,2,3,4,5,6,8,c = 10)

# 关键字的动态传参
# *args 位置参数 接收到的是元组
# **kwargs 关键字的动态传参, 接收到的是字典
# def func(**kwargs): # key word arguments
#     print(kwargs)
#
# func(a=10, b=20, jay="周杰伦", jj="林俊杰")

# 无敌模式. 所有的参数都能接收
# def func(*args, **kwargs):
#     print(args)
#     print(kwargs)
#
# func(1, 2, 5, jj="陶喆", jay="zhoujielun", soup="胡辣汤")

# def func(*args): # 在这里. 其实相当于把传进来的参数做了一次聚合, 聚合成一个元组
#     print(args)
#
# lst = "娃哈哈"
# func(*lst) #  在实参位置 * 表示打散, 打散的是可迭代对象


# def func(**kwargs): # ** 把接收到的关键字参数打包(聚合)成字典
#     print(kwargs) # 一定是字典
#
# dic = {"张无忌": "明教教主", "谢逊": "金毛狮王", "范瑶": "光明右使"}
#
# # func(张无忌=dic['张无忌'], 谢逊=dic['谢逊'], 范瑶=dic['范瑶'])
# func(**dic) # 这里的** 是把字典打散. 字典的key作为参数的名字, 字典的值作为参数的值传递给形参

# 在形参上
#   1. 位置参数
#   2. 默认值参数
#   3. 动态参数
#       1. *args  位置参数的动态传参. 系统会自动的把所有的位置参数聚合成元组
#       2. **kwargs  关键字的动态传参. 系统会自动把所有的关键字参数聚合成字典
#       3.  def func(*args, **kwargs): 无敌传参
#       4. 顺序:  位置参数, *args, 默认值, **kwargs
#       5. 在使用的时候, 可以任意的进行搭配
#   4. 在实参上. *, **表示的打散.  在形参. *,** 表示聚合

  

2. 作用域
名称空间:
1. 内置
2. 全局
3. 局部

作用域:
1. 全局作用域: 内置+全局
2. 局部作用域: 局部

globals() 查看全局作用域中的内容
locals() 查看当前作用域中的内容

# 最开始会开辟一个自己的命名空间- 内置名称空间
# a = 10
# print(a)
# # 直接在py文件一个层面上是全局名称空间
# def func():
#     hasakey = 10
# # 在函数内部属于局部名称空间
# func()
# 加载顺序: 内置 => 全局 => 局部
# 取值顺序: 局部 => 全局 => 内置

# a = 10 # 全局
# def func():
#     # a = 20
#     print(a)
#
# func()

# 作用域: 变量或者函数的声明周期
# 全局作用域: 全局名称空间+内置名称空间
# 局部作用域: 局部名称空间
# a = 10 # 全局
# def func():
#     liuwei = "刘伟"

# 1. globals() 查看全局作用域中的所有内容
# qiao = "乔峰"
# def 抗收音机():
#     bgm = "难念的经"
#     print("娃哈哈")
#     print(locals())
# 抗收音机()

# # print(globals()) # 查看全局作用域中的内容
# # print(locals()) # locals()查看的是当前作用域中的内容

  

3. global nonlocal
global: 在局部引入全局变量
nonlocal: 在局部, 引入离他最近的那一层的变量

 

 

关于函数的嵌套

# def func1():
#     print("我是func1")
#
# def func2():
#     print("我是func2")
#     func1()
#
# def func3():
#     func2()
#     print("我是func3")
# func3()
# 这样的代码不是嵌套. 互相调用

# 函数可以互相嵌套
# def outer():
#     def inner():
#         print("我是内部")
#     print("我是外部")
#     inner()
#
# outer()

# def outer():
#     print("我是外面的")
#     def inner_1():
#         def inner_2():
#             print("我是里面的2")
#         inner_2()
#         print("我是里面的1")
#     inner_1()
#     print("我是外面的收尾")
#
# outer()

# a = 10
# def func():
#     global a #表示在当前作用域中的使用的a是全局中的变量
#     a = 20 # 所有的a都是外面的了
#     print(a) # 现在只有看的权利
#
# print(a) # 10
# func() # 20
# print(a) # 20


# 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)

# global 引入全局变量, 可以定义全局变量
# nonlocal 引入局部中离他最近的外层变量

# def func():
#     global a # 没有也得有. 自动帮你创建
#     a = 20
#
# func()
# print(a)

  

posted @ 2018-09-18 17:50  孔辉  阅读(338)  评论(0编辑  收藏  举报