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)
  • 相关阅读:
    Checking Types Against the Real World in TypeScript
    nexus pip proxy config
    go.rice 强大灵活的golang 静态资源嵌入包
    几个golang 静态资源嵌入包
    rpm 子包创建学习
    Rpm Creating Subpackages
    ava 类似jest snapshot 功能试用
    ava js 测试框架基本试用
    The Architectural Principles Behind Vrbo’s GraphQL Implementation
    graphql-compose graphql schema 生成工具集
  • 原文地址:https://www.cnblogs.com/zyos/p/10112392.html
Copyright © 2011-2022 走看看