何时在 Python 中使用“while”或“for”
- 2025-02-27 09:05:00
- admin 原创
- 63
问题描述:
在 Python 中,我什么时候应该使用while
循环或for
循环?看起来人们更喜欢使用for
循环(为了简洁?)。在特定情况下我应该使用其中一个吗?这是个人喜好的问题吗?到目前为止,我读过的代码让我认为它们之间存在很大差异。
解决方案 1:
是的,while 和 for 之间有很大区别。
for语句遍历集合、可迭代对象或生成器函数。
while语句只是循环直到条件为 False。
这不是偏好问题。这是数据结构的问题。
通常,我们将想要处理的值表示为range
(实际列表)或xrange
(生成值)(编辑:在 Python 3 中,range
现在是一个生成器,其行为与旧xrange
函数类似。已从 Python 3 中删除)。这为我们提供了一个为forxrange
语句量身定制的数据结构。
但是一般我们都有一个现成的集合:集合、元组、列表、映射甚至字符串已经是一个可迭代集合,所以我们只需使用for循环。
在某些情况下,我们可能希望函数式编程为我们完成一些处理,在这种情况下,我们可以将转换作为迭代的一部分应用。sorted
andenumerate
函数对可迭代对象应用转换,这自然适合for语句。
如果您没有整洁的数据结构来进行迭代,或者没有驱动处理的生成器函数,那么您必须使用while。
解决方案 2:
while
在中断条件在逻辑上不依赖于任何类型的序列的情况下很有用。例如,考虑不可预测的交互:
while user_is_sleeping():
wait()
当然,你可以编写一个适当的迭代器来封装该操作并使其可以通过以下方式访问for
- 但这如何提高可读性?¹
在 Python 中的所有其他情况下,使用for
(或封装循环的适当的高阶函数)。
¹假设user_is_sleeping
函数在为 false 时返回False
,则示例代码可以重写为以下for
循环:
for _ in iter(user_is_sleeping, False):
wait()
解决方案 3:
这for
是迭代列表的更符合 Python 风格的选择,因为它更简单且更易于阅读。
例如这个:
for i in range(11):
print i
比这个更简单,也更容易阅读:
i = 0
while i <= 10:
print i
i = i + 1
解决方案 4:
当您有明确的迭代次数(已知迭代次数)时,使用for循环。
使用示例:
按照确定范围的循环进行迭代:
for i in range(23):
。遍历集合(字符串、列表、集合、元组、字典)
for book in books:
:。
while循环是一种不确定的迭代,当循环重复未知次数并在满足某些条件时结束时使用。
请注意,在 while 循环的情况下,循环的缩进主体应该修改测试条件中的至少一个变量,否则结果是无限循环。
使用示例:
代码块的执行需要用户输入指定的输入:
while input == specified_input:
。当您有一个带有比较运算符的条件时:
while count < limit and stop != False:
。
参考文献:For 循环与 While 循环,Udacity 数据科学, Python.org。
解决方案 5:
首先,python 中的 for 循环与其他语言中的 for 循环有所不同。在 python 中,for 循环遍历一个值列表(例如:for value in [4,3,2,7]),而在大多数其他语言(C/C++、Java、PHP 等)中,for 循环充当 while 循环,但更易于阅读。
For 循环通常在已知迭代次数(例如数组的长度)的情况下使用,而 while 循环则在不知道迭代需要多长时间的情况下使用(例如,只要值未排序,冒泡排序算法就会一直循环)
解决方案 6:
考虑处理可迭代对象。你可以用循环来完成for
:
for i in mylist:
print i
或者,你可以用循环来完成while
:
it = mylist.__iter__()
while True:
try:
print it.next()
except StopIteration:
break
这两个代码块基本上以相同的方式完成相同的任务。但是循环for
隐藏了迭代器的创建和异常的处理,StopIteration
因此您无需亲自处理它们。
我能想到的唯一一次使用while
循环来处理可迭代对象的情况是如果你由于某种原因需要直接访问迭代器,例如,在某些情况下你需要跳过列表中的项目。
解决方案 7:
For 循环通常使迭代操作更加清晰。您不能总是直接使用它们,但大多数情况下,while 循环中的迭代逻辑可以包装在生成器函数中。例如:
def path_to_root(node):
while node is not None:
yield node
node = node.parent
for parent in path_to_root(node):
...
而不是
parent = node
while parent is not None:
...
parent = parent.parent
解决方案 8:
for循环将遍历一个列表(范围是数字列表)。
while循环将不断迭代,直到满足条件为止。
您可以使用for循环逐字逐句地遍历文件,并使用 break 来产生异常。正如其他人所提到的,您通常希望在使用for循环时遍历列表。
for word in book:
if word == 'is':
break
while循环一直运行,直到发生异常为止。正如其他人所提到的,使用while循环时,并不期望迭代所有值。
print("Enter any negative value to end.")
while (n=int(input)) => 0:
grade_total += n
average = grade_total / n
这将允许使用不同数量的可评分项目对不同的学生进行评分。
解决方案 9:
与所有语言一样,您应该尝试使用最适合该工作的工具。
while condition
是一个非常普遍的概念
for item in iterator
更具体一点。
只要你能使用后者,它就是首选。从更一般的意义上讲,我们有概念的层次结构
goto
,if
switchelif
function call
(包括递归)while
,,,,until
continue
break
for
map
,,filter
reduce
您想使用列表的最低部分(即最高索引)来简洁地表达您的想法。
如果您可以将操作实现为map
,则无需编写for
或while
循环。如果您可以将某事简洁地表达为for
或while
循环,则无需使用递归来编写概念。如果您可以使用函数调用和循环来简洁地表达一个想法,则无需调用goto
。
复杂的想法需要你在列表中往上移(即更原始的想法)。
并非每个人都只是对一堆数据进行映射。他们会对每个元素执行一些复杂的操作,因此他们需要处于级别 (4) 而不是级别 (5)。
有些人正在循环一个非常复杂且没有被迭代器索引的条件。他们需要留在while
陆地上。
有些人正在研究一种高度自我参照的事物,它有许多案例,有许多相互交织的部分,他们需要在其中生活function
和switch
着陆。
有时(但非常非常少),你需要一些跳跃式的代码,因为 1. 因为某种原因,这是表达你的想法最简单的方式,或 2. 你有一些资源/空间限制迫使你去实现它,3. 你正在进行超出编译器能力范围的优化。
在这种罕见的情况下,你会想住在goto
陆地上。
这里我们看到,Pythonfor
尽可能地倾向于使用while
,因为它尊重使想法更加具体的自然层次结构。
解决方案 10:
while 循环更适合普通循环,而 for 循环在处理字符串(如列表、字符串等)时比 while 循环好得多。
解决方案 11:
对我来说,如果你的问题需要使用多个指针来跟踪某个边界,我总是更喜欢 While 循环。
在其他情况下,它只是 for 循环。
扫码咨询,免费领取项目管理大礼包!