标签: generator

计算生成器的python中的平均值

我正在做一些统计工作,我有一个(大)随机数集合来计算平均值,我想使用生成器,因为我只需要计算均值,所以我不需要存储数字.

问题是numpy.mean如果你把它传给发电机就会中断.我可以写一个简单的函数来做我想要的,但我想知道是否有一个正确的,内置的方法来做到这一点?

如果我能说"sum(values)/ len(values)"会很好,但是len不适用于genetators,并且总和已经消耗的值.

这是一个例子:

import numpy 

def my_mean(values):
    n = 0
    Sum = 0.0
    try:
        while True:
            Sum += next(values)
            n += 1
    except StopIteration: pass
    return float(Sum)/n

X = [k for k in range(1,7)]
Y = (k for k in range(1,7))

print numpy.mean(X)
print my_mean(Y)
Run Code Online (Sandbox Code Playgroud)

这两个都给出相同,正确,答案,买my_mean不适用于列表,numpy.mean不适用于生成器.

我真的很喜欢使用发电机的想法,但这样的细节似乎破坏了事情.

python generator mean

13
推荐指数
3
解决办法
6810
查看次数

如何使用python连接/合并两个生成器输出

我有两台发电机g1和g2

for line in g1:
    print line[0]
Run Code Online (Sandbox Code Playgroud)

[a,a,a]
[b,b,b]
[c,c,c]

for line1 in g2:
    print line1[0]
Run Code Online (Sandbox Code Playgroud)

[1,1,1]
[2,2,2]
[3,3,3]

for line in itertools.chain(g1, g2):
    print line[0]
Run Code Online (Sandbox Code Playgroud)

并[a,A,A]
[B,B,B]
[C,C,C]
[1,1,1]
[2,2,2]
[3,3,3]


怎么样

得到如下输出:

[a,a,a],[1,1,1]
[b,b,b],[2,2,2]
[c,c,c],[3,3, 3]


并[a,A,A,1,1,1]
[B,B,B,2,2,2]
[C,C,C,3,3,3]


谢谢您的帮助.

python generator python-itertools

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

可以产生多个连续发电机吗?

以下是将可迭代项目拆分为子列表的两个函数.我相信这种类型的任务是多次编程的.我使用它们来解析由repr('result','case',123,4.56)和('dump',..)等行组成的日志文件.

我想改变这些,以便它们将产生迭代器而不是列表.因为列表可能会变得非常大,但我可以根据前几个项目决定接受或跳过它.此外,如果iter版本可用,我想嵌套它们,但这些列表版本会通过复制部分浪费一些内存.

但是从可迭代源中获取多个生成器对我来说并不容易,所以我请求帮助.如果可能的话,我希望避免引入新课程.

另外,如果您对这个问题有更好的标题,请告诉我.

谢谢!

def cleave_by_mark (stream, key_fn, end_with_mark=False):
    '''[f f t][t][f f] (true) [f f][t][t f f](false)'''
    buf = []
    for item in stream:
        if key_fn(item):
            if end_with_mark: buf.append(item)
            if buf: yield buf
            buf = []
            if end_with_mark: continue
        buf.append(item)
    if buf: yield buf

def cleave_by_change (stream, key_fn):
    '''[1 1 1][2 2][3][2 2 2 2]'''
    prev = None
    buf = []
    for item in stream:
        iden = key_fn(item)
        if prev is None: prev = iden
        if …
Run Code Online (Sandbox Code Playgroud)

python iterator yield generator

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

如何通过生成器或其他方式在Python中无限循环迭代器?

我的理解是使用Generator是实现这类目标的最佳方式,但我愿意接受建议.

具体来说,一个用例是这样的:我想打印一些项目和另一个列表,任意长度,必要时截断初始迭代器.

这是工作的python代码,演示了我想要的确切示例行为:

    def loop_list(iterable):
        """
        Return a Generator that will infinitely repeat the given iterable.

        >>> l = loop_list(['sam', 'max'])
        >>> for i in range(1, 11):
        ...     print i, l.next()
        ... 
        1 sam
        2 max
        3 sam
        4 max
        5 sam
        6 max
        7 sam
        8 max
        9 sam
        10 max

        >>> l = loop_list(['sam', 'max'])
        >>> for i in range(1, 2):
        ...     print i, l.next()
        ... 
        1 sam
        """
        iterable = tuple(iterable)
        l = len(iterable)
        num = 0 …
Run Code Online (Sandbox Code Playgroud)

python loops generator

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

Python生成器对象和.join

关于python和.join()方法的一个基本问题:

file1 = open(f1,"r")
file2 = open(f2,"r")
file3 = open("results","w")

diff = difflib.Differ()
result = diff.compare(file1.read(),file2.read())
file3.write("".join(result)),
Run Code Online (Sandbox Code Playgroud)

上面的代码片段以字符串格式生成一个存储在名为"results"的文件中的良好输出,逐行显示两个文件之间的差异.但是我注意到,如果我只是在使用.join()的情况下打印"result" ,编译器将返回包含内存地址的消息.在尝试将结果写入文件而不使用.join()之后,编译器通知我,在.join()方法中只能使用字符串和字符缓冲区,而不是生成器对象.因此,根据我提出的所有证据,如果我错了,请纠正我:

  1. result = diff.compare(file1.read(),file2.read()) <----结果是生成器对象?

  2. result是一个字符串列表,它result本身是第一个字符串的引用?

  3. .join() 获取一个内存地址并指向第一个,然后迭代该结构中字符串的其余地址?

  4. 生成器对象是一个返回指针的对象?

如果我的问题不清楚,我道歉,但我基本上想问问python退伍军人,如果我的扣除是正确的.我的问题不是关于可观察的结果,而是更多关于python的内部工作原理.我感谢你的所有帮助.

python string pointers list generator

13
推荐指数
1
解决办法
3万
查看次数

TypeError:*之后的类型对象参数必须是序列,而不是生成器

为什么以下Python代码会引发错误
TypeError: type object argument after * must be a sequence, not generator
,如果我在生成器f中注释第一行(无用),一切正常?

from itertools import izip

def z():
    for _ in range(10): 
        yield _

def f(z):
    for _ in z: pass    # if I comment this line it works! (??)
    for x in range(10):
        yield (x,10*x,100*x,1000*x)

iterators =  izip(*f(z))
for it in iterators:
    print list(it)
Run Code Online (Sandbox Code Playgroud)

注意我实际上要做的是,使用单个生成器,返回多个迭代器(尽可能多的我将作为参数传递给生成器).我发现这样做的唯一方法是产生元组并对它们使用izip() - 对我来说是黑魔法.

python generator typeerror

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

python Set Comprehensions如何工作?

Q1 - 以下是set()a generator expression还是a set comprehension?(或者它们是否相同?如果是这样,那么list&dictcomprehensions是否也在发电机上进行相应的类型转换?)

my_set = {x for x in range(10)}
Run Code Online (Sandbox Code Playgroud)

Q2 - 评估是否考虑重复值,然后通过应用删除它们set()

dup_set = {x for x in [0, 1, 2, 0, 1, 2]}
Run Code Online (Sandbox Code Playgroud)

理解是否比常规for循环更好地执行(速度方面)?

更新 - 我尝试timeit用于速度比较.我不确定我是否只是(公平).

C:\>python -m timeit "s = set()" "for x in range(10):" "
  s.add(x)"
100000 loops, best of 3: 2.3 usec per loop

C:\>python -m timeit "s = {x for x …
Run Code Online (Sandbox Code Playgroud)

python generator set set-comprehension

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

为什么php生成器比foreach慢?

根据文档的评论:http://php.net/manual/en/language.generators.overview.php
我们可以看到,由于生成器有大量的内存使用改进(这是显而易见的),但也有2-执行速度慢3倍 - 这对我来说并不那么明显.

我们以牺牲时间为代价来提高内存使用率 - 这并不好.
那么,为什么php生成器比foreach慢?

谢谢你的提示.

php performance foreach generator

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

`yield from $ generator`和`return $ generator`之间的区别?

我有一个功能,返回一个发电机.目前它使用yield from:

function foo()
{
    $generator = getGenerator();
    // some other stuff (no yields!)
    yield from $generator;
}
Run Code Online (Sandbox Code Playgroud)

如果我yield from用一个简单的替换它,return在这种情况下,这会改变什么吗?也许在执行中?还是表现?会yield from产生一个新的"外部"迭代器吗?

我知道,在其他情况下yield from可以更灵活,因为我可以使用它几次甚至将它与简单的yields 混合,但这对我的情况无关紧要.

php return generator yield-from

12
推荐指数
2
解决办法
3180
查看次数

大多数pythonic可调用生成True?

该类collections.defaultdict采用默认工厂,用于生成默认值。

如果包含在dict-like 对象中的值应默认为False,则可以将实例创建为:

d_false = defaultdict(bool)
Run Code Online (Sandbox Code Playgroud)

为默认值实现相同的最pythonic 的方法是True什么?

换句话说,是否有一个标准的可调用对象返回True,它习惯上用作bool?

当然,工厂可以构建为 lambda 表达式:

d_true = defaultdict(lambda: True)
Run Code Online (Sandbox Code Playgroud)

但这可能是在重新发明轮子。

python generator

12
推荐指数
2
解决办法
997
查看次数