我有过Java / C#/ C ++和for循环的经验,或者几乎没有完全相同的经验。现在我通过Codecademy学习Python。我发现它向我解释循环的方式很差。他们给你的代码是
my_list = [1,9,3,8,5,7]
for number in my_list:
# Your code here
print 2 * number
这是说for every number in my_list ... print 2 * number
。
如果那是真的,那对我来说有点意义,但我没有得到number
以及它是如何工作的。它甚至不是先前声明的变量。你是否用for循环声明变量? Python如何知道该数字正在访问my_list
中的值并将它们乘以2?另外,for循环如何处理除列表之外的其他东西,因为我已经查看了包含for循环的其他Python代码,它们毫无意义。您能否找到一些方法来解释这些类似于C#for循环的方式,或者只是解释Python for循环。
答案 0 :(得分:1)
与C#相关的快速答案是,Python for
循环大致相当于C#foreach
循环。 C ++类似的设施(例如BOOST_FOREACH
或C ++ 11中的for
语法),但C没有等价物。
在C风格的for (initial; condition; increment)
样式循环中没有Python的等价物。
Python for
循环可以迭代不仅仅是列表;他们可以迭代任何 iterable 。请参阅示例What makes something iterable in python。
答案 1 :(得分:1)
是,number是新定义的变量。 Python在使用它们之前不需要声明变量。并且对循环迭代的理解是正确的。
这是与使用Borne风格的shell相同的sytnax(例如bash)。
for循环的逻辑是这样的:为命名变量分配列表中的下一个值,迭代,重复。
<强>校正强> 至于其他非列表值,它们应该转换为python中的序列。试试这个:
val="1 2 3"
for number in val:
print number
注意这会打印“1”,“”,“2”,“”,“3”。
这是一个有用的参考:http://www.tutorialspoint.com/python/python_for_loop.htm。
答案 2 :(得分:1)
Python不需要声明变量,它可以在初始化时声明自己
while和do while类似于那些语言,但for循环在python中是完全不同的
你可以将它用于类似于每个的列表 但是为了另一个目的,比如从1到10,你可以使用,
for number in range(10):
print number
答案 3 :(得分:0)
Python for循环应该与C#foreach循环非常相似。它逐步执行my_list,在每一步中,您都可以使用“数字”来尊重列表中的元素。
如果你想在迭代时访问列表索引以及列表元素,通常的习惯用法是使用g“枚举函数:
for (i, x) in enumerate(my_list):
print "the", i, "number in the list is", x
foreach循环应该类似于以下的desugared代码:
my_iterator = iter(my_list)
while True:
try:
number = iter.next()
#Your code here
print 2*number
except StopIteration:
break
答案 4 :(得分:0)
在Python中,您不需要声明变量。在这种情况下,number
变量是通过在循环中使用它来定义的。
至于循环结构本身,它类似于C ++ 11 range-based for
loop:
std::vector<int> my_list = { 1, 9, 3, 8, 5, 7 };
for (auto& number : my_list)
std::cout << 2 * number << '\n';
这当然可以在使用std::for_each
之前使用合适的函子对象(当然可能是C ++ 11 lambda表达式)在C ++ 11之前实现。
Python没有与普通的C风格for
循环等效的东西。
答案 5 :(得分:0)
Python使用协议(使用特殊命名的方法进行鸭子输入,使用双下划线进行前后固定)。 Java中的等价物是接口或抽象基类。
在这种情况下,Python中实现the iterator
protocol的任何内容都可以在for
循环中使用:
class TheStandardProtocol(object):
def __init__(self):
self.i = 0
def __iter__(self):
return self
def __next__(self):
self.i += 1
if self.i > 15: raise StopIteration()
return self.i
# In Python 2 `next` is the only protocol method without double underscores
next = __next__
class TheListProtocol(object):
"""A less common option, but still valid"""
def __getitem__(self, index):
if index > 15: raise IndexError()
return index
然后我们可以在for
循环中使用任一类的实例,一切都能正常工作:
standard = TheStandardProtocol()
for i in standard: # `__iter__` invoked to get the iterator
# `__next__` invoked and its return value bound to `i`
# until the underlying iterator returned by `__iter__`
# raises a StopIteration exception
print i
# prints 1 to 15
list_protocol = TheListProtocol()
for x in list_protocol: # Python creates an iterator for us
# `__getitem__` is invoked with ascending integers
# and the return value bound to `x`
# until the instance raises an IndexError
print x
# prints 0 to 15
Java中的等价物是Iterable
和Iterator
接口:
class MyIterator implements Iterable<Integer>, Iterator<Integer> {
private Integer i = 0;
public Iterator<Integer> iterator() {
return this;
}
public boolean hasNext() {
return i < 16;
}
public Integer next() {
return i++;
}
}
// Elsewhere
MyIterator anIterator = new MyIterator();
for(Integer x: anIterator) {
System.out.println(x.toString());
}
答案 6 :(得分:0)
非常类似于这个Java循环:Java for loop syntax: "for (T obj : objects)"
在python中没有必要声明变量类型,这就是number
没有类型的原因。
答案 7 :(得分:0)
我将尽可能以基本的方式向您解释 python for 循环:
假设我们有一个清单:
a = [1, 2, 3, 4, 5]
在我们跳转到for循环之前,让我告诉你我们在声明变量时不必在python中初始化变量类型。
int a,str a不是必需的。
现在让我们进行循环。
for i in a:
print 2*i
现在,它做了什么?
循环将从第一个元素开始,
i is replaced by 1
并将其乘以2并显示。在完成1后,它将跳到2.
关于你的另一个问题:
Python在其执行中知道其变量类型:
>>> a = ['a', 'b', 'c']
>>> for i in a:
... print 2*i
...
aa
bb
cc
>>>