我试图找到一种优雅的方式来做到这一点。我基本上有一个返回记录的类。 我为此使用了一个基本的迭代器:
i = 0
if mode == "sim":
for record in iterator_obj:
try:
s.sendall(record)
time.sleep(delay)
i += 1
但是,此迭代器类已被修改,因此如果使用命令行开关,它将返回(记录,延迟)元组。
这个延迟我用在了 time.sleep(延迟)
这看起来像这样(如果迭代器没有返回延迟,这显然会失败):
for record, wait in iterator_obj:
if wait == 0:
pass
else:
delay = wait
if verbose:
print ('\n[+] Waiting {} seconds to send next record'.format(delay))
try:
s.sendall(record)
time.sleep(delay)
i += 1
它有很多浪费的行,有没有办法为1个或多个元素做一个条件循环?
for x, y (if y) in iterator_object
溶液
诀窍是使用isinstance来检查元组。更新了以下代码:
for record in iterator_obj:
wait = None
if isinstance(record,(list,tuple)):
record,wait = record
if wait == 0 or wait is None:
pass
else:
delay = wait
if verbose:
print ('\n[+] Waiting {} seconds to send next record'.format(delay))
答案 0 :(得分:2)
for record in myList:
wait = None
if isinstance(record,(list,tuple)):
record,wait = record
可能是你想要的......
答案 1 :(得分:1)
也许这个答案有点过分,但我认为它可以满足您的需求。尽管如此,这可能不是你想要的,因为它是一个相当丑陋的表达。以下是其工作原理的示例:
In [1]: iterable = [(1,2), (0,1), 2, 4]
In [2]: [(lambda *z: isinstance(z[0], tuple) and z[0] or (z[0], 0))(x) for x in iterable
Out[2]: [(1, 2), (0, 1), (2, 0), (4, 0)]
最后一个术语是可迭代的,应该用迭代器替换。返回的每个元素都通过lambda function运行,and-or trick使用{{3}}返回原始元组,或者元组内的整数,第二个元素设置为零。
基本上,它允许您按照要求处理多种形式的输入。但它的可读性低于你想要的。
答案 2 :(得分:0)
您有几个选择:
始终让iterator_obj
同时返回记录和延迟,并在您不需要时忽略延迟:
for record, _ in iterator_obj
使用不同的方法返回不同的迭代器:
for record, delay in iterajtor_obj.iterate_with_delay()
答案 3 :(得分:0)
以列表为例:
l=[(1,2),(2,3),(3,4)]
[(x,y) for x,y in list if y>2]
此输出[(2,3),(3,4)] 希望这有用。