编程语言是最有意思的,如果要实现一个复杂的功能或程序,条件语句和循环语句必不可少。除了常见的顺序结构,if-elif-else是常见的条件语句,当你写出这样的语句的时候,就意味着你告诉了计算机什么时候该怎么做,或者什么是不用做的。for循环和while循环是常见的循环语句,循环作为编程语言中最强力的特性之一,能够帮助我们做很多重复性的事情,比如批量命名、批量操作等。

⛄顺序结构

在我们最开始编写的基础程序中,语句都是逐条执行的。即从上而下,顺序执行代码。

name = "xiaotang"
name_describe ="this is My name"
age = 20
age_describe = "this is My age"
print("="*50)
print("this is a line")
print("this is another block")
print("Hello World")
print("My friends")
......

⛄分支结构

👀布尔值

现在,如果想更进一步,让程序选择是否执行特定的语句块,该怎么办呢?在介绍分支语句之前,我们先了解一下布尔值的用武之地,布尔值(TrueFalse)作为一种变量的类型,实际上,TrueFalse不过是0和1的别名,虽然看起来不同,但作用是相同的。换而言之,标准值FalseNone、各种类型(包括浮点数、复数等)的数值0、空序列(如空字符串、空元组和空列表)以及空映射(如空字典)都被视为假,而其他各种值都被视为真,包括特殊值True

>>> True
True
>>> False
False
>>> True == 1
True
>>> False == 0
True
>>> True + False + 20
21

因此,如果你看到一个返回1或0的表达式(可能是使用较旧的Python版本编写的),就知道这实际上意味着TrueFalse

布尔值TrueFalse属于类型bool,而boolliststrtuple一样,可用来转换其他的值。

>>> bool("I think, there I am")
True
>>> bool(20)
True
>>> bool("")
False
>>> bool(0)
False

鉴于任何值都可用作布尔值,因此你几乎不需要显式地进行转换(Python会自动转换)。

👀if语句

真值可合并,至于如何合并稍后再讲,先来看看真值可用来做什么。

name = input("请输入你的语句:")
if name.endswith("wow!!"):
print"hello xiaotang wow!!"

endswith()方法用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。可选参数”start“和”end“为检索字符串的开始与结束位置。

这就是if语句,让你能够有条件地执行代码。这意味着如果条件(if和冒号之间的表达式)为前面定义的真,就执行后续代码块(这里是一条print语句);如果条件为假,就不执行(你应该猜到了)。

👀else子句

在前一节的示例中,如果你输入以Gumby结尾的名字,方法name.endswith将返回True,导致后续代码块执行——打印问候语。如果你愿意,可使用else子句增加一种选择(之所以叫子句是因为else不是独立的语句,而是if语句的一部分)。

name = input("请输入你的语句:")
if name.endswith("wow!!"):
print"hello xiaotang wow!!"
else:
print("Hello people")

在这里,如果没有执行第一个代码块(因为条件为假),将进入第二个代码块。这个示例表明,Python代码很容易理解,不是吗?如果从if开始将代码大声朗读出来,听起来将像普通句子一样(也可能不那么普通)。

还有一个与if语句很像的“亲戚”,它就是条件表达式——C语言中三目运算符的Python版本。下面的表达式使用ifelse确定其值:

status = "friend" if name.endswith("wow!!") else "people"

如果条件(紧跟在if后面)为真,表达式的结果为提供的第一个值(这里为”friend“),否则为第二个值(这里为”people“)。

👀elif子句

要检查多个条件,可使用elifelifelse if的缩写,由一个if子句和一个else子句组合而成,也就是包含条件的else子句。

num = int(input('Enter a number: ')) 
if num > 0:
print('The number is positive')
elif num < 0:
print('The number is negative')
else:
print('The number is zero')

👀代码块嵌套

下面穿插点额外的内容。你可将if语句放在其他if语句块中,如下所示:

if 条件 1
# 条件1满足执行的代码
......
if 条件1基础上的条件2
# 条件2满足时,执行的代码
......
# 条件2不满足的处理
else:
# 条件2不满足时,执行的代码
# 条件1不满足的处理
else:
# 条件1不满足时,执行的代码
......
name = input('What is your name? ') 
if name.endswith('Gumby'):
if name.startswith('Mr.'):
print('Hello, Mr. Gumby')
elif name.startswith('Mrs.'):
print('Hello, Mrs. Gumby')
else:
print('Hello, Gumby')
else:
print('Hello, stranger')

在这里,如果名字以Gumby结尾,就同时检查名字开头,这是在第一个代码块中使用一条独立的if语句完成的。请注意,这里还使用了elif。最后一个分支(else子句)没有指定条件——如果没有选择其他分支,就选择最后一个分支。如果需要,这里的两个else子句都可省略。如果省略里面的else子句,将忽略并非以Mr.或Mrs.打头的名字(假设名字为Gumby)。如果省略外面的else子句,将忽略陌生人。

⛄循环结构

至此,你知道了如何在条件为真(或假)时执行操作,但如何重复操作多次呢?例如,你可能想创建一个程序,要打印1~100的所有数。当然,你可能会想到:

print(1)
print(2)
print(3)
print(4)
print(5)
......
......
print(98)
print(99)
print(100)

但如果你愿意使用笨办法,就不会求助于Python了,不是吗?

循环的作用就是让指定的代码重复的执行。

👀while循环

为避免前述示例所示的繁琐代码,可以使用while循环快速地打印出1~100的所有数。while循环最常用的应用场景就是让执行的代码按照指定的次数重复执行。

x = 1 
while x <= 100:
print(x)
x += 1

就像上面那样做,不太复杂,不是吗?你还可以使用循环来确保用户输入名字,如下所示:

name = '' 
while not name:
name = input('Please enter your name: ')
print('Hello, {}!'.format(name))

请尝试运行这些代码,并在要求你输入名字时直接按回车键。你会看到提示信息再次出现,因为name还是为空字符串,这相当于假。

如果你只是输入一个空格字符(将其作为你的名字),结果将如何呢?程序将接受这个名字,因为包含一个空格字符的字符串不是空的,因此不会将name视为假。这无疑是这个小程序的一个瑕疵,但很容易修复:只需将while not name改为while not name or name.isspace()while not name.strip()即可。

isspace()方法:如果字符串中的所有字符均为空格字符,则返回”True“,否则,返回”False“;

strip()方法:用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。该方法只能删除开头或结尾的字符,不能删除中间部分的字符。

while循环语句基本语法

初始条件设置--通常是重复执行的计数器
while 条件(判断计数器是否达到目标次数):
条件满足时,做的事情1
条件满足时,做的事情2
条件满足时,做的事情3
......
处理条件(例如:计数器 + 1

while语句以及缩进部分是一个完整的代码块。例子:打印100遍Hello Python

# 1 初始条件设置--通常是重复执行的计数器
i = 1
# 2 使用while判断条件
while i <= 5
# 要重复执行的代码
print("Hello Python")

# 处理计数器 i
i = i + 1
print("循环结束后 i = %d" % i)

注意:循环结束后,之前定义的计数器条件的数值时依旧存在的。

死循环,由于程序员的问题,忘记在循环内部修改循环的判断条件,导致循环持续执行,程序无法终止。

👀for循环

while语句非常灵活,可用于在条件为真时反复执行代码块。这在通常情况下很好,但有时候你可能想根据需要进行定制。一种这样的需求是为序列(或其他可迭代对象)中每个元素执行代码块。

基本上,可迭代对象是可使用for循环进行遍历的对象。就目前而言,只需将可迭代对象视为序列即可。

words = ['this', 'is', 'an', 'ex', 'parrot'] 
for word in words:
print(word)
# 或者
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for number in numbers:
print(number)

鉴于迭代(也就是遍历)特定范围内的数是一种常见的任务,Python提供了一个创建范围的内置函数。

>>> range(0, 10) 
range(0, 10)
>>> list(range(0, 10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

范围类似于切片。它们包含起始位置(这里为0),但不包含结束位置(这里为10)。在很多情况下,你都希望范围的起始位置为0。实际上,如果只提供了一个位置,将把这个位置视为结束位置,并假定起始位置为0。

>>> range(10) 
range(0, 10)

下面的程序打印数1~100:

for number in range(1,101): 
print(number)

(1)迭代字典

要遍历字典的所有关键字,可像遍历序列那样使用普通的for语句。

d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
print(key, 'corresponds to', d[key])

也可使用keys等字典方法来获取所有的键。如果只对值感兴趣,可使用d.values。你可能还记得,d.items以元组的方式返回键值对。for循环的优点之一是,可在其中使用序列解包。

for key, value in d.items(): 
print(key, 'corresponds to', value)

(2)遍历列表

names = ['anne', 'beth', 'george', 'damon']
ages = [12, 45, 32, 102]
for i in range(len(names)):
print(names[i], 'is', ages[i], 'years old')

👀break和continue

breakcontinue是专门在循环中使用的关键字。

break:在循环过程中,如果某一条件满足后,不希望执行循环,可以使用break退出循环;

continue:在循环过程中,如果某一条件满足后,不希望执行循环,但又不退出循环,可以使用continue跳过当次循环。即:在整个循环中,只有某些条件,不需要执行循环代码,而其它条件都需要执行。

👀练习

(1)打印小星星

# 打印小星星
i = 1
while i <= 5:
j = 1
# 在循环内部,再增加一个循环,实现每一行的星星打印
while j <= i:
print("*",end="")
j += 1
# 每一行星号输出完成后,再增加一个换行
print("")
i += 1

# 输出结果
*
**
***
****
*****

默认情况下,print()函数输出内容之后,会自动在内容末尾增加换行;如果不希望末尾增加换行,可以在print()函数输出内容的后面增加,end="";其中””中间可以指定print()函数输出内容之后,继续希望显示的内容。

# 向控制台输出内容结束之后,不会换行
print("*",end="")
# 单纯的换行
print("")

(2)打印九九乘法表

# 打印九九乘法表
i = 1
# 最大打印9行
while i <= 9:
# 定义起始列
j = 1
# 最大打印i列
while j <= i:
# 转义字符,\t在控制台输出一个制表符,协助在输出文件时,垂直方向保持对齐
print("%d*%d=%d"%(j,i,i*j),end="\t")
j += 1
# 一行打印完成后,换行
print("")
i += 1

# 输出结果
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

\t 在控制台输出一个制表符,协助在输出文本时垂直方向保持对齐

\n 在控制台输出一个换行符

制表符的功能是在不使用表格的情况下在垂直方向按列对齐文本。

⛄转义字符

转义字符是很多程序语言、数据格式和通信协议的形式文法的一部分。对于一个给定的字母表,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义。因此转义字符开头的字符序列被叫做转义序列。

转义序列通常有两种功能。第一个是编码一个句法上的实体,如设备命令或者无法被字母表直接表示的特殊数据。第二种功能,也叫字符引用,用于表示无法在当前上下文中被键盘录入的字符(如字符串中的回车符),或者在当前上下文中会有不期望的含义的字符(如C语言字符串中的双引号字符”,不能直接出现,必须用转义序列表示)。在后面那种情况,转义序列是一种由转义字符自身和一个被引用的字符组成的一个二合字母(digraph)情形。

转义字符 描述说明
\\ 反斜杠符号
' 单引号
" 双引号
\n 换行
\t 横向制表符
\r 回车

参考文献:

《编程小白的第1本Python入门书》侯爵

《Python基础教程(第3版)》 Magnus Lie Hetland(著)袁国忠(译)