本章涉及内容:
- 循环
- 先判断后循环与先循环后判断
- 判断表达式和循环体
- while语句
- for语句和range函数
- 增量赋值运算符
- 递增计数
- 递减计数
- 计算1到n的和
- break语句和else代码块
- continue语句
- 无限循环
- 多重循环
1. while语句
关于while语句
循环结构可以实现以下功能:
- 重复执行相同或相似的处理操作
- 变更条件的同时重复执行处理
- 重复执行处理直到某个条件成立
while循环示例
递增计数
a = int(input("整数a: "))
b = int(input("整数b: "))
a, b = sorted([a, b])
counter = a
while counter <= b:
print(counter, end=' ')
counter = counter + 1
print()
运行结果:
这段代码用于获取用户输入的两个整数,并按顺序打印这两个整数之间的所有整数(包括这两个整数本身)。下面是代码的逐行解释:
a = int(input("整数a: "))
:这行代码提示用户输入一个整数,作为变量a
的值。input()
函数用于获取用户输入的字符串,然后int()
函数将这个字符串转换成一个整数。b = int(input("整数b: "))
:这行代码与第一行类似,它提示用户输入另一个整数,作为变量b
的值。a, b = sorted([a, b])
:这行代码首先将变量a
和b
的值放入一个列表中,然后使用sorted()
函数对这个列表进行排序。sorted()
函数返回一个新的列表,其中包含按升序排列的元素。之后,这个排序后的列表被解包(unpack)到变量a
和b
中,这样变量a
就包含了两个整数中较小的一个,而变量b
包含了较大的一个。counter = a
:这行代码将变量counter
初始化为a
的值。counter
用于在接下来的循环中作为计数器,从a
开始递增直到b
。while counter <= b
:这是一个while
循环的开始,循环的条件是counter
小于或等于b
。只要条件为真,循环体内的代码就会执行。print(counter, end=' ')
:这行代码打印当前的counter
值,后面跟着一个空格(由end=' '
参数指定)。这意味着每打印一个数字后不会换行,而是在同一行继续打印下一个数字。counter = counter + 1
:这行代码将counter
的值增加1。这是循环的递增部分,确保了循环能够向前推进。print()
:当while
循环结束后,这行代码执行,打印一个换行符。这是为了在打印完所有数字后,将光标移动到下一行,以便于后续的输出或命令行提示符不会紧接着数字序列出现。这段代码的作用是让用户输入两个整数,然后按顺序打印从较小的整数开始到较大的整数结束的所有整数。
递减计数
a = int(input('整数a: '))
while a >= 0:
print(a, end=' ')
a -= 1
print()
运行结果:
这段代码的核心功能是使用
while
循环逆序打印从用户输入的整数a
开始到 0 的所有整数。下面是while
循环相关的解释:
a = int(input('整数a: '))
:用户输入一个整数,作为变量a
的初始值。while a >= 0
:这是while
循环的条件。循环会一直执行,直到a
不再大于或等于 0。每次循环迭代都会检查这个条件。print(a, end=' ')
:在循环体内,当前的a
值被打印出来,后面跟着一个空格(end=' '
参数的作用),而不是默认的换行符。这样,所有打印的数字会在同一行上显示。a -= 1
:这是a
的递减操作,等同于a = a - 1
。每次循环迭代后,a
的值都会减少 1。这是循环向结束条件靠近的关键步骤。print()
:当a
的值小于 0,while
循环终止。这时执行print()
函数,打印一个换行符,确保命令行提示符或后续输出出现在新的一行上。总的来说,这段代码使用
while
循环从用户输入的整数a
开始递减打印,直到打印到 0 为止。
计算1到n的和
print("计算1到n的和")
n = int(input("n的值:"))
sum = 0
i = 1
while i <= n:
sum += i
i += 1
print('1到', n, '的和为:', sum)
运行结果:
这段代码是一个简单的Python程序,用来计算从1加到n的和。下面是每一行代码的解释:
print("计算1到n的和")
这一行是打印输出,向用户展示这个程序的功能,即计算从1加到n的和。n = int(input("n的值:"))
这一行代码首先显示提示信息"n的值:"
,然后等待用户输入一个值。用户输入的值通过input()
函数获取,然后使用int()
函数将这个值转换成一个整数,并赋值给变量n
。sum = 0
这里初始化一个变量sum
,用来存储从1加到n的总和,初始值设为0。i = 1
这里初始化一个计数器变量i
,它将用于while循环中,表示当前加到哪个数了,初始值设为1。while i <= n:
这是一个while循环的开始,条件是i
小于等于n
。只要这个条件为真,循环就会继续执行。sum += i
这一行是循环体的一部分,它将变量i
的当前值加到变量sum
上,等价于sum = sum + i
。i += 1
这一行也是循环体的一部分,它将计数器i
的值增加1,等价于i = i + 1
。这是为了在下一次循环迭代中处理下一个数。print('1到', n, '的和为:', sum)
当while循环结束(即i
大于n
时),这一行将执行。它会打印出从1到n的和,显示给用户。总结起来,这个程序首先让用户输入一个整数n,然后通过while循环将从1到n的所有整数相加,并最终打印出总和。
else代码块和break
在Python中,while
循环可以有一个可选的 else
代码块,它在循环正常结束时执行,即没有遇到 break
语句导致的提前退出。
如果循环因为条件不再为真而退出,else
代码块将被执行。但是,如果循环因为 break
语句而退出,else
代码块将不会执行。
这是一个简单的例子来展示如何使用 while
循环的 else
代码块:
count = 0
while count < 5:
print(count)
count += 1
if count == 3:
break
else:
print("Loop finished without break")
print("Done")
上面的代码会输出:
0
1
2
Done
在这个例子中,当 count
增加到3时,break
语句被执行,循环提前退出,因此 else
代码块没有被执行。如果我们移除 if
语句和 break
,则 else
代码块会在循环自然结束后执行:
count = 0
while count < 5:
print(count)
count += 1
else:
print("Loop finished without break")
print("Done")
这次的输出将会是:
0
1
2
3
4
Loop finished without break
Done
在这个修改后的例子中,因为没有 break
语句导致的提前退出,所以 else
代码块被执行了。
continue语句
在Python中,continue
语句用于跳过当前循环的剩余部分,并继续下一次迭代。continue
语句通常与某种形式的条件语句(如 if
)一起使用,以决定是否跳过当前循环的迭代。
当continue
语句执行时,当前迭代中continue
之后的代码将不会执行,而是直接开始下一次循环的迭代。continue
语句可以用在while
循环和for
循环中。
下面是一个使用continue
语句的简单例子:
for i in range(1, 10):
if i % 2 == 0: # 如果i是偶数
continue # 跳过当前迭代
print(i) # 只有当i是奇数时,这行代码才会执行
在这个例子中,continue
语句导致打印语句只在i
为奇数时执行。因此,输出将是1到9之间的所有奇数:
1
3
5
7
9
需要注意的是,continue
语句只影响当前迭代的剩余部分,它不会终止整个循环。循环会继续执行,直到其自然结束或遇到break
语句。
Python"自带电池"特性
在 Python 社区中,有一个常用的表达:“Python自带电池”("Python comes with batteries included"),这句话的意思是 Python 标准库(Standard Library)提供了大量的模块和功能,这些模块和功能几乎可以处理日常编程中遇到的各种任务,而无需另外安装第三方库。
Python 的标准库包含了很多有用的模块,例如:
datetime
:用于处理日期和时间。collections
:提供了一些额外的数据结构,如namedtuple
,deque
,Counter
等。json
、csv
:用于处理 JSON 和 CSV 文件。sqlite3
:提供了一个轻量级的数据库引擎。http
:用于处理 HTTP 请求。re
:正则表达式库,用于字符串匹配和搜索。math
、random
:数学运算和随机数生成。unittest
:用于编写测试用例的测试框架。logging
:提供了灵活的日志记录系统。
标准库的强大之处在于它的广泛性和易用性,这使得 Python 成为一个非常适合快速开发的语言。不过,对于更专业化或者性能要求更高的场景,可能需要使用到第三方库,比如在科学计算中经常用到的 NumPy、Pandas、Matplotlib 等。
2. for语句
与上一节while相同,for语句也可以用于控制程序中的循环。
关于for语句
在Python中,for
语句用于遍历序列(如列表、元组、字符串)或其他可迭代对象。for
循环的基本语法如下:
for element in sequence:
# do something with element
这里,sequence
是你想要遍历的序列,element
是序列中的每个元素的引用。
下面是几个使用 for
语句的例子:
- 遍历列表:
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
print(fruit)
这会依次打印出列表中的每个水果名称。
- 遍历字符串:
for letter in 'Python':
print(letter)
这会打印出字符串 "Python" 中的每个字符。
- 使用
range()
函数:
for i in range(5):
print(i)
这会打印出数字 0 到 4。range(5)
生成一个包含从 0 到 4 的整数序列。
- 遍历字典:
dict = {'name': 'John', 'age': 25, 'gender': 'Male'}
for key in dict:
print(key, dict[key])
这会打印出字典中每个键及其对应的值。
- 使用
enumerate()
函数遍历列表并同时获取索引和值:
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
print(index, fruit)
这会打印出列表中每个水果的索引和名称。
- 使用列表推导式:
squares = [x**2 for x in range(10)]
这将创建一个包含前10个整数平方的列表。
for
循环是Python中非常重要的控制流语句,它让代码可以执行重复的任务,而无需手动编写多次相同的代码。
range函数
在Python中,range()
函数是一个内置函数,用于生成一个不可变的数字序列。这个序列通常用在for循环中进行迭代。
range()
函数可以接受一到三个整数参数:
start
(可选):序列的起始值,默认为0。stop
:序列的结束值,但不包括该值本身。step
(可选):步长,默认为1。
如果只提供一个参数,那么它会被认为是stop
值,而start
将默认为0,step
默认为1。
以下是range()
函数的一些用法示例:
# 使用一个参数(这将创建一个从0开始到5(不包括5)的序列)
for i in range(5):
print(i) # 输出: 0, 1, 2, 3, 4
# 使用两个参数(这将创建一个从1开始到5(不包括5)的序列)
for i in range(1, 5):
print(i) # 输出: 1, 2, 3, 4
# 使用三个参数(这将创建一个从1开始到10(不包括10)的序列,步长为2)
for i in range(1, 10, 2):
print(i) # 输出: 1, 3, 5, 7, 9
请注意,range()
生成的是一个range对象,它在Python 3中是一个迭代器,不会立即生成所有值,而是在迭代时按需生成。这意味着它在处理大范围的数字时是内存高效的。如果确实需要一个列表,可以通过将range()
的结果传递给list()
函数来转换:
numbers = list(range(5))
print(numbers) # 输出: [0, 1, 2, 3, 4]
在Python 2中,range()
会直接返回一个列表,但是为了大范围数字序列的内存效率,通常推荐使用xrange()
,它的行为类似于Python 3中的range()
。在Python 3中,xrange()
已经被移除,只保留了新的range()
实现。
for循环同样支持else
、break
、continue
,且这些语句的用法与while
相同
3. 多重循环
如果在循环语句的循环体中使用循环语句,就可以进行二重循环或三重循环。这种循环称为多重循环。
九九乘法表
# 外层循环负责行数,从1到9
for i in range(1, 10):
# 内层循环负责列数,从1到i
for j in range(1, i + 1):
# 打印乘法表的一项,end=' '意味着打印后不换行,而是空格
print(f"{j} * {i} = {i * j}", end=' ')
# 当一行打印结束后换行
print()
运行结果:
在这个例子中,外层循环遍历了1到9的数字,代表九九乘法表的行,而内层循环则根据外层循环的当前值遍历从1到当前值的数字,代表每行的列。每次内层循环迭代时,都会打印出一个乘法表达式及其结果。使用end=' '
参数确保在同一行内打印所有列,而print()
在内层循环结束后调用,以换行到下一行。