2019.2.27学习笔记

一,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}

  1. 其中key值会进行hash运算,生成hash表,所以字典的访问效率高于普通的序列数据类型,如列表,元组。
  2. key值由于需要通过hash,所以 可变数据类型不能作为key值
  3. 访问字典: dict.keys(), dict.values()
  4. 用 in 和 not in 来判断字典中有没有某个key值
  5. 利用pop函数删除:pop函数不仅能删除,还会将这key对应的value值返回
mydict = {1: 'a', 2: 'b'}
value = mydict.pop(1)
# my_dict = {2:'b'}, value = 'a'. 

四,python中集合(去重):可变集合set,不可变集合frozenset。集合中的值也是无序的

  1. 增加 set.add(): 把可hash数据类型添加到集合中,维持原样
  2. 更新 set.update(): 传入序列的话,序列会被拆分成单个元素。此时可以传入list。
  3. 删除 set.remove()
  4. 集合的基本操作:交 &, 并 |, 差补 - ,超集 >,子集 <, 对称差分 ^

五,闭包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,多个装饰器装饰一个函数

最核心的是:

  1. 装饰器只装饰被装饰函数,不装饰装饰器函数
  2. 函数定义阶段,自内向外
  3. 函数执行阶段,由外面向内
    link

七,Python中的作用域

在python中,只有变量在Module(模块), Class(类),def(函数)中定义的时候,才有作用域的概念。主要有四种:
5. Local 局部作用域
6. Enclosing 嵌套作用域
7. Global 全局作用域
8. Built-in 内置作用域
注意的几个点:

1,函数中调用全局变量 要用 global 先声明

2,闭包或者装饰器中调用外部函数的变量 要用 nonlocal先声明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值