• day 19 yeild的表达式 面向过程 内置函数


    def init(func):
         def wrapper(*args,**kwargs):
             g=func(*args,**kwargs)
             next(g)
             return g
         return wrapper
     @init #foo=init(foo)
     def foo():
         print('starting')
         while True:
             x=yield None#return 1
             print('value :   ',x)
     g=foo() #wrapper()
     g.send(2)
    send 的效果:
         1:先从为暂停位置的那个yield传一个值,然后yield会把值赋值x
         2:与next的功能一样
    范例:
    def init(func):
        def wrapper(*args,**kwargs):
            g=func(*args,**kwargs)
            next(g)
            return g
        return wrapper #初始化函数
    @init
    def eater(name):
        print('%s ready to eat' %name)
        food_list=[]
        while True:
            food=yield food_list#return None
            food_list.append(food)
            print('%s start to eat %s' %(name,food))
     
    # e=eater('alex')
    # print(e.send('狗屎'))
    # print(e.send('猫屎'))
    # print(e.send('alex屎'))
     
    # def make_shit(people,n):
    #     for i in range(n):
    #         people.send('shit%s' %i)
    #
    # e=eater('alex')
    # make_shit(e,5)
     
    面向过程: 
              优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
        缺点:没有面向对象易维护、易复用、易扩展
    主要的应用场景 模仿:grep -rl 'root' /etc
    import os
    def init(func):
        def wrapper(*args,**kwargs):
            g=func(*args,**kwargs)
            next(g)
            return g
        return wrapper
    #阶段一:递归地找文件的绝对路径,把路径发给阶段二
    @init
    def search(target):
        'search file abspath'
        while True:
            start_path=yield
            g = os.walk(start_path)
            for par_dir, _, files in g:
                # print(par_dir,files)
                for file in files:
                    file_path = r'%s\%s' % (par_dir, file)
                    target.send(file_path)
    #阶段二:收到文件路径,打开文件获取获取对象,把文件对象发给阶段三
    @init
    def opener(target):
        'get file obj: f=open(filepath)'
        while True:
            file_path=yield
            with open(file_path,encoding='utf-8') as f:
                target.send((file_path,f))
     
    #阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
    @init
    def cat(target):
        'read file'
        while True:
            filepath,f=yield
            for line in f:
                res=target.send((filepath,line))
                if res:
                    break
     
    #阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
    @init
    def grep(target,pattern):
        'grep function'
        tag=False
        while True:
            filepath,line=yield tag #target.send((filepath,line))
            tag=False
            if pattern in line:
                target.send(filepath)
                tag=True
    #阶段五:收到文件名,打印结果
    @init
    def printer():
        'print function'
        while True:
            filename=yield
            print(filename)
     
    start_path1=r'C:UsersAdministratorPycharmProjectspython5期a'
    start_path2=r'C:UsersAdministratorPycharmProjectspython5期a'
    g=search(opener(cat(grep(printer(),'root'))))
     
    print(g)
    # g.send(start_path1)
    g.send(start_path2)
     
    内置函数
     
    1.取绝对值的内置函数: abs
     
      print(bas(-9)) #-9的绝对值会被打印出来
    2. 处理可迭代对象的函数(一):all
      name = ("Tom","Jack","Lily")
      print(all(name)) #因name这个变量定义的可迭代对象是一个正确的列表
      所以实print执行会返回Truse,只有可迭代对象全为真,
      返回结果才为True.
    3.处理可迭代对象函数(二):any
      name = ("Tom","Jack","Lily",[]) #这本身并不是一个列表
      print(any(name)) #返回结果会是True,因为any函数对对象处理是或的关系
      只有列表中的元素全为假,返回值才为假
     
    4.将十进制转换成二进制的函数 bin()
      num = 10
      print(bin(num) #0b1010 0b意为转换的是二进制形式
     
    5.将十进制转换成八进制的函数 oct()
      print(oct(10)) #这是一种简写形式,直接转换,o012
     
    6.将十进制转换成十六进制的函数:hex()
      print(hex(19)) #19转换成十六进制形式打印
     
    7.对结果进行判断的函数 bool()
      print(bool(2>3)) #返回False,可以在函数体中加入bool
     
    8.将字符类型转换成十六进制位的字节码后并打印
      print(bytes("jiahb",encoding="utf-8")) #在转换的最后加上编码类型,gbk utf-8
     
    9.将十六进进制字节码转换成字符串(或汉字),反编译
      print(str(bytes("jiahb",encoding="utf-8"))) #最后打印出的依然是alex,反编译了。
     
    10.判断函数是否可以被调用 callable
      def f1():
      pass
      f2=(121)
     
      print(callable(f1)) #判断一个是函数是否可以被调用,其实就是判断一个函数是否是完整的
     
    11.将数字转换成ASSIC码表中对应的值 chr
      print(chr(1)) #还有ASSIC码表中可能对应了一个空的值,即没有返回值。
     
    12.将字符串编译成python代码 complile()
      name = "jiab"
      b = compile(name,'','','exec')
      exec(b) #使用compile模块下的exec方法对name这个变量定义的字符串进 行编译,编译结果是没有返回值的
     
      print(eval("8*8")) #打印8*8的计算结果,但是有返回值
      print(exec("8*8")) #没有返回值,只会打印下None
     
    13.快速查看模块提供了哪些功能 dir()
      a. print(dir(compile)) #查看compile这个内置函数的基本功能
      也可以查看导入模块的基本功能信息
      b.import json
      print(dir(json)) #查看json模块的基本功能
     
    14.求两个数的商和余数 divmod()
      num = divmod(12,8)
      print(divmod)
      print(num[0]) #取商
      print(num[1]) #取余数
     
    15.判断对象是否是某个类的实例 isinstance
      name = "jiahb"
      print(isinstance(s,str)) #创建的对象"jiahb"是否是str这个类的实例,是则True,不是则False.
     
    16.查看创建变量的内存地址 id()
      name = "jiahb"
      print(id(name)) #返回一串数字,即内存的地址
     
    17.将创建的对象转换成浮点型 float()
      name = "12"
      print(float(name)) #转换成12.0
     
    18. 将对象转换成hash值 hash()
      name = "jiahb"
      print(hash(name)) #求定义的变量的一个哈希值,并将其当作key进行存储(这点儿没太明白)
     
    19.创建一个迭代器 iter() 后续再加
     
    20.查看python创建变量的字符串的长度,也可以按字节查看 len()
      python3默认是按字符查看,pyhon2.7只能按字节查看
      name = "jiahb"
      print(len(name))
     
     python3.0按字节查看
      b = bytes(name,encoding='utf-8')
      print(len(b)) #将转换成的字节数打印出来
     
    21.对多个数字进行求和运算 sum()
      print(sum(11,22,33,44)) #多个数字累加求和
     
    22.求若干数字中最大最小值 max() min()
      print(max(11,22,33,44))
      print(min(11,22,33,44))
     
    23.求某个数的指数 pow()
     print(pow(2,10)) #2**10会打印
     
    24.面向对象中会用到的内置函数 repr()
     
    25.求序列的反转 reverse()
      注:reverse这个反转函数只能处理列表,不能处理元组
      num = [11,22,33,44]
      num.reverse()
      print(num)
     
    26.把一个字母转换成数字 ord()
     print(ord("a")
     
    27.求四舍五入的数 round()
     print(round(float(1.9)) #返回2
     
    28.slice 切片功能 python3.0新加功能
     
    29.pythnon中json模块 dumps的使用
     
      <a>.json.dumps()的作用是把字典类型转换成字符串
     
      例:#!/usr/bin/env python
     
      dic = '{"name":"tom","hometown":"china","age":"20"}'
     
      print type(dic),dic
     
      str = json.dumps(dic)
     
      print type(str),str #将原字典转换成字典并打印在前面
     
      <b>python中json模块 loads方法的使用
     
      a.json.loads() 的方法是 把字符串类型的变量转换成字典类型
     
      例:#!/usr/bin/evn python
     
      import json
     
      str = '{"Name":"tom","Hometown":"china","Age"}'
     
      print type(str),str
     
      dic = json.loads(str)
     
      print type(dic),dic #将str类型转换成字典类型并在前面打印出来
     
      总结:
      1.json.dumps() 方法是把python的对象类型(字典)转换成字符串
      2.json.loads() 方法是把单引号下的字符串转换成python的对象类型(字典)
      3.转换后的字典是无序的
  • 相关阅读:
    单片机模块化程序: 来看看加入环形队列的串口发送数据
    单片机模块化程序: 丢给你个环形队列玩玩
    单片机模块化程序: 你是否还是个小学生时代的串口发送数据
    单片机模块化程序: 关于串口接收处理数据
    单片机模块化程序: 看看是不是你想要的按键处理
    单片机模块化程序: 来看下我的程序架子吧
    ESA2GJK1DH1K升级篇: 升级STM32 预热: 单片机每隔一定时间 使用 http 获取天气
    ESA2GJK1DH1K升级篇: 升级STM32 预热: 单片机定时 使用 http 获取云端文本文件里面的内容,然后显示在液晶屏
    ESA2GJK1DH1K升级篇: 远程升级准备工作: 使用TCP客户端连接Web服务器实现http下载数据
    ESA2GJK1DH1K升级篇: 远程升级准备工作: 安装Web服务器
  • 原文地址:https://www.cnblogs.com/lizhaoyu/p/7049433.html
Copyright © 2020-2023  润新知