1. 概述

今天我们继续来看循环语句,主要介绍赋值运算符、无限循环和for循环语句。计算机编程的原理简要介绍

集成开发环境PyCharm

变量名、数字、字符串、列表

句式、注释

输入和输出

条件判断语句

循环语句

各类数据结构

函数

模块和引入

2. 赋值运算符

我们都知道赋值运算符,也就是单个等号,比如,

c = a + b

意思是把a和b相加后得到的值赋给c。在循环中,特别是while里面,我们需要常常更新控制变量,比如最基本的,

i = i + 1

将变量i增加1,并且赋值给自己以更新该变量所存储的值,其实在大部分语言中,包括Python,我们有其他的赋值运算符能让代码更简洁:

i += 1

这行代码和i = i + 1是等价的、没有区别的,“+=”号可以直接让代码中少写一个变量,变得更简洁,同理,

m -= 3 相当于 m = m - 3
n *= y 相当于 n = n * y
w /= x + y 相当于 w = w / (x + y)
p %= 7 相当于 p = p % 7
q //= p 相当于 q = q // p
t **= -1 相当于 t = t ** (-1)

如果赋值运算符后面是个公式,那么就像第三行“w /= x + y“一样,我们先计算右边的x+y,把其作为一个整体,算出值后,再用w除以计算出来的和,最后赋值回w以更新w的值。

3. 无限循环

如果代码很长,你的循环里面逻辑算法十分复杂,我们很可能会忘记更新控制变量,这时候就会产生无限循环。来看下面的代码:

i = 0
while i < 5:
print("In the loop...")
print("Goodbye!")

我们可以看到,这里的控制变量“i”用于等于0,也就是说while后面的条件永远为True,这个循环将会永远进行下去,你的屏幕上会不停地显示一行又一行的“In the loop...”,根本停不下来,而最后的Goodbye永远也不会被输出。唯一能终止程序的方法就是手动了,点击PyCharm的停止按钮或者control+C来外力终止程序。

无限循环有时候会有用处但是有用的场所很少,一般来说,我们在写程序时,必须要避免无限循环的产生,记住要更新循环的控制变量。

4. for循环语句

循环的另一大语法魔王则是for循环语句。Python的循环比较特殊,通常比如在C语言中,for依旧遵循while的基本三原则,控制变量初始化、条件判断和变量更新,如下:

#include int main(){
int ind, loop_num;
for(ind = 0; ind < 10; ind++){
loop_num = ind + 1;
printf("This is loop number %d.\n", loop_num);
}
}

大家只需要看for这一栏,大部分语言的for和C的for长得很像,可以说for是一个简化版的while循环,但是Python很有趣,其for循环必须长这样:

for in :
#code here

Python的for是直接对序列中每一个元素进行读取处理,并不需要控制变量或者条件判断(可以这么理解,但是深层次地编译还是有的,只是在表面上我们并不需要想那么多),如果一个序列到头了,循环也就自动结束了。我们来先看一个例子:

student_list = ['Alice', 'Bob', 'Cat', 'David', 'Evan', 'Frank', 'Gary', ]
for student in student_list:
print('We are now looking at ' + student)

最后结果为:

We are now looking at Alice
We are now looking at Bob
We are now looking at Cat
We are now looking at David
We are now looking at Evan
We are now looking at Frank
We are now looking at Gary

在这个简短的循环中,我们可以看到这for循环会从列表第一个元素开始,每次循环前进一个,比如第一次我们看Alice,第二次我们就看Bob,第三次是Cat,以此类推,直到列表到头,循环也跟着结束。而在每一次循环的时候,该循环所指向的元素会被赋给student这个变量(也就是紧跟在for后面那个单词),我们可以直接拿来用,不需要再和while一样用下标到列表里去找。由此也可见,用for可以很有效地避免无限循环的出现。

5. range函数

简单介绍一下range函数,range是一个内置函数,可以直接拿来用,range产生的结果是一个特殊的序列,所属一个独特类型叫range,可以转换为列表,但是一般没有必要。

range(10) #从0开始一个一个数到9

range(3, 10) #从3开始一个一个数到9

range(10, 20, 2) #从10开始每隔2个数到20前一个,也就是18

range(20, 10, -2) #从20开始每隔2个倒着数到10前一个,也就是12

可以看到range和我们之前讲的切片很像,如果写着从a到b,range就会从a开始一个一个数,最后停在b-1这里;如果只有一个数字,就像range(10)一样,就是默认从0开始数,数到括号里面那个数字减1,也就是9;如果是三个数字range(a, b, n),则可以进行跳跃我们可以每隔n个数字数,数到比b小的最大的一个数为止。

如果我们要看结果,我们必须要进行一点小操作,range产生的结果虽然是一个序列但是并不能直观地输出,我们需要把其转换为列表:

print(list(range(10))) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(range(3, 10))) #[3, 4, 5, 6, 7, 8, 9]
print(list(range(10, 20, 2))) #[10, 12, 14, 16, 18]
print(list(range(20, 10, -2))) #[20, 18, 16, 14, 12]

最后注意,range是数整数的,默认是一个一个顺序数,除非有第三个参数在里面,range不能细分成小数,比如range(0, 2, 0.1)这样的操作是不行的。

有时候我们在for循环里会使用下标,但是for...in...这种结构经常让想使用下标的人抓狂,我们有两种方法,第一种是手动添加:

student_list = ['Alice', 'Bob', 'Cat', 'David', 'Evan', 'Frank', 'Gary', ]
ind = 0
for student in student_list:
print('-- Student ID: {} --'.format(ind))
print('We are now looking at ' + student)
ind += 1

或者我们可以用len函数来数处有几个学生,结合range:

student_list = ['Alice', 'Bob', 'Cat', 'David', 'Evan', 'Frank', 'Gary', ]
for ind in range(len(student_list)):
print('-- Student ID: {} --'.format(ind))
print('We are now looking at ' + student_list[ind])

我们可以看出用range后,ind就会跟着for自动增加。range产生的是一个序列,从0数到学生数-1,也就是0到6,正好照顾到了列表所有7个学生的下标,而ind其实是在走range序列,由于range自己帮我们列好了行走路线,我们就不用像第一段代码一样手动初始化加更新变量了。

不过用了range,我们有了下标数字却不像之前一样直接能拿元素来用了,我们需要跟while一样到列表里去找元素,也就是“student_list[ind]”,有得也有失。

range函数的意义在于,for循环太方便了,我们都用不着数下标了,但是就怕有时候我们需要这些数字,我们就不得不稍微退一步。

6. while和for的选择与互换

单单说选择while还是for的话,简要来说,如果循环条件是一些不稳定的、奇奇怪怪的条件的,那还是用while比较直接;如果循环有一个序列,则for比较简便。

不过如果我们有一个稳定的序列、判断条件也不奇怪,很多情况下while和for是能互换的,也就是我们想不想把控制变量单独拎出来,这有时候还是很看程序员自己的口味。

来看一个互换的例子,

# Given a list of students' name
student_list = ['Alice', 'Bob', 'Cat', 'David', 'Evan', 'Frank', 'Gary', ]
# Initialize the counter which indicates index
ind = 0
# Length of the list indicates the number of students
total = len(student_list)
# Loop through the list
while ind < total:
# Get the current student's name
# We will look at this specific student at this loop
student = student_list[ind]
# Determine if the student passes the course
if int(input("Please type the score for {}: ".format(student))) >= 90:
print("PASSED: {}.".format(student))
else:
print("FAILED: {}.".format(student))
# Increase the counter by 1 and prepare for the next student
ind += 1
这是我们之前讲的一个例子,换成for之后就长这样:
# Given a list of students' name
student_list = ['Alice', 'Bob', 'Cat', 'David', 'Evan', 'Frank', 'Gary', ]
# Loop through the list with the each student
for student in student_list:
# Determine if the student passes the course
if int(input("Please type the score for {}: ".format(student))) >= 90:
print("PASSED: {}.".format(student))
else:
print("FAILED: {}.".format(student))

由于我们不需要下标,而for又能自动走列表,我们把很多关于下标、长度(数数有关的)代码及注释都删了,整个代码就简洁了不少。如果我们想使用下标,for加上range也非常简洁。

最后声明一下,这两天实在太忙了,来不及更新,不过貌似杂事都处理完了,应该可以回到正常的更新频率了,下一篇我们介绍break和continue以及如何在Python中实现do...while语句。