相关疑难解决方法(0)

Python函数返回列表还是作为生成器工作?

我正在尝试创建一个返回对象或作为生成器的函数.

这是一个坏主意,因为作为一种最佳实践,您希望函数可靠地返回相同类型的值,但为了科学的利益......

我正在使用Python 2,因此range返回一个列表,并且xrange是一个可迭代的(有趣的是也提供了一个__len__).

def xr(start, stop=None, step=1, gen=True):
    if stop is None:
        start, stop = 0, start
    if gen == True:
        for i in xrange(start, stop, step):
            yield i
    else:
        return range(start, stop, step)
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

  File "<stdin>", line 8
SyntaxError: 'return' with argument inside generator
Run Code Online (Sandbox Code Playgroud)

问题:

为什么(除了显而易见的"你不能同时在函数中产生和返回",假设是正确的)它是否这样做?看看我的代码,不清楚为什么这样做会很糟糕.

我怎么试图绕过这个?我知道我可以返回xrange而不是从xrange中产生每个项目,所以我可以返回在另一个函数中创建的生成器,但是有更好的方法吗?

python generator

3
推荐指数
2
解决办法
1612
查看次数

模拟 python 中 findWhere() 的行为

Underscore 有一个方便的小函数findWhere(),可用于在列表中查找特定结构,例如

myList = [
  {'name': 'Thor'},
  {'name': 'Odin'},
  {'name': 'Freya'},
  {'name': 'Skadi'}
];
findWhere(myList, {'name': 'Skadi'});
Run Code Online (Sandbox Code Playgroud)

结果:[{'name': 'Skadi'}]

更好的例子:

my_list = [
   {'name': 'Thor',
    'occupation': 'God of Thunder',
    'favorite color': 'MY HAMMER'}
   {'name': 'Skadi',
   'occupation': 'Queen of the Ice Giants',
   'favorite color': 'purpz'}
  ]
findWhere(my_list, {'name': 'Skadi'})
Run Code Online (Sandbox Code Playgroud)

结果:

[{'name': 'Skadi',
'occupation': 'Queen of the Ice Giants',
'favorite color': 'purpz'}]
Run Code Online (Sandbox Code Playgroud)

唉,我在 python 中找不到类似的东西。实现相同功能的 Python 方式是什么?

javascript python underscore.js

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

使用产量的函数有多少内存?

我无法理解yield关键字.
我理解程序执行时会发生什么影响,但我真的不明白它使用了多少内存.

我将尝试用例子来解释我的怀疑.
假设我们有三个功能:

HUGE_NUMBER = 9223372036854775807

def function1():
    for i in range(0, HUGE_NUMBER):
        yield i

def function2():
    x = range(0, HUGE_NUMBER)
    for i in x:
        yield i

def function3(file):
    with open(file, 'r') as f:
        dictionary = dict(csv.reader(f, delimiter = ' '))
    for k,v in dictionary.iteritems():
        yield k,v
Run Code Online (Sandbox Code Playgroud)

如果我迭代第一个函数返回的生成器,那么巨大的范围是否实际存储在内存中?

第二个功能怎么样?

如果我迭代第三个函数返回的生成器,那么我的程序会使用更少的内存(而不是仅仅创建该字典并直接迭代它)吗?

python memory yield generator

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

_,在Golang中意味着什么?

我是Go的新手,在浏览其他一些主题时遇到了这行代码:

if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err)
Run Code Online (Sandbox Code Playgroud)

_之后是什么意思?是否指定将在if条件中分配某些内容(因为它似乎发生在err中)?我在维基上找不到这种语法的例子,我很好奇看到它的用途.

这是我正在看的线程的链接,如果它有帮助: 如何检查Go中是否存在文件?

go

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

可以同时运行两个无限循环吗?

我希望能够同时while True运行两个循环.这可能吗?

我是Python的新手,所以我不知道如何解决这个问题.

这是我制作的代码:

import time

def infiniteLoop():
    while True:
        print('Loop 1')
        time.sleep(1)

infiniteLoop()

while True:
    print('Loop 2')
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

现在,它只打印一个'循环1'

提前致谢

python loops

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

为什么 wordnet 中的 NLTK wn.all_synsets() 函数不返回同义词集列表?

我为这个问题编写代码:

没有下义词的名词同义词集的百分比是多少?您可以使用 wn.all_synsets('n') 获取所有名词同义词集。

这是我的代码:

import nltk
from nltk.corpus import wordnet as wn

all_noun = wn.all_synsets('n')
print(all_noun)
print(wn.all_synsets('n'))
all_num = len(set(all_noun))
noun_have_hypon = [word for word in wn.all_synsets('n') if len(word.hyponyms()) >= 1]
noun_have_num = len(noun_have_hypon)
print('There are %d nouns, and %d nouns without hyponyms, the percentage is %f' %
  (all_num, noun_have_num, (all_num-noun_have_num)/all_num*100))
Run Code Online (Sandbox Code Playgroud)

当我运行这段代码时,输​​出是

<generator object all_synsets at 0x10927b1b0>

<generator object all_synsets at 0x10e6f0bd0>

有名词 82115 个,无下位词名词 16693 个,百分比为 79.671193

但如果改变

noun_have_hypon = [word for word in wn.all_synsets('n') if len(word.hyponyms()) >= …

python nlp generator nltk wordnet

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

在scrapy 1.3中,收益请求和退货请求有什么区别?

似乎它们提供了相同的功能,最终通过管道或提要返回字典或项。我有理由要一个使用另一个吗?

scrapy

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

函数生成器Python

我试图实现一个函数发生器使用n次.我的想法是创建一个生成器对象,然后将该对象分配给另一个变量,并将重新分配的变量作为函数调用,例如:

def generator:
   [...]
   yield ...

for x in xrange(10):
   function = generator
   print function(50)
Run Code Online (Sandbox Code Playgroud)

当我调用print函数时,我发现function(50)没有调用它.相反,输出是:<generator object...>.我试图通过将此函数分配给生成器函数10次并使用此新变量作为生成器函数来尝试使用此函数.

我怎么能纠正这个?

python generator

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

如何在不破坏循环的情况下返回值?

我想知道如何在不破坏Python循环的情况下返回值.

这是一个例子:

def myfunction():
    list = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    print(list)
    total = 0
    for i in list:
        if total < 6:
            return i  #get first element then it breaks
            total += 1
        else:
            break

myfunction()
Run Code Online (Sandbox Code Playgroud)

return 只会得到第一个答案,然后离开循环,我不希望这样,我想返回多个元素,直到该循环结束.

如何解决这个问题,有什么解决方案吗?

python function return-value

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

Python的迭代是否真的将所有值存储在内存中?

我正在阅读e-satisf'回答"yield"关键字在Python中的作用?.他说:

这些迭代很方便,因为你可以根据自己的意愿阅读它们,但是你将所有的值存储在内存中,当你有很多值时,这并不总是你想要的

我真的不同意.但我不能在那里发表评论.

然后是这个问题:Python的迭代是否真的将所有值存储在内存中?

我曾经这么认为.但是自从我昨天看到Python的详细文档以来,我改变了我的观点.

>>> import sys
>>> def gen(): 
...   n = 0                                                                                          
...   while n < 10:                                                                                 
...     yield n                                                                                     
...     n += 1
...
>>> a = [0,1,2,3,4,5,6,7,8,9]
>>> b = range(10)  # b is a range object, which is a iterable
>>> c = gen(10)    # c is a iterator, which is a iterable too
>>> sys.getsizeof(a)
144
>>> sys.getsizeof(b)
48
>>> sys.getsizeof(c)
72
>>> B = list(b)                                                                                     
>>> C = list(c)                                                                                     
>>> …
Run Code Online (Sandbox Code Playgroud)

python iterable

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