学习笔记2019
一,python中的变量引用计数
python中,相同数据的赋值,会共享同一片空间地址,而非占用一个新的地址单元。可以用sys模块下的getrefcount()函数查看变量
二,python中的深浅拷贝
list_1 = [1, 2, 3, ['a', 'b'] ]
# 引用
list_2 = list_1 # 因为list是可变对象,所以list_2和list_1指向同一片空间,只是引用
# 浅拷贝
list_2 = list_1[:] # 利用切片,但这里只是浅拷贝,即list_1中嵌套的list改变,list_2也会改变,例如list_1[3][0] = 'c' 则list_2也会变成[1, 2, 3, ['c', b']]
# 深拷贝
import copy
list_2 = copy.deepcopy(list_1)
三,python中的字典dict:利用Hash,关键是key值
{key: value}
- 其中key值会进行hash运算,生成hash表,所以字典的访问效率高于普通的序列数据类型,如列表,元组。
- key值由于需要通过hash,所以 可变数据类型不能作为key值
- 访问字典: dict.keys(), dict.values()
- 用 in 和 not in 来判断字典中有没有某个key值
- 利用pop函数删除:pop函数不仅能删除,还会将这key对应的value值返回
mydict = {1: 'a', 2: 'b'}
value = mydict.pop(1)
# my_dict = {2:'b'}, value = 'a'.
四,python中集合(去重):可变集合set,不可变集合frozenset。集合中的值也是无序的
- 增加 set.add(): 把可hash数据类型添加到集合中,维持原样
- 更新 set.update(): 传入序列的话,序列会被拆分成单个元素。此时可以传入list。
- 删除 set.remove()
- 集合的基本操作:交 &, 并 |, 差补 - ,超集 >,子集 <, 对称差分 ^
五,闭包closure
内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包。一个闭包就是你调用了外部函数,外部函数返回内部函数,此时的内部函数就叫做闭包。
其实闭包就是通过内部函数调用外部函数的变量,在内部函数中保存了该变量,只要内部函数还在,该变量就还在。
闭包私有化了变量,原来需要类对象完成的工作,闭包也可以完成
六,装饰器decorator :装饰器就是闭包函数调用外部函数中的函数参数
在函数运行时增加功能且能不影响这个函数原有内容,还可以进行函数执行后的清理工作,分为4种
1,装饰器函数和被装饰函数都不带参数
def func1(func):
def add_func():
print('这是我要添加的功能')
return func() # 这是函数调用,即调用函数执行
return add_fun # 这是函数名
@func1 # 装饰器做的事情就是func1(func2).即func1为外部函数,func2为内部函数
def func2():
print('hello world')
fun2()
# 输出为:
这是我要添加的功能
hello world
2,被装饰器函数带参数
对于如果要装饰带参数的函数,一定记住内部函数(即上文中的add_func()要和func()函数参数一致。add_func()会调用func()中的参数。
def func1(func):
def func2(a, b):
print(a, b)
return func(a, b)
return func2
@func1
def func(x, y):
print(x + y)
func(10, 20)
# 结果为:
# 10, 20
# 30
#如果在func2函数print(a, b)前加一句:a = 1, b =2, 则输出为
# 1, 2
# 3
3,装饰器函数带参数
一定明确,装饰器函数只能接受一个函数作为参数,所以,如果想让装饰器带参数,我们必须在装饰器函数外层再定义一个参数接受函数
def arg_func(arg): # 这个就是装饰器函数外层的参数接受函数
def decorator_func(func): # 这个就是装饰器函数,参数func为被装饰函数
def inner_func(): # 这个就是闭包函数,用来扩展被装饰函数,如果被装饰函数带参数,闭包函数必须和其参数一致。一般可以用(*args, **kw)
if arg == 1:
print('hello world')
else:
print('goodbye')
# 以上就是给被装饰函数添加的功能
return func() # 一定记住,闭包函数返回的是被装饰函数的调用
return inner_func # 装饰器函数返回的是闭包函数名
return decorator_func # 参数接受函数返回的是装饰器函数名
@ arg_func(1)
def func():
print('hello world')
func()
# 结果为:
# hello world # 这是装饰器函数添加的功能
# hello world # 这是被装饰函数自己的功能
4,多个装饰器装饰一个函数
最核心的是:
- 装饰器只装饰被装饰函数,不装饰装饰器函数
- 函数定义阶段,自内向外
- 函数执行阶段,由外面向内
link
七,Python中的作用域
在python中,只有变量在Module(模块), Class(类),def(函数)中定义的时候,才有作用域的概念。主要有四种:
5. Local 局部作用域
6. Enclosing 嵌套作用域
7. Global 全局作用域
8. Built-in 内置作用域
注意的几个点: