Python学习笔记
函数相关
1,函数参数:args与kwargs
1)使用demo
def index(a, b):
print(a, b)
def func(*args, **kwargs):
index(*args, **kwargs)
fun(1, 2)
2)个人总结
函数定义的时候,形参位置的 *args 表示把普通参数保存到元组, **kwargs 表示把关键字参数保存到字典
实参位置的 *args 表示把元组类型打散,**kwargs 表示把字典转换成关键字实参
如上demo:
func(1, 2) 函数调用,*args会把参数全部存到元组中,即args = [1, 2]。如果是 func(1, b='aaa') **kwargs 会把关键字参数存到字典中,即 args = [1],kwargs = {'b':'aaa'}
注意:func会把接收的参数当作实参传递给index(),所以参数会被打散成index的形参格式,要求index的形参不许有重名,并且参数打散后需要和index的形参个数保持一致
2,函数嵌套
1)函数的嵌套定义: 在函数内又定义了一个函数
定义在函数内部的内容有一个效果:函数外无法访问,只有在函数内才可以访问到
# def f1():
# def f2():
# print('from f2')
# f2()
3,函数对象
def foo(): # foo->函数的内存地址
print('from foo')
1)可以被赋值
# f = foo
2)可以当做参数传入
# def f1(func):
# print('====>f1')
# func()
# f1(foo) # f1(函数的内存地址)
3)可以当做返回值
# def f1(func):
# return func
#
# f = f1(foo)
# print(f)
4)可以当做容器类型的元素
# x = 10
# l = [x,foo,foo()]
# print(l)
# l[1]()
5)定义一个方法集合
def login():
print('登录功能'.center(50, '*'))
def register():
print("注册功能".center(50, '*'))
def transfer():
print("转账功能".center(50, '*'))
def withdraw():
print("提现功能".center(50, '*'))
func_dic = {
"1": ['登录功能', login],
"2": ['注册功能', register],
"3": ['转账功能', transfer],
"4": ['提现功能', withdraw],
}
while True:
print("0 退出")
for k in func_dic:
print(k,func_dic[k][0])
choice = input("请输入命令编号:").strip()
if choice == "0":
break
if choice in func_dic:
func_dic[choice][1]()
else:
print("输入的指令错误")
4,名称空间与作用域
# 名称空间Namespace:存放名字与内存地址绑定关系的地方
# 内置名称空间:存放python解释器自带的名字
局部Local-》外层函数Enclosing-》全局Global-》内置Builtin
# L->E->G->B
名称空间的嵌套关系是在函数定义阶段、扫描语法时就确定好的,与调用位置无关
global关键字
# l = []
# x = 100
# def foo():
# l.append(333)
# global x
# x = 200
# print(x) 200
nonlocal关键字
x = 111
def f1():
x = 222
def f2():
nonlocal x
x = 333
f2()
print('==========>f1肚子里的x: ',x) # 333
# f1()
# print(x) # 111
5,闭包函数
1)闭函数:定义在函数内部的函数
2)包函数: 内部函数引用了一个来自于外层函数的变量
3)为函数体传参的两种方案
1、直接通过参数传入即可
2、闭包函数
def outter(x):
def wrapper():
print('====>wrapper',x)
return wrapper # 不要加括号
wrapper = outter(111)