在Perl 5.10中,我可以说:
sub foo () {
state $x = 1;
say $x++;
}
foo();
foo();
foo();
Run Code Online (Sandbox Code Playgroud)
......它会打印出来:
1
2
3
Run Code Online (Sandbox Code Playgroud)
Python有这样的东西吗?
所以,我一直在阅读这篇文章,并了解了如何向生成器发送值.
而现在我有点困惑.产量是陈述还是表达?它不像函数一样使用括号语法,所以它看起来像语句.但它返回值,所以它就像表达式.
就在不久前,我已经开始讨论"为什么python没有'如果x = foo():( ...)'?" (为什么我们不能在if语句条件中分配).我说,语句是原子的,所以赋值语句和if语句应该分开.现在,我不知道该怎么想.
==编辑==
我做了我公平的阅读.
http://docs.python.org/2/reference/expressions.html#generator.send - "value参数成为当前yield表达式的结果."
因此,产生HAS值.我明白了,所有的文档都说这是一个陈述,但如果陈述可能有价值,那么表达和陈述之间的差异到底是什么?
另外,我知道什么是生成器,协同程序等等.我需要元语义或文档的语义:D
==最终答案==
当你做这样的事情:
for i in range(5):
print i
Run Code Online (Sandbox Code Playgroud)
Python做什么?它首先使用[0,1,2,3,4]生成一个数组,然后遍历打印它的每个项目吗?相近:
for i in [0,1,2,3,4]:
print i
Run Code Online (Sandbox Code Playgroud)
或者是否在生成它们时打印每个数字?就像是:
生成0将0分配给i打印i
生成1 - >将1分配给i - >打印i
生成2 - >将2分配给i - >打印i
生成3 - >将3分配给i - >打印i
生成4 - >将4分配给i - >打印i
更新
我添加了Python 2.7的标签.我不认为我的问题是版本特定的,但它似乎是!
现在我正在使用Python 2.7,所以我的问题就是这个.但我发现将Python 2范围与Python 3范围进行比较的信息非常有价值.
我在合并和拆分部分偶然发现了pymotw.com的这段代码。
from itertools import *
def make_iterables_to_chain():
yield [1, 2, 3]
yield ['a', 'b', 'c']
for i in chain.from_iterable(make_iterables_to_chain()):
print(i, end=' ')
print()
Run Code Online (Sandbox Code Playgroud)
我不明白make_iterables_to_chain()的工作方式。它包含两个yield语句,它如何工作?我知道生成器是如何工作的,但是那里只有一个yield语句。
请帮忙!
可能重复:
解释了Python yield关键字
好吧,我可能很难说这个问题,但这就是我的情况.
我在Python 2.7中有这行代码,我试图理解:
yield (padding_zeros + number_string).encode("ascii")
Run Code Online (Sandbox Code Playgroud)
在这行代码中,padding_zeros是一个变量数为0的字符串,是一个字符串number_string形式的数字,可以是0到10000之间的任何数字.
我非常有信心.encode("ascii")将yield的输出转换为ascii.
我完全在海上讲的是它的yield (padding_zeros + number_string)作用.
我知道它启动了一个生成器,但我花了很多时间在线搜索并阅读语法,但我仍然无法弄清楚生成器实际上做了什么.这是我第一次看python没有帮助(我的最终目标是将此代码转换为C#).
那么,基本上,请有人向我解释这行代码的作用是什么?它只是将两个字符串加在一起还是做了一些更复杂的事情?
对于进一步的上下文,这是该行代码出现的块:
for current_length in range(4, max_length + 1):
for i in range(0, pow(10, current_length)):
number_string = str(i)
padding_zeros = "0" * (current_length - len(number_string))
yield (padding_zeros + number_string).encode("ascii")
Run Code Online (Sandbox Code Playgroud)
(max_length正如它听起来的那样 - 一个表示某事物最大长度的数字)
提前感谢任何和所有的答案(即使他们告诉我不要这样一个毛躁的菜鸟):)
编辑:非常感谢你的答案 - 即使我只选择一个作为最好的答案,他们都非常有帮助.还要感谢评论 - 正如其中一些人指出的那样,"yield"关键字在Python中有什么作用?对于产量,生成器和迭代,它是一个非常好的通用指南,即使我没有找到它对我的具体情况的答案:)
我有兴趣实现一个我读过的特定的Shellsort方法,它具有与bitonic排序相同的时间复杂度.然而,对于任何整数p和q,它要求间隙序列是满足表达式2 ^ p*3 ^ q的数字序列[1,N-1].在外行人的术语中,该范围内的所有数字只能被2和3整除一次.是否有相对有效的方法来生成此序列?
在NLTK中,如何遍历已解析的句子以返回名词短语字符串列表?
我有两个目标:
(1)创建名词短语列表,而不是使用'traverse()'方法打印它们.我目前使用StringIO来记录现有traverse()方法的输出.这不是一个可接受的解决方案.
(2)解析名词短语字符串,以便:'(NP Michael/NNP Jackson/NNP)成为'Michael Jackson'.在NLTK中有解除解析的方法吗?
NLTK文档建议使用traverse()来查看名词短语,但是如何在这个递归方法中捕获't',以便生成一个字符串名词短语列表?
from nltk.tag import pos_tag
def traverse(t):
try:
t.label()
except AttributeError:
return
else:
if t.label() == 'NP': print(t) # or do something else
else:
for child in t:
traverse(child)
def nounPhrase(tagged_sent):
# Tag sentence for part of speech
tagged_sent = pos_tag(sentence.split()) # List of tuples with [(Word, PartOfSpeech)]
# Define several tag patterns
grammar = r"""
NP: {<DT|PP\$>?<JJ>*<NN>} # chunk determiner/possessive, adjectives and noun
{<NNP>+} # chunk sequences of proper nouns
{<NN>+} # …Run Code Online (Sandbox Code Playgroud) 我正在尝试读取和处理1000个文件,但不幸的是,处理文件的时间大约是从磁盘读取文件的3倍,因此我希望在读入时处理这些文件(当我在我继续阅读其他文件).
在一个完美的世界中,我有一个一次读取一个文件的生成器,我想将这个生成器传递给一个工作池,这些工作器在(缓慢)生成时处理来自生成器的项目.
这是一个例子:
def process_file(file_string):
...
return processed_file
pool = Pool(processes=4)
path = 'some/path/'
results = pool.map(process_file, (open(path+part,'rb').read() for part in os.listdir(path)))
Run Code Online (Sandbox Code Playgroud)
上面代码的唯一问题是在池开始之前所有文件都被读入内存,这意味着我需要等待磁盘读取所有内容,并且还消耗大量内存.
我手动构建了一个数据生成器,产生[input, target]每个调用的元组.我将我的发生器设置为每个时期对训练样本进行洗牌.然后我fit_generator用来调用我的generator,但是在这个函数的"shuffle"参数中混淆:
fit_generator(self, generator, steps_per_epoch=None, epochs=1, verbose=1, callbacks=None, validation_data=None, validation_steps=None, class_weight=None, max_queue_size=10, workers=1, use_multiprocessing=False, shuffle=True, initial_epoch=0)
Run Code Online (Sandbox Code Playgroud)
来自Keras API:
shuffle:是否在每个时代开始时改组批次的顺序.仅用于Sequence的实例(keras.utils.Sequence)
我认为"洗牌"应该是工作的generator.当我的自定义generator决定在每次迭代中输出哪个批次时,它如何改变批次的顺序?
我决定不浪费我的暑假开始学习 Python。我想我会开始学习循环技术,所以我想从一个基本的数字列表开始,也就是写一个 for 循环来生成数字 1 - 10。
这就是我所拥有的:
def generateNumber(num):
i=0
for i in range(num):
return i
return i
Run Code Online (Sandbox Code Playgroud)
并且代码不起作用。我想在这样的列表中得到一个输出:
>>> generateNumber(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)