zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    Airflow 使用 Celery 时,如何添加 Celery 配置
    什么是唯品会JIT业务
    Linux 性能优化排查工具
    HttpClient 报错 Invalid cookie header, Invalid 'expires' attribute: Thu, 01 Jan 1970 00:00:00 GMT
    如何使用 Enterprise Architect 画 UML
    通过maven profile 打包指定环境配置
    Git 使用总结
    Git 分支模型
    本地Windows环境Dubbo搭建测试
    makefile
  • 原文地址:https://www.cnblogs.com/zyos/p/10112392.html
Copyright © 2011-2022 走看看