[新手向] Python 入门(2)
Adrian Chen

条件语句

正常情况下,我们的程序是按照顺序执行的,即从上到下,逐行执行。但是有时候我们需要根据不同的情况执行不同的代码,这时候就需要用到条件语句。

image

if-else 语句

条件语句最为经典的就是 if-else 语句,它的语法如下:

1
2
3
4
if condition:
# 如果 condition 为真,执行这里的代码
else:
# 如果 condition 为假,执行这里的代码

这里我们需要说明一下,Python 中的代码块是通过缩进来划分的,而不是 C Family 中的花括号 {}。在 Python 中,缩进是非常非常严格的

上面的代码中,ifelse 在同一缩进位,说明二者是同一级别。而 if 下面的代码块是缩进的,说明这些代码是在 if 为真的情况下执行的。同理,else 下面的代码块也是缩进的,说明这些代码是在 if 为假的情况下执行的。

再来看上面这段代码的意思。这段代码是说,如果 condition 为真,那么执行 if 下面的代码块;否则,执行 else 下面的代码块。

else 一定是和 if 搭配使用的,但是 else 是可选的。如果没有 else,那么当 if 为假的时候,就不会执行任何代码。比如:

1
2
if condition:
# 如果 condition 为真,执行这里的代码

上面这段代码就是说,如果 condition 为真,那么执行 if 下面的代码块;否则,不执行任何代码。

if-elif-else 语句

有时候我们需要判断多个条件,这时候就需要用到 if-elif-else 语句。elifelse if 的缩写,它的语法如下:

1
2
3
4
5
6
if condition1:
# 如果 condition1 为真,执行这里的代码
elif condition2:
# 如果 condition1 为假,condition2 为真,执行这里的代码
else:
# 如果 condition1 和 condition2 都为假,执行这里的代码

这段代码是说,如果 condition1 为真,那么执行 if 下面的代码块;否则,即 condition1 为假,condition2 为真,那么执行 elif 下面的代码块;否则,即 condition1condition2 都为假,那么执行 else 下面的代码块。

循环语句

循环语句是用来重复执行一段代码的。比如,你有大量的逻辑需要重复执行,那么为了节省代码量,你应该使用循环语句。这些情况比如,遍历一个列表,或者重复执行某个操作。

image

for 循环

for 循环是最常用的循环语句,它的语法如下:

1
2
3
iterable = [1, 2, 3, 4, 5]
for item in iterable:
# 对 iterable 中的每个 item 执行这里的代码

这段代码是说,对 iterable 中的每个 item,执行 for 下面的代码块。item 是一个临时的变量,它会依次取 iterable 中的每个元素。

iterable 可以是任何可迭代对象,比如列表、元组、字符串等。for 循环会遍历这个可迭代对象中的每个元素。

如果你没有一个列表,但想要循环一定次数,你可以使用 range 函数:

1
2
for i in range(5):
# 对 0, 1, 2, 3, 4 执行这里的代码

range 函数会生成一个从 0 到 4 的整数序列,for 循环会遍历这个序列中的每个元素。

while 循环

while 循环是另一种常用的循环语句,它的语法如下:

1
2
3
condition = True
while condition:
# 只要 condition 为真,就一直执行这里的代码

这段代码是说,只要 condition 为真,就一直执行 while 下面的代码块。condition 是一个布尔值,当它为真的时候,就会执行 while 下面的代码块。

while 循环是一个入口控制循环,即在循环开始之前,先判断条件是否为真,只有条件为真的时候,才会执行循环体。

循环嵌套

循环语句可以嵌套,即在一个循环体中再放入另一个循环体。比如,我们可以用两个循环来遍历一个二维列表:

1
2
3
4
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for row in matrix:
for item in row:
# 对 matrix 中的每个 item 执行这里的代码

break 和 continue

在循环中,我们可以使用 breakcontinue 来控制循环的执行。break 会立即终止整个循环,而 continue 会终止当前这一次循环,直接进入下一次循环。

比如,我们可以用 break 来提前终止循环:

1
2
3
4
for i in range(10):
if i == 5:
break
print(i)

这段代码会打印出 0 到 4,当 i 等于 5 的时候,break 会终止整个循环。

而我们可以用 continue 来跳过某一次循环:

1
2
3
4
for i in range(10):
if i == 5:
continue
print(i)

这段代码会打印出 0 到 9,但不包括 5,因为当 i 等于 5 的时候,continue 会跳过这一次循环,直接进入下一次循环。

函数

我和许多人讲编程的时候都有讲到函数的概念,就我个人的教学经验而言,函数是为数不多的新手程序员在早期可能完全无法理解的概念之一。但是,函数是编程中非常重要的概念。任何一门高级语言,甚至可以没有变量的概念,但绝对都有函数。

函数这个词语,在英文中叫做 “function”,它还有一个翻译,叫“功能”。这个翻译非常贴切,因为函数就是用来实现某个功能的。在中国台湾,我们习惯把函数叫做“函式”,用以同数学上的函数区分开。

函数的作用是封装一段代码,使得这段代码可以被重复调用。这样,我们就可以把一段代码写在一个函数中,然后在需要的时候调用这个函数,而不需要重复写这段代码。

举一个例子,我们有一个非常奇葩的甲方,他要求我们,要在程序的十个不同地方都有一段代码,计算 1~100 的整数和,然后打印一句“甲方真帅”,最后生成一个 1~1000 的随机数,并判断这个随机数是比 500 大还是比 500 小,如果大的话就打印一句“甲方超级无敌帅”,小的话就打印一句“甲方帅到没朋友”。小明是承接这个工作的乙方程序员,但他不懂函数,于是他就累死累活,把下面这段代码写了十遍:

1
2
3
4
5
6
7
8
9
10
11
12
import random
sum = 0
for i in range(1, 101):
sum += i
print(sum)
print("甲方真帅")

random_number = random.randint(1, 1000)
if random_number > 500:
print("甲方超级无敌帅")
else:
print("甲方帅到没朋友")

本以为可以交差了,但是逆天的奇葩甲方又觉得,嗯,这段代码太优美了,我要在另外一百个地方,也都有这段代码!于是小明就崩溃了。他总不可能把这一堆代码写一百遍吧?

这个时候,函数就派上用场了。我们可以把这段代码封装成一个函数,然后在需要的地方调用这个函数。这样,我们就可以避免重复写代码。

我们来看如何用函数实现这个甲方的变态需求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import random

# 函数的声明,即创造一个函数
def calculate_sum():
sum = 0
for i in range(1, 101):
sum += i
print(sum)
print("甲方真帅")

random_number = random.randint(1, 1000)
if random_number > 500:
print("甲方超级无敌帅")
else:
print("甲方帅到没朋友")

# 调用函数,即使用这个函数
calculate_sum()
calculate_sum()
calculate_sum() # 这里可以调用多次,演示 3 次

我们发现,似乎代码还是那么些代码,但是我们这次,用了一个关键字 def,去声明了一个函数,这个函数叫做 calculate_sum。这个函数里面,我们把原来的代码放了进去。然后,我们在任何需要的地方,调用这个函数,就可以执行这段代码了。

这就是函数的作用。函数用来封装一段代码,使得这段代码可以被重复调用

函数的参数

按照以往的经验,参数这个东西是函数中最抽象、最难以理解、最容易让新手迷惑的概念。形式参数和实际参数,有不知道多少人弄不明白。于是我决定,不再介绍形式参数和实际参数的相关概念,直接来讲,希望能让新手朋友们更容易理解。

我们开始。

我们还是用回上面逆天甲方的变态例子。这次,甲方又变本加厉,他要求我们,计算 1~100 的整数和的时候,不是 1~100,而是 1~n,n 是一个变量,是甲方给我们的。并且,甲方还要求,打印的时候,不是打印“甲方真帅”,而是打印“甲方xxx真帅”,xxx 是甲方给我们的名字。

小明刚刚从陈叔这里学到了函数,他立刻信心满满,这好说!于是他就写了下面这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import random

def calculate_sum():
sum = 0
n = 0
name = ""
for i in range(1, n + 1):
sum += i
print(sum)
print("甲方" + name + "真帅")

random_number = random.randint(1, 1000)
if random_number > 500:
print("甲方超级无敌帅")
else:
print("甲方帅到没朋友")

calculate_sum()

然后他就被甲方半夜打电话骂了,说你这个小明,我给你了 n 和 name,你怎么不用呢?你这个小明,你这个小明……

小明睡眼惺忪,赶紧打开电脑来看。可不是嘛!n 是 0,name 是空字符串,甲方给的 n 和 name 根本没有用到!

于是小明又困惑了,他不明白咋办,于是给陈叔打电话,大半夜的把陈叔叫醒,又被陈叔呲了一顿。最后陈叔跟他说,小明,你应该用参数啊!

那怎么用参数呢?陈叔指导他,你把 n 和 name 放在函数体里面,当然不行,那是函数内部的东西,外部改不了。要想改动,就得把它俩放到函数内外都能够得到地方,哪儿呢?我们观察观察,当你调用函数的时候,是不是函数名后面跟着一个括号?对呀!括号!函数定义的时候有括号,函数调用的时候也有括号,那这个括号不就是一个函数内外都能够得到的地方吗!

好,参数的概念来了。参数通俗来说,就是写在函数标志的小括号里的,可以由外部传值到函数内部使用的一组变量

比如,上面的例子,我们可以这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import random

def calculate_sum(n, name):
sum = 0
for i in range(1, n + 1):
sum += i
print(sum)
print("甲方" + name + "真帅")

random_number = random.randint(1, 1000)
if random_number > 500:
print("甲方超级无敌帅")
else:
print("甲方帅到没朋友")

calculate_sum(100, "猪八戒") # 计算了 1~100 的整数和,打印“甲方猪八戒真帅”,并判断随机数

函数参数位的参数变量,就是函数内部的变量。当我们调用函数的时候,我们可以给这些参数变量传值,这些值会被传递到函数内部,然后在函数内部使用。比如上面的例子中,我们调用 calculate_sum(100, "猪八戒")100这个值会被传递给 n"猪八戒"这个值会被传递给 name。所以在函数内部,n 的值是 100name 的值是 "猪八戒"。这样就可以继续下去了。

模组及其引入

在 Python 中,我们可以把一些函数、变量、类等封装到一个文件中,这个文件就叫做模组。一个模组就是一个.py文件

模组化编程的好处是,我们可以把一些相关的代码放到一个文件中,这样可以更好地组织代码,提高代码的可读性。而且,我们可以把一些常用的代码封装到模组中,然后在其他地方引入这个模组,这样就可以重复使用这些代码。

比如,我们有一个模组 math.py,里面有一个函数 add

1
2
3
# math.py
def add(a, b):
return a + b

我们可以在另一个文件中引入这个模组,然后使用这个模组中的函数:

1
2
3
4
5
# main.py
import math # 引入 math.py 这个模组

result = math.add(1, 2) # 调用 math.py 中的 add 函数
print(result) # 输出 3

在上面的例子中,我们使用 import math 来引入 math.py 这个模组。然后我们就可以使用 math 这个模组中的函数 add。如果你有在使用 PyCharm,当你打出import 的时候,PyCharm 会自动提示你可以引入哪些模组,你只需要选择你要引入的模组,然后 PyCharm 会自动帮你引入。

除了 import,我们还可以使用 from import 来直接引入模组中的某个函数:

1
2
3
4
5
6
# main.py
from math import add # 从 math.py 中引入 add 函数

result = add(1, 2) # 直接调用引入的 add 函数

print(result) # 输出 3

这样,我们就可以直接使用 add 函数,而不需要写 math.add