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] ") 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循环遍历列表生成器,获取所有数据

需要视情况而定,如果数据量比较大,推荐使用生成器

  1. 要调用生成器产生新的元素,有两种方式:
  2. 调用内置的next()方法
  3. 使用循环对生成器对象进行遍历(推荐)
  4. 调用生成器对象的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)
原文地址:https://www.cnblogs.com/zyos/p/10112392.html