简明Python3教程 8.控制流

简介

迄今为止我们见到的所有程序总是含有一连串语句并且python忠实的顺序执行它们。

那么如何改变它们的执行顺序呢?例如你希望程序根据不同情况作出不同反应,按照当前时间分别

打印出’Good Morning’或’Good Evening’?

也许你已经猜到了,这需要使用控制流程语句,python拥有3种此类语句,分别为if,forwhile

 

if语句

if语句用来检查一个条件,如果条件为则执行一个语句块(被称作if),否则执行另一个语句块(被称作else)。

其中else分支是可选的。

范例:

#!/usr/bin/python

# Filename: if.py

number = 23

guess = int(input('Enter an integer : '))

if guess == number:

    print('Congratulations, you guessed it.') # 新块开始处

    print('(but you do not win any prizes!)') # 新块结束处

elif guess < number:

    print('No, it is a little higher than that') # 另一个块

    # 你可以在一个块里做任何你想做的。。。

else:

    print('No, it is a little lower than that')

    # 只有guess > number 才会执行到此处

print('Done')

# if语句执行完毕后,最后这条语句永远会被执行

输出:

    $ python if.py

    Enter an integer : 50

    No, it is a little lower than that

    Done

   

    $ python if.py

    Enter an integer : 22

    No, it is a little higher than that

    Done

   

    $ python if.py

    Enter an integer : 23

    Congratulations, you guessed it.

    (but you do not win any prizes!)

    Done

程序流程:

本程序将用户猜测的数对比被猜的数(注: 23)。

我们可以将被猜数定为任何整数。然后利用input()函数得到用户猜测的数。

函数只是可复用的程序片段,下章我们会学到更多关于函数的知识。

我们为内建input函数提供一个字符串,函数会将它打印到屏幕,一但我们输入了什么并按下回车,

input就会将输入当作一个字符串返回,之后利用int我们将其转换为一个整数并存入变量guess中。

实际上int是一个类,现在你只需知道它能将一个字符串转换为整数(假设字符串包含一个合法的文本

形式的整数)。

接下来我们比较用户猜测的数与被猜的数,如果它们相等我们就打印一个成功信息。注意我们

使用缩进告诉python语句分别属于哪些块,这就是为什么缩进对于python非常重要。

我也希望你能做到前文提到的”缩进一致性”规则,你可以吗?

同时也要注意到if语句的结尾包含一个分号 – 它指示python分号其后将跟随一个语句块。

紧接着我们检查猜测的数是否小于被猜数,如果是,则告诉用户猜测的数大了一些。

这里我们使用的是elif分支,事实上它把两个相关的if else-if else语句组合成一个if-elif-else语句。

这样做不仅使得程序更加简洁也降低了缩进数量。

同样,elifelse语句必须在逻辑行的结尾写上冒号,其后是与之对应的语句块(当然还要有相应的缩进)

最后你也可以在if语句中插入另一个if-block块,这叫做嵌套的if语句。

上面说过elif和else是可选的。一个最简单合法的if语句如下:

if True:

    print('Yes, it is true')

当python执行完if语句及其相关的elif和else分支,控制权会转移到包含此if语句的语句块的下一条语句。

本例中,这个块是主块,程序从此块开始执行,下一个条语句为print(‘Done’)

随后python看到程序的结尾并简单的结束运行。

尽管程序非常简单,我也指出了这个简单程序中你所有应该注意的地方。

这一切十分易懂(有C/C++背景更是如此),但在最初你还是要引起注意,等到用熟以后就会感到自然,顺手了。

C/C++程序员请注意

python没有switch语句,你可以使用if…elif…else语句达到同样的目的(有时用字典代替会更加快捷)。

 

while语句

只要条件为真,while语句允许你不断的重复执行语句块。

while语句是所谓循环语句的一个例子,它还可以拥有一个可选的else分支。

范例:

#!/usr/bin/python

# Filename: while.py

number = 23

running = True

while running:

    guess = int(input('Enter an integer : '))

    if guess == number:

        print('Congratulations, you guessed it.')

        running = False # this causes the while loop to stop

    elif guess < number:

        print('No, it is a little higher than that.')

    else:

        print('No, it is a little lower than that.')

else:

    print('The while loop is over.')

    # Do anything else you want to do here

print('Done')

输出:

    $ python while.py

    Enter an integer : 50

    No, it is a little lower than that.

    Enter an integer : 22

    No, it is a little higher than that.

    Enter an integer : 23

    Congratulations, you guessed it.

    The while loop is over.

Done

工作流程

本例中我们继续玩猜数字游戏,不过更先进的是用户可以不断的猜直到猜对为止 – 如此就不会象

上一个范例那样用户每猜一次都运行一遍程序了。这正好可以恰当的示范while语句的使用。

我们将input和if语句移进while循环内,并在循环开始前将变量running设为True

最初我们检查变量running是否为True并进入while块执行之。while块执行完毕后继续检查条件,即running是否为真。

如果是则再次执行while块,否则可选的else块将被执行。完毕后再执行下一条语句。

只有while语句的条件为False时else才会被执行 – 就算条件第一次被检查时也是如此。

因此除非使用break跳出循环,否则while循环的else分支肯定会被执行。

TrueFalse被称为Boolean类型,你可以分别把它们看作是值1和0。

(注:只是”看作”而已,不要认为它们完全等于0和1)

写给C/C++程序员

记住,while循环可以拥有else分支

 

for循环

for…in是另一种循环语句,用来遍历序列对象,也就是说遍历序列中的每个元素。

至于序列对象,你现在只要记住序列只是元素的集合就可以了。

范例:

#!/usr/bin/python

# Filename: for.py

for i in range(1, 5):

    print(i)

else:

    print('The for loop is over')

输出

    $ python for.py

    1

    2

    3

    4

The for loop is over

执行流程

在这个程序中,我们打印了一个数字序列。而这个序列由内建range函数产生。

根据我们提供的两个数字,range返回一个开始于第一个数字而结束于第二个数的序列,例如

range(1, 5)产生序列[1, 2, 3, 4]。默认的range步长为1。如果我们传给它第三个数字,则相当于设置步长。

例如range(1, 5, 2)产生[1, 3]。记住range函数止步于我们提供的第2个数字,即不包含第2个数。

然后for循环对其进行迭代 – for i in range(1, 5)等价于for I in [1, 2, 3, 4]就象将序列中的每个数

字(或对象)一次一个的赋给i,而每次赋值都会执行一遍for语句块。本例中我们仅仅打印i的值。

记住,else部分同样是可选的,除非使用break语句跳出循环否则它总是在循环结束时执行一次。

还应记住,for…in可以工作于任何序列,这里我们使用的是内建函数range产生的数字列表,

但我们也可以使用任何种类的对象组成的任何种类的序列!后面的章节会有具体解释。

C/C++/Java/C#请注意

python的for循环完全不同于C/C++的for循环。

C#程序员应该已经注意到它类似于C#中的foreach循环。

而Java程序员也应该注意到了Java1.5的for(int i : IntArray)与之很相似。

如果你想实现C/C++中的for(int i = 0; i< 5; i++),python中只需编写 for i in range(0, 5)

如你所见,python的for循环更简单,更富于表达力也更不容易出错。

 

break语句

break语句用于跳出循环,即停止循环语句的执行,即使循环条件还没有变为False或者序列的遍历尚未完成。

一个需要特别注意的地方是如果你使用break跳出for或while循环,那么相关的else块不会被执行。

范例

#!/usr/bin/python

# Filename: break.py

while True:

    s = (input('Enter something : '))

    if s == 'quit':

        break

    print('Length of the string is', len(s))

print('Done')

输出:

    $ python break.py

    Enter something : Programming is fun

    Length of the string is 18

    Enter something : When the work is done

Length of the string is 21

Enter something : if you wanna make your work also fun:

Length of the string is 37

Enter something :       use Python!

Length of the string is 12

Enter something : quit

Done

工作流程

这个程序不断的取得用户输入,并打印每次输入的长度。通过一个特殊条件判断用户

输入是否等于’quit’,如果是则使用break跳出循环,随后来到程序尾则程序终止。

而输入字符串的长度可以通过内建函数len得到。

记住for循环同样可以使用break语句。

 

Swaroop Poetic Python

我在范例中输入的是一首自赋的小诗,它的名字叫Swaroop's Poetic Python:

    Programming is fun

    When the work is done

    if you wanna make your work also fun:

        use Python!

(注: Swaroop是本文作者,不翻译了,各位用个人独有的悠悠情愫”淫”起来吧,啊。。。。啊。。。。)

 

continue语句

语句continue告诉python跳过当前循环语句块的剩余部分执行下次迭代。

范例:

#!/usr/bin/python

# Filename: continue.py

while True:

    s = input('Enter something : ')

    if s == 'quit':

        break

    if len(s) < 3:

        print('Too small')

        continue

    print('Input is of sufficient length')

    # Do other kinds of processing here...

输出:

    $ python test.py

    Enter something : a

    Too small

    Enter something : 12

Too small

Enter something : abc

Input is of sufficient length

Enter something : quit

工作流程:

本例接收用户输入,只有当输入至少为3个字符长时才会进行处理。

因此我们使用内建len函数取得输入长度,当小于3时利用continue语句跳过程序的余下部分。

否则程序的余下部分会被执行,在这里可以进行我们希望做的任何种类的处理。

注意,continue语句同样能够配合for循环使用。

 

小结

我们已经知道如何使用python中的3个控制流语句了 - if, while, for及其相关的break, continue语句。

它们是python中常用的部分,因此有必要熟练掌握。

接下来,我们会看到如何创建和使用函数

 

 

 

 

--------------Python书籍推荐-----------------
Python基础教程-第2版.修订版 
购买地址1  购买地址2
PYTHON核心编程
购买地址1  购买地址2
零基础学Python
购买地址1  购买地址2

转载于:https://www.cnblogs.com/txw1958/archive/2012/12/10/A_Byte_of_Python3_Control_Flow.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1166. 设计文件系统(哈希map)

文章目录1. 题目2. 解题1. 题目 你需要设计一个能提供下面两个函数的文件系统&#xff1a; create(path, value): 创建一个新的路径&#xff0c;并尽可能将值 value 与路径 path 关联&#xff0c;然后返回 True。 如果路径已经存在或者路径的父路径不存在&#xff0c;则返回 …

LeetCode 1087. 字母切换(回溯)

文章目录1. 题目2. 解题1. 题目 我们用一个特殊的字符串 S 来表示一份单词列表&#xff0c;之所以能展开成为一个列表&#xff0c;是因为这个字符串 S 中存在一个叫做「选项」的概念&#xff1a; 单词中的每个字母可能只有一个选项或存在多个备选项。 如果只有一个选项&…

遍历删除_面试难题:List 如何一边遍历,一边删除?

1. 新手常犯的错误可能很多新手(包括当年的我&#xff0c;哈哈)第一时间想到的写法是下面这样的&#xff1a;public static void main(String[] args) { List platformList new ArrayList<>(); platformList.add("博客园"); platformList.add("…

LeetCode 1060. 有序数组中的缺失元素(二分查找)

文章目录1. 题目2. 解题2.1 一次遍历2.2 二分查找1. 题目 给出一个有序数组 A&#xff0c;数组中的每个数字都是 独一无二的&#xff0c;找出从数组最左边开始的第 K 个缺失数字。 示例 1&#xff1a; 输入&#xff1a;A [4,7,9,10], K 1 输出&#xff1a;5 解释&#xff1…

iOS代码工具箱

判断日期是不是同一天&#xff0c;不要求是小时、分钟要一样。from&#xff1a;http://www.oliverfoggin.com/nsdate-isequaltodatetounitgranularity/?utm_sourceiOSDevWeekly&utm_campaigniOS_Dev_Weekly_Issue_115&utm_mediumemail #import <Foundation/Foundat…

LeetCode 536. 从字符串生成二叉树(递归)

文章目录1. 题目2. 解题1. 题目 你需要从一个包括括号和整数的字符串构建一棵二叉树。 输入的字符串代表一棵二叉树。 它包括整数和随后的0&#xff0c;1或2对括号。 整数代表根的值&#xff0c;一对括号内表示同样结构的子树。 若存在左子结点&#xff0c;则从左子结点开始…

LeetCode 1062. 最长重复子串(二分查找)

文章目录1. 题目2. 解题1. 题目 给定字符串 S&#xff0c;找出最长重复子串的长度。如果不存在重复子串就返回 0。 示例 1&#xff1a; 输入&#xff1a;"abcd" 输出&#xff1a;0 解释&#xff1a;没有重复子串。示例 2&#xff1a; 输入&#xff1a;"abbaba…

LeetCode MySQL 1174. 即时食物配送 II

文章目录1. 题目2. 解题1. 题目 配送表: Delivery -------------------------------------- | Column Name | Type | -------------------------------------- | delivery_id | int | | customer_id | int | | o…

存储过程语法

View Code 存储过程如同一门程序设计语言&#xff0c;同样包含了数据类型、流程控制、输入和输出和它自己的函数库。--------------------基本语法--------------------一.创建存储过程 create procedure sp_name() begin ......... end二.调用存储过程 1.基本语法&#xff1a…

LeetCode MySQL 1158. 市场分析 I

文章目录1. 题目2. 解题1. 题目 Table: Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | join_date | date | | favorite_brand | varchar | ------------------------- 此表主键是 user_i…

sqlite 数据量_向SQLite批量导入csv,txt数据

将csv或者txt格式的文件导入SQLite一般有两种方式&#xff1a;使用pandas.readcsv()读取后&#xff0c;用to_sql方法写入数据库使用SQLiteStudio创建表格&#xff0c;再导入数据但是这两种方法在数据量比较大的时候会非常慢&#xff0c;这里提供一种使用官网提供的SQLite.exe命…

ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL(转)

http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html 引言-- 在初级篇中&#xff0c;我们介绍了如何利用基于ASP.NET MVC的Web程序中的Global文件来简单的重写路由。也介绍了它本身的局限性-依赖于路由信息中的键值对: 如果键值对中没有的值&#xff0c;我们无…

LeetCode MySQL 580. 统计各专业学生人数

文章目录1. 题目2. 解题1. 题目 一所大学有 2 个数据表&#xff0c;分别是 student 和 department &#xff0c;这两个表保存着每个专业的学生数据和院系数据。 写一个查询语句&#xff0c;查询 department 表中每个专业的学生人数 &#xff08;即使没有学生的专业也需列出&a…

LeetCode 1522. Diameter of N-Ary Tree(递归)

文章目录1. 题目2. 解题1. 题目 Given a root of an N-ary tree, you need to compute the length of the diameter of the tree. The diameter of an N-ary tree is the length of the longest path between any two nodes in the tree. This path may or may not pass thro…

LeetCode MySQL 1355. 活动参与者(any函数)

文章目录1. 题目2. 解题1. 题目 表: Friends ------------------------ | Column Name | Type | ------------------------ | id | int | | name | varchar | | activity | varchar | ------------------------ id 是朋友的 id 和该表的主…

LeetCode MySQL 578. 查询回答率最高的问题

文章目录1. 题目2. 解题1. 题目 从 survey_log 表中获得回答率最高的问题&#xff0c; survey_log 表包含这些列&#xff1a;id, action, question_id, answer_id, q_num, timestamp。 id 表示用户 id&#xff1b; action 有以下几种值&#xff1a;"show"&#xff…

LeetCode MySQL 1098. 小众书籍

文章目录1. 题目2. 解题1. 题目 书籍表 Books&#xff1a; ------------------------- | Column Name | Type | ------------------------- | book_id | int | | name | varchar | | available_from | date | ------------------------- book_…

LeetCode MySQL 1107. 每日新用户统计

文章目录1. 题目2. 解题1. 题目 Traffic 表&#xff1a; ------------------------ | Column Name | Type | ------------------------ | user_id | int | | activity | enum | | activity_date | date | ------------------------ 该表没有主键&a…

mysql gui 有哪些_推荐五款较好的MySQLGUI工具

大多数数据库都是由两个截然不同的部分组成的&#xff1a;后端(存储数据的地方)和前端(一个用于连接数据组件的用户界面)。这种架构可以大多数数据库都是由两个截然不同的部分组成的&#xff1a;后端(存储数据的地方)和前端(一个用于连接数据组件的用户界面)。这种架构可以把用…

共享打印机的方法

共享打印机的方法 1、在计算机上连接好打印机&#xff0c;并安装好打印机的驱动&#xff0c;测试是否在本机上可以打印 &#xff1b; 2、在打印服务器上&#xff0c;共享该打印机&#xff1b; 3、保证打印服务器上的共享资源可以正常地访问&#xff1b; 4、在PC机运行“\\打印服…