一、分支结构

应用场景

我们写的Python代码都是一条一条语句顺序执行,这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题。

if语句的使用

在Python中,要构造分支结构可以使用ifelifelse关键字。所谓关键字就是有特殊含义的单词,像ifelse就是专门用于构造分支结构的关键字,很显然你不能够使用它作为变量名。下面的例子中演示了如何构造一个分支结构。

username = input('请输入用户名: ')password = input('请输入口令: ')# 用户名是admin且密码是123456则身份验证成功否则身份验证失败if username == 'admin' and password == '123456':print('身份验证成功!')else:print('身份验证失败!')

需要说明的是,不同于C++、Java等编程语言,Python中没有用花括号来构造代码块而是使用了缩进的方式来表示代码的层次结构,如果if条件成立的情况下需要执行多条语句,只要保持多条语句具有相同的缩进就可以了。换句话说连续的代码如果又保持了相同的缩进那么它们属于同一个代码块,相当于是一个执行的整体。缩进可以使用任意数量的空格,但通常使用4个空格,强烈建议大家不要使用制表键来缩进代码,如果你已经习惯了这么做,可以设置代码编辑工具将1个制表键自动变成4个空格,很多的代码编辑工具都支持这项功能。

提示ifelse 的最后面有一个:,它是用英文输入法输入的冒号;程序中输入的'"=()等特殊字符,都是在英文输入法状态下输入的。有很多初学者经常不注意这一点,结果运行代码的时候就会遇到很多莫名其妙的错误提示。强烈建议大家在写代码的时候都打开英文输入法(注意是英文输入法而不是中文输入法的英文输入模式),这样可以避免很多不必要的麻烦。

如果要构造出更多的分支,可以使用if...elif...else...结构或者嵌套的if...else...结构,下面的代码演示了如何利用多分支结构实现分段函数求值。

f(x)= { 3x−5,(x>1)x+2,(−1≤x≤1)5x+3,(x<−1) f(x) = \begin{cases} 3x – 5, & (x \gt 1) \\ x + 2, & (-1 \le x \le 1) \\ 5x + 3, & (x \lt -1) \end{cases} f(x)= 3x5,x+2,5x+3,(x>1)(1x1)(x<1)

"""分段函数求值"""x = float(input('x = '))if x > 1:y = 3 * x - 5elif x >= -1:y = x + 2else:y = 5 * x + 3print(f'f({x}) = {y}')

当然根据实际开发的需要,分支结构是可以嵌套的,例如判断是否通关以后还要根据你获得的宝物或者道具的数量对你的表现给出等级(比如点亮两颗或三颗星星),那么我们就需要在if的内部构造出一个新的分支结构,同理elifelse中也可以再构造新的分支,我们称之为嵌套的分支结构,也就是说上面的代码也可以写成下面的样子。

"""分段函数求值"""x = float(input('x = '))if x > 1:y = 3 * x - 5else:if x >= -1:y = x + 2else:y = 5 * x + 3print(f'f({x}) = {y}')

说明: 大家可以自己感受和评判一下这两种写法到底是哪一种更好。在Python之禅中有这么一句话:“Flat is better than nested”,之所以提倡代码“扁平化”,是因为代码嵌套的层次如果很多,会严重的影响代码的可读性,所以使用更为扁平化的结构在很多场景下都是较好的选择。

一些例子

例子1:英制单位英寸与公制单位厘米互换。
"""英制单位英寸和公制单位厘米互换"""value = float(input('请输入长度: '))unit = input('请输入单位: ')if unit == 'in' or unit == '英寸':print('%f英寸 = %f厘米' % (value, value * 2.54))elif unit == 'cm' or unit == '厘米':print('%f厘米 = %f英寸' % (value, value / 2.54))else:print('请输入有效的单位')
例子2:百分制成绩转换为等级制成绩。

要求:如果输入的成绩在90分以上(含90分)输出A;80分-90分(不含90分)输出B;70分-80分(不含80分)输出C;60分-70分(不含70分)输出D;60分以下输出E。

"""百分制成绩转换为等级制成绩"""score = float(input('请输入成绩: '))if score >= 90:grade = 'A'elif score >= 80:grade = 'B'elif score >= 70:grade = 'C'elif score >= 60:grade = 'D'else:grade = 'E'print('对应的等级是:', grade)
例子3:输入三条边长,如果能构成三角形就计算周长和面积。
"""判断输入的边长能否构成三角形,如果能则计算出三角形的周长和面积"""a = float(input('a = '))b = float(input('b = '))c = float(input('c = '))if a + b > c and a + c > b and b + c > a:peri = a + b + cprint(f'周长: {peri}')half = peri / 2area = (half * (half - a) * (half - b) * (half - c)) ** 0.5print(f'面积: {area}')else:print('不能构成三角形')

说明: 上面通过边长计算三角形面积的公式叫做海伦公式。

二、循环结构

应用场景

我们在写程序的时候,一定会遇到需要重复执行某条指令或某些指令的场景。例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令。在这个场景中,让机器人向球门方向移动就是一个需要重复的动作,当然这里还会用到上一课讲的分支结构来判断机器人是否持球以及是否进入射门范围。再举一个简单的例子,如果要实现每隔1秒中在屏幕上打印一次“hello, world”并持续打印一个小时,我们肯定不能够直接把print('hello, world')这句代码写3600遍,这里我们需要构造循环结构。

所谓循环结构,就是程序中控制某条或某些指令重复执行的结构。在Python中构造循环结构有两种做法,一种是for-in循环,另一种是while循环。

for-in循环

如果明确的知道循环执行的次数,我们推荐使用for-in循环,例如输出100行的”hello, world“。 被for-in循环控制的语句块也是通过缩进的方式来构造的,这一点跟分支结构完全相同,大家看看下面的代码就明白了。

"""用for循环实现1~100求和"""total = 0for x in range(1, 101):total += xprint(total)

需要说明的是上面代码中的range(1, 101)可以用来构造一个从1100的范围,当我们把这样一个范围放到for-in循环中,就可以通过前面的循环变量x依次取出从1100的整数。当然,range的用法非常灵活,下面给出了一个例子:

  • range(101):可以用来产生0到100范围的整数,需要注意的是取不到101。
  • range(1, 101):可以用来产生1到100范围的整数,相当于前面是闭区间后面是开区间。
  • range(1, 101, 2):可以用来产生1到100的奇数,其中2是步长,即每次递增的值。
  • range(100, 0, -2):可以用来产生100到1的偶数,其中-2是步长,即每次递减的值。

知道了这一点,我们可以用下面的代码来实现1~100之间的偶数求和。

"""用for循环实现1~100之间的偶数求和"""total = 0for x in range(2, 101, 2):total += xprint(total)

while循环

如果要构造不知道具体循环次数的循环结构,我们推荐使用while循环。while循环通过一个能够产生bool值的表达式来控制循环,当表达式的值为True时则继续循环,当表达式的值为False时则结束循环。

下面我们通过一个“猜数字”的小游戏来看看如何使用while循环。猜数字游戏的规则是:计算机出一个1100之间的随机数,玩家输入自己猜的数字,计算机给出对应的提示信息(大一点、小一点或猜对了),如果玩家猜中了数字,计算机提示用户一共猜了多少次,游戏结束,否则游戏继续。

"""猜数字游戏"""import random# 产生一个1-100范围的随机数answer = random.randint(1, 100)counter = 0while True:counter += 1number = int(input('请输入: '))if number  answer:print('小一点')else:print('恭喜你猜对了!')break# 当退出while循环的时候显示用户一共猜了多少次print(f'你总共猜了{counter}次')

break和continue

上面的代码中使用while True构造了一个条件恒成立的循环,也就意味着如果不做特殊处理,循环是不会结束的,这也就是常说的“死循环”。为了在用户猜中数字时能够退出循环结构,我们使用了break关键字,它的作用是提前结束循环。需要注意的是,break只能终止它所在的那个循环,这一点在使用嵌套循环结构时需要引起注意,下面的例子我们会讲到什么是嵌套的循环结构。除了break之外,还有另一个关键字是continue,它可以用来放弃本次循环后续的代码直接让循环进入下一轮。

嵌套的循环结构

和分支结构一样,循环结构也是可以嵌套的,也就是说在循环中还可以构造循环结构。下面的例子演示了如何通过嵌套的循环来输出一个乘法口诀表(九九表)。

"""打印乘法口诀表"""for i in range(1, 10):for j in range(1, i + 1):print(f'{i}*{j}={i * j}', end='\t')print()

很显然,在上面的代码中,外层循环用来控制一共会产生9行的输出,而内层循环用来控制每一行会输出多少列。内层循环中的输出就是九九表一行中的所有列,所以在内层循环完成时,有一个print()来实现换行输出的效果。

循环的例子

例子1:输入一个正整数判断它是不是素数。

提示:素数指的是只能被1和自身整除的大于1的整数。

"""输入一个正整数判断它是不是素数"""num = int(input('请输入一个正整数: '))end = int(num ** 0.5)is_prime = Truefor x in range(2, end + 1):if num % x == 0:is_prime = Falsebreakif is_prime and num != 1:print(f'{num}是素数')else:print(f'{num}不是素数')
例子2:输入两个正整数,计算它们的最大公约数和最小公倍数。

提示:两个数的最大公约数是两个数的公共因子中最大的那个数;两个数的最小公倍数则是能够同时被两个数整除的最小的那个数。

"""输入两个正整数计算它们的最大公约数和最小公倍数"""x = int(input('x = '))y = int(input('y = '))for factor in range(x, 0, -1):if x % factor == 0 and y % factor == 0:print(f'{x}和{y}的最大公约数是{factor}')print(f'{x}和{y}的最小公倍数是{x * y // factor}')break

如果知道循环的次数,我们通常使用for循环;如果循环次数不能确定,可以用while循环。在循环中还可以使用break来提前结束循环

三、分支和循环结构的应用

分支和循环结构的重要性不言而喻,它是构造程序逻辑的基础,对于初学者来说也是比较困难的部分。大部分初学者在学习了分支和循环结构后都能理解它们的用途和用法,但是遇到实际问题的时候又无法下手。

经典小案例

例子1:寻找水仙花数。

说明:水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯特朗数,它是一个3位数,该数字每个位上数字的立方之和正好等于它本身。

这个题目的关键是将一个三位数拆分为个位、十位、百位,这一点利用Python中的//(整除)和%(求模)运算符其实很容易做到,代码如下所示。

"""找出所有水仙花数"""for num in range(100, 1000):low = num % 10mid = num // 10 % 10high = num // 100if num == low ** 3 + mid ** 3 + high ** 3:print(num)

上面利用//%拆分一个数的小技巧在写代码的时候还是很常用的。我们要将一个不知道有多少位的正整数进行反转,例如将12345变成54321,也可以利用这两个运算来实现,代码如下所示。

"""正整数的反转"""num = int(input('num = '))reversed_num = 0while num > 0:reversed_num = reversed_num * 10 + num % 10num //= 10print(reversed_num)
例子2:百钱百鸡问题。

说明:百钱百鸡是我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?翻译成现代文是:公鸡5元一只,母鸡3元一只,小鸡1元三只,用100块钱买一百只鸡,问公鸡、母鸡、小鸡各有多少只?

"""《百钱百鸡》问题"""# 假设公鸡的数量为x,x的取值范围是0到20for x in range(0, 21):# 假设母鸡的数量为y,y的取值范围是0到33for y in range(0, 34):z = 100 - x - yif 5 * x + 3 * y + z // 3 == 100 and z % 3 == 0:print(f'公鸡: {x}只, 母鸡: {y}只, 小鸡: {z}只')

上面使用的方法叫做穷举法,也称为暴力搜索法,这种方法通过一项一项的列举备选解决方案中所有可能的候选项并检查每个候选项是否符合问题的描述,最终得到问题的解。这种方法看起来比较笨拙,但对于运算能力非常强大的计算机来说,通常都是一个可行的甚至是不错的选择,只要问题的解存在就能够找到它。

例子3:CRAPS赌博游戏。

说明:CRAPS又称花旗骰,是美国拉斯维加斯非常受欢迎的一种的桌上赌博游戏。该游戏使用两粒骰子,玩家通过摇两粒骰子获得点数进行游戏。简化后的规则是:玩家第一次摇骰子如果摇出了7点或11点,玩家胜;玩家第一次如果摇出2点、3点或12点,庄家胜;玩家如果摇出其他点数则玩家继续摇骰子,如果玩家摇出了7点,庄家胜;如果玩家摇出了第一次摇的点数,玩家胜;其他点数玩家继续摇骰子,直到分出胜负。

"""Craps赌博游戏我们设定游戏开始时玩家有1000元的赌注游戏结束的条件是玩家破产(输光所有的赌注)"""from random import randintmoney = 1000while money > 0:print(f'你的总资产为: {money}元')go_on = False# 下注金额必须大于0小于等于玩家总资产while True:debt = int(input('请下注: '))if 0 < debt <= money:break# 第一次摇色子# 用1到6均匀分布的随机数模拟摇色子得到的点数first = randint(1, 6) + randint(1, 6)print(f'\n玩家摇出了{first}点')if first == 7 or first == 11:print('玩家胜!\n')money += debtelif first == 2 or first == 3 or first == 12:print('庄家胜!\n')money -= debtelse:go_on = True# 第一次摇色子没有分出胜负游戏继续while go_on:go_on = Falsecurrent = randint(1, 6) + randint(1, 6)print(f'玩家摇出了{current}点')if current == 7:print('庄家胜!\n')money -= debtelif current == first:print('玩家胜!\n')money += debtelse:go_on = Trueprint('你破产了, 游戏结束!')
例子4:斐波那契数列。

说明:斐波那契数列(Fibonacci sequence),通常也被称作黄金分割数列,是意大利数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)在《计算之书》中研究在理想假设条件下兔子成长率问题而引入的数列,因此这个数列也常被戏称为“兔子数列”。斐波那契数列的特点是数列的前两个数都是1,从第三个数开始,每个数都是它前面两个数的和,按照这个规律,斐波那契数列的前10个数是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55。斐波那契数列在现代物理、准晶体结构、化学等领域都有直接的应用。

"""输出斐波那契数列前20个数"""a, b = 0, 1for _ in range(20):a, b = b, a + bprint(a)
例子5:打印100以内的素数。

说明:素数指的是只能被1和自身整除的正整数(不包括1)。

"""输出100以内的素数"""for num in range(2, 100):# 假设num是素数is_prime = True# 在2到num-1之间找num的因子for factor in range(2, num):# 如果找到了num的因子,num就不是素数if num % factor == 0:is_prime = Falsebreak# 如果布尔值为True在num是素数if is_prime:print(num)

文末免费送书:Python从入门到精通

《Python从入门到精通(微课精编版)》使用通俗易懂的语言、丰富的案例,详细介绍了Python语言的编程知识和应用技巧。全书共24章,内容包括Python开发环境、变量和数据类型、表达式、程序结构、序列、字典和集合、字符串、正则表达式、函数、类、模块、异常处理和程序调试、进程和线程、文件操作、数据库操作、图形界面编程、网络编程、Web编程、网络爬虫、数据处理等,还详细介绍了多个综合实战项目。其中,第24章为扩展项目在线开发,是一章纯线上内容。全书结构完整,知识点与示例相结合,并配有案例实战,可操作性强,示例源代码大都给出详细注释,读者可轻松学习,快速上手。本书采用O2O教学模式,线下与线上协同,以纸质内容为基础,同时拓展更多超值的线上内容,读者使用手机微信扫一扫即可快速阅读,拓展知识,开阔视野,获取超额实战体验。

抽奖方式: 评论区随机抽取3位小伙伴免费送出!
参与方式: 关注博主、点赞、收藏、评论区评论“人生苦短,我用Python!”(切记要点赞+收藏,否则抽奖无效,每个人最多评论三次!)
活动截止时间: 2024-3-04 20:00:00
当当: 购买链接传送门
京东: 购买链接传送门

名单公布方式: 下期活动开始将在评论区和私信一并公布,中奖者请三天内提供信息

前言
随着人工智能、大数据处理和区块链等新技术的流行,Python语言也开始受人关注并不断被普及。Python语言自诞生至今经历了近30年时间,最近十年发展比较迅猛。一方面是因为Python语言的优点吸引了大量编程人员,另一方面是因为当下科学计算、人工智能需求与Python语言特色相契合。

Python语言简单易学,具有开放特性,并拥有成熟而丰富的第三方库,因此适用于新兴技术领域的开发。Python能够很轻松地把用其他语言设计的各种模块(尤其是C/C++)连接在一起,这大大拓展了Python的应用范畴。现在很多学校都开设了Python编程课程,甚至连小学生都开始学习Python语言。本书从初学者的角度出发,循序渐进地讲解使用Python语言进行编程和应用开发的各项技术。

本书内容

本书分为四大部分,共24章,具体结构划分如下。

第1部分:语法基础(第1~7章)。内容包括Python开发环境、Python开发工具、变量和数据类型、运算符和表达式、语句和程序结构、序列、列表、元组、字典与集合、字符串等知识。使读者能快速掌握Python语言的基本语法,为以后编程奠定坚实的基础。

第2部分:开发进阶(第8~17章)。内容包括正则表达式、函数、类及面向对象程序设计、模块、异常处理和程序调试、进程和线程、文件操作、数据库操作、图形界面编程、网络编程等。学习完该部分,读者可以掌握Python核心开发技术。

第3部分:项目应用(第18~23章)。面向Web开发、网络爬虫、大数据开发3个热门应用方向展开,讲解这3个应用方向的核心技术,并分类提供了这3个方向的常用开发项目。学习完该部分,读者能够开发简单的应用程序,解决实际问题。

第4部分:扩展项目在线开发(第24章)。该部分是纯线上内容,涉及界面设计、人工智能、游戏开发、自动化运维和API应用,通过5大类、29个热门的完整项目引导读者学习如何使用Python进行项目开发,带领读者亲身体验使用Python开发实际应用程序的全过程。

本书特色

400万+读者体验,畅销丛书新增精品;14年开发教学经验,一线讲师半生心血。

内容全面:本书由浅入深,循序渐进地讲解了Python语言的核心基础知识,并且适度地与当今热门的Python开发方向对接,知识点布局合理、结构匀称,全书内容完整、前面、详尽,适合相关院校选作教学参考用书,也适合相关培训机构用作教材。

体验超好:配套同步视频讲解,微信扫一扫,随时随地看视频;配套在线支持,知识拓展,专项练习,更多案例,同样微信扫一扫即可学习。适应移动互联网时代的学习习惯,全面提升读者体验。

语言简练:本书语言通俗易懂,知识讲解简洁明了,重难点突出,避免专业式说教,适合初学者自学阅读。

入门容易:本书遵循学习规律,入门和实战相结合。采用“基础知识+中小案例+实战案例”的编写模式,内容由浅入深、循序渐进,从入门中学习实战应用,从实战应用中激发学习兴趣。

案例超多:通过例子学习是最好的学习方式,本书通过一个知识点、一个例子、一个结果、一段评析的模式,透彻详尽地讲述了Python开发的各类主流应用知识,并且几乎每一章都配有综合应用的实战案例。实例、案例丰富详尽,跟着大量案例去学习,边学边做,从做中学,学习可以更深入、更高效。

栏目贴心:本书根据需要在各章使用了很多“注意”“提示”等小栏目,让读者可以在学习过程中更轻松地理解相关知识点及概念,扫除盲点,并轻松地掌握个别技术的应用技巧。

资源丰富:本书配套Python学习人员(尤其是零基础学员)最需要的13大资源库,包括计算机基础知识库、Python基础工具库、正则表达式工具库、数据库编程工具库、网络编程工具库、前端开发工具库、Web开发工具库、网络爬虫工具库、界面编程工具库、大数据处理工具库、人工智能编程工具库、游戏编程工具库、Python面试题库。这些资源,不仅学习中需要,工作中更有用。另外,本书还配有307集同步讲解视频和示例源码库。

在线支持:顺应移动互联网时代知识获取途径变化的潮流,本书每一章均配有在线支持,提供与本章知识相关的知识拓展、专项练习、更多案例等优质在线学习资源,并且新知识、新题目、新案例不断更新中。这样一来,在有限的纸质图书中承载了更丰富的学习内容,让读者真实体验到以一倍的价格购买两倍的学习内容,更便捷,更超值。