标签: generator

如何正确定义和使用Python生成器

我想从列表中定义一个生成器,它将一次输出一个元素,然后以适当的方式使用此生成器对象.

a = ["Hello", "world", "!"]
b = (x for x in a)
c = next(b, None)
while c != None:
    print c,
    c = next(b, None)
Run Code Online (Sandbox Code Playgroud)

这种while方法有什么不对或可以改进的吗?有没有办法避免在循环之前分配'c'?

谢谢!

python generator while-loop

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

Python中的多范围产品

有一个更好的方法吗:

perms = product(range(1,7),range(1,7),range(1,7))
Run Code Online (Sandbox Code Playgroud)

这样我可以选择使用多少量程?我希望它等同于此,但可扩展.

def dice(num)
    if num == 1:
        perms = ((i,) for i in range(1,7))
    elif num == 2:
        perms = product(range(1,7),range(1,7))
    elif num == 3:
        perms = product(range(1,7),range(1,7),range(1,7))
    #... and so on
Run Code Online (Sandbox Code Playgroud)

但我知道必须有更好的方法.我用它来计算骰子结果.实际的代码

def dice(selection= lambda d: d[2]):   
    perms = itertools.product(range(1,7),range(1,7),range(1,7))      
    return collections.Counter(((selection(sorted(i)) for i in perms)))
Run Code Online (Sandbox Code Playgroud)

我可以用各种各样的选择器来调用它,例如sum(d[0:2])最低2个骰子的总和或者d[1]获得中间骰子.

python generator permutation range

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

产量只有发电机所需的数量

我希望只从需要许多物品的发电机中获益.

在以下代码中

a, b, c = itertools.count()
Run Code Online (Sandbox Code Playgroud)

我收到这个例外:

ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)

我已经看过几个相关的问题,但是我对发电机剩余的项目没有兴趣,我只想收到我要求的数量,而不提前提供这个数量.

在我看来,Python确定了你想要的项目数,但后来尝试阅读和存储超过该数量(生成ValueError).

如何在不传递我想要的物品数量的情况下,只能生产出我需要的物品数量?

Update0

为了帮助理解我认为应该可能的近似行为,这里是一个代码示例:

def unpack_seq(ctx, items, seq):
    for name in items:
        setattr(ctx, name, seq.next())

import itertools, sys
unpack_seq(sys.modules[__name__], ["a", "b", "c"], itertools.count())
print a, b, c
Run Code Online (Sandbox Code Playgroud)

如果您可以改进此代码,请执行.

Alex Martelli的回答告诉我,字节op UNPACK_SEQUENCE负责限制.我不明白为什么这个操作应该要求生成的序列在长度上也必须完全匹配.

请注意,Python 3具有不同的解包语法,这可能会使此问题中的技术讨论无效.

python yield generator python-2.x

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

阻止浏览器缓存链接文件

我的任务是维护一个PHP网站,该网站具有自动生成RTF文件的功能,并提供下载链接.每次先前生成的文件被新的文件覆盖.

然而,似乎在试图下载生成的文件,浏览器有时会检索缓存的版本,这是从最新的版本通常是不同的(所以你会得到相同的文档最后时间,而不是你所要求的一个).

我设法通过给每个生成的文件根据当前时间戳的唯一名称来解决这一点,但这个产生很多混乱的,这将需要定期清理目录.理想情况下,我想标记此文件,以便浏览器不会缓存它,并且每次都会获得最新版本.我怎么能实现这个目标?

php caching generator

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

什么是好的,免费的数据库脚本工具

我正在寻找一个免费工具,它允许我在表上指定SELECT语句,然后将结果集生成为一系列INSERT语句以传输到另一个数据库.我有SQL发布向导,但这只允许我为整个表生成语句,我不能指定WHERE子句来过滤它发布的数据.到目前为止,我见过的唯一工具是由Red Gate制作的,我的雇主只给了DBA.是否有任何免费工具可以让我做同样的事情,而不必在每次我需要更新数据库中的某些数据时发生错误的DBA?

sql scripting insert generator

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

生成伪随机数的算法系列,可重现知道初始种子

我必须编写一个轻量级算法来生成伪随机无限数字序列,并且强烈依赖于初始种子.

在python中应该是这样的

seed = 3345                 // Common number
generator = numgen(seed)
while True:
    generator.getNext()     // With the same seed it produce same numbers
Run Code Online (Sandbox Code Playgroud)

正如我所写的,使用相同的种子,它必须生成相同的数字系列,即使在不同的机器和不同的时间.是否有标准模式或我是否必须实现自己的算法?

python algorithm numbers generator series

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

Python字典来排序元组,这可以做得更好吗?

我的输入有一个dictonary有以下特点:

  • 每个值都可以是整数,字符串或可迭代(除了字符串).
  • 如果元素是可迭代的,则该iterable中的每个元素将只是一个字符串或整数.

例如:

mydict = {
    'one': 1,
    'two': '23',
    'three': 3,
    'four': [
        7,
        '6',
        5,
        8
    ],
    'nine': 9
}
Run Code Online (Sandbox Code Playgroud)

我需要将输入转换为元组列表,其中每个元组是键/值对.对于可迭代元素,每个元素都有一个键/值对,按值排序.例如,上面的输出应该是:

('four', 5)
('four', 7)
('four', 8)
('four', '6')
('nine', 9)
('one', 1)
('three', 3)
('two', '2')
Run Code Online (Sandbox Code Playgroud)

我目前使用以下生成器实现了这个:

def dict_to_sorted_tuples(unsorted_dict):
    for key in sorted(unsorted_dict):
        if isinstance(unsorted_dict[key], basestring):
            yield key, unsorted_dict[key]
            continue
        try:
            for v in sorted(unsorted_dict[key]):
                yield key, v
        except:
            yield key, unsorted_dict[key]

print list(dict_to_sorted_tuples(mydict))
Run Code Online (Sandbox Code Playgroud)

我觉得这可以用更干净的方式完成,有任何改进建议吗?

python sorting dictionary iterable generator

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

C++强随机数生成器 - 必要吗?

我最新的项目是基于文本的RPG的开发,现在我需要一个随机数生成器,一个很好的计算器,可以在不同的情况下计算是否可以执行某些操作而不会出现问题.我们每个人都知道,基本功能std::srandstd::rand简单易用的算法来计算伪随机值.但是我希望有真实值而不是伪值.因此,我想问一下,使用比上述解决方案更好的解决方案是否会过分夸大并坚持基础; 如果没有,你会建议什么?如何实现这样一个"好的发电机"?

c++ random algorithm generator

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

Python生成器返回一系列次数

我希望这不是Python生成器的能力之外,但是我想构建一个,这样每次调用函数时,它都会在下一分钟返回,直到结束时间.

因此,函数读取开始和结束时间,并以分钟为单位返回时间,直到覆盖了所有时间.

这将如何实施?TIA

python generator

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

Python生成器,添加两个数字数组:我正确执行此操作吗?

我对发电机的概念仍然有点朦胧.我想创建一个生成器函数,它接收两个数字数组并在相应的索引处添加值.我有一些有用的东西,我只是不确定我是否正确地使用惰性评估(即正确使用生成器).有人能告诉我这是否确实是使用发生器的正确方法,或者如果我做错了就纠正我?

def add(a1,a2):
    i = 0
    while i < len(a1):
        yield a1[i]+a2[i]
        i += 1
Run Code Online (Sandbox Code Playgroud)

python generator lazy-evaluation

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