条件语句
正常情况下,我们的程序是按照顺序执行的,即从上到下,逐行执行。但是有时候我们需要根据不同的情况执行不同的代码,这时候就需要用到条件语句。
if-else 语句
条件语句最为经典的就是 if-else
语句,它的语法如下:
这里我们需要说明一下,Python 中的代码块是通过缩进来划分的,而不是 C Family 中的花括号 {}
。在 Python 中,缩进是非常非常严格的。
上面的代码中,if
和 else
在同一缩进位,说明二者是同一级别。而 if
下面的代码块是缩进的,说明这些代码是在 if
为真的情况下执行的。同理,else
下面的代码块也是缩进的,说明这些代码是在 if
为假的情况下执行的。
再来看上面这段代码的意思。这段代码是说,如果 condition
为真,那么执行 if
下面的代码块;否则,执行 else
下面的代码块。
else
一定是和 if
搭配使用的,但是 else
是可选的。如果没有 else
,那么当 if
为假的时候,就不会执行任何代码。比如:
上面这段代码就是说,如果 condition
为真,那么执行 if
下面的代码块;否则,不执行任何代码。
if-elif-else 语句
有时候我们需要判断多个条件,这时候就需要用到 if-elif-else
语句。elif
是 else if
的缩写,它的语法如下:
这段代码是说,如果 condition1
为真,那么执行 if
下面的代码块;否则,即 condition1
为假,condition2
为真,那么执行 elif
下面的代码块;否则,即 condition1
和 condition2
都为假,那么执行 else
下面的代码块。
循环语句
循环语句是用来重复执行一段代码的。比如,你有大量的逻辑需要重复执行,那么为了节省代码量,你应该使用循环语句。这些情况比如,遍历一个列表,或者重复执行某个操作。
for 循环
for
循环是最常用的循环语句,它的语法如下:
这段代码是说,对 iterable
中的每个 item
,执行 for
下面的代码块。item
是一个临时的变量,它会依次取 iterable
中的每个元素。
iterable
可以是任何可迭代对象,比如列表、元组、字符串等。for
循环会遍历这个可迭代对象中的每个元素。
如果你没有一个列表,但想要循环一定次数,你可以使用 range
函数:
range
函数会生成一个从 0 到 4 的整数序列,for
循环会遍历这个序列中的每个元素。
while 循环
while
循环是另一种常用的循环语句,它的语法如下:
这段代码是说,只要 condition
为真,就一直执行 while
下面的代码块。condition
是一个布尔值,当它为真的时候,就会执行 while
下面的代码块。
while
循环是一个入口控制循环,即在循环开始之前,先判断条件是否为真,只有条件为真的时候,才会执行循环体。
循环嵌套
循环语句可以嵌套,即在一个循环体中再放入另一个循环体。比如,我们可以用两个循环来遍历一个二维列表:
break 和 continue
在循环中,我们可以使用 break
和 continue
来控制循环的执行。break
会立即终止整个循环,而 continue
会终止当前这一次循环,直接进入下一次循环。
比如,我们可以用 break
来提前终止循环:
这段代码会打印出 0 到 4,当 i
等于 5 的时候,break
会终止整个循环。
而我们可以用 continue
来跳过某一次循环:
这段代码会打印出 0 到 9,但不包括 5,因为当 i
等于 5 的时候,continue
会跳过这一次循环,直接进入下一次循环。
函数
我和许多人讲编程的时候都有讲到函数的概念,就我个人的教学经验而言,函数是为数不多的新手程序员在早期可能完全无法理解的概念之一。但是,函数是编程中非常重要的概念。任何一门高级语言,甚至可以没有变量的概念,但绝对都有函数。
函数这个词语,在英文中叫做 “function”,它还有一个翻译,叫“功能”。这个翻译非常贴切,因为函数就是用来实现某个功能的。在中国台湾,我们习惯把函数叫做“函式”,用以同数学上的函数区分开。
函数的作用是封装一段代码,使得这段代码可以被重复调用。这样,我们就可以把一段代码写在一个函数中,然后在需要的时候调用这个函数,而不需要重复写这段代码。
举一个例子,我们有一个非常奇葩的甲方,他要求我们,要在程序的十个不同地方都有一段代码,计算 1~100 的整数和,然后打印一句“甲方真帅”,最后生成一个 1~1000 的随机数,并判断这个随机数是比 500 大还是比 500 小,如果大的话就打印一句“甲方超级无敌帅”,小的话就打印一句“甲方帅到没朋友”。小明是承接这个工作的乙方程序员,但他不懂函数,于是他就累死累活,把下面这段代码写了十遍:
本以为可以交差了,但是逆天的奇葩甲方又觉得,嗯,这段代码太优美了,我要在另外一百个地方,也都有这段代码!于是小明就崩溃了。他总不可能把这一堆代码写一百遍吧?
这个时候,函数就派上用场了。我们可以把这段代码封装成一个函数,然后在需要的地方调用这个函数。这样,我们就可以避免重复写代码。
我们来看如何用函数实现这个甲方的变态需求。
我们发现,似乎代码还是那么些代码,但是我们这次,用了一个关键字 def
,去声明了一个函数,这个函数叫做 calculate_sum
。这个函数里面,我们把原来的代码放了进去。然后,我们在任何需要的地方,调用这个函数,就可以执行这段代码了。
这就是函数的作用。函数用来封装一段代码,使得这段代码可以被重复调用。
函数的参数
按照以往的经验,参数这个东西是函数中最抽象、最难以理解、最容易让新手迷惑的概念。形式参数和实际参数,有不知道多少人弄不明白。于是我决定,不再介绍形式参数和实际参数的相关概念,直接来讲,希望能让新手朋友们更容易理解。
我们开始。
我们还是用回上面逆天甲方的变态例子。这次,甲方又变本加厉,他要求我们,计算 1~100 的整数和的时候,不是 1~100,而是 1~n,n 是一个变量,是甲方给我们的。并且,甲方还要求,打印的时候,不是打印“甲方真帅”,而是打印“甲方xxx真帅”,xxx 是甲方给我们的名字。
小明刚刚从陈叔这里学到了函数,他立刻信心满满,这好说!于是他就写了下面这段代码:
然后他就被甲方半夜打电话骂了,说你这个小明,我给你了 n 和 name,你怎么不用呢?你这个小明,你这个小明……
小明睡眼惺忪,赶紧打开电脑来看。可不是嘛!n 是 0,name 是空字符串,甲方给的 n 和 name 根本没有用到!
于是小明又困惑了,他不明白咋办,于是给陈叔打电话,大半夜的把陈叔叫醒,又被陈叔呲了一顿。最后陈叔跟他说,小明,你应该用参数啊!
那怎么用参数呢?陈叔指导他,你把 n 和 name 放在函数体里面,当然不行,那是函数内部的东西,外部改不了。要想改动,就得把它俩放到函数内外都能够得到地方,哪儿呢?我们观察观察,当你调用函数的时候,是不是函数名后面跟着一个括号?对呀!括号!函数定义的时候有括号,函数调用的时候也有括号,那这个括号不就是一个函数内外都能够得到的地方吗!
好,参数的概念来了。参数通俗来说,就是写在函数标志的小括号里的,可以由外部传值到函数内部使用的一组变量。
比如,上面的例子,我们可以这样写:
函数参数位的参数变量,就是函数内部的变量。当我们调用函数的时候,我们可以给这些参数变量传值,这些值会被传递到函数内部,然后在函数内部使用。比如上面的例子中,我们调用 calculate_sum(100, "猪八戒")
,100
这个值会被传递给 n
,"猪八戒"
这个值会被传递给 name
。所以在函数内部,n
的值是 100
,name
的值是 "猪八戒"
。这样就可以继续下去了。
模组及其引入
在 Python 中,我们可以把一些函数、变量、类等封装到一个文件中,这个文件就叫做模组。一个模组就是一个.py文件。
模组化编程的好处是,我们可以把一些相关的代码放到一个文件中,这样可以更好地组织代码,提高代码的可读性。而且,我们可以把一些常用的代码封装到模组中,然后在其他地方引入这个模组,这样就可以重复使用这些代码。
比如,我们有一个模组 math.py
,里面有一个函数 add
:
我们可以在另一个文件中引入这个模组,然后使用这个模组中的函数:
在上面的例子中,我们使用 import math
来引入 math.py
这个模组。然后我们就可以使用 math
这个模组中的函数 add
。如果你有在使用 PyCharm,当你打出import
的时候,PyCharm 会自动提示你可以引入哪些模组,你只需要选择你要引入的模组,然后 PyCharm 会自动帮你引入。
除了 import
,我们还可以使用 from import
来直接引入模组中的某个函数:
这样,我们就可以直接使用 add
函数,而不需要写 math.add
。