我刚刚在一周前了解了Python中的生成器.根据我的理解,'yield'返回一个生成器对象而不是整个数组.
这是我为获取整数的数字而编写的代码:
def getDigits(m):
for d in str(m):
yield int(m)
Run Code Online (Sandbox Code Playgroud)
这应该返回作为生成器对象传递给它的整数的数字.但当我这样做时:
for i in getDigits(123):
print i
Run Code Online (Sandbox Code Playgroud)
我得到的输出为:
123
123
123
Run Code Online (Sandbox Code Playgroud)
代替:
1
2
3
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事?难道我做错了什么?
我想知道,如果有可能创建变量并在Python上命名使用字符串和其他变量.这对我正在帮助我真的很有帮助.
例如,我想创建10个变量:
var0
var1
var2
...
Run Code Online (Sandbox Code Playgroud)
我尝试过这样的"for"循环:
for i in range(10):
'var'+str(i) = 0
Run Code Online (Sandbox Code Playgroud)
但它给了我一个错误.请帮忙!
任何帮助将非常感激.
可能重复:
Python生成器与迭代器之间的差异
生成器在Python中看起来很重要,偶尔会向它们添加新功能,依此类推.
据我所知,相反,生成器可以始终使用带有迭代器接口的对象.(通常)更简洁是发电机的唯一好处还是我错过了什么?
这很好用:
>>> def my_range(stop):
i = 0
while i < stop:
yield i
i += 1
>>> [k for k in my_range(10) if k < 5]
[0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
现在我修改我的发电机:
>>> def my_range():
i = 0
while True:
yield i
i += 1
>>> result = []
>>> for k in my_range():
if k < 5:
result.append(k)
else:
break
>>> print(result)
[0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
现在,为什么这个陷入无限循环?即使我有k <5.生成器是否应该只在下一次被调用时迭代?
>>> [k for k in my_range() if k < 5]
Run Code Online (Sandbox Code Playgroud) 我试图对一些itertools针对生成器和列表推导的方法进行基准测试.我的想法是,我想通过过滤基本列表中的一些条目来构建迭代器.
这是我提出的代码(在接受的答案后编辑):
from itertools import ifilter
import collections
import random
import os
from timeit import Timer
os.system('cls')
# define large arrays
listArrays = [xrange(100), xrange(1000), xrange(10000), xrange(100000)]
#Number of element to be filtered out
nb_elem = 100
# Number of times we run the test
nb_rep = 1000
def discard(it):
collections.deque(it, maxlen=0)
def testGenerator(arr, sample):
discard(x for x in sample if x in arr)
def testIterator(arr, sample):
discard(ifilter(sample.__contains__, arr))
def testList(arr, sample):
discard([x for x in sample if …Run Code Online (Sandbox Code Playgroud) 我试图使用随机生成器生成二维数组.基本上,每列应包含一个介于1-50之间的随机值,但不会重复,但问题是,我无法在同一行或程序中的任何其他行或列上获得重复值.换句话说,每个I整数应该只显示一次.我的对象是通过链表创建的,一旦我弄明白,我可能会将algorthim整合到那里,但是现在,继续我所做的.
int[] array = new int[50];
for(int i=1;i<=9;i++)
{
int[] grades = new int[5];
for(int j=0;j<=4;j++)
{
int unique = gen.nextInt(50)+1;
grades[j] = unique;
}
list.add(new Student(i, grades));
}
System.out.println(list);
Run Code Online (Sandbox Code Playgroud)
我的输出:
Student1: 20 49 45 16 13
Student2: 28 10 11 30 6
Student3: 13 25 37 31 49
Student4: 8 23 8 12 32
Student5: 22 18 35 2 7
Student6: 35 8 16 23 36
Student7: 35 3 15 42 2
Student8: 43 12 44 2 35
Student9: …Run Code Online (Sandbox Code Playgroud) 我有一个执行昂贵操作的功能,经常被调用; 但是,操作只需执行一次 - 其结果可以缓存.
我尝试制作一个无限的发电机,但我没有得到我预期的结果:
>>> def g():
... result = "foo"
... while True:
... yield result
...
>>> g()
<generator object g at 0x1093db230> # why didn't it give me "foo"?
Run Code Online (Sandbox Code Playgroud)
为什么不是g发电机?
>>> g
<function g at 0x1093de488>
Run Code Online (Sandbox Code Playgroud)
编辑:如果这种方法不起作用,这很好,但我需要的东西与常规函数完全相同,如下所示:
>>> [g() for x in range(3)]
["foo", "foo", "foo"]
Run Code Online (Sandbox Code Playgroud) 我想迭代一个字典的子集来找到子集中的最小值.我可以使用生成器表达式来获取值:
>>> S = {'a', 'c'}
>>> D = {'a': 2, 'b': 0, 'c': 1, 'd': 3}
>>> min(D[k] for k in S)
1
Run Code Online (Sandbox Code Playgroud)
要获得相关的密钥,我想这是可能的:
>>> subset_min = min(D[k] for k in S)
>>> [k for k, v in D.iteritems() if v == subset_min]
['c']
Run Code Online (Sandbox Code Playgroud)
但肯定有一种方法不需要再次搜索字典?我希望像这里min(D, key=D.get)讨论的那样,但在这种情况下我无法看到如何应用它.
有人能够帮助我吗?当我在Javascript中尝试计算时,它们似乎总是失败并以NaN的形式返回
function SpinRand()
{
var a,b,c,d,e,f;
a=Math.floor(Math.random()*9);
b=Math.floor(Math.random()*9);
c=Math.floor(Math.random()*9);
d=Math.floor(Math.random()*9);
e=Math.floor(Math.random()*9);
f=a+b+c+d+e+f;
alert(f);
}
Run Code Online (Sandbox Code Playgroud) 我做了一个简单的数字生成器,我有一个问题:生成器是否可以弹出"红色","蓝色","绿色","黄色"和"白色"而不是数字1-5?
namespace zufallsgenerator
{
public partial class Form1 : Form
{
Random r = new Random();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void btnWhlie_Click(object sender, EventArgs e)
{
int summe = 0, z;
lblAnzeige.Text = " ";
while (summe <= 0)
{
z = r.Next(1, 6);
summe = summe + z;
}
lblAnzeige.Text += summe + "\n";
}
}
}
Run Code Online (Sandbox Code Playgroud) generator ×10
python ×7
random ×3
iterator ×2
benchmarking ×1
c# ×1
caching ×1
dictionary ×1
for-loop ×1
java ×1
javascript ×1
linked-list ×1
loops ×1
math ×1
nan ×1
python-2.7 ×1
string ×1
variables ×1