装饰器
定义 : 本质就是函数,功能 :(装饰其他函数),就是为其他函数添加的附加功能。
原则 :
1、不能修改被装饰的函数的源代码
2、不能修改被装饰的函数的调用方式
总结 : 装饰器对被装饰的函数是完全透明的,感知不到装饰器存在,因为没有修改源函数,该怎么运行还在运行。
实现装饰器的知识 :
1、函数 即 "变量"
2、高阶函数
a : 把一个函数名当做实参传给另一个函数。(在不修改被装饰函数源代码的清空下为其添加功能)

b : 返回值中包含函数名(不修改函数的调用方式)

3、嵌套函数
高阶函数+嵌套函数=> 装饰器



import time
def timer(func):
print ("in the timer")
def deco():
func()
print ("in the deco ")
time.sleep(2)
print ("装饰器完成..")
return deco
#@timer()
def test1():
a ="123"
print ("in the test1")
#test1 = timer(test1) #两种方式,一种是赋值,一种是用@来
test1()
高级装饰器,对传入参数加上非固定参数

装饰器总结:高级函数 (例如timer(func) ) + 嵌套函数(例如 wrapper() func return wrapper)
当需要传参数的处理的时候,一定不能修改原代码,要修改装饰器代码进行传参或多层return,同时装饰器可以接受传参。
列表生成式
作用 : 使代表更加简洁
原理 : 使用 列表生成器的时候会加载全部元素会占用大量内存,使用生成器的时候每次只循环出1个元素。
生成器只有在调用的时候猜会生成相应的数据,若假设直接用生成器调用 c[100]则会提示报错,因为还未循环并位生成这个元素。
使用 : 只有一个__next__()方法

生成器
函数中每次使用yield产生一个值,函数就返回该值,然后停止执行,等待被激活,被激活后继续在原来的位置执行。
send可以传参数
生产者与消费者
import time
def consumer(name):
print ("%s准备吃包子!"%name)
while True:
baozi = yield
print ("包子 [%s] 来了,被[%s]吃了"%(baozi,name))
def producer():
c1 = consumer("a")
c2 = consumer("b")
c1.__next__()
c2.__next__()
print ("开始准备包子啦 !!")
for i in range(10):
time.sleep(1)
print ("做了一个包子!")
c1.send(i)
c2.send(i)
producer()
a准备吃包子!
b准备吃包子!
开始准备包子啦 !!
做了一个包子!
包子 [0] 来了,被[a]吃了
包子 [0] 来了,被[b]吃了
做了一个包子!
包子 [1] 来了,被[a]吃了
包子 [1] 来了,被[b]吃了
做了一个包子!
包子 [2] 来了,被[a]吃了
包子 [2] 来了,被[b]吃了
做了一个包子!
包子 [3] 来了,被[a]吃了
包子 [3] 来了,被[b]吃了
迭代器
isinstance内置函数可以判断类型
例如
isinstance(10,Iterator)
False
通过Iterator可以把list dict str变成迭代器,编程迭代器后有next方法
f = Iterator([1,2,3])
总结 :
1、凡是可用于for循环的对象都是Iterable类型
2、凡是有next()方法的都是迭代器
python2 range(10)产生的是list [0,1,2,3,4,5..]
python3 range(10)产生的是迭代器 (0,10)
python3 打开文件 for line in f 其实就是个迭代器
内置方法
all() #只要有一个是False则返回False
print (all([0,"None"])) #False
any() #只要有一个是True则返回True
print (any([0,"None"])) #True
bin() #将数字转换成二进制
print (bin(8)) #0b100
chr()和ord()
chr负责将给定的数字转换成ascii 字符 #chr('98') a==> 'a '
ord负责将给定的字符转换成ascii对应的数字位置
dir() #看有什么方法
例如
a={}
dir(a)
匿名函数 #适用于三元运算,不适合复杂方法、
calc = lambda n:3 if n<4 else n
(lambda n:print(n))(5)
calc = lambda n:print(n)
calc(5)
filter() #输出想要的东西
res = filter(lambda n:n>5,range(10))
for i in res:
print (i)
map() #
将给的值依次传入func中再返回
def test(x):
x = x*2
return x
res = map(test,range(10))
for i in res:
print (i)
或
res = map(lambda n:n*2,range(10))
for i in res:
print (i)
0
2
4
6
8
10
12
14
16
18
hash()
hash("str")
可以hash成一个数组,对数组进行排序,排序后可以方便用二分法来查找
round()
round(1.222,2) #保留两位小叔
1.22
round(1.22) #保留1位
1
sotred() #排序
a = [12,2,3,5,4]
a = sorted(a)
a= [2,3,4,5,12]
a = {6:2,8:0,-5:7,4:22}
sorted(a.items(),key=lambad x:x[1]) #按照value进行排序
Json & pickle 数据序列化
import json
序列化写入文件
info = {"name":"zouyi","age"=20}
f = open("text.txt","w")
f.write(json.dumps(info))
反序列化
f = open("text.txt","r")
data = f.read()
data = json.load(data)
pickle用于处理复杂的,跟json用法一样
pickle用二进制写入wb读用rb
代码书写规范

1、在pycharm中可以new --> python_package
2、print (__file__) #可以打印相对路径
import os
print (os.paht.abspath(__file__)) #可以返回绝对路径
os.path.dirname(os.path.abspath(__file__)) #返回文件的目录名
