我正在运行一段代码,意外地在程序的某个部分出现了逻辑错误.在调查该部分时,我创建了一个测试文件来测试正在运行的语句集,并发现一个看起来非常奇怪的异常错误.
我测试了这个简单的代码:
array = [1, 2, 2, 4, 5] # Original array
f = (x for x in array if array.count(x) == 2) # Filters original
array = [5, 6, 1, 2, 9] # Updates original to something else
print(list(f)) # Outputs filtered
Run Code Online (Sandbox Code Playgroud)
输出是:
>>> []
Run Code Online (Sandbox Code Playgroud)
是的,没什么.我期待过滤器理解能够在数组中获取数量为2的项并输出它,但我没有得到:
# Expected output
>>> [2, 2]
Run Code Online (Sandbox Code Playgroud)
当我评论第三行再次测试时:
array = [1, 2, 2, 4, 5] # Original array
f = (x for x in array if array.count(x) == 2) # Filters original
### array …Run Code Online (Sandbox Code Playgroud) 如何在Java中创建条形码图像?我需要能够输入数字并生成相应条形码图像的东西.是否有可用于此类任务的免费库?
是否有更复杂的语法写作方式?
gen = (i for i in xrange(10))
index = 5
for i, v in enumerate(gen):
if i is index:
return v
Run Code Online (Sandbox Code Playgroud)
生成器应该有一个gen[index]表达式,作为一个列表,但在功能上与上面的代码完全相同似乎是很自然的.
我知道yield将函数转换为生成器,但yield表达式本身的返回值是多少?例如:
def whizbang():
for i in range(10):
x = yield i
Run Code Online (Sandbox Code Playgroud)
x这个函数执行时变量的值是多少?
我已经阅读了Python文档:http://docs.python.org/reference/simple_stmts.html#grammar-token-yield_stmt,似乎没有提到yield表达式本身的值.
我在Nodejs v0.11.2中使用了生成器,我想知道如何检查我的函数的参数是生成器函数.
我找到了这种方式,typeof f === 'function' && Object.getPrototypeOf(f) !== Object.getPrototypeOf(Function)但我不确定这是否好(并在将来工作)方式.
你对这个问题有什么看法?
考虑这种情况:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
walk = os.walk('/home')
for root, dirs, files in walk:
for pathname in dirs+files:
print os.path.join(root, pathname)
for root, dirs, files in walk:
for pathname in dirs+files:
print os.path.join(root, pathname)
我知道这个例子有点多余,但您应该考虑我们需要walk多次使用相同的数据.我有一个基准测试场景,必须使用相同的walk数据才能获得有用的结果.
我试图walk2 = walk在第二次迭代中克隆并使用,但它没有用.问题是......我怎么能复制它?它有可能吗?
先感谢您.
我正在尝试编写一些代码来测试一堆输入参数的笛卡尔积.
我看过了itertools,但它的product功能并不完全是我想要的.是否有一个简单明显的方法来获取具有任意数量的键和每个值中的任意数量的元素的字典,然后产生具有下一个排列的字典?
输入:
options = {"number": [1,2,3], "color": ["orange","blue"] }
print list( my_product(options) )
Run Code Online (Sandbox Code Playgroud)
示例输出:
[ {"number": 1, "color": "orange"},
{"number": 1, "color": "blue"},
{"number": 2, "color": "orange"},
{"number": 2, "color": "blue"},
{"number": 3, "color": "orange"},
{"number": 3, "color": "blue"}
]
Run Code Online (Sandbox Code Playgroud) 我今天正在查看我的代码库并发现了这个:
def optionsToArgs(options, separator='='):
kvs = [
(
"%(option)s%(separator)s%(value)s" %
{'option' : str(k), 'separator' : separator, 'value' : str(v)}
) for k, v in options.items()
]
return list(
reversed(
list(
(lambda l, t:
(lambda f:
(f((yield x)) for x in l)
)(lambda _: t)
)(kvs, '-o')
)
)
)
Run Code Online (Sandbox Code Playgroud)
它似乎采用参数的dict并将它们转换为shell命令的参数列表.它看起来像是在生成器理解中使用yield,我认为这是不可能的......?
>>> optionsToArgs({"x":1,"y":2,"z":3})
['-o', 'z=3', '-o', 'x=1', '-o', 'y=2']
Run Code Online (Sandbox Code Playgroud)
它是如何工作的?
根据这个问题的答案,C#中的yield break相当于python中的return.在正常情况下,'return'确实会停止发电机.但是如果你的函数除了返回之外什么都不做,你将获得一个None而不是一个空的迭代器,它在C#中由yield break返回
def generate_nothing():
return
for i in generate_nothing():
print i
Run Code Online (Sandbox Code Playgroud)
你会得到一个TypeError:'NoneType'对象是不可迭代的.但是如果我在返回之前添加一个从不运行的yield,这个函数会返回我期望的结果.
def generate_nothing():
if False: yield None
return
Run Code Online (Sandbox Code Playgroud)
如果有效,但似乎有线.谁有更好的主意?
谢谢,
PEP 342(通过增强型生成器的协程)throw()向生成器对象添加了一个方法,它允许调用者在生成器内引发异常(就好像它是由yield表达式抛出的).
我想知道这个功能的用例是什么.