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:\Users\Administrator\PycharmProjects\python5期\a'
start_path2=r'C:\Users\Administrator\PycharmProjects\python5期\a\b'
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.转换后的字典是无序的
posted @ 2017-06-19 16:46  lazy宇  阅读(265)  评论(0编辑  收藏  举报