是否有从生成器创建列表的快捷方式?我现在正在这样做:
list_form = [ item for item in some_generator ]
Run Code Online (Sandbox Code Playgroud)
我需要在迭代之前对数据进行排序,因此不能直接在我的循环中使用生成器.
在你有一个N大小的集合但想要使用单一项目(概念上是一个0 or 1大小的集合)的问题是很常见的.
我可以写传统的if:
def singular_item(collection):
if collection:
return collection[0]
else:
return None
Run Code Online (Sandbox Code Playgroud)
并简化为:
def singular_item(collection):
return collection[0] if collection else None
Run Code Online (Sandbox Code Playgroud)
但它不适用于iterables,只有定义大小的集合.例如,传递生成器将失败:
singular_item((_ for _ in range(10)))
=> TypeError: 'generator' object has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)
所以我通常做的是:
def singular_item(collection):
return next((_ for _ in collection), None)
singular_item([1]) -> 1
singular_item([1,2,3]) -> 1
singular_item([]) -> None
Run Code Online (Sandbox Code Playgroud)
这适用于任何集合(或可迭代),但感觉有点笨拙创建一个生成器只获取一个项目.此外,可读性在某种程度上被杀死了:另外两个例子更清楚地表明代码正在尝试做什么.
所以我的问题是:
我有大量的字符串列表,我希望iteratoe在这个列表上.我想弄清楚哪个是迭代列表的最佳方法.我尝试过使用以下方法:
发电机表达: g = (x for x in list)
Itertools.chain: ch = itertools.chain(list)
对于列表迭代,是否有另一种方法,优于这两种方法?
在下面的代码中,使用列表推导还是生成器更好?
from itertools import izip
n=2
l=izip(xrange(10**n), xrange(10**n))
print 3 not in [x[0] for x in l]
#or
#print 3 not in (x[0] for x in l)
Run Code Online (Sandbox Code Playgroud)
在这些测试中,如果列表很大,则生成器更快,如果列表更短,则列表理解显然更快.
这是因为理解只是计算机一次吗?
对于大型列表:生成器比listcomp更快
对于小型列表:生成器比listcomp慢
我想生成这样的数字: 1, -1, 2, -2, 3, -3, ...
但我不知道如何在Python中做到这一点.
def genNumbers():
gi = genInt()
while True:
yield gi.next()
def genInt():
i = 0
while True:
i+=1
yield i
gennr = genNumbers()
print gennr.next(), gennr.next(), gennr.next()
Run Code Online (Sandbox Code Playgroud)
我写了另一个生成数字的生成器.实际的生成器genNumbers()应该改变每个数字的符号,但我没有看到在进入下一个int之前打印其签名状态中的每个int的方法.
有人可以用简单的方式为我解释这段代码.
prompts = ("Enter Strength Attribute, between 1 and 50: ", "Enter Skill Attribute, between 1 and 50: ") # I already now this so no need to explain it
answers = [int(input(p)) for p in prompts]
if not all(0 < a <=50 for a in answers):
# other code here
Run Code Online (Sandbox Code Playgroud)
它是发电机吗?
它是如何工作的?
提前感谢您的任何答案.
我正在尝试为DES上的暴力攻击编写一个程序,键是一个由8位字符组成的字符串,例如(12345678).
所以我需要一些帮助来编写一个程序,我可以将测试键设置为(00000000)并开始逐步循环(00000001),(00000002)直到(99999999)并且每次尝试按键.
我已经完成了DES程序,现在我的大脑仍然坚持这部分.
更新:非常感谢Hyperboreus,关键生成器功能,但是当我在我的程序中使用它时,我收到错误消息
UnicodeDecodeError:'utf-8'编解码器无法解码位置1中的字节0xbf:无效的起始字节
任何大于(00000002)的密钥
这是我的代码
from Crypto.Cipher import DES
import os
import base64
print ("key size is fixed at 16 Bytes including parities (56 bits effective)")
size = 16
key = '00000002'
cipher = DES.new(key)
BS = 8
def getMode():
while True:
mode = input('Do you wish to Encrypt "e", Decrypt "d" or Brute force "b" a message?\n')
if mode in 'e d b'.split():
return mode
else:
print('Enter either "e" for encrypt,"d" for decrypt, or "b" …Run Code Online (Sandbox Code Playgroud) 我有一个生成器,在每次迭代中返回一个列表.列表的每个元素可以是0或1.我想计算返回的元素总数(包括0和1)以及返回的总数.我尝试使用reduce函数实现这个:
t = reduce( (lambda x,y:(y[0]+1,y[1]+x)), gen_fn(), (0,0))
上面的gen_fn()是返回每个yield语句中列表的一部分的生成器.我想通过使用元组(0,0)初始化来实现它.鉴于从生成器返回的元素如下:
[0, 1, 1, 0, 1]
我对t的预期输出是(5,3).但我的代码失败了这个错误消息:
TypeError: unsupported operand type(s) for +: 'int' and 'tuple'
任何人都可以帮我识别问题吗?我缺乏reduce和lambda函数的经验使我无法弄清楚我做错了什么.提前致谢.
装饰器有没有办法将下面的函数转换为生成器?
@decorator_that_makes_func_into_generator
def countdown(n):
while n > 0:
print n,
n = n - 1
Run Code Online (Sandbox Code Playgroud)
必要时可以修改该功能.请注意,该函数没有yield语句,否则它已经是一个生成器.
考虑以下(非工作)示例代码:
class MyGenerator:
def test_gen(self):
for i in range(1,5):
if i % 2:
self.foo(i)
else:
self.bar(i)
def foo(self, i):
yield i
def bar(self, i):
yield i**2
g = MyGenerator()
for i in g.test_gen():
print i
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为test_gen没有yield,不再是生成器功能.在这个小例子我再从返回值foo和bar,并把yield成test_gen,但是我有一个情况下这是不可能的.如何test_gen再次变成发电机功能?