请向C ++ / C#/ Java程序员解释Python for循环

时间:2013-08-27 03:50:21

标签: python loops for-loop

我有过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循环。

8 个答案:

答案 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中的等价物是IterableIterator接口:

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
>>>