使用for循环控制流程*

有时候,我们希望一块代码可以反复执行,这时候我们要用到的,就是循环~

  • for循环

假设我们有一个单词’Python’,我们想要把其中的每个字母为一行打印出来:

P
y
t
h
o
n

这就是for循环的一个经典运用场景——我们可以用for循环,遍历一个序列(字符串’Python’)中的每个元素,然后对每个元素(‘Python’中的每个字母)进行同样的操作(打印)。我们来观察其写法:

>>> word = 'Python'
>>> for ch in word: #出现了三个我们不认识的东西,for、ch还有in
	print(ch)
	
P
y
t
h
o
n

我们看到:

  1. for循环形状和前面学的if很像,for什么什么之后有一个冒号,然后另起一行缩进后书写。
  2. for循环的一般格式为:
for <变量> in <序列>:
    <缩进语块>

也就是说,for循环,实际是将一个序列(本例中,变量word所指向的字符串’Python’)中的元素,顺次赋值给一个变量(本例中 ch),然后对该变量执行缩进语块中的操作(本例中,print(ch))。

其中,变量ch只是一个名称(在这里我取的是character的首两字母),我们同样可以写成其他自己喜欢的变量名:

for letter in word:

其中,序列除了本例中的字符串外,还可以是列表、元组、集合以及我们前面学过的range()函数生成的整数序列等等。

 

  • 应用实例

初步理解for循环之后,我们来看一些实际应用的例子来加深理解:

for循环与if语句嵌套:假设我们要写一个程序——用户输入一个英文单词,程序逐行打印出该单词中所有的元音字母:

word = input('请输入一个英文单词:') #由于input()返回的是字符串,因此不需eval()

for ch in word:
    if ch in 'aeiouAEIOU': #英语中,元音字母有且仅有五个
        print(ch) #注意这一行再次进行了缩进

我们看到,在这个例子中,我们的缩进语块部分从之前一个单一的print()扩展到了一个if条件语句,我们对变量word中的每个元素进行了一次“是否为元音字母”的判断,将判断结果为True的元素,进行了打印。其中,我们要特别注意正确使用缩进

 

计算数列乘积:假设我们有一个纯数字列表[4, -2.7, 8 ,666 ,9 , -7],我们要计算所有数字的乘积:

lst = [4, -2.7, 8 ,666 ,9 , -7]
result = 1 #将整数1赋值给变量result,用来储存乘积

for num in lst:
    result = result * num #将result与num的乘积重新赋值给result
    
print(result) #注意本行的缩进,是在for循环结束之后才打印,并非每循环一次都打印

尤其注意理解第四行的用法:我们讲过,Python会先计算赋值号右边的结果,再赋值给左侧的变量。result最初是整数1,在第一次循环中,result与列表中第一个数4相乘,乘积4被重新赋值给result,此时result指向整数4。在下一个循环中,便是result指向的4与序列中的第二个数-2.7相乘了。以此类推。

 

利用索引循环*:假设我们有一个列表[1, 2, 3, 4, 5],我们使用如下循环:

>>> lst = [1, 2, 3, 4, 5]
>>> for num in lst:
	print(num)
	
1
2
3
4
5

通过上面的讲解,这个循环相信大家都很容易理解了。下面,我们介绍另一种方式来循环这个列表:

>>> for x in range(len(lst)):
	print(lst[x])
	
1
2
3
4
5

我们发现:我们首先利用len(lst)计算出了列表长度;
然后,利用这个长度生成了一个整数序列range(len(lst));
接着,我们用for循环将这个数列中的数依次赋值给x;
最后,我们打印出列表中索引号为x的元素lst[x]。

为什么要使用这种更复杂的方法来循环呢?

我们假设要写一个程序,判断一个列表[81267,  844690,  877845,  804469,  897759,  897454,  897674,  896749,  895657] 中的数字是不是按照从大到小排序的:

lst = [81267, 844690, 877845, 804469, 897759, 897454, 897674, 896749, 895657]
for num in lst:
     #_(:з」∠)_  写不下去了,因为我们没法用这种循环比较前后两个元素

这时,我们就不得不使用索引号来循环这个列表:

lst = [81267, 844690, 877845, 804469, 897759, 897454, 897674, 896749, 895657]

for x in range(len(lst)-1): #思考一下为什么是len(lst)-1
    if lst[x+1] < lst[x]: #判断是否存在任意索引为x+1的数小于索引为x的数
        print('表中第', x, '个数大于第', x+1, '个数', sep = '')

由于我们还学习到函数,上面这段代码功能不完善,但是通过这个例子,我们应该认识到,有的时候,通过索引号来进行循环是有意义的。

 

  • 本节练习

使用for循环逐行打印出列表[1, 64, 376, 881, 97, 108, 4, 67]中的奇数。

看答案

>>> lst = [1, 64, 376, 881, 97, 108, 4, 67]
>>> for num in lst:
	if num%2 ==1:
            print(num)
		
1
881
97
67

酱哦

 

已知以下两个列表:

ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
classes = ['红桃', '黑桃', '方块', '梅花']

利用for循环生成一个新的列表deck,包含一副去除大小王的扑克牌中所有元素。

看答案

>>> ranks = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
>>> classes = ['红桃', '黑桃', '方块', '梅花'] 
>>> deck = []
>>> for r in ranks:
	for c in classes:
		deck.append(c+r)

		
>>> deck
['红桃A', '黑桃A', '方块A', '梅花A', '红桃2', '黑桃2', '方块2', '梅花2', '红桃3', '黑桃3', '方块3', '梅花3', '红桃4', '黑桃4', '方块4', '梅花4', '红桃5', '黑桃5', '方块5', '梅花5', '红桃6', '黑桃6', '方块6', '梅花6', '红桃7', '黑桃7', '方块7', '梅花7', '红桃8', '黑桃8', '方块8', '梅花8', '红桃9', '黑桃9', '方块9', '梅花9', '红桃10', '黑桃10', '方块10', '梅花10', '红桃J', '黑桃J', '方块J', '梅花J', '红桃Q', '黑桃Q', '方块Q', '梅花Q', '红桃K', '黑桃K', '方块K', '梅花K']

酱哦

 

【选做】写一个程序,让用户输入一个英文单词,并将其中的所有元音字母变成大写

看答案

word = input('请输入一个英文单词:')
new_word = word

for i in range(len(word)):
    if word[i] in 'aeiouAEIOU':
        new_word = new_word.replace(word[i], word[i].upper())

print(new_word)

酱哦

 

如果还有什么问题或者发现了文章的错误,欢迎给我留言!邮箱可以随便乱写~

发表评论

邮箱地址不会被公开。 必填项已用*标注