1. while循环

1) 循环

i = 0
print(i)
i = i + 1
print(i)
i = i + 1
print(i)
i = i + 1
# 逐行输出:0 1 2

2) while循环

当满足条件时,就一直重复执行某段代码。如上例可用while循环改写为:

i = 0
while i < 3:
  print(i)
  i = i + 1


  • while循环的组成:
while 循环条件:
  循环体

在满足循环条件的情况下,计算机会自上而下重复执行循环体内的代码,直到不满足循环条件时结束循环。

Note: i = i + 1可以简写为i += 1,即A += B等价于A = A + B。

3) 死循环

一个靠自身控制无法终止的程序称为死循环。如果没有控制好循环条件,很可能会引发死循环。

while True:
  print('Hello World')
# 由于循环条件一直是True,所以会永无止境地打印Hello World
i = 0
while i < 3:
  print(i)
# 由于漏掉了i = i + 1,导致i的值一直为0,进入死循环

Note: 死循环会导致后续代码无法执行,甚至导致CPU占用过高电脑死机,因此要控制好循环条件。

2. for循环

1) for循环

格式:

for 变量 in 序列:
  循环体

Note: for循环没有循环条件,而是通过for…in…的语法进行循环,循环的次数就是in后面序列的元素个数。

for i in [0, 1, 2]:
  print(i + 1)
# 逐行输出:1 2 3

for循环的特性:依次遍历序列中的元素,并依次赋值给变量,最后执行统一的处理。

2) 序列

指与列表有相似特性的类型,列表、元组、字符串都属于序列。他们都存着一组数据,可以通过索引访问里面的元素,可以使用for循环遍历。

range()函数生成序列,可与for循环一起使用:

for i in range(3):
  print(i)
# 逐行输出:0 1 2

上面的代码等同于:

for i in range[0, 1, 2]:
  print(i)
# 逐行输出:0 1 2

range()函数可以很方便地写出循环n次的代码,比如实现"I love you three thousand":

for i in range(3000):
  print('I love you')

又如,按数字排序命名100个Excel文件:

for i in range(100):
  filename = '材料' + str(i + 1) + '.xlsx'
  print('正在处理' + filename)

3) 循环体

循环的核心代码,即被重复执行的部分。

for i in range(10):
  print(i * 2)
# 将0-9每个数乘以2打印
for i in range(10):
  if i > 5:
    print(i)
# 将0-9中大于5的数打印

也可在循环中嵌套循环,如打印九九乘法表:

for i in range(1, 10):
  for j in range(1, i + 1):
    print(str(j) + 'x' + str(i) + '=' + str(i * j) + 't', end = '')
    # t是制表符,用来对齐。end默认是n,打印后会换行,end = ''可以防止换行
  print('')
  # 打印完一行后换行

4) 列表生成式

生成一个[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]的列表:

y = []
for x in range(1, 11):
  y.append(x * x)

以上代码用列表生成式可简化为:

y = [x * x for x in range(1, 11)]

也可在for…in…后加上条件判断以筛选出奇数的平方:

y = [x * x for x in range(1, 11) if x % 2 == 1]
print(y)
# 输出:[1, 9, 25, 49, 81]

综上,列表生成式的语法规则是:

[表达式 for循环 条件判断(可选)]

Eg: 筛选低于60的分数:

scores = [91, 4, 20, 67, 24, 13, 84, 40, 77, 47]
result = [x for x in scores if x < 60]
print(result)

5) break语句

break语句用于结束循环,常与条件判断一起使用,在特定条件下结束循环,后续循环代码不再执行。

break语句的用法:

while 循环条件:
  ……
  if 循环结束条件:
    break    # 满足条件触发break语句
……    # 结束循环,执行循环后代码
for 变量 in 循环序列:
  ……
  if 循环结束条件:
    break    # 满足条件触发break语句
……    # 结束循环,执行循环后代码

实例如:

# while循环
i = 0
while i < 5:
  i = i + 1
  if i == 3:
    break
  print(i)
print('循环结束')
# 逐行输出:1 2 循环结束
# for循环
for i in range(5):
  i = i + 1
  if i == 3:
    break
  print(i)
print('循环结束')
# 逐行输出:1 2 循环结束

Note: break语句可以在特定条件下跳出死循环,相当于将循环条件放到了循环体中,用if和break语句来判断并终止循环。

6) continue语句

continue语句用于在特定情况下跳过当前循环体中的剩余语句,继续进行下一轮循环,常和条件判断一起使用。

while 循环条件:
  ……
  if 循环结束条件:
    continue     # 跳到循环开头,进行下一轮循环
for 变量 in 循环序列:
  ……
  if 循环结束条件:
    continue     # 跳到循环开头,进行下一轮循环

实例如:

# while循环
i = 0
while i < 5:
  i = i + 1
  if i == 3:
    continue
  print(i)
print('循环结束')
# 逐行输出:1 2 4 5 循环结束
# for循环
for i in range(5):
  i = i + 1
  if i == 3:
    continue
  print(i)
print('循环结束')
# 逐行输出:1 2 4 5 循环结束

Note: break语句用于结束循环,continue语句用于跳过当前循环,所以continue语句不能跳出死循环。

Note: break语句和continue语句都需缩进。

3. 总结拓展

1) while循环和for循环辨析

  • 相同点:将一件事重复n遍;
  • 不同点:while循环更适合循环次数不确定的情况,for循环更适合循环次数确定的情况。

2) break和continue语句辨析

  • break:跳出整个循环;
  • continue:跳出当前循环。

3) zip()函数

zip()函数和for循环结合可以同时遍历多个列表。

names = ['吴承恩', '罗贯中', '施耐庵', '曹雪芹']
books = ['西游记', '三国演义', '水浒传', '红楼梦']
for name, book in zip(names, books):
  print(book + '的作者是' + name)
# 输出:
# 西游记的作者是吴承恩
# 三国演义的作者是罗贯中
# 水浒传的作者是施耐庵
# 红楼梦的作者是曹雪芹

zip()函数生成的列表中的元素是一个个元组,上例中name, book这样用逗号分隔开的写法可以获取元组中对应的元素。

Note: 当用zip()函数同时遍历多个列表时,如果两个列表长度不一样,遍历次数以长度短的列表长度为准。

4) enumerate()函数

作用:同时给出序列的元素下标和元素。

names = ['吴承恩', '罗贯中', '施耐庵', '曹雪芹']
for index, item in enumerate(names):
  print(index, item)
# 输出:
# 0 吴承恩
# 1 罗贯中
# 2 施耐庵
# 3 曹雪芹

上述代码中,index是列表中元素的索引,item是列表中对应的元素。

Note: enumerate()函数返回值是enumerate类型,也需要用list()函数转换。

names = ['吴承恩', '罗贯中', '施耐庵', '曹雪芹']
print(list(enumerate(names)))
# 输出:[(0, '吴承恩'), (1, '罗贯中'), (2, '施耐庵'), (3, '曹雪芹')]

enumerate()函数生成的新列表中的元素也是元组,元组中第一个元素是索引,第二个元素是原来列表中对应索引的元素。