yield的表达式形式

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
print('value : ', x) g = foo() #wrapper() g.send()
结果:
starting
value :

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 #foo=init(foo)
def foo():
print('starting')
while True:
x = yield None#return
print('value : ', x)
#
g = foo() #wrapper() print(g)
next(g)
print('='*)
print(g.send())
print('='*)
print(g.send(None)) #g.send(None)等同于next(g)
结果:
starting
<generator object foo at 0x0000000002144990>
value : None
==============================
value :
None
==============================
value : None
None
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屎'))
结果:
alex ready to eat
alex start to eat 狗屎
['狗屎']
alex start to eat 猫屎
['狗屎', '猫屎']
alex start to eat alex屎
['狗屎', '猫屎', 'alex屎']
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)) def make_shit(people, n):
for i in range(n):
people.send('shit%s' % i) e = eater('alex')
make_shit(e, )
结果:
alex ready to eat
alex start to eat shit0
alex start to eat shit1
alex start to eat shit2
alex start to eat shit3
alex start to eat shit4

应用:grep -rl 'root' /etc

import os
def init(func):
def wrapper(*args, **kwargs):
g = func(*args, **kwargs)
next(g)
return g
return wrapper
#阶段一:递归地找文件的绝对路径,把路径发给阶段二
def search(target,start_path):
g = os.walk(start_path)
for par_dir, _, files in g:
for file in files:
file_path = r'%s\%s' %(par_dir, file)
target.send(file_path)
#阶段二:收到文件路径,打开文件获取获取对象,把文件对象发给阶段三
@init
def opener(target):
while True:
file_path = yield
with open(file_path, encoding='utf-8') as f:
target.send((file_path, f))
#阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
@init
def cat(target):
while True:
filepath,f = yield
for line in f:
target.send((filepath, line))
#阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
@init
def grep(target, pattern):
while True:
filepath,line = yield
if pattern in line:
target.send(filepath)
#阶段五:收到文件名,打印结果
@init
def printer():
while True:
filename = yield
print(filename) start_path = r'C:\Users\Administrator\PycharmProjects\untitled4\a'
search(opener(cat(grep(printer(), 'root'))), start_path)
结果:
C:\Users\Administrator\PycharmProjects\untitled4\a\a.txt
C:\Users\Administrator\PycharmProjects\untitled4\a\b\b2.txt
C:\Users\Administrator\PycharmProjects\untitled4\a\b\c\c.txt

进一步优化版本:

import os
def init(func):
def wrapper(*args, **kwargs):
g = func(*args, **kwargs)
next(g)
return g
return wrapper
#阶段一:递归地找文件的绝对路径,把路径发给阶段二
@init
def search(target):
while True:
start_path = yield
g = os.walk(start_path)
for par_dir,_, files in g:
for file in files:
file_path = r'%s\%s' % (par_dir, file)
target.send(file_path)
#阶段二:收到文件路径,打开文件获取获取对象,把文件对象发给阶段三
@init
def opener(target):
while True:
file_path = yield
with open(file_path, encoding='utf-8') as f:
target.send((file_path, f))
#阶段三:收到文件对象,for循环读取文件的每一行内容,把每一行内容发给阶段四
@init
def cat(target):
while True:
filepath, f = yield
for line in f:
res = target.send((filepath, line))
if res:
break
#阶段四:收到一行内容,判断root是否在这一行中,如果在,则把文件名发给阶段五
@init
def grep(target,pattern):
tag = False
while True:
filepath, line = yield tag
tag = False
if pattern in line:
target.send(filepath)
tag = True
#阶段五:收到文件名,打印结果
@init
def printer():
while True:
filename = yield
print(filename) start_path1 = r'C:\Users\Administrator\PycharmProjects\untitled4\a'
start_path2 = r'C:\Users\Administrator\PycharmProjects\untitled4\a\b'
g = search(opener(cat(grep(printer(), 'root')))) print(g)
# g.send(start_path1)
g.send(start_path2)
结果:
<generator object search at 0x0000000001E04DB0>
C:\Users\Administrator\PycharmProjects\untitled4\a\b\b2.txt
C:\Users\Administrator\PycharmProjects\untitled4\a\b\c\c.txt
<generator object search at 0x0000000001E97048>
def init(func):
def wrapper(*args, **kwargs):
g = func(*args, **kwargs)
next(g)
return g
return wrapper
@init #func=init(func)
def func():
tag = False
while True:
x = yield tag #g.send('b') #x='b'
tag = False
if 'root' in x:
print(x)
tag = True
g = func() print(g.send('a'))
print(g.send('root123'))
print(g.send('b'))
print(g.send('c'))
print(g.send('d'))
print(g.send('e'))
结果:
False
root123
True
False
False
False
False

内置函数

print(abs(-))
print(all([, , , ]))
print(all([, , , ]))
print(all([, , , None]))
print(all([, , , '']))
print(all([]))
结果: True
False
False
False
True
print(all(i for i in range(, )))
print(any(''))
print(any([, '', {}, (), ]))
结果:
True
False
True
print(bin()) #将十进制数转换为二进制数
print(oct()) #将十进制数转换为八进制
print(hex()) #将十进制数转换为十六进制
结果:
0b11
0o11
0xd
print(bool())
print(bool(None))
print(bool(''))
结果:
False
False
False
print(bytes('sss', encoding='utf-8'))
print('sss'.encode('utf-8'))
结果:
b'sss'
b'sss'
def func():
pass
print(callable(func)) #查看函数是否可以被调用
结果:
True
print(chr()) #返回对象对应的ASCII字符
print(ord('B')) #与chr相反,返回ASCII字符对应的内容
结果:
B
x = complex(-2j) #complex()是复数函数
print(x.real) #查看实部
print(x.imag) #查看虚部
结果:
1.0
-2.0

面向对象的内置函数:

classmethod

staticmethod

property

setattr

delattr

getattr

hasattr

还有:

  • int
  • dict
  • list
  • tuple
  • set
  • str
import os
#
print(dir(os)) #os.walk print(help(os)) def func():
'my function'
pass print(help(func))

补充

import time
import random
def init(func):
def wrapper(*args, **kwargs):
g = func(*args, **kwargs)
next(g)
return g
return wrapper def producer(target,count):
for i in range(count):
time.sleep(random.randrange(, ))
x = 'baozi%s' % i
print('\033[45m 厨师造好的包子: %s\033[0m' % x)
target.send(x) @init
def consumer(name):
while True:
food = yield
time.sleep(random.randrange(, ))
print('\033[46m %s start to eat %s \033[0m' % (name, food)) producer(consumer('alex'), )
结果:
厨师造好的包子: baozi0
alex start to eat baozi0
.
.
.
厨师造好的包子: baozi9
alex start to eat baozi9

下面为不用yield的版本:

import time
import random def producer(count):
res = []
for i in range(count):
res.append('baozi %s' %i)
return res def consumer(name,res):
for i in res:
print('%s start to eat %s' % (name, i)) consumer('alex',producer())
结果:
alex start to eat baozi
alex start to eat baozi
.
.
.
alex start to eat baozi
alex start to eat baozi

虽然两者都可以实现,但是用yield的程序是:厨师做好一个包子,alex吃一个包子,而不用yield的版本是:厨师做好十个包子之后alex才吃。单是此程序体现的差别,往大方面考虑,涉及内存问题,显然yield版本比较省内存,所以我们建议使用yield版本。

python--表达式形式的yield、面向过程编程、内置函数的更多相关文章

  1. Python基础(9)_生成器(yield表达式形式)、面向过程编程

    一.yield表达式形式 1 #装饰器,初始化含yield表达式的生成器 def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwa ...

  2. Python【map、reduce、filter】内置函数使用说明(转载)

    转自:http://www.blogjava.net/vagasnail/articles/301140.html?opt=admin 介绍下Python 中 map,reduce,和filter 内 ...

  3. Python【map、reduce、filter】内置函数使用说明

    题记 介绍下Python 中 map,reduce,和filter 内置函数的方法 一:map map(...) map(function, sequence[, sequence, ...]) -& ...

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

    Python之路,Day10 = Python基础10 生成器表达式: (i for i in range(10) if i > 5)os.walk(r'文件路径')返回一个迭代器, 第一次ne ...

  5. Python之路【第六篇】:Python迭代器、生成器、面向过程编程

    阅读目录 一.迭代器 1.迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 代码如下: while True: ...

  6. 跟着ALEX 学python day3集合 文件操作 函数和函数式编程 内置函数

    声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  一. 集合 集合是一个无序的,不重复的数据组合,主要作用如下 1.去重 把一个列表变成集合 ,就自动去重 ...

  7. Python基础编程 内置函数

    内置函数 内置函数(一定记住并且精通) print()屏幕输出 int():pass str():pass bool():pass set(): pass list() 将一个可迭代对象转换成列表 t ...

  8. Python中生成器,迭代器,以及一些常用的内置函数.

    知识点总结 生成器 生成器的本质就是迭代器. 迭代器:Python中提供的已经写好的工具或者通过数据转化得来的. 生成器:需要我们自己用Python代码构建的 创建生成器的三种方法: 通过生成器函数 ...

  9. Python中冷门但非常好用的内置函数

    Python中有许多内置函数,不像print.len那么广为人知,但它们的功能却异常强大,用好了可以大大提高代码效率,同时提升代码的简洁度,增强可阅读性 Counter collections在pyt ...

  10. Python语法速查: 1. 数据类型与内置函数

    返回目录 (1)常用内置数据类型 分类 类型名称 描述 数字 int 整数 float 浮点数 complex 复数 bool 布尔值 序列 str 字符串(不可变序列) list 列表 tuple ...

随机推荐

  1. sql 连接的使用说明

    SQL中的left outer join,inner join,right outer join用法详解 使用关系代数合并数据 关系代数 合并数据集合的理论基础是关系代数,它是由E.F.Codd于19 ...

  2. C#正则表达式将html代码中的所有img标签提取

    /// <summary> /// 取得HTML中所有图片的 URL. /// </summary> /// <param name="sHtmlText&qu ...

  3. jQuery积累:serialize()、stringify()、toJSON()

    *)表单serialize()序列化,和serializeArray() ##)应用场景 当Ajax或者get请求发送表单中的某一个,或者某几个值到后台时,通过jQuery就能获取到这些值.然后作为A ...

  4. git分支回退以及目录回退

    分支回退 git checkout - 目录回退 cd -

  5. appium 链接真机后,运行代码,但是APP并没有启动

    要淡定,链接真机后,问题一下多出来这么多,还没有启动程序,就碰到接二连三的问题. 爽到家了.慢慢解决吧. 具体问题是这样的: # coding=utf-8from appium import webd ...

  6. CSS-inline-block 间隙

    间隙产生的原因是`inline-block`对外是`inline`,对内是`block`.`inline`会将连续的空白符解析为一个空格(如:下面示例的两个`li`之间的后面的换行空格).取消间隙的方 ...

  7. drf:restful概念,类继承关系,drf请求封装,drf请求流程,版本控制组件,认证组件(token),权限组件

    1.restful规范 resfful规范的概念最重要: 是一套规范,规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的就是,以前写增删改查的时候需要些四个视图寒素,rest ...

  8. python3 装饰器修复技术@wraps到底是什么?

    Python 装饰器中的@wraps的作用:    装饰器的作用:    在不改变原有功能代码的基础上,添加额外的功能,如用户验证等    @wraps(view_func)的作用:     不改变使 ...

  9. svn设置文件提交过滤、svn设置classes文件提交

    在svn提交文件的时候为了避免一些不必要的文件也提交到资源库 像编译后的.class文件 第一步:在文件中右击打开设置, 第二步:找到全局忽略样式 第三步:修改要过滤的文件 设置过滤通配符 *clas ...

  10. selenium,webdriver模仿浏览器访问百度 基础1

    这是一种比较好的反反爬技术 #安装:pip install selenium=2.48.0 #显示:pip show selenium #卸载:pip uninstall selenium #模拟用户 ...