我正试图弄清楚迭代步骤是什么。
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,一个迭代步骤也称为迭代遍历。
我的理解正确吗?
答案 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
。
因此,步骤是计数器增长或降低的速度。 通过次数是结果值,取决于:计数器,步进,暂停条件。请记住,由于break
,return
语句或运行时错误,每次传递都可能是最后一次。
相同的逻辑可以应用于 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
是一个序列对象,它具有迭代器对象,该对象知道应该处理此序列。如果您观看我上面提供的视频,您将了解我在说什么。
某些迭代器对象自身隐藏并维护start
,stop
,step
变量。还有其他使用其他数据结构的文件,例如链表。他们正在通过另一种方式确定迭代的数量。传递并没有进行到任何地方,这里的循环重复了3
次,因为mylist
迭代器返回了3
个项目。
结论:不,通过和步骤在 Python 和 C 中是不同的。步长决定通过次数。