2

我在 Java/C#/C++ 和 for 循环方面有经验,或者几乎没有完全一样的经验。现在我正在通过 Codecademy 学习 Python。我发现它试图向我解释 for 循环的方式很糟糕。他们给你的代码是

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 循环。

4

8 回答 8

1

与 C# 相关的快速答案是 Pythonfor循环大致相当于 C#foreach循环。C++ 有类似的功能(BOOST_FOREACH例如,或forC++11 中的语法),但 C 没有等价物。

Python 中没有对应的 Cfor (initial; condition; increment)样式循环。

Pythonfor循环可以迭代的不仅仅是列表;他们可以迭代任何可迭代的东西。例如,参见What makes something iterable in python

于 2013-08-27T03:53:19.040 回答
1

是的,数字是一个新定义的变量。Python 不需要在使用变量之前声明变量。并且对循环迭代的理解是正确的。

这与使用的 sytnax Borne 样式的 shell(例如 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 。

于 2013-08-27T03:53:39.847 回答
1

Python不需要声明变量,它可以在初始化时自行声明

While 和 do while 与那些语言相似,但 for 循环在 python 中完全不同

您可以将其用于类似于 for each 的列表,但用于其他目的,例如从 1 运行到 10 您可以使用,

for number in range(10):
    print number
于 2013-08-27T03:56:21.500 回答
0

Python for 循环应该与 C# foreach 循环非常相似。它逐步遍历 my_list,并且在每一步中,您都可以使用“数字”来尊重列表中的该元素。

如果您想在迭代时访问列表索引以及列表元素,通常的习惯用法是使用 g "enumerate 函数:

for (i, x) in enumerate(my_list):
   print "the", i, "number in the list is", x

foreach 循环应该类似于以下脱糖代码:

my_iterator = iter(my_list)
while True:
   try:
     number = iter.next()
     #Your code here
     print 2*number
   except StopIteration:
      break
于 2013-08-27T03:55:25.673 回答
0

在 Python 中,您不需要声明变量。在这种情况下,number变量是通过在循环中使用来定义的。

至于循环构造本身,它类似于 C++11基于范围的for循环

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循环等效的功能。

于 2013-08-27T03:55:35.403 回答
0

Python 使用协议(使用特殊命名的方法进行鸭子类型化,使用双下划线进行前后固定)。Java 中的等价物是接口或抽象基类。

在这种情况下,Python 中任何实现iterator协议的东西都可以在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 中的等价物是IterableandIterator接口:

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());
}
于 2013-08-27T03:55:52.043 回答
0

非常类似于这个 Java 循环:Java for 循环语法:“for (T obj : objects)”

在 python 中不需要声明变量类型,这就是为什么number没有类型。

于 2013-08-27T03:56:45.220 回答
0

我将尝试以尽可能基本的方式向您解释python for循环:

假设我们有一个列表:

a = [1, 2, 3, 4, 5]

在我们进入 for 循环之前,让我告诉你我们不必在声明变量时在 python 中初始化变量类型。

int a, str a 不是必需的。

现在让我们进入 for 循环。

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
>>> 
于 2013-08-27T04:00:41.203 回答