python笔记---day4
装饰器
装饰器:本质是函数
功能:装饰其他函数,就是为其他函数添加附加功能
高阶函数+嵌套函数=装饰器
原则:
1,不能修改被装饰的函数的源代码
2,不能修改被装饰的函数的调用方式
import sys, time def timer(fucnc): #timer(fucnc)相当于 执行timer(jindutiao) def deco(): start_time = time.time() fucnc() stop_time = time.time() print("The jindutiao run time is %s" % (stop_time - start_time)) return deco #装饰器要写在被装饰函数的前面
@timer def jindutiao(): for i in range(50): if i < 49: sys.stdout.write('#') sys.stdout.flush() else: sys.stdout.write("# [OK]\n") time.sleep(0.2) jindutiao() # 为jindutiao 这个函数增加一个计算时间的功能,但是没有改变jindutiao()函数的源代码和调用方式。
提升版:
增加传入非固定参数
import time def timer(func): def count(*args,**kwargs): start_time=time.time() func(*args,**kwargs) stop_time=time.time() print("This function runs for %s seconds"%(stop_time-start_time)) return count @timer def login(name): print("Wlcome %s login..."%name) time.sleep(2) print("this a Brave New World")
@timer def print_info(name,age,home): info=""" 姓名:%s 年龄:%s 籍贯:%s """%(name,age,home) time.sleep(1) print(info) login("zhangyong") #给login这个函数增加计算时间的功能 print_info('zhangyong',18,'guangdong') #增加计算时间的功能
列表生成式
列表生成式:会将所有的结果全部计算出来,把结果存放到内存中,如果列表中数据比较多,就会占用过多的内存空间,可能会导致MemoryError内存错误或者导致程序在运行时出现卡顿的情况。
普通的列表生成方式:
>>> numbers=[] >>> for i in range(1,11): numbers.append(i) >>> numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
使用列表生成式生成:
>>> numbers=[i for i in range(1,11)]
>>> numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] #效果普通的一样,但是高大上很多,一条代码搞定。
列表生成式的其他用法:
#生成偶数
>>> numbers=[i*2 for i in range(1,10)] >>> numbers [2, 4, 6, 8, 10, 12, 14, 16, 18]
#查找字符
list=['zhangyong','liudehua','zhangxueyou','zhoujielun']
>>> [i for i in list if 'zhang' in i] #查找名字带有zhang的人
['zhangyong', 'zhangxueyou']
#双层for循环
>>> [x*y for x in range(1,10) for y in range(1,10)]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]
生成器
列表生成器:会创建一个列表生成器对象,不会一次性的把所有结果都计算出来,如果需要获取数据,可以使用next()函数来获取,但是需要注意,一旦next()函数获取不到数据,会导致出现StopIteration异常错误,可以使用for循环遍历列表生成器,获取所有数据
需要视情况而定,如果数据量比较大,推荐使用生成器
- 要调用生成器产生新的元素,有两种方式:
- 调用内置的next()方法
- 使用循环对生成器对象进行遍历(推荐)
- 调用生成器对象的send()方法
#把[] 换成() 就是生成器
list=(x*y for x in range(1,10) for y in range(1,10))
>>> print(list) <generator object <genexpr> at 0x03AB7EB0> #生成器其实一个未调用的函数 >>> next(list) #调用方法 用next() 1 >>> next(list) 2 >>> next(list) 3 >>> for i in list: #推荐用for 循环 print (i)