标签: generator

从生成器创建列表

是否有从生成器创建列表的快捷方式?我现在正在这样做:

list_form = [ item for item in some_generator ]
Run Code Online (Sandbox Code Playgroud)

我需要在迭代之前对数据进行排序,因此不能直接在我的循环中使用生成器.

python list generator

1
推荐指数
1
解决办法
174
查看次数

从集合中获取一个或者无

在你有一个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)

这适用于任何集合(或可迭代),但感觉有点笨拙创建一个生成器只获取一个项目.此外,可读性在某种程度上被杀死了:另外两个例子更清楚地表明代码正在尝试做什么.

所以我的问题是:

  • 是否有更好的方法可以使用内置函数?
  • 在创建一个只生成一个项目的生成器时,您是否浪费资源?

python generator

1
推荐指数
1
解决办法
70
查看次数

在生成器表达式或itertools.chain之间更快更有效地迭代大型列表?

我有大量的字符串列表,我希望iteratoe在这个列表上.我想弄清楚哪个是迭代列表的最佳方法.我尝试过使用以下方法:

  • 发电机表达: g = (x for x in list)

  • Itertools.chain: ch = itertools.chain(list)

对于列表迭代,是否有另一种方法,优于这两种方法?

python generator python-itertools listiterator

1
推荐指数
1
解决办法
814
查看次数

发电机与列表理解

在下面的代码中,使用列表推导还是生成器更好?

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

python list-comprehension generator

1
推荐指数
1
解决办法
215
查看次数

如何生成具有不同符号的整数?

我想生成这样的数字: 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的方法.

python generator

1
推荐指数
1
解决办法
57
查看次数

有人可以帮我解释这段代码吗?

有人可以用简单的方式为我解释这段代码.

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)

它是发电机吗?

它是如何工作的?

提前感谢您的任何答案.

python generator

1
推荐指数
1
解决办法
66
查看次数

如何在python中顺序更改字符串?

我正在尝试为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)

python string des generator sequence

1
推荐指数
1
解决办法
229
查看次数

Python聚合在一个生成器上

我有一个生成器,在每次迭代中返回一个列表.列表的每个元素可以是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函数的经验使我无法弄清楚我做错了什么.提前致谢.

python lambda generator

1
推荐指数
1
解决办法
706
查看次数

使用装饰器将函数转换为Python中的生成器

装饰器有没有办法将下面的函数转换为生成器?

@decorator_that_makes_func_into_generator
def countdown(n):
    while n > 0:
        print n,
        n = n - 1
Run Code Online (Sandbox Code Playgroud)

必要时可以修改该功能.请注意,该函数没有yield语句,否则它已经是一个生成器.

python generator decorator

1
推荐指数
2
解决办法
864
查看次数

如何创建调用生成器函数的生成器函数

考虑以下(非工作)示例代码:

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,不再是生成器功能.在这个小例子我再从返回值foobar,并把yieldtest_gen,但是我有一个情况下这是不可能的.如何test_gen再次变成发电机功能?

python generator

1
推荐指数
1
解决办法
71
查看次数