更多课程 选择中心


Python培训

400-111-8989

利用python完成枯燥重复的任务:控制流


声明:本系列教程翻译自AUTOMATE THE BORING STUFF WITH PYTHON,原作者Al Sweigart

你已经知道一些组成程序的基本元素。然而程序真正的力量不只局限于像一份周末任务清单一样一项一项地执行,基于条件表达式的值,它可以决定某段代码是否跳过,或者重复,或者选择一个分支进行下去。


布尔值

布尔值也是一种数据类型,它只有两个值:True和False(注意大小写)

和其他类型的值一样,布尔值也可以和其他元素构成表达式或存进变量中。

如果输入错误的大小写,或者作为变量名,就会引起错误:

>>> spam = True 

>>> spamTrue>>> true 

Traceback (most recent call last):   

    File "<stdin>", line 1, in <module>

NameError: name 'true' is not defined

>>> True = 2 + 2 

    File "<stdin>", line 1

SyntaxError: can't assign to keyword

>>>

比较操作符

比较操作符比较两边元素的大小,得出一个布尔值

>>> 42 == 42

True

>>> 42 == 99

False

>>> 2 != 3

True

>>> 2 != 2

False

>>> 'hello' == 'hello'

True

>>> 'hello' == 'Hello'

False

>>> 'dog' != 'cat'

True

>>> True == True

True

>>> True != False

True

>>> 42 == 42.0

True

>>> 42 == '42'

False

>>>

<,>,<=和>=操作符只能对整型和浮点型进行操作;注意“==”和“=”的区别

>>> 42 < 100

True

>>> 42 > 100

False

>>> 42 < 42

False

>>> eggCount = 42

>>> eggCount <= 42

True

>>> myAge = 29

>>> myAge >= 10

True

>>>

布尔操作符

and,or,not三个布尔操作符用于比较布尔值,并给出一个布尔值

and和or都是对两个布尔值或表达式进行操作,所以是二元操作符

>>> True and True

True

>>> True and False

False

>>>

>>> False or True

True

>>> False or False

False

>>>

>>> not True

False

>>> not not not not True

True

>>>

布尔操作符和比较操作符

既然用比较操作符可以得到布尔值,那么可以在表达式中并用比较操作符和布尔操作符

>>> (4 < 5) and (5 < 6)

True

>>> (4 < 5) and (9 < 6)

False

>>> (1 == 2) or (2 == 2)

True

>>>

上例中,电脑先计算左边的表达式,再计算右边的表达式,再计算得出整个表达式的布尔值

>>> 2 + 2 == 4 and not 2 + 2 == 5 and 2 * 2 == 2 + 2

True

>>>

优先级:not>and>or


计算(4<5)and(5<6)得到True

控制流要素

了解控制流语句之前,先介绍条件代码块的概念。目前为止出现的布尔表达式都可以作为控制流语句的条件。一个条件得出一个布尔值,控制流语句决定做什么正是基于条件的布尔值。几乎每个控制流语句都要用到条件。

几行代码组成一个代码块,通过缩进可以判断代码块的起止。块遵循三个规则:

  • 块开始于缩进值增加的地方

  • 块可以包含另外的块

  • 块结束于缩进值减为0或上级代码块的缩进值时

(貌似很复杂,其实看下面就明白了)

name = 'Mary'
password = 'swordfish'
if name == 'Mary':
    print('Hello Mary')
    if password == 'swordfish':
        print('Access granted.')
    else:
        print('Wrong password.')

程序并不是总要一行一行地执行,有时也会跳来跳去,因为它们用到了

控制流语句

最常见的控制流语句是if语句,由3个部分组成:

  • if关键字

  • 冒号

  • 下一行开始的缩进的代码块(if 语句主体)

if name == 'Alice':
    print('Hi, Alice.')

上例的流程图如下

if语句的流程图

if语句后面也可以加上else语句,只有当if语句的条件为False才执行else语句

else语句没有条件,由3部分组成:

  • else关键字

  • 冒号

  • 下一行开始的缩进的代码块(else 语句主体)

name = 'Bob'
if name == 'Alice':
    print('Hi, Alice.')
else:
    print('Hello, stranger.')

上例的流程图如下

else语句的流程图

如果分多种情况,那么需要elif语句,它由以下部分组成:

  • elif关键字

  • 条件

  • 冒号

  • 下一行开始的缩进的代码块(elif 语句主体)

name = 'Bob'
age = 5
if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')


elif语句的流程图

name = 'Dracula'
age = 4000
if ame == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')
elif age > 2000:
    print('Unlike you, Alice is not an undead, immortal vampire.')
elif age > 100:
    print('You are not Alice, grannie.')


多个elif语句的流程图

如果只有elif语句,那么可能没有分支能够执行(如果条件都是False)。想要至少有一种情况执行,可以在最后添加else语句

name = 'Bob'
age = 30
if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')
else:
    print('You are neither Alice nor a little kid.')


观察下面的流程图,打岔的分支是不可能发生的(为什么?)

如果想一直重复某块代码,可以使用while循环语句(当循环),只要它的条件一直为True,换句话说,当条件变为False时,while循环才退出。其组成部分:

  • while关键字

  • 条件

  • 冒号

  • 下一行开始的缩进的代码块(while 语句主体)

不同于if语句执行完就跳出并往下执行,while 语句主体执行完会回去检验条件的布尔值,若为True则继续执行while 语句主体,直到条件的布尔值变为False才跳出。请看下例

spam = 0
if spam < 5:
    print('Hello, world.')
    spam = spam + 1

输出结果

Hello, world.

同样的条件,同样的动作,while语句的输出结果则不同

spam = 0
while spam < 5:
    print('Hello, world.')
    spam = spam + 1

输出结果

Hello, world.

Hello, world.

Hello, world.

Hello, world.

Hello, world.

它们各自的流程图如下

if语句

while语句

有一种情况:while循环的条件永远为True,那么while循环将无限循环,没完没了。

在while 语句主体中使用break语句可以立刻结束循环。break语句只由break关键字组成。

while True: 

    print('Please type your ame.')

    name = input() 

    if name == 'your ame': 

        break

print('Thank you!')

上面第一行创造了一个无限循环(条件True的布尔值永远是True),退出当且仅当break语句被执行,其流程图如下(无限循环也叫死循环,是一种常见的程序bug)

和break语句一样,continue语句用于while循环里。当程序碰到continue时,立即跳回循环的开头,重新检验条件是否成立。

如果程序陷入死循环,按下CTRL+C(这个组合键会向程序发送KeyboardInterrupt错误来使程序立刻终止),或者在菜单中选择Shellrestart Shell来结束程序。

while True:

    print('Who are you?')

    name = input()

    if name != 'Joe':

        continue

    print('Hello, Joe. What is the password? (It is a fish.)') 

    password = input() 

    if password == 'swordfish':

        break 

print('Access granted.') 


打岔路线永不发生,因为条件总为True

作为条件时,其他数据类型的值也分为“真”值和“假”值,分别对应于True或False,比如0、0.0、''(空字符串)等价于False,而其他值等价于True。尝试执行以下代码并观察结果

name = ''

while not name: 

    print('Enter your name:')

    name = input()

print('How many guests will you have?')

numOfGuests = int(input())

if numOfGuests: 

    print('Be sure to have enough room for all your guests.')

print('Done')

你也可以把条件“not name” 换成“ not name != '' ”,把条件“numOfGuests”换成“numOfGuests != 0”,但是使用真假值可以使代码更简洁。

while循环会一直循环,只要条件为真(True)。但是如果想让一块代码执行仅执行特定的次数呢?for 循环语句range() 函数可以实现。

for循环语句长这样 for i in range(5): ,它总是包含

  • for关键字

  • 一个变量名

  • in关键字

  • 最多可接受3个整型实参的range()函数

  • 冒号

  • 下一行开始的缩进的代码块(for 语句主体)

程序示例

print('My name is')
for i in range(5):
    print('Jimmy Five Times (' + str(i) + ')')

for循环里的代码执行5次,第一次变量 i 设为 0,下次为1,逐步增长到4(不是5)

程序的结果是

My name is
Jimmy Five Times (0)
Jimmy Five Times (1)
Jimmy Five Times (2)
Jimmy Five Times (3)
Jimmy Five Times (4)

注意:for循环里也可以使用break和continue。

continue忽略后面的代码直接从计数器 i 的下一个值开始。break和continue只能用在while循环和for循环里,用在别处python会报错。

作为for循环的另一个例子,这里有一个关于数学家高斯的故事。在高斯还只是个孩子的时候,他的数学老师有一天不想上课,就让全班孩子计算0加到100的总和。高斯使用一种巧妙的方法快速得出了答案。当然现在我们可以写一个程序,计算交给python去做。

total = 0

for num in range(101): 

    total = total + num

print(total) 

答案是5050。首先变量 total 设为0,然后for循环执行 total = total + num 一百次,0到100的整数就都加到 total 上面了。即使是最慢的电脑,得出答案需要的时间也不超过1秒。

也可以写个等价的while循环实现上述做法,只是没有for循环来的简洁。

print('My name is')
i = 0
while i < 5:
    print('Jimmy Five Times (' + str(i) + ')')
    i = i + 1

它的输出和前面的前面的for循环是一样的。

range() 有起始参数,终止参数和步长参数,因此是一个多参数函数,括号中的参数之间用逗号隔开。

for i in range(12, 16):
    print(i)

第一个参数12是for循环的变量开始时候的值,第二个参数16规定 i 增长结束的地方(不包括此参数值)。第三个参数步长是每执行一次循环主体后,变量 i 增加的数值。步长是可选的,即不写时默认为1。

for i in range(0, 10, 2):
    print(i)

调用range(0, 10, 2),以2为间隔从0数到8。

甚至可以使用负的步长,让for循环倒着数。

for i in range(5, -1, -1):
    print(i)

结果是

5
4
3
2
1
0

导入函数库

每个python程序都能调用一系列基本的函数叫做内置函数,包括之前见到的print(),input(),len()。

Python也自带一些模块叫做标准库。每个库/模块都是一个python程序,它包含一些同类型功能的函数,并且可以为我们所调用。比如,math库含有许多与数学相关的函数,random库含有许多与随机数相关的函数,等等。

在能够使用库模块里的函数之前,需要先使用import语句导入库模块,它由以下部分组成:

  • import关键字

  • 库的名称

  • 更多库的名称(可选,库名之间用逗号隔开)

import random
for i in range(5):
    print(random.randint(1, 10))

输出结果:

4
1
8
4
1

randint(1, 10)的作用是随机给出介于1和10之间的整数。因为randint()属于random库,所以在函数名前面需要加上random.来告诉python从哪里找到这个函数。同时导入多个库可以这么做:

import random, sys, os, math

这样我们就可以随意使用其中的函数了,更详细的内容参见后续章节。

另一种import语句由以下要素组成:from关键字、库名、import关键字、*号。例如from random import *。使用这种形式后,在调用random库函数时不用写random.前缀,但为了代码的可读性,使用一般的import语句会好些。

最后介绍的控制流概念是如何终止程序。虽然代码执行到最后一行就会退出,但我们也可以调用sys.exit()来退出程序,记得先导入sys库。程序示例

while True:
    print('Type exit to exit.')
    response = input()
    if response == 'exit':
        sys.exit()
    print('You typed ' + response + '.')

本文内容转载自网络,本着传播与分享的原则,来源/作者信息已在文章顶部表明,版权归原作者所有,如有侵权请联系我们进行删除!

预约申请免费试听课

填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:8步搞定Python EasyGui模块安装
下一篇:Python3:Python 进程和线程

Python IDE推荐7个你可能会错过的Python IDE

Python面试题之Python中爬虫框架或模块的区别

2021年Python面试题及答案汇总详解

python数据分析,你需要这些工具

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省