python学习 da4

一、装饰器

##装饰器:
#定义:本质是函数,(装饰其他函数),就是为其他函数添加附加功能
#原则:1.不能修改被装饰的函数的源代码
# 2.不能修改被装饰的函数的调用方式
# 装饰器对被装饰函数来说,是完全透明的。装饰函数不知道装饰器的存在。
###实现装饰器知识储备
#1.函数即“变量”
#2.高阶函数
#3.嵌套函数
#高阶函数+嵌套函数---》装饰器
import time
def timmer(func):
def warpper(*args,**kwargs):
start_time = time.time()
func()
stop_time = time.time()
print('the func run time is {a}'.format(a=stop_time-start_time))
return warpper

@timmer
def test1():
time.sleep(3)
print('in the test1')



import time

def timer(func):
def deco(*args,**kwargs):
start_time = time.time()
# print(func)
func(*args,**kwargs) #run test1
stop_time = time.time()
print('the func time is {a}'.format(a=stop_time-start_time))
return deco

@timer # 等价于test1 = timer(test1) (相当于把原来的test1给偷梁换柱为我们的timer(test1)了)
def test1():
time.sleep(1)
print('in the test1')
@timer #test2 = timer(test2) = deco test2(name) = deco(name)
def test2(name,age,):
print('test2:',name,age)

test1()
##(相当于把原来的test1给偷梁换柱为我们的timer(test1)了)
##思考1.要想达到装饰函数效果:即不改变调用方式,不改变函数源代码,增加函数功能,那么
##思路必然是搞一个新的函数,并且把函数地址赋给test1,即完成test1函数的偷梁换柱。
test2('alex',22) ##2.目的是增加函数功能,那么前提是保证原来函数功能,所以就要把test1函数地址作为实参
##传递给装饰函数,并且在装饰函数中执行test1. 此外,就是在装饰函数中实现附加功能。
#####最后,要返回嵌套内函数的地址,(外函数只是个形式,起到传参作用),赋给test1,保证被
#####偷梁换柱后的test1,具有原功能和附加功能。
二、迭代器
# 我们已经知道,可以直接作用于for循环的数据类型有以下几种:
# 一类是集合数据类型,如list、tuple、dict、set、str等;
# 一类是generator,包括生成器和带yield的generator function。
# 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
# 可以使用isinstance()判断一个对象是否是Iterable对象:


#*可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
#可以使用isinstance()判断一个对象是否是Iterator对象:

#生成器都是迭代器Iterator,但list、dict、str虽然是Iterable,却不是迭代器Iterator。
#把list、dict、str等Iterable变成Iterator可以使用iter()函数:

#range(10)是个迭代器
#for line in f 也是迭代器
from collections import Iterable
from collections import Iterator
print(isinstance([],Iterable))
print(isinstance([],Iterator))

a = [1,2,3]
b = iter(a)
print(b.__next__())
三、生成器
import time
def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield

print("包子[%s]来了,被[%s]吃了!" %(baozi,name))

# c = consumer('llw') #产生一个生成器,不会执行consumer里面语句
# c.__next__() #只是调用yield
# b1 = '韭菜馅'
# c.send(b1) #调用yield,并给yield传值

def producer(name):
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("老子开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了2个包子!")
c.send(i)
c2.send(i)

producer("alex")
四、匿名函数
#匿名函数:函数即变量。没有名字,就没有门牌号,就会被回收。
# (变量和函数均有内存回收机制,当没有门牌号时,内存回收)

# calc = lambda x:x*3
# print(calc(3))
#
#
# def sayhi(n):
# print(n)
# sayhi(3)
#
# calc = (lambda n:print(n)) ##只能把简单函数搞成匿名函数
# calc(5)
#
# calc = lambda n:3 if n<4 else n ##三元组
五、内置方法
 
#匿名函数:函数即变量。没有名字,就没有门牌号,就会被回收。
# (变量和函数均有内存回收机制,当没有门牌号时,内存回收)

# calc = lambda x:x*3
# print(calc(3))
#
#
# def sayhi(n):
# print(n)
# sayhi(3)
#
# calc = (lambda n:print(n)) ##只能把简单函数搞成匿名函数
# calc(5)
#
# calc = lambda n:3 if n<4 else n ##三元组
 
 





猜你喜欢

转载自www.cnblogs.com/llw-/p/10820173.html
da