本文概述
循环在Python或任何其他编程语言中都很重要, 因为它们可以帮助你重复执行代码块。你经常会遇到需要一遍又一遍地使用一段代码, 但又不想多次编写同一行代码的情况。
在此Python循环教程中, 你将涵盖以下主题:
- Python while循环:你将学习如何在数据科学应用程序中构造和使用while循环。你将通过解决一些交互式编码挑战来做到这一点。
- 接下来, 你将进入for循环:再次, 你将学习如何在现实环境中构造和使用for循环。
- 你还将学习使用while循环和for循环之间的区别。
- 也是嵌套循环的主题
- 之后, 你将看到如何使用break和continue关键字。
- xrange()和range()函数之间的区别
While循环
while循环是你开始学习如何编程时可能会遇到的第一个循环之一。可以说, 它也是最直观的理解之一:如果你想到此循环的名称, 你将很快理解, ” while”一词必须与” interval”或” time-period”有关。你现在已经知道, “循环”一词是指你重复执行的一段代码。
考虑到所有这些, 你可以轻松理解while循环的以下定义:
while循环是一种编程概念, 实现后, 将在给定条件仍然成立的情况下, 一遍又一遍地执行一段代码。
上面的定义还突出显示了在Python中构造while循环所需的三个组件:
- while关键字;
- 转换为True或False的条件;和
- 你要重复执行的代码块
这就是全部!
如何在Python中制作While循环
既然你知道构造While循环的必要条件, 那么现在要做的就是看一个真实的示例, 在开始自己做练习之前, 使用while循环!考虑以下示例:
# Take user input
number = 2
# Condition of the while loop
while number < 5 :
print("Thank you")
# Increment the value of the variable "number by 1"
number = number+1
Thank you
Thank you
Thank you
上面的代码示例是一个非常简单的while循环:考虑一下, 你之前阅读过的三个组件都存在:while关键字, 后跟一个转换为True或False(数字<5)和你要重复执行的代码块:
print("Thank you")
number = number + 1
如果你在上面的代码中进行了详细介绍, 你会看到存在一个存储整数2的变量数字。由于number的值小于5, 因此你将打印”谢谢”并使用一。当number的值保持小于5时, 你将继续执行while循环中包含的两行代码:
"Thank you"
"Thank you"
在number的值等于5且条件不再评估为True之前, 你还要打印两次”谢谢”。由于条件现在的值为False, 因此你将退出while循环并继续执行程序(如果包含更多代码)。在这种情况下, 没有更多的代码, 因此你的程序将停止。
上面的示例有点基本, 你还可以包括条件, 或者换句话说, 如果条件, 以使其更具个性化。看下面的例子:
# Take user input
number = 2
# Condition of the while loop
while number < 5 :
# Find the mod of 2
if number%2 == 0:
print("The number "+str(number)+" is even")
else:
print("The number "+str(number)+" is odd")
# Increment `number` by 1
number = number+1
The number 2 is even
The number 3 is odd
The number 4 is even
现在, 让我们练习!
编写一个函数collatz(), 该函数使用户可以在名为number的变量中输入整数。如果数字为偶数, 则应打印数字/ 2的结果。如果number为奇数, 则collatz()应打印并返回3 * number +1。程序应继续对number调用函数collatz(), 直到返回1。
请注意, 这实际上是collatz序列的实现, 简而言之是一个数学问题, 你可以选择一个数字, 并继续进行上述计算, 直到得出结果1。
在下面, 你可以找到解决方案:
def collatz(number):
# Is the mod of 2 equal to 0?
if number % 2 == 0:
print(number // 2)
return number // 2
# If the mod of 2 isn't equal to 0, print `3 * number + 1`
elif number % 2 == 1:
result = 3 * number + 1
print(result)
return result
# Ask input from the user
n = input("Give me a number: ")
# As long as `n` is not equal to `1`, run `collatz()`
while n != 1:
n = collatz(int(n))
Give me a number: 5
16
8
4
2
1
对于循环
你可以以与while循环相同的方式处理for循环。如你所料, ” for循环”中的” for”组件是指你执行了一定次数的操作。
如果你牢记以上所有内容, 则可以轻松地如下定义for循环:
for循环是一种编程概念, 当实现该循环时, 它会根据序列一次又一次地”重复”执行一段代码。
与while循环相反, 没有任何活动条件参与-你只需多次重复执行一段代码。换句话说, 虽然while循环仅在条件为True之前继续执行其中包含的代码块, 但是for循环仅执行特定次数的执行。此”次数”由事物的顺序或有序列表确定。
你将稍微了解一下while和for循环之间的区别, 但是现在, 请集中精力创建一个for循环所需的以下内容:
- for关键字
- 一个变量
- in关键字
- range()函数, 这是Python库中用于创建数字序列的内置函数
- 你要重复执行的代码
对于Python中的循环
# Print "Thank you" 5 times
for number in range(5):
print("Thank you")
Thank you
Thank you
Thank you
Thank you
Thank you
如你所见, 在上一节中看到的组件在Python的这个for循环小示例中返回:for关键字, 变量号, in关键字, range()函数和你想要的代码执行多次, 请打印(“谢谢”)。
那不是那么难, 对吧?
让我们考虑一个for循环的示例, 在该示例中, 你使用两个变量来定义控制流:
languages = ['R', 'Python', 'Scala', 'Java', 'Julia']
for index in range(len(languages)):
print('Current language:', languages[index])
Current language: R
Current language: Python
Current language: Scala
Current language: Java
Current language: Julia
如你所见, 你可以使用for关键字开始循环。接下来, 你将使用变量索引和语言, in关键字以及range()函数来创建数字序列。此外, 你看到在这种情况下你还使用len()函数, 因为语言列表不是数字。你要重复执行的代码段是一条打印语句, 即print(‘Current language:’, languages [index])。
在上面的循环中, 你要表示要针对len(languages)范围内的每个索引, 打印数据科学编程语言。现在, len(languages)为5, 因此该语句也可以重写为:
for index in range(5):
print('Current language:', languages[index])
Current language: R
Current language: Python
Current language: Scala
Current language: Java
Current language: Julia
这再次给你相同的结果!
While与Python中的For循环
让我们再次回顾第一个while循环示例, 以确定while和for循环之间的确切区别。你已经在上面读到了区别在于所涉及的条件或不涉及的条件, 但是这在代码中如何体现出来, 又如何在两者之间切换?
# Take user input
number = 2
while number < 5 :
print("Thank you")
# Increment `number` by 1
number = number+1
Thank you
Thank you
Thank you
你可以使用for循环以更可控的方式打印语句”谢谢”:
# Print "Thank you" 3 times
for number in range(3) :
print("Thank you")
Thank you
Thank you
Thank you
看到将while循环转换为等效的for循环有多么容易?
你问它如何运作?好吧, 这很简单。
在for循环中, range函数内提到的整数是范围或控件需要循环并执行for循环子句中的代码的次数。
请注意, range()函数的计数从0开始, 而不是从1开始。这意味着, 在上面的示例中, 计数应类似于0, 1, 2, 而不是1, 2, 3。这就是计算机内存中数字计数的工作方式。因此, 在设计for循环时, 请始终记住, 必须考虑从0而不是从1开始的范围计数。
提示:例如, 这与Python中的列表相同。如果你想进一步了解Python列表, 请考虑查看srcmini的18个最常见的Python列表问题教程。
现在, for循环和while循环之间还有另一个有趣的区别。 for循环比while循环快。要了解这一点, 你必须查看以下示例。
import timeit
# A for loop example
def for_loop():
for number in range(10000) :
# Execute the below code 10000 times
sum = 3+4
#print(sum)
timeit.timeit(for_loop)
267.0804728891719
import timeit
# A while loop example
def while_loop():
i =0
while i<10000:
sum = 3+4
#print(sum)
i+=1
timeit.timeit(while_loop)
884.9233417965908
在上面的代码块中, 你有两个带有大约10000次迭代的循环。乍一看, 两者看起来都是一样的, 直到你了解幕后并了解这两个循环的工作原理。提示:timeit()函数为你提供了可能有所不同的线索!
请记住:所有Python代码都是使用C编译器编译的, 这意味着你在上面看到的代码首先被分解为字节码, 然后由基础C编译器进行处理。
当上述示例中的for循环开始执行时, Python解释器与基础C编译器进行对话, 然后创建一个大小为10000的列表对象。接下来, 它调用一个迭代器以触及其中10000个项目中每个项目的索引。名单。
另一方面, while循环的执行不会创建任何列表对象。实际上, 底层C编译器针对条件i <10000 9999次调用布尔比较运算符。
你已经可以想象到, 与重复执行布尔操作9999次相比, 对编译器而言, 对已创建的具有10000个元素的列表对象进行迭代要容易得多, for循环的时间性能优于while循环的时间性能。这清楚地反映在执行时间上:for循环完成的时间比while循环需要完成的时间小得多。
现在尝试一下for循环!请注意, 你要指定的范围是0到11, 因为你只想显示序列中的数字, 最多55个, 即序列中的第11个数字。
嵌套循环
正如你在上面的示例中注意到的那样, while循环中有一个if-else条件, 使你可以在代码中引入更多条件。
坚持, 稍等!
这不是定制循环的唯一方法。你还可以在现有代码中包含更多while循环, 这被称为嵌套循环。你可以修改上面的示例以包括另一个while循环, 如下所示:
# Take user input
number = 2
# condition of the while loop
while number < 5 :
# condition of the nested while loop
while number % 2 == 0:
print("The number "+ str(number)+" is even")
在上面的示例中, 还有一个while循环”嵌套”在外部循环中, 该内部循环又进行了一次检查, 以查看数字%(mod)2是否为0。
换句话说, 它检查数字是否为偶数, 然后打印语句”数字为偶数”。
但是有一个陷阱:如果仔细观察, 你会发现这次与前面的代码一样, 缺少number = number + 1条语句。由于你没有在任何地方增加变量号, 因此变量的值每次都保持不变, 并且代码进入无限循环。这意味着, 一旦它进入循环, 它就永远不会离开并打印无数次语句, 因为变量数将始终设置为2。该数当然小于5且为偶数。
现在让我们看一下嵌套的for循环是什么样的:
# Print the below statement 3 times
for number in range(3) :
print("-------------------------------------------")
print("I am outer loop iteration "+str(number))
# Inner loop
for another_number in range(5):
print("****************************")
print("I am inner loop iteration "+str(another_number))
-------------------------------------------
I am outer loop iteration 0
****************************
I am inner loop iteration 0
****************************
I am inner loop iteration 1
****************************
I am inner loop iteration 2
****************************
I am inner loop iteration 3
****************************
I am inner loop iteration 4
-------------------------------------------
I am outer loop iteration 1
****************************
I am inner loop iteration 0
****************************
I am inner loop iteration 1
****************************
I am inner loop iteration 2
****************************
I am inner loop iteration 3
****************************
I am inner loop iteration 4
-------------------------------------------
I am outer loop iteration 2
****************************
I am inner loop iteration 0
****************************
I am inner loop iteration 1
****************************
I am inner loop iteration 2
****************************
I am inner loop iteration 3
****************************
I am inner loop iteration 4
上面的代码是第一个for循环示例的修改版本。注意在外部循环中如何使用第二个for循环。
继续执行代码。
你将发现该控件进入第一个for循环, 并且变量number的值初始化为0。打印第一个print语句, 然后控件进入第二个for循环, 其中变量another_number的值初始化为0。第二个for循环中的第一个print语句被打印一次。
现在, 该控件再次返回到内部for循环, 并且another_number的值再次初始化为下一个整数, 然后在print()函数内部打印该语句。
继续上述过程, 直到控件遍历了range()函数的末尾(在本例中为5), 然后控件返回最外层的循环, 将变量号初始化为下一个整数, 并在其中打印语句print()函数访问内部循环, 然后重复上述所有步骤, 直到遍历range()函数为止。
控件的这一过程从最外层的循环开始, 遍历内层的循环, 然后再返回到外层的for循环, 直到控件覆盖整个范围(在你的情况下为3倍)为止。
既然你已阅读了有关嵌套循环的一些说明, 那么该开始自己了!编写一个Python程序, 使用嵌套的for循环构造以下模式:
中断并继续关键字:创建无限循环
你可以使用break并在创建的任何循环中继续。这些关键字不仅限于打破故意的无限循环, 而应谨慎使用。这两个关键字使其他人(包括你自己在几个月后回头查看代码时)难以理解循环中的控制流以及条件的终止位置。此外, 你不需要使用break和continue关键字:到目前为止, 你没有它们就做得很好!
但是, 在某些情况下, 编写有目的的无限循环比你到目前为止看到的传统的for和while循环更为清楚。当然, 在这种情况下, 鼓励使用这些关键字!
在Python中中断和继续While循环
幸运的是, 有一种方法可以突破上述无限循环的情况, 那就是使用break关键字。
# Take user input
number = 2
# Condition of the while loop
while number < 5 :
# condition of the nested while loop
while number % 2 == 0:
print("The number "+str(number)+" is even")
break
number+=1
当你运行上面的代码时, 它不再进入无限循环。
“这是什么法术!”你喊。 -我说放松, 这不是巫术。
发生的情况是, 当控件遇到break关键字时, 它将理解它必须退出循环(在这种情况下为内部循环)并执行下一行代码。因此, 它会从内部while循环中跳出并进入外部循环, 并继续执行其通常的工作, 直到外部while循环中的条件成立为止。
你应该考虑以下事实:在break关键字之后必须存在一行代码, 否则它不会起作用。在上面的示例中, 尝试删除break关键字之后的代码行, 然后执行代码。
如果你在break语句后潜入continue关键字怎么办?你可以按照以下代码进行操作:
# Take user input
number = 2
while number < 5 :
while number % 2 == 0:
print("The number "+str(number)+" is even")
break
continue
number+=1
上面的代码是break关键字示例的稍作修改的版本。
当你运行上述代码时, 你将再次遇到无限循环。在开始沮丧地拉头发之前, 请仔细看一下。你会发现休息后有一个继续关键字。 continue关键字所做的是, 即使在变量号增加之前, 它仍将控制权转移回最外层的循环, 因此代码进入了无限循环。
中断并继续循环
如果你不想在整个示例中对整个范围执行内部for循环, 该怎么办?你可以像在while循环中一样使用break语句。
# Print the below statement 3 times
for number in range(3) :
print("-------------------------------------------")
print("I am outer loop iteration "+str(number))
for another_number in range(3):
print("****************************")
print("I am inner loop iteration "+str(another_number))
break
在上面的示例中, 内循环之后的break关键字指示控件从内循环中脱离出来, 然后控件返回到外循环。
运行以下代码示例:
# Print the below statement 3 times
for number in range(3) :
print("-------------------------------------------")
print("I am outer loop iteration "+str(number))
continue
for another_number in range(3):
print("****************************")
print("I am inner loop iteration "+str(another_number))
break
在上面的代码中, 仅执行最外层的循环, 而控件甚至不接触内层的循环。
“为什么?”你问。
仔细看一下代码。最外层循环中的第二个print语句之后有一个continue关键字。它的作用是指示控件跳回到外部for循环并重新开始, 这就是为什么控件从不接触内部循环的原因。
与while循环不同, for循环中的break关键字之后不需要任何代码。一个单独的中断循环将在for循环内正常工作。
range()与xrange()
这两个函数彼此相似, 但是如果你使用的是Python 3, 则只有range()函数可用。在Python 3.x中, xrange()函数被重命名为range()。这意味着, 如果你尝试在Python 3中使用xrange()函数, 则会出现NameError:名称’xrange’未定义错误。
要了解这两个功能的相似之处, 请考虑以下示例:
# Print the below statement 3 times
for number in range(5, 10, 2) :
print("I am number : "+str(number))
I am number : 5
I am number : 7
I am number : 9
通过运行上面的代码, 你将看到如何将变量号的值跳过2倍, 这是由于range()函数中的参数所致。
此函数中的第一个参数是开始参数。这是控件开始计数的地方。第二个参数是停止参数, 是控制必须停止的点, 最后一个参数是步进功能, 它定义了控制在计数时必须跳变的因子。
因此, 在上述情况下, 控件从5开始, 然后遍历循环直到9, 同时在每次计数期间加2。这意味着5、5 + 2 = 7、7 + 2 = 9。
你已经了解了range()函数如何用于定义代码必须循环的次数。现在, 在Python 2.x中, 你还将找到另一种方法, 那就是使用xrange()函数。运行以下代码:
# Print the below statement 3 times
for number in xrange(10) :
print("I am number : "+str(number))
I am number : 0
I am number : 1
I am number : 2
I am number : 3
I am number : 4
I am number : 5
I am number : 6
I am number : 7
I am number : 8
I am number : 9
你在上述代码的输出与没有xrange()函数的代码的输出中看到了什么区别?没有不同?
那就对了。你不会在代码输出中看到任何差异。
那么, 为什么要使用xrange()函数呢?你将在本教程的稍后部分进行介绍。首先运行以下代码:
print(xrange(10))
print(range(10))
xrange(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
你可以看到在以上代码的输出中, 两个print语句的输出都有差异。在包含xrange()函数的print语句中, 将打印出xrange()函数对象。这与具有range()函数的print语句不同:在此处, 你会得到一个从0到9的整数列表。
现在, 这正是range()函数和xrange()函数之间的区别。
定义range()函数时, 整个范围的列表将存储在RAM中并显示给你。但是, 定义xrange()函数时, 列表未存储在内存中。相反, xrange()函数会在需要时在整个范围内生成整数。这样, xrange()函数有助于在资源匮乏的系统中节省内存。
磨练你的Python技能!
恭喜, 你已完成本教程的结尾。既然你已经学习了如何在Python中使用循环, 请继续练习。练习越多越好!
评论前必须登录!
注册