迭代步骤和迭代传递在python中是否相同?

时间:2019-09-14 15:03:50

标签: python

我正试图弄清楚迭代步骤是什么。

wikipedia给出了有关迭代的解释

  

计算迭代是一种技术,用于在计算机程序中的语句块中标记出一定数量的重复项。该语句块被称为迭代语句。计算机科学家也可能将该语句块称为“迭代”。

Python doc

  

Python中的for语句与您在C或Pascal中使用的语句有些不同。而不是总是遍历数字的算术级数(例如在Pascal中),或者让用户能够定义迭代步骤和暂停条件(如C)...

考虑此示例

FROM node:8.16.0-slim

ARG NODE_ENV=development

ENV NODE_ENV=${NODE_ENV}

RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

WORKDIR /home/node/app

# The package files should use Docker cache system
COPY ./foobar-blog-ui/package*.json .
COPY ./foobar-blog-ui/yarn.lock .

RUN yarn global add gatsby-cli
RUN yarn install

RUN apt-get update
RUN apt-get install -y rsync vim git libpng-dev libjpeg-dev libxi6 build-essential libgl1-mesa-glx

EXPOSE 8000

很明显,步骤的总数等于3。

在下面的代码中,步骤的总数等于3。

@media (max-width: 896px) and (min-aspect-ratio: 13/9){/* Landscape content*/}

此代码在一个迭代步骤中打印i ^ 2,一个迭代步骤也称为迭代遍历。

我的理解正确吗?

2 个答案:

答案 0 :(得分:1)

在C中,迭代步骤是for循环的第三部分。在您的示例中,它是i++。每次循环时,该代码会将值增加一。 Python的for循环没有一个等效的概念,因为它们在可迭代对象上进行迭代,这些对象负责根据自己的意愿生成自己的值。并非所有可迭代对象都具有C风格的迭代步骤的有意义的概念。

也就是说,与Python中经典C风格的for循环最直接的类比是for对象上的range循环。 range对象确实具有一个step,尽管它默认为1,所以您可能并不总是看到它被明确指定。将C循环不必要地翻译成Python是:

for i in range(1, 4, 1): # the 1 last 1 could be omitted, since it's the default
    ...

该迭代将从第一个迭代的i开始向1赋值(从传递给范围的第一个1开始)。当值变为(或通过)4(相当于C循环中的<= 3条件)时,它将停止。迭代步骤为1,等效于i++

在执行其他奇数种循环时(例如将偶数从10倒计数到零),指定该步骤会更加有用:

for i in range(10, -1, -2): # 10, 8, 6, ..., 0
    ...

在C中应该是:

for (i = 10; i > -1; i -= 2) {}

答案 1 :(得分:1)

步骤不是与 pass 相反的迭代概念,它与计数器有关。

在您的 C 示例中,i是一个计数器。计数器的起始值为1步骤也等于1停止条件说:“如果计数器小于或等于3-结束循环”。在这种情况下,for循环内的代码将被传递3次。或者换句话说,它将进行3次迭代(重复)。

采取另一种情况:for (i = 0; i <= 15; i = i + 3)。在这里,步骤等于3,但通过的次数等于5。如果步骤5,则通过的次数将减少并等于3

因此,步骤计数器增长或降低的速度。 通过次数是结果值,取决于:计数器,步进,暂停条件。请记住,由于breakreturn语句或运行时错误,每次传递都可能是最后一次。

相同的逻辑可以应用于 Python

start = 0
end = 16
step = 3
for i in range(start, end, step):
    pass

注意pass语句吗?它特别适合您的问题。 有关pass的信息:How to use the pass statement?

但是尽管可以将相同的逻辑应用于 Python ,但for循环在幕后的工作方式完全不同。如果您有兴趣,建议您观看CPython internals - Iterators - Lecture 7

现在,考虑您的 Python的示例:

>>> mylist = [1, 2, 3]
>>> for i in mylist:
...    print(i**2)

mylist是一个序列对象,它具有迭代器对象,该对象知道应该处理此序列。如果您观看我上面提供的视频,您将了解我在说什么。

某些迭代器对象自身隐藏并维护startstopstep变量。还有其他使用其他数据结构的文件,例如链表。他们正在通过另一种方式确定迭代的数量。传递并没有进行到任何地方,这里的循环重复了3次,因为mylist迭代器返回了3个项目。

结论:不,通过和步骤在 Python C 中是不同的。步长决定通过次数。