我正在尝试创建一个返回对象或作为生成器的函数.
这是一个坏主意,因为作为一种最佳实践,您希望函数可靠地返回相同类型的值,但为了科学的利益......
我正在使用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中产生每个项目,所以我可以返回在另一个函数中创建的生成器,但是有更好的方法吗?
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 方式是什么?
我无法理解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)
如果我迭代第一个函数返回的生成器,那么巨大的范围是否实际存储在内存中?
第二个功能怎么样?
如果我迭代第三个函数返回的生成器,那么我的程序会使用更少的内存(而不是仅仅创建该字典并直接迭代它)吗?
我是Go的新手,在浏览其他一些主题时遇到了这行代码:
if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err)
Run Code Online (Sandbox Code Playgroud)
_之后是什么意思?是否指定将在if条件中分配某些内容(因为它似乎发生在err中)?我在维基上找不到这种语法的例子,我很好奇看到它的用途.
这是我正在看的线程的链接,如果它有帮助: 如何检查Go中是否存在文件?
我希望能够同时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'
提前致谢
我为这个问题编写代码:
没有下义词的名词同义词集的百分比是多少?您可以使用 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()) >= …
我试图实现一个函数发生器使用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循环的情况下返回值.
这是一个例子:
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 只会得到第一个答案,然后离开循环,我不希望这样,我想返回多个元素,直到该循环结束.
如何解决这个问题,有什么解决方案吗?
我正在阅读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)