python学习第十章
Posted auxiaoliu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习第十章相关的知识,希望对你有一定的参考价值。
关于问题的注意事项
nonlocal 的问题
nonlocal的变量范围问题,可以获取上层函数的变量,如果上层函数没有这个变量,那么会到上上层找,但不会到全局找.
示例如下:
def fun(): a = 1 def fun2(): a = 2 def fun3(): nonlocal a print(a) fun3() fun2() fun() """ 运行结果 不注释a=2时话是2,注释后是1 """
关于全局作用域和局部作用域的问题
示例:
def fun(): a = 1 def fun2(): a += 1 print(a) fun2() fun() """ 这里会报错的,因为如果在局部一但赋值操作,python解释器就会认为是局部变量,局部变量的话,需要先赋值 """
关于dic增加的j时dic.setdefault("key","value")
这个dic.setdefault("key","value")有增另键值对的功能 ,这里需要注意到的是,这个会有返回.返回的值是value的值.
由于setdefault这个值,当字典中存在这个key时,这次的增加是无效的,但是这个会返回现在字典中这个key的value值.如果不存在key会返回setdefault设置的value值.
示例如下:
dic = {} dic.setdefault("key","value") print(dic) """ 这个是增加字典的键值 """
关于**kwargs 这个值,不能传入**{3:4}这样的值,因为传参相当于变量,变量不能接受纯数字当变量的.
示例:
def func(**kwargs): print(kwargs) def(**{"a":2,"b":3},**{3:4})
关于函数默认赋值的深坑
def func(a,lst = []):
lst.append(a)
return lst
如下问题:
lst1 = func("10")
lst2 = func("20",[])
lst3 = func("30")
最后print(lst1,lst2,lst3)
下面是运行结果
[‘10‘, ‘30‘] [‘20‘] [‘10‘, ‘30‘]
原因是当形参传入可变值时,python解释器会分配一个对像,这个对像是不变的,当多次调这个函数时,指向的是同一个地址.所以函数默认传参应该尽量传入可hash的,也就是不可变类型的.
上面是补充,补充完毕
本节主要内容: 1. 函数名的运?, 第?类对象 2. 闭包 3. 装饰器初识
1. 函数名的运?, 第?类对象
函数名是一个变量,但它是一个特殊的变量加个()是可以执行的变量
函数名有 以下特性:
1)函数名是一个内存地址,
示例:
def fun(): print(100) print(fun)
上面的代码是打印函数的内存地址.
2)函数名可以赋值给其他变量
示例:
示例是把函数名赋值给b,然后b执行了这个函数
def fun(): print(100) b = fun b()
3)函数名可以当做容器类的元素
函数名可以当做其他容器类的无素,容器类如,列表,字典等
示例:
def fun1(): print("1") def fun2(): print("2") def fun3(): print("3") lst = [fun1,fun2,fun3] for e in lst: print(e) """ 变量名只是内存地址,循环调用的话,只是显示了内存地址 """
4.函数名可以当做函数的参数
示例:
def fun(): print("呵呵") def fun1(fn): fn() fun1(fun)
5. 函数名可以作为函数的返回值
示例:
def fun(): def inner(): print("123") return inner f = fun() f() """ 函数的返回 """
?. 闭包
以上是关于python学习第十章的主要内容,如果未能解决你的问题,请参考以下文章