• Day_04 装饰器_迭代器_生成器_内置方法_Json & pickle 数据序列化


    装饰器
     
    定义 : 本质就是函数,功能 :(装饰其他函数),就是为其他函数添加的附加功能。
     
    原则 :
    1、不能修改被装饰的函数的源代码
    2、不能修改被装饰的函数的调用方式
    总结 : 装饰器对被装饰的函数是完全透明的,感知不到装饰器存在,因为没有修改源函数,该怎么运行还在运行。
     
    实现装饰器的知识
    1、函数 即 "变量"
    2、高阶函数
         a : 把一个函数名当做实参传给另一个函数。(在不修改被装饰函数源代码的清空下为其添加功能)
         b : 返回值中包含函数名(不修改函数的调用方式)
    3、嵌套函数
     
    高阶函数+嵌套函数=> 装饰器
     
     
    import time
     
    def timer(func):
        print ("in the timer")
        def deco():
            func()
            print ("in the deco ")
            time.sleep(2)
            print ("装饰器完成..")
        return deco
     
    #@timer()
    def test1():
        a ="123"
        print ("in the test1")
     
    #test1 = timer(test1)          #两种方式,一种是赋值,一种是用@来
    test1()

     
    高级装饰器,对传入参数加上非固定参数
     
    装饰器总结:高级函数 (例如timer(func) ) + 嵌套函数(例如 wrapper() func return wrapper)  
    当需要传参数的处理的时候,一定不能修改原代码,要修改装饰器代码进行传参或多层return,同时装饰器可以接受传参。
     
     
     
     
    列表生成式
     
    作用 : 使代表更加简洁
    原理 :  使用 列表生成器的时候会加载全部元素会占用大量内存,使用生成器的时候每次只循环出1个元素。
    生成器只有在调用的时候猜会生成相应的数据,若假设直接用生成器调用 c[100]则会提示报错,因为还未循环并位生成这个元素。
    使用 :  只有一个__next__()方法
     
     
     
     
     
    生成器
    函数中每次使用yield产生一个值,函数就返回该值,然后停止执行,等待被激活,被激活后继续在原来的位置执行。
    send可以传参数
     
     
     
    生产者与消费者
     
    import time
     
    def consumer(name):
        print ("%s准备吃包子!"%name)
        while True:
            baozi = yield
            print ("包子 [%s] 来了,被[%s]吃了"%(baozi,name))
     
    def producer():
        c1 = consumer("a")
        c2 = consumer("b")
        c1.__next__()
        c2.__next__()
        print ("开始准备包子啦 !!")
        for i in range(10):
            time.sleep(1)
            print ("做了一个包子!")
            c1.send(i)
            c2.send(i)
     
    producer()
     
    a准备吃包子!
    b准备吃包子!
    开始准备包子啦 !!
    做了一个包子!
    包子 [0] 来了,被[a]吃了
    包子 [0] 来了,被[b]吃了
    做了一个包子!
    包子 [1] 来了,被[a]吃了
    包子 [1] 来了,被[b]吃了
    做了一个包子!
    包子 [2] 来了,被[a]吃了
    包子 [2] 来了,被[b]吃了
    做了一个包子!
    包子 [3] 来了,被[a]吃了
    包子 [3] 来了,被[b]吃了
     
     
     
    迭代器
    isinstance内置函数可以判断类型
     
    例如
    isinstance(10,Iterator)
    False
     
    通过Iterator可以把list dict str变成迭代器,编程迭代器后有next方法
    f = Iterator([1,2,3])
     
    总结 :
    1、凡是可用于for循环的对象都是Iterable类型
    2、凡是有next()方法的都是迭代器
     
    python2 range(10)产生的是list [0,1,2,3,4,5..]
    python3 range(10)产生的是迭代器 (0,10)
     
    python3 打开文件 for line in f 其实就是个迭代器
     
     
     
    内置方法
    all()  #只要有一个是False则返回False
    print (all([0,"None"]))   #False
     
    any()  #只要有一个是True则返回True
    print (any([0,"None"]))   #True
     
    bin() #将数字转换成二进制
    print (bin(8))  #0b100
     
    chr()和ord()
    chr负责将给定的数字转换成ascii 字符    #chr('98') a==> 'a '
    ord负责将给定的字符转换成ascii对应的数字位置
     
    dir() #看有什么方法
    例如
    a={}
    dir(a)
     
    匿名函数 #适用于三元运算,不适合复杂方法、
    calc = lambda n:3 if n<4 else n
    (lambda  n:print(n))(5)
    calc = lambda n:print(n)
    calc(5)
     
    filter() #输出想要的东西
    res = filter(lambda n:n>5,range(10))
    for i in res:
        print (i)
     
    map()  #
    将给的值依次传入func中再返回
    def test(x):
        x = x*2
        return  x
     
    res = map(test,range(10))
    for i in res:
        print (i)
     
     
    res = map(lambda n:n*2,range(10))
    for i in res:
        print (i)
     
    0
    2
    4
    6
    8
    10
    12
    14
    16
    18
     
    hash()
    hash("str")
    可以hash成一个数组,对数组进行排序,排序后可以方便用二分法来查找
     
    round()
    round(1.222,2) #保留两位小叔
    1.22
    round(1.22)   #保留1位
    1
     
    sotred() #排序
    a = [12,2,3,5,4]
    a = sorted(a)
    a= [2,3,4,5,12]
     
    a = {6:2,8:0,-5:7,4:22}
    sorted(a.items(),key=lambad x:x[1]) #按照value进行排序
     
     
     
     
     
    Json & pickle 数据序列化
    import json
     
    序列化写入文件
    info = {"name":"zouyi","age"=20}
    f = open("text.txt","w")
    f.write(json.dumps(info))
     
    反序列化
    f = open("text.txt","r")
    data = f.read()
    data = json.load(data)
     
     
    pickle用于处理复杂的,跟json用法一样
    pickle用二进制写入wb读用rb
     
     
     
    代码书写规范
     
    1、在pycharm中可以new --> python_package
    2、print (__file__)                #可以打印相对路径
    import os 
    print (os.paht.abspath(__file__))  #可以返回绝对路径
    os.path.dirname(os.path.abspath(__file__))  #返回文件的目录名
     
  • 相关阅读:
    转载:javaweb学习总结(八)——HttpServletResponse对象(二)
    转载:javaweb学习总结(七)——HttpServletResponse对象(一)
    转载:javaweb学习总结(六)——Servlet开发(二)
    转载:javaweb学习总结(五)——Servlet开发(一)
    转载:javaweb学习总结(四)——Http协议
    蓝桥杯 答题分数
    Saruman's Army (POJ 3069)
    Best Cow Line (POJ 3217)
    区间调度问题
    硬币问题
  • 原文地址:https://www.cnblogs.com/zoee/p/5783823.html
Copyright © 2020-2023  润新知