day22 yield的表达式的应用,面向过程编程,内置函数前几个

Python之路,Day10 = Python基础10

 

生成器表达式: (i for i in range(10) if i > 5)
os.walk(r'文件路径')
返回一个迭代器,
  第一次next:包含一个元组,元组中有三个元素,(路径,路径包含的所有文件夹,路径包含的所有文件)
  第二次next:包含一个元组,元组中有三个元素,(上面第二个元素中的第一个路径,前面那个路径包含的所有文件夹,前面那个路径包含的所有文件)

 

1.x = yield #yield的表达式的应用,可以通过 yield 向函数中传值

 1 def yield_init(func):
 2     def wrapper(*args,**kwargs):
 3         res = func(*args,**kwargs)
 4         next(res)
 5         return res
 6     return wrapper
 7 
 8 @yield_init
 9 def eater(name):
10     baozi_l = []
11     while True:
12         food = yield baozi_l
13         baozi_l.append('包子%s'%food)
14         print('%s 吃 包子%s'%(name, food))
15 
16 
17 
18 a = eater('LiSi')
19 for i in range(1,19):
20     print(' '.join(a.send(i)))

 

2.面向过程编程: grep -rl 'root' /etc

通过 yield 以及,函数,实现上面的命令(寻找到传入的路径下及自路径下的所有文件中包含 ‘roo’ 的文件的全路径,综合yield 及函数传值)

 1 #! /usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # __author__ = "Always"
 4 # Date: 2017/6/19
 5 
 6 import os
 7 
 8 def yiled_init(func):
 9     """
10     装饰器,用来初始化 生成器(含有yield的函数),执行后立即执行next()方法。
11     :param func: 被装饰的 生成器
12     :return:
13     """
14     def wrapper(*args,**kwargs):
15         res = func(*args, **kwargs)
16         next(res)
17         return res
18     return wrapper
19 
20 @yiled_init
21 def search(target):
22     """
23     这里面用了一个 os.work() 函数,作用是递归进入所有的目录,并返回结果,结果为一个列表(当前目录,当前目录存在的所有文件夹, 当前目录存在的所有文件名)
24     :param target: 下一个函数的结果,用来将这个函数处理好的东西(文件名)传给它,进行下一步运算
25     :return:
26     """
27     while True:
28         start_path = yield
29         g = os.walk(start_path)
30         for par_dir, _, files in g:
31             for file in files:
32                 file_path = r'%s\%s'%(par_dir, file)
33                 target.send(file_path)
34 
35 @yiled_init
36 def opener(target):
37     """
38     用来打开文件
39     :param target:  下一个函数的结果,用来将这个函数处理好的东西(文件句柄)传给它,进行下一步运算
40     :return:
41     """
42     while True:
43         file_path = yield
44         with open(file_path,encoding='utf-8') as f:
45             target.send((file_path, f))
46 
47 @yiled_init
48 def cat(target):
49     """
50     读取文件内容,逐行传给下一个函数,在下一个函数中寻找是否存在需要的内容,如果不存在就下一行,如果存在则返回True,终止这个文件循环
51     :param target:  下一个函数的结果,用来将这个函数处理好的东西(文件的行)传给它,进行下一步运算
52     :return:
53     """
54     while True:
55         file_path, f = yield
56         for line in f:
57             if target.send((file_path, line)):
58                 break
59 
60 @yiled_init
61 def grep(target, pattern):
62     """
63     查找这行是否存在需要的内容,如果存在,传给下一个函数来打印,如果不存在,则忽略
64     :param target:  下一个函数的结果,用来将这个函数处理好的东西(文件全路径)传给它,进行下一步运算
65     :param pattern: 查找的关键字
66     :return:
67     """
68     tag = False
69     while True:
70         file_path, line = yield tag
71         if pattern in line:
72             target.send(file_path)
73             tag = True
74 
75 
76 @yiled_init
77 def printer():
78     """
79     将传来的内容打印出来
80     :return:
81     """
82     while True:
83         filename = yield
84         print(filename)
85 
86 
87 filepath = r'C:\Users\Administrator\PycharmProjects\老男孩全栈5期\上课笔记\day'
88 g = search(opener(cat(grep(printer(), 'root'))))
89 g.send(filepath)

 

3.内置函数
       abs()             # 返回数字的绝对值。参数可以是整数或浮点数。如果参数是复数,则返回其大小。
  all()               # 括号中加入可迭代的对象,如果该对象的所有内容为 True,则返回True。如果可迭代对象为空,为 True。
  any()             # 括号中加入可迭代的对象,如果该对象的所有内容为 True,则返回True。如果可迭代对象为空,为 True。

  bin()      # 十进制转二进制
  oct()      # 十进制转八进制
  hex()     # 十进制转十六进制

 

posted on 2017-06-19 15:02  何必从头  阅读(176)  评论(0编辑  收藏  举报

导航