几个星期前,我看到一个带有强大生成器的网站,可以创建自己的源代码文件的精美图片.生成器创建的图像具有可变效果,如透视变换和景深等.
通常情况下我不会在这里问这样的问题,但我用Google搜索超过2小时,我再也找不到这个发电机了.我真的很疯狂 - 我知道这个网站存在...
这是使用此生成器生成的代码示例图:

非常感谢你!Waescher
有很多次我认为生成器样式可以更直接地返回列表,例如,
def foo(input_array):
for x in input_array:
yield processed(x)
Run Code Online (Sandbox Code Playgroud)
与
def bar(input_array):
accumulator = []
for x in input_array:
accumulator.append(processed(x))
return accumulator
Run Code Online (Sandbox Code Playgroud)
(好吧,如果它真的那么简单,我会写map,但你明白了:生成器版本更清晰).但是,并不总是需要返回类型的发电机.是否有一个内置的装饰器,我可以用它来改变foo一个返回列表或元组的函数?我自己写的方式是,
import functools
def transform_return_value(transformer):
def inner(f):
@functools.wraps(f)
def new_f(*argv, **kwargs):
return transformer(f(*argv, **kwargs))
return new_f
return inner
@transform_return_value(list)
def foo(input_array):
for x in input_array:
yield processed(x)
Run Code Online (Sandbox Code Playgroud) 我的Python程序中有这个函数:
@tornado.gen.engine
def check_status_changes(netid, sensid):
como_url = "".join(['http://131.114.52:44444/ztc?netid=', str(netid), '&sensid=', str(sensid), '&start=-5s&end=-1s'])
http_client = AsyncHTTPClient()
response = yield tornado.gen.Task(http_client.fetch, como_url)
if response.error:
self.error("Error while retrieving the status")
self.finish()
return error
for line in response.body.split("\n"):
if line != "":
#net = int(line.split(" ")[1])
#sens = int(line.split(" ")[2])
#stype = int(line.split(" ")[3])
value = int(line.split(" ")[4])
print value
return value
Run Code Online (Sandbox Code Playgroud)
我知道
for line in response.body.split
Run Code Online (Sandbox Code Playgroud)
是一个发电机.但我会将值变量返回给调用该函数的处理程序.这可能吗?我能怎么做?
我正在尝试创建一个实用程序类来遍历目录中的所有文件,包括子目录和子子目录中的文件.我试图使用发电机,因为发电机很酷; 但是,我遇到了麻烦.
def grab_files(directory):
for name in os.listdir(directory):
full_path = os.path.join(directory, name)
if os.path.isdir(full_path):
yield grab_files(full_path)
elif os.path.isfile(full_path):
yield full_path
else:
print('Unidentified name %s. It could be a symbolic link' % full_path)
Run Code Online (Sandbox Code Playgroud)
当生成器到达目录时,它只是产生新生成器的内存位置; 它没有给我目录的内容.
如果已经有一个简单的库函数来递归列出目录结构中的所有文件,请告诉我它.我不打算复制库函数.
我multiprocessing.Pool()用来并行化一些繁重的计算.
目标函数返回大量数据(一个巨大的列表).我的RAM用完了.
如果没有multiprocessing,我只需将目标函数更改为生成器,通过逐个yield计算结果元素.
我理解多处理不支持生成器 - 它等待整个输出并立即返回它,对吧?没有屈服.有没有办法让Pool工作人员在数据可用时立即生成数据,而无需在RAM中构建整个结果数组?
简单的例子:
def target_fnc(arg):
result = []
for i in xrange(1000000):
result.append('dvsdbdfbngd') # <== would like to just use yield!
return result
def process_args(some_args):
pool = Pool(16)
for result in pool.imap_unordered(target_fnc, some_args):
for element in result:
yield element
Run Code Online (Sandbox Code Playgroud)
这是Python 2.7.
据我了解,以下是解决异步编程工作流的技术:
较新的方法:
我们现在正在回避这些新方法的回调和承诺.我目前理解的是 - 在ES2015生成器之上,Async/Await更像是一个更清晰的抽象.
我无法理解的是Observables和Generators之间的概念差异.我已广泛使用它们并且使用它们没有任何问题.
令我困惑的是Observables和Generators的用例.我得出的结论是,他们最终解决了同样的问题 - 异步性.我看到的只有潜在的差异是生成器固有地为代码提供命令式语义,而使用Rxjs的Observable似乎提供了反应范式.但是这样吗?
这应该是Observable和Generator之间选择的标准吗?优缺点都有什么.
我错过了大局吗?
随着Observable最终制作成未来的Ecmascript,Promises(带有可取消令牌)/ Observable/Generators会相互竞争吗?
javascript generator reactive-programming ecmascript-6 rxjs5
我有一个发电机功能,想从中得到前10个项目; 我的第一次尝试是:
my_generator()[:10]
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为生成器不是可订阅的,因为错误告诉我.现在我已经解决了这个问题:
list(my_generator())[:10]
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为它将生成器转换为列表; 然而,这是低效的,并且失去了拥有发电机的重点.是否有一些内置的,Pythonic相当于[:10]发电机?
反正在javascript中为浏览器创建一个唯一的ID?
我不是在谈论每次生成它时随机的ID,而是一个生成的浏览器所特有的ID,但也考虑了它运行的计算机.
例:
Windows 7 Chrome可能会生成:asdh128hakj4gh
Windows 7 Opera可能会生成:23hjad823hjakk
Windows 7 Chrome,差异硬件,可能会生成:asd238881jaal
等等...
反正有没有这样做?
在Tornado中,我们通常编写以下代码来异步调用函数:
class MainHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def post(self):
...
yield self.handleRequest(foo)
...
@tornado.gen.coroutine
def handleRequest(self, foo):
...
Run Code Online (Sandbox Code Playgroud)
但是在asyncio中(将随Python 3.4一起提供,可以从pip for Python 3.3安装),我们yield from用来实现同样的目的:
@asyncio.coroutine
def myPostHandler():
...
yield from handleRequest(foo)
...
@asyncio.coroutine
def handleRequest(foo)
...
Run Code Online (Sandbox Code Playgroud)
从代码看,差异是yield和yield from.然而,前者handleRequest(foo)返回一个tornado.concurrent.Future对象,后者返回一个generator对象.
我的问题是,机制中两件事之间有什么区别?控制流程如何?谁调用实际handleRequest并检索其返回值?
附加:我具有Python生成器和迭代器的基本知识.我想通过使用这些来了解Tornado和asyncio的成就,以及这两种机制之间的区别.
我构建了一个简单的生成器,tuple(inputs, targets)在inputs和targets列表中只生成一个单项.基本上,它一次抓取数据集,一个样本项.
我把这个发生器传递给:
model.fit_generator(my_generator(),
nb_epoch=10,
samples_per_epoch=1,
max_q_size=1 # defaults to 10
)
Run Code Online (Sandbox Code Playgroud)
我明白了:
nb_epoch 是训练批次的运行次数samples_per_epoch 是每个时期训练的样本数量但它是什么max_q_size,为什么它会默认为10?我认为使用生成器的目的是将数据集批量化为合理的块,那么为什么要添加额外的队列呢?