有时候,我们希望一块代码可以反复执行,这时候我们要用到的,就是循环~
- 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
我们看到:
- for循环形状和前面学的if很像,for什么什么之后有一个冒号,然后另起一行缩进后书写。
- 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)
酱哦
如果还有什么问题或者发现了文章的错误,欢迎给我留言!邮箱可以随便乱写~