python--表达式形式的yield、面向过程编程、内置函数
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、面向过程编程、内置函数的更多相关文章
- Python基础(9)_生成器(yield表达式形式)、面向过程编程
		
一.yield表达式形式 1 #装饰器,初始化含yield表达式的生成器 def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwa ...
 - Python【map、reduce、filter】内置函数使用说明(转载)
		
转自:http://www.blogjava.net/vagasnail/articles/301140.html?opt=admin 介绍下Python 中 map,reduce,和filter 内 ...
 - Python【map、reduce、filter】内置函数使用说明
		
题记 介绍下Python 中 map,reduce,和filter 内置函数的方法 一:map map(...) map(function, sequence[, sequence, ...]) -& ...
 - day22 yield的表达式的应用,面向过程编程,内置函数前几个
		
Python之路,Day10 = Python基础10 生成器表达式: (i for i in range(10) if i > 5)os.walk(r'文件路径')返回一个迭代器, 第一次ne ...
 - Python之路【第六篇】:Python迭代器、生成器、面向过程编程
		
阅读目录 一.迭代器 1.迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 代码如下: while True: ...
 - 跟着ALEX 学python day3集合 文件操作  函数和函数式编程    内置函数
		
声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 一. 集合 集合是一个无序的,不重复的数据组合,主要作用如下 1.去重 把一个列表变成集合 ,就自动去重 ...
 - Python基础编程 内置函数
		
内置函数 内置函数(一定记住并且精通) print()屏幕输出 int():pass str():pass bool():pass set(): pass list() 将一个可迭代对象转换成列表 t ...
 - Python中生成器,迭代器,以及一些常用的内置函数.
		
知识点总结 生成器 生成器的本质就是迭代器. 迭代器:Python中提供的已经写好的工具或者通过数据转化得来的. 生成器:需要我们自己用Python代码构建的 创建生成器的三种方法: 通过生成器函数 ...
 - Python中冷门但非常好用的内置函数
		
Python中有许多内置函数,不像print.len那么广为人知,但它们的功能却异常强大,用好了可以大大提高代码效率,同时提升代码的简洁度,增强可阅读性 Counter collections在pyt ...
 - Python语法速查: 1. 数据类型与内置函数
		
返回目录 (1)常用内置数据类型 分类 类型名称 描述 数字 int 整数 float 浮点数 complex 复数 bool 布尔值 序列 str 字符串(不可变序列) list 列表 tuple ...
 
随机推荐
- SQL Server 创建表
			
SQL Server 创建表 我们在上一节中完成了数据库的创建,在本节,我们要往这个新的数据库中加入点数据,要想将数据添加到数据库,我们就必须在数据库中添加一个表,接下来来看看具体的操作. 我们的数据 ...
 - Mac 上使用svn 记录
			
.启动svn服务器 svnadmin create /Users/liuwei/Desktop/svn/UI 如果本地有 UI这个目录了就不用再运行 使用这句就可以了 svnserve -d -r / ...
 - 空间日志编辑器:word文档图文快速粘贴到web
			
百度ueditor可以实现word文档图文快速粘贴到web 1.4.2之后官方并没有做功能的改动,1.4.2在word复制这块没有bug,其他版本会出现手动无法转存的情况 本文使用的后台是Java.前 ...
 - 【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】
			
https://codeforces.com/contest/1256 A:Payment Without Change[思维] 题意:给你a个价值n的物品和b个价值1的物品,问是否存在取物方案使得价 ...
 - 【CF741D】Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths(dsu on tree)
			
题意:我们称一个字符串为周驿东串当且仅当重排它的字符可以组成一个回文串. 给出一个n个点的有根树,根为1,每条边上有一个从a到v的字符,求每个点的子树中所有简单路径可以组成的周驿东串中的最长长度. n ...
 - CF 717A Festival Organization——斯特林数+递推求通项+扩域
			
题目:http://codeforces.com/contest/717/problem/A 是 BJOI2019 勘破神机 的弱化版. 令 \( g[i] \) 表示长为 i .以 1 结尾的方案数 ...
 - 使用Echarts中遇到值得记录的小案例(一)
			
需求部分 在开发项目的时候遇到一个需求,就是如何保证echarts图表里至少显示一个图例的数据(也就是最后一个图例不能变成unselected的状态)下图是最初加载时的画面 不想出现图例都被点击取消导 ...
 - centos查看磁盘空间大小
			
查看磁盘空间大小 df -h 查看当前文件夹所有文件大小 du -sh 查看指定文件夹大小 du -h /data 查看指定文件夹下所有文件的大小 du -h /data/ 查看指定文件大小 du - ...
 - RQNOJ  PID331  家族
			
题目描述 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是 ...
 - 面试题30:包含min函数的栈
			
思路: 1.首先将栈的基本结构写出 #初始化栈的写法 def __init__(self): self.stack = [] #栈的压入 (加self是实例化,如果前面加入静态装饰器啥的,就不需要 ...
 
			
		