javascript

java

python

c#

android

c++

node.js

php

reactjs

jquery

html

css

ios

.net

git

ruby-on-rails

sql

c

string

ruby

python-将生成器拆分为多个块,而无需预先遍历

(这个问题与此相关,但是这些问题是在发电机前进行的,这正是我要避免的问题)

我想将生成器拆分为多个块。 要求是:

  • 不要填充数据块:如果剩余元素的数量小于数据块大小,则最后一个数据块必须较小。
  • 不要事先走生成器:计算元素是昂贵的,并且必须仅通过使用函数来完成,而不是通过分块器来完成
  • 这当然意味着:不要在内存中累积(无列表)

我尝试了以下代码:

def head(iterable, max=10):
    for cnt, el in enumerate(iterable):
        yield el
        if cnt >= max:
            break

def chunks(iterable, size=10):
    i = iter(iterable)
    while True:
        yield head(i, size)

# Sample generator: the real data is much more complex, and expensive to compute
els = xrange(7)

for n, chunk in enumerate(chunks(els, 3)):
    for el in chunk:
        print 'Chunk %3d, value %d' % (n, el)

这以某种方式起作用:

Chunk   0, value 0
Chunk   0, value 1
Chunk   0, value 2
Chunk   1, value 3
Chunk   1, value 4
Chunk   1, value 5
Chunk   2, value 6
^CTraceback (most recent call last):
  File "xxxx.py", line 15, in <module>
    for el in chunk:
  File "xxxx.py", line 2, in head
    for cnt, el in enumerate(iterable):
KeyboardInterrupt

Buuuut ...因为2964171943525745745665,它永远不会停止(我必须按chunks)。无论何时使用完发电机,我都想停止该循环,但是我不知道如何检测这种情况。 我试图提出一个异常:

class NoMoreData(Exception):
    pass

def head(iterable, max=10):
    for cnt, el in enumerate(iterable):
        yield el
        if cnt >= max:
            break
    if cnt == 0 : raise NoMoreData()

def chunks(iterable, size=10):
    i = iter(iterable)
    while True:
        try:
            yield head(i, size)
        except NoMoreData:
            break

# Sample generator: the real data is much more complex, and expensive to compute    
els = xrange(7)

for n, chunk in enumerate(chunks(els, 2)):
    for el in chunk:
        print 'Chunk %3d, value %d' % (n, el)

但是然后仅在使用方的上下文中引发异常,这不是我想要的(我想保持使用方代码干净)

Chunk   0, value 0
Chunk   0, value 1
Chunk   0, value 2
Chunk   1, value 3
Chunk   1, value 4
Chunk   1, value 5
Chunk   2, value 6
Traceback (most recent call last):
  File "xxxx.py", line 22, in <module>
    for el in chunk:
  File "xxxx.py", line 9, in head
    if cnt == 0 : raise NoMoreData
__main__.NoMoreData()

如何在chunks功能中检测到发电机已耗尽,而没有行走?

trans by 2020-07-13T04:56:01Z

android-如何生成一定范围内的随机数?

如何创建使用Eclipse在Android中生成随机数,然后在TextView字段中显示结果的应用程序? 随机数必须在用户选择的范围内。 因此,用户将输入范围的最大值和最小值,然后输出答案。

trans by 2020-07-09T15:54:04Z

python-处理在gen中引发的异常

我有一个生成器和一个使用它的函数:

def read():
    while something():
        yield something_else()

def process():
    for item in read():
        do stuff

如果生成器引发异常,我想在使用者函数中处理该异常,然后继续使用迭代器,直到耗尽为止。 请注意,我不想在生成器中有任何异常处理代码。

我想到了类似的东西:

reader = read()
while True:
    try:
        item = next(reader)
    except StopIteration:
        break
    except Exception as e:
        log error
        continue
    do_stuff(item)

但这对我来说看起来很尴尬。

trans by 2020-07-06T15:29:11Z

从Python列表中获取前n个唯一元素

我有一个python列表,其中元素可以重复。

>>> a = [1,2,2,3,3,4,5,6]

我想从列表中获得第一个n个独特元素。因此,在这种情况下,如果我想要前5个唯一元素,它们将是:

[1,2,3,4,5]

我想出了一个使用生成器的解决方案:

def iterate(itr, upper=5):

    count = 0
    for index, element in enumerate(itr):
        if index==0:
            count += 1
            yield element

        elif element not in itr[:index] and count<upper:
            count += 1
            yield element

正在使用:

>>> i = iterate(a, 5)
>>> [e for e in i]
[1,2,3,4,5]

我怀疑这是否是最佳解决方案。 有没有一种我可以实现的替代策略,可以用更加Python化和高效的方式编写它方式?

trans by 2020-06-30T05:01:42Z

返回生成器以及Python 3.3中的yield

在Python 2中,函数定义中return和yield一起出现错误。 但是对于Python 3.3中的这段代码

def f():
  return 3
  yield 2

x = f()
print(x.__next__())

没有错误,return与函数一起使用yield。 但是,当调用函数__next__时,将引发StopIteration异常。 为什么不仅有返回值3? 这个回报以某种方式被忽略了吗?

trans by 2020-06-26T18:54:40Z

python 2.7-我应该如何使用Google样式的Sphinx记录列表,可选内容和收益?

如何使用Sphinx-Napoleon在Google样式的文档字符串上指示列表类型,可选参数和生成器的返回类型?

我试过了

List[type]
list of type

Optional[type]
type, optional

Yields:
   type: 

分别; 但是所有生成的输出都不令人满意,这与生成的文档的其余部分不一致。 例如

Optional[type]

只是给

可选[类型]

没有type的任何链接。

我尝试了所有内置主题,并且遇到了相同的问题。

我应该如何在Sphinx-Napoleon中使用Google样式的文档字符串记录这些元素?

trans by 2020-06-22T07:08:25Z

generator-node.js是否支持yield?

有什么方法可以让生成器进入node.js?

我目前在用回调伪造它们,但我必须记住检查生成器函数内部的回调响应,这会产生大量if (callback(arg) === false) return;

我想要类似python的内容:

for p in primes():
  if p > 100: break
  do_something(p)

我正在像这样在节点中做的事情:

primes(function(p) {
  if (p > 100) return false;
  do_something(p)
});

也许像coffeescript这样的东西可以帮助您?

trans by 2020-06-21T06:09:25Z

我如何判断发电机是否刚刚启动?

我想要一个函数.gi_running,该函数的行为如下:

>>> def gen(): yield 0; yield 1
>>> a = gen()
>>> is_just_started(a) 
True
>>> next(a)
0
>>> is_just_started(a) 
False
>>> next(a)
1
>>> is_just_started(a) 
False
>>> next(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> is_just_started(a)
False

如何实现此功能?

我查看了.gi_running属性,但它似乎用于其他用途。

如果我知道需要发送到生成器的第一个值,则可以执行以下操作:

def safe_send(gen, a):
    try:
        return gen.send(a)
    except TypeError as e:
        if "just-started" in e.args[0]:
            gen.send(None)
            return gen.send(a)
        else:
            raise

但是,这似乎很可恶。

trans by 2020-02-04T08:08:45Z

python-generator.throw()有什么用?

PEP 342(通过增强型生成器进行协程)向生成器对象添加了throw()方法,该方法允许调用方在生成器内引发异常(就像它是由yield表达式抛出的一样)。

我想知道此功能的用例是什么。

trans by 2020-02-04T05:57:52Z

如何克隆Python生成器对象?

考虑这种情况:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os

walk = os.walk('/home')

for root, dirs, files in walk:
    for pathname in dirs+files:
        print os.path.join(root, pathname)

for root, dirs, files in walk:
    for pathname in dirs+files:
        print os.path.join(root, pathname)

我知道这个示例有点多余,但是您应该考虑到我们需要多次使用相同的walk2 = walk数据。 我有一个基准场景,必须使用相同的walk数据才能获得有用的结果。

我已经尝试在第二个迭代中克隆和使用walk2 = walk,但没有成功。 问题是...我该如何复制? 有可能吗?

先感谢您。

trans by 2020-01-30T06:33:32Z

generator-Python中的收益中断

根据对这个问题的回答,C#中的yield break等同于python中的return。 在正常情况下,“返回”确实会停止发电机。 但是,如果您的函数只执行返回操作,则将获得None而不是空的迭代器,该迭代器由C#中的yield break返回

def generate_nothing():
    return

for i in generate_nothing():
    print i

您将收到TypeError:'NoneType'对象不可迭代。但是,如果我在返回前添加了永不运行的收益,则此函数将返回我期望的结果。

def generate_nothing():
    if False: yield None
    return

如果可行,但似乎有线。 谁有更好的主意?

谢谢,

trans by 2020-01-29T09:42:13Z

python-列表字典的笛卡尔积

我正在尝试编写一些代码来测试一堆输入参数的笛卡尔积。

我看过itertools,但是它的product功能并不是我想要的。 是否有一种简单明了的简单方法来制作一个字典,每个字典中有任意数量的键和任意数量的元素,然后生成具有下一个排列的字典?

输入:

options = {"number": [1,2,3], "color": ["orange","blue"] }
print list( my_product(options) )

输出示例:

[ {"number": 1, "color": "orange"},
  {"number": 1, "color": "blue"},
  {"number": 2, "color": "orange"},
  {"number": 2, "color": "blue"},
  {"number": 3, "color": "orange"},
  {"number": 3, "color": "blue"}
]
trans by 2020-01-24T02:43:46Z

python-此lambda / yield / generator理解如何工作?

我今天在浏览我的代码库,发现了这一点:

def optionsToArgs(options, separator='='):
    kvs = [
        (
            "%(option)s%(separator)s%(value)s" %  
            {'option' : str(k), 'separator' : separator, 'value' : str(v)}
        ) for k, v in options.items()
    ]
    return list(
        reversed(
            list(
                    (lambda l, t: 
                        (lambda f: 
                            (f((yield x)) for x in l)
                        )(lambda _: t)
                    )(kvs, '-o')
                )
            )
        )

似乎要听一些参数,然后将它们变成shell命令的参数列表。 看来它正在生成器理解中使用yield,我认为这是不可能的...?

>>> optionsToArgs({"x":1,"y":2,"z":3})
['-o', 'z=3', '-o', 'x=1', '-o', 'y=2']

它是如何工作的?

trans by 2020-01-24T02:28:29Z

javascript-检查函数是否为gen

我在Nodejs v0.11.2中使用了生成器,我想知道如何检查函数的自变量是生成器函数。

我找到了typeof f === 'function' && Object.getPrototypeOf(f) !== Object.getPrototypeOf(Function)的这种方式,但是我不确定这是否很好(并且将来会继续工作)。

您对此问题有何看法?

trans by 2020-01-05T22:18:10Z

在Python中获取生成器的第n个项

有没有一种语法更简洁的方式编写以下内容?

gen = (i for i in xrange(10))
index = 5
for i, v in enumerate(gen):
    if i is index:
        return v

生成器应该具有gen[index]表达式,这似乎是很自然的,该表达式充当列表,但在功能上与上述代码相同。

trans by 2020-01-02T11:12:47Z

generator-Python中yield表达式的结果是什么?

我知道yield将函数转换为生成器,但是yield表达式本身的返回值是多少? 例如:

def whizbang(): 
    for i in range(10): 
        x = yield i

执行此函数时变量x的值是什么?

我已经阅读了Python文档:[http://docs.python.org/reference/simple_stmts.html#grammar-token-yield_stmt],并且似乎没有提及yield表达式本身的值。

trans by 2019-12-24T18:48:02Z

python-为什么下一步会引发“ StopIteration”,而“ for”却会正常返回?

在这段代码中,为什么使用StopIteration不会导致return None还是GeneratorExit循环捕获了所有异常然后静默退出?在这种情况下,为什么会有多余的return? 还是raise StopIteration由:return None

#!/usr/bin/python3.1
def countdown(n):
    print("counting down")
    while n >= 9:
        yield n
        n -= 1
    return

for x in countdown(10):
    print(x)

c = countdown(10)
next(c)
next(c)
next(c)

假设StopIteration由以下人员触发:return None。什么时候生成GeneratorExit

def countdown(n):
    print("Counting down from %d" % n)
    try:
        while n > 0:
            yield n
            n = n - 1
    except GeneratorExit:
        print("Only made it to %d" % n)

如果我手动执行以下操作:

c = countdown(10)
c.close() #generates GeneratorExit??

在这种情况下,为什么看不到追溯?

trans by 2019-11-14T18:13:21Z

在python中,有没有一种方法可以在调用函数之前检查它是否为“生成器函数”?

可以说我有两个功能:

def foo():
  return 'foo'

def bar():
  yield 'bar'

第一个是普通函数,第二个是生成器函数。 现在我要写这样的东西:

def run(func):
  if is_generator_function(func):
     gen = func()
     gen.next()
     #... run the generator ...
  else:
     func()

goo()的简单实现将是什么样子? 使用goo()程序包,我可以测试gen是否为发电机,但是我希望在调用func()之前先进行测试。

现在考虑以下情况:

def goo():
  if False:
     yield
  else:
     return

调用goo()将返回一个生成器。 我假设python解析器知道goo()函数具有yield语句,并且我想知道是否有可能轻松获得该信息。

谢谢!

trans by 2019-11-12T18:49:52Z

带有条件生成器表达式的意外行为

这个问题在这里已有答案:

  • 生成器表达式使用生成器创建后分配的列表                                     5个答案

我正在运行一段代码,该代码在程序的某个部分意外出了逻辑错误。 在研究本节时,我创建了一个测试文件来测试正在运行的语句集,并发现了一个看起来很奇怪的异常错误。

我测试了以下简单代码:

array = [1, 2, 2, 4, 5] # Original array
f = (x for x in array if array.count(x) == 2) # Filters original
array = [5, 6, 1, 2, 9] # Updates original to something else

print(list(f)) # Outputs filtered

输出为:

>>> []

是的,什么都没有。 我期望过滤器理解能获得2中计数的数组中的项目并输出,但是我没有得到:

# Expected output
>>> [2, 2]

当我注释掉第三行再次对其进行测试时:

array = [1, 2, 2, 4, 5] # Original array
f = (x for x in array if array.count(x) == 2) # Filters original
### array = [5, 6, 1, 2, 9] # Ignore line

print(list(f)) # Outputs filtered

输出正确(您可以自己测试):

>>> [2, 2]

在某一时刻,我输出了变量f的类型:

array = [1, 2, 2, 4, 5] # Original array
f = (x for x in array if array.count(x) == 2) # Filters original
array = [5, 6, 1, 2, 9] # Updates original

print(type(f))
print(list(f)) # Outputs filtered

我得到:

>>> <class 'generator'>
>>> []

为什么在Python中更新列表会更改另一个生成器变量的输出? 我觉得这很奇怪。

trans by 2019-11-08T13:29:56Z

生成器可以递归吗?

我天真地尝试创建一个递归生成器。 没用 这是我所做的:

def recursive_generator(lis):
    yield lis[0]
    recursive_generator(lis[1:])

for k in recursive_generator([6,3,9,1]):
    print(k)

我所得到的只是第一项yield

有没有办法使这种代码起作用? 在递归方案中,本质上是将yield命令转移到上述级别吗?

trans by 2019-11-03T07:39:41Z

1 2 3 下一页 共3页