zoukankan      html  css  js  c++  java
  • 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__))  #返回文件的目录名
     
  • 相关阅读:
    .NET Interop 工具集
    关于正弦波的算法
    Windows Phone 系列 本地数据存储
    Xaml cannot create an instance of “X”
    Windows Phone 系列 使用 MVVM绑定时无法获取当前值
    Windows Phone 系列 应用程序图标无法显示
    Windows Phone 系列 WPConnect无法上网的问题
    Windows Phone 系列 使用 Windows Phone 保存铃声任务
    WP7.5提交应用
    Windows Phone 系列 动态删除ObservableCollection
  • 原文地址:https://www.cnblogs.com/zoee/p/5783823.html
Copyright © 2011-2022 走看看