第十一天-函数进阶
Posted xi1419
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十一天-函数进阶相关的知识,希望对你有一定的参考价值。
# 动态传参:
# * 表示接收所有 位置参数 的动态传参
# 传参时自动把实参打包成 元祖 给形参
1 def chi(*food): 2 print(food) 3 return food 4 5 chi() # 动态传参可以为空不传参 6 # chi("紫菜汤",food="鸡蛋汤") # * args 不可接收关键字参数 7 8 chi("鸡蛋汤","紫菜汤","疙瘩汤") 9 chi("鸡蛋汤","紫菜汤","疙瘩汤","海带炖猪肉","小鸡炖蘑菇") # 返回一个元祖 10 # (‘鸡蛋汤‘, ‘紫菜汤‘, ‘疙瘩汤‘, ‘海带炖猪肉‘, ‘小鸡炖蘑菇‘)
# ** 表示接收 关键字参数 的动态传参
# 把实参打包成 字典 传给形参
1 def chi1(**food): 2 print(food) 3 4 chi1(good_food="哈哈",junk_food="呵呵",drink="嘻嘻") # 返回一个字典 5 # {‘good_food‘: ‘哈哈‘, ‘junk_food‘: ‘呵呵‘, ‘drink‘: ‘嘻嘻‘} 6 # chi1("哈哈","呵呵","吼吼") # TypeError ** kwargs 不可接收位置参数
# 参数顺序 位置》*args》默认值》**kwargs 可以任意组合
# 无敌参数
1 # 无敌参数 2 def num(*args,**kwargs): 3 print(args,kwargs) 4 5 num(1,2,3,4,5,6,a="7",b="8",c="9") 6 # (1, 2, 3, 4, 5, 6) {‘a‘: ‘7‘, ‘b‘: ‘8‘, ‘c‘: ‘9‘}
1 lis = [1,2,3,4,5,6,7] 2 def fun(*args): # 在形参表示聚合多个 3 print(args) 4 5 fun(lis[0],lis[1],lis[2],lis[3],lis[4],lis[5],lis[6]) 6 fun(*lis) # 省去多次输入完全等同于上面 把一个 列表/字符/元祖 打散成参数传给形参 7 s = "2018年10月30日19:50:39" 8 fun(*s) # 在实参表示打散 9 10 dic = {"张无忌":"倚天屠龙记", "乔峰":"天龙八部", "郭靖":"射雕"} 11 def fun1(**kwargs): # 聚合 12 print(kwargs) 13 14 # fun1(张无忌=dic[‘张无忌‘],乔峰="天龙八部") 15 fun1(**dic) # 把字典 打散 成关键字参数 传给形参 省去上面一个个输入 16 17 # 可得出结论 *, ** : 在形参: 聚合, 实参: 打散
# 命名空间 三种:
# 定义:我们称存放名字和值的关系的空间叫做命名空间
# 内置命名空间 —— python解释器
# python解释器启动就可使用的名字 存储在内置命名空间 如:print() input() list tuple 等
# 内置的名字在解释器启动的时候被加载进内存
# 全局命令空间 —— 写的代码
# 程序从上到下被执行的过程中依次加载进内存的
# 放置了我们所色设置的变量名和函数名
# 局部命名空间 —— 函数 类, 方法, 其他模块, 对象
# 函数内部定义的名字
# 调用函数的时候 才会产生空间 随着函数执行结束清空被回收
# 在局部:可以使用全局、内置命名空间的名字
# 在全局:可以使用内置,不可使用局部
# 在内置:不可使用局部和全局的名字
1 # 在全局调用:全局命名空间->内置命名空间 2 def fun(): 3 a = 10 4 print(a) 5 6 fun() # a随函数执行完毕已清空 7 # print(a) # name ‘a‘ is not defined 全局不可使用局部 8 9 # 在局部调用:局部命名空间->全局命名空间->内置命名空间 10 a = 1 11 def func(x): 12 x = a 13 print(x) 14 15 func(10) # 打印 1 局部可调用全局 16 17 # 在内置命名空间:不可往下调用 因为运行前已经加载完成
# 内置——》全局——》局部 (依赖倒置关系:可逆不可顺)
# 加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
# 作用域:作用域就是作用范围,按照生效范围来看分:全局作用域和局部作用域
# 全局作用域:
# 包含内置命名空间和全局命名空间,在整个文件任何位置都可使用(遵循从上到下逐行执行)
# 局部作用域:在函数内部可使用.
# 作用域命名空间:
# 全局作用域: 全局命名空间+内置命名空间
# 局部作用域: 局部命名空间
# 可通过globals()函数来查看全局作用域中的内容,也可以通过locals()来查看局部作用域中的变量和函数信息
1 a = 10 2 def func(): 3 a = 40 4 b = 20 5 def abc(): 6 print("哈哈") 7 print(a,b) 8 print(globals()) # 查看全局作用域(内置+全局)内容 9 print(locals()) # 查看局部作用域(函数 模块 对象等内部)内容 10 11 func() 12 13 # 从局部找全局可以. 但是从全局找局部是不可以的
1 # 实例 2 def print(*args): # 声明函数名 print 非内置print 3 pass 4 # print(args) # maximum recursion depth exceeded 自己调用自己 递归 这里会报错 5 6 def func(): 7 print("呵呵") 8 9 func() # 无返回值 调用函数 func 但里面的print不是内置的,因此去上层找全局命名 print 自然是pass
以上是关于第十一天-函数进阶的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情