为了说明这个问题,假设我们有这个简单的生成器:
def firstn(n):
num = 0
while num < n:
yield num
num += 1
for i in firstn(10):
print i
Run Code Online (Sandbox Code Playgroud)
这将打印数字 0 到 9。但是如果我们有:
def firstn(n):
num = 0
while num < 5 < n:
yield num
num += 1
for i in firstn(10):
print i
Run Code Online (Sandbox Code Playgroud)
(更改在while语句中。)然后它仅打印数字 0 到 4。一旦num >= 5,生成器将不再生成值。
我很好奇的是幕后发生的事情:我使用PythonTutor来逐步执行代码,我的印象是,一旦while语句不再True,函数就会隐式返回None,循环for以某种方式检测到,然后也断了。我使用next内置函数来更仔细地检查这一点:
>>> def firstn(n):
... num = 0
... while num …Run Code Online (Sandbox Code Playgroud) 我想访问生成器中相邻值的重叠对。
如果它是一个列表,我可以使用
a = [5, 7, 11, 4, 5]
for v, w in zip(a[:-1], a[1:]):
print [v, w]
Run Code Online (Sandbox Code Playgroud)
这是来自这个问题。
但是当我尝试对生成器执行相同操作时,出现错误
TypeError: 'generator' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)
有没有办法为发电机做到这一点?
这是一个无限循环程序,我添加了行号打印以方便跟踪程序执行。
def infinite_looper(objects):
count = 0
print("row 35")
while True:
print("row 37")
if count >= len(objects):
count = 0
print("Row 40")
message = yield objects[count]
print("row 42")
print("The message is "+str(message))
print("row 44")
if message != None:
count = 0 if message < 0 else message
print("row 47, count = "+str(count))
else:
count += 1
print("row 50")
print("Row 51")
x = infinite_looper("abcdefghijkl")
print("executing next 1st time")
print(next(x))
print("executing next 2nd time")
print(next(x))
print("executing send 1st time")
print(x.send(10))
Run Code Online (Sandbox Code Playgroud)
输出是:
executing next …Run Code Online (Sandbox Code Playgroud) 我正在开始开发新的 Ruby on Rails 6 应用程序,我需要找到默认的scaffold_controller 模板以及默认的视图文件:_form.html.erb、index.hmtl.erb、edit.html.erb 等。 .这样我就可以通过将它们放在 /lib/templates 文件夹中来自定义它们。
默认模板位于哪里,以便我可以将它们复制到 /lib/templates 文件夹并修改它们?
谢谢 !
我正在尝试做标题所说的事情,这就是我能弄清楚如何在 php 中做的所有事情。
<?php
$random = substr(md5(mt_rand()), 0, 8
echo $random;
?>
Run Code Online (Sandbox Code Playgroud) 乍一看,这个问题似乎非常基本且简单,但我在编写有效的解决方案时仍然遇到了一些困难。这个想法是编写一个函数,该函数将两个生成器作为输入并生成每个列表的一项。如果任一列表为空,它将生成剩余列表的每个项目。例子:
list(alternate("abcdefg", [1, 2, 3, 4])) == ["a", 1, "b",2, "c", 3, "d", 4, "e", "f", "g"]
Run Code Online (Sandbox Code Playgroud)
什么样的工作,但看起来很丑:
def alternate(xs1, xs2):
xs1 = iter(xs1)
xs2 = iter(xs2)
while xs1 and xs2:
try:
yield next(xs1), next(xs2)
except StopIteration:
for x1 in xs1:
yield x1
for x2 in xs2:
yield x2
Run Code Online (Sandbox Code Playgroud)
特别是我想避免在一开始就将输入转换为迭代器。我尝试使用 2 个简单的 for 循环,但这显然只返回每个列表的最后一个值,因为一个 for 循环在另一个循环开始之前完成。这不是一个解决我的问题的问题,我而是在寻找一些代码来提高编写代码的技能!
我正在尝试使用生成器进行斐波那契继承,但我的代码返回 2**a...
def fibonacci():
a, b = 0, 1
while True:
yield a
a = b
b = a + b
n = int(input("How long? "))
fib = fibonacci()
for i in range(n):
print(next(fib))
Run Code Online (Sandbox Code Playgroud) 我有漂亮的打印模块,我准备,因为我不高兴pprint模块生成zillion行的数字列表有一个列表列表.以下是我的模块的示例用法.
>>> a=range(10)
>>> a.insert(5,[range(i) for i in range(10)])
>>> a
[0, 1, 2, 3, 4, [[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7, 8]], 5, 6, 7, 8, 9]
>>> import pretty
>>> pretty.ppr(a,indent=6)
[0, 1, 2, 3, 4,
[
[],
[0], …Run Code Online (Sandbox Code Playgroud) a=[['1','3','2'],['11','22','33']]
k = [(float(a[i][j]) for j in range(0,3)) for i in range(0,2)]
>>> print k
[<generator object <genexpr> at 0x7f1a9d568f50>, <generator object <genexpr> at 0x7f1a9d568fa0>]
Run Code Online (Sandbox Code Playgroud)
但我想得到[(1,3,2),(11,22,33)]为什么列表理解产生一个发电机?
假设我有一份清单清单.子列表本身可以包含子列表.将所有子列表的所有元素转换为特定类型的有效方法是什么?
让我们说它像这样凌乱:
a = [
1,
2,
3,
[
"a",
"b"
],
[
10,
20,
[
"hello",
"world"
]
],
4,
5,
"hi",
"there"
]
Run Code Online (Sandbox Code Playgroud)
我的想法是将类似的内容转换为:
a = [
"1",
"2",
"3",
[
"a",
"b"
],
[
"10",
"20",
[
"hello",
"world"
]
],
"4",
"5",
"hi",
"there"
]
Run Code Online (Sandbox Code Playgroud)
请注意,我正在寻找处理任意深度的子列表的方法.我有一种感觉,可以使用发电机,但我不知道如何处理这个问题.