25 python python-3.x
#!/usr/bin/python3.2
import sys
def match_text(pattern):
line = (yield)
if pattern in line:
print(line)
x = match_text('apple')
x.next()
for line in input('>>>> '):
if x.send(line):
print(line)
x.close()
Run Code Online (Sandbox Code Playgroud)
这是一个协程,但Python3.2将其视为生成器 - 为什么?这里发生了什么?我指的是David Beazeley编写的Python Essential Reference:20.
引用相关部分:
Normally, functions operate on a single set of input arguments. However, a function can
also be written to operate as a task that processes a sequence of inputs sent to
it.This type of function is known as a coroutine and is created by using the yield
statement as an expression (yield) as shown in this example:
def print_matches(matchtext):
print "Looking for", matchtext
while True:
line = (yield) # Get a line of text
if matchtext in line:
print line
To use this function, you first call it, advance it to the first (yield), and then
start sending data to it using send(). For example:
>>> matcher = print_matches("python")
>>> matcher.next() # Advance to the first (yield)
Looking for python
>>> matcher.send("Hello World")
>>> matcher.send("python is cool")
python is cool
>>> matcher.send("yow!")
>>> matcher.close() # Done with the matcher function call
Run Code Online (Sandbox Code Playgroud)
为什么我的代码不起作用 - 而不是DB的工作..
deathstar> python3.2 xxx
Traceback (most recent call last):
File "xxx", line 9, in <module>
matcher.next() # Advance to the first (yield)
AttributeError: 'generator' object has no attribute 'next'
Run Code Online (Sandbox Code Playgroud)
Kar*_*tel 45
您将被错误消息抛弃; 类型方面,Python没有区别 - 你可以.send
使用任何东西yield
,即使它没有对内部发送的值做任何事情.
在3.x中,不再有.next
这些方法; 相反,使用内置的免费功能next
.
归档时间: |
|
查看次数: |
33383 次 |
最近记录: |