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 + 1while循环的组成:

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()函数生成的新列表中的元素也是元组,元组中第一个元素是索引,第二个元素是原来列表中对应索引的元素。

Reference:

[1] Wes McKinney. 2017. Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython, 2nd Edition [M]. O'Reilly Media, Inc.