「Python编程基础」第3章:控制流

文章目录

  • 一、用“炒菜”简单介绍下“控制流”
  • 二、布尔值
  • 三、比较运算符
  • 四、== 和 = 操作符的区别
  • 五、布尔操作符
  • 六、混合布尔和比较操作符
  • 七、代码块是什么?
  • 八、控制流语句
    • 1. if 语句
    • 2. else语句
    • 3. elif语句
    • 4. 总结
  • 九、while循环语句
  • 十、break语句
  • 十一、continue语句
  • 十二、for循环与range()函数
  • 十三、细说range()函数
  • 十四、模块导入
  • 十五、控制流的压轴戏“sys.exit()”函数,提前结束程序。
  • 十六、练习题
    • 第一题:猜数字
    • 第二题:小孩子们的“石头、剪刀、布”。

一、用“炒菜”简单介绍下“控制流”

事实上,之前学习的代码,都是一行一行执行,但是我们希望可以通过一些代码,让代码按照我们的想法,去执行。

比如:

我们希望可以跳过代码;

重复执行某一段代码;

根据我们的预期结果和实际接轨,执行某一段代码;

就像下面这个简单的“炒菜”一样,告诉你炒菜都需要做些什么事?

「Python编程基础」第3章:控制流_第1张图片

二、布尔值

前面已经学习过“整型、浮点型、字符串”,他们可以输入无数种值,但布尔值只有两种值

炒菜例子中,我们有两种判断 “有、没有”,代码中布尔值则用 “True、False”表示,意思为“是、不是”

a = True
print(a)

b = False
print(b)

代码中,我们将True和False保存在变量a、b中。

「Python编程基础」第3章:控制流_第2张图片

提一个问题,变量名能否用True或Flase命名,初学的朋友可以敲下代码试试?
「Python编程基础」第3章:控制流_第3张图片
在这里插入图片描述
在Python里,我们对类似“True”这样的词语有一个称呼叫做 「关键字」,关键字是不能用来变量命名的。

以下都属于Python的关键字:

and、as、assert、break、class、continue、def、del、elif、else、except、False、finally、for、from、global、if、import、in、is、lambda、None、nonlocal、not、or、pass、raise、return、True、try、while、with、yield

三、比较运算符

比较运算符(关系操作符),顾名思义,就是比较两个值的真假关系。

操作符 含义
== 等于
!= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于
print(1 == 1)
print("测试划水老师傅" == "测试划水老师傅")

print(1 != 1)
print("测试划水老师傅" != "测试划水老师傅")

print(1 < 2)
print(1 > 2)

print(1 <= 1)
print(1 >= 1)

我们会发现,比较运算符可以应用于 字符串、数字、以及后面我们会学到的列表、字典等所有数据类型,如果两边的值符合比较符号逻辑判断,则值显示为True,反之为False。

「Python编程基础」第3章:控制流_第4张图片

这里提一个问题,下面这个代码输出是True还是False?请告诉我原因是什么?

print(1 == '1')

原因由于两者的数据类型不一致,在Python的语法中,认为“整数1”与“字符串1”不同。

四、== 和 = 操作符的区别

估计细心的同学已经注意到“=”、“==”这两个符号,那么他们有什么区别?不知道在学习过程中你们有没试错?

比如编写代码“print(1 = 1)”,看看代码会不会报错。

  1. = 是“赋值符号”,用于将右边的“值”赋值给左边的“变量”。
  2. == 是“等于”符号,用于比较确定两个值是否相同。

五、布尔操作符

就在刚刚,我们已经学习了“布尔值”和“比较操作符”,那么还有那些“布尔操作符”?

这里介绍剩下的3个操作符,他们的写法与操作符不一样,是以英文字母表示。

操作符 含义
and
or
not

我们写写代码,看看Python运行结果。

# and 操作符
print(True and True)
print(True and False)
print(False and True)
print(False and False)

「Python编程基础」第3章:控制流_第5张图片

# or 操作符
print(True or True)
print(True or False)
print(False or True)
print(False or False)

「Python编程基础」第3章:控制流_第6张图片

# not 操作符
print(not True)
print(not False)

「Python编程基础」第3章:控制流_第7张图片

思考5分钟,你有没有发现一些写法上、结果上的规律呢?试着别看文档,自己想想答案,毕竟作为测试,观察和思考很重要!

写法上:

  1. and 和 or 都需要接收2个布尔值(或表达式),并将结果求值为一个布尔值。
  2. not 只接收1个布尔值(或表达式),并将结果求值为一个布尔值。

结果上:

  1. and 接收的2个布尔值(或表达式),必须都为真,结果才为真,如果有一个是假,则结果是假。
  2. or 简单来说就是只要有一个为真,结果就为真。
  3. not 则将一个求值结果为相反的布尔值。

六、混合布尔和比较操作符

写代码中,当然不可能仅仅用到一种操作符,大概率是要混合使用,所以是时候跟着我的代码练习下混合写法。

(代码没有标准性,只要结果正确就行,所以建议写完后,可以按照自己的理解,写写不一样代码,与自己脑子记预想的结果是否一致)

a = (1 < 2) and (3 < 4)
print(a)

b = (1 == 1) or (2 == 1)
print(b)

c = 1 + 1 == 2 and not 1 + 1 == 5 and 2 * 2 == 2 + 2
print(c)

「Python编程基础」第3章:控制流_第8张图片

你会发现,最后一行代码略显复杂,因为我还没告诉你算数操作符和布尔操作符的优先级,布尔操作符,在所有算数符和比较操作符之后,进行操作,如果你觉得难以立即,试试加上括号()。

c = (1 + 1 == 2) and not (1 + 1 == 5) and (2 * 2 == 2 + 2)
print(c)

七、代码块是什么?

控制流语句开始的部分通常都是“条件”,接下来是一个“代码块”,根据条件的布尔值,也就是“真\假”来执行代码块。

什么是代码块?

Python中,代码块的定义其实是根据**“缩进”**来完成的,这些放在一组的代码语句组成的“块”就是代码块。

# 代码块演示
login_user = "测试划水老师傅" 
login_password = "pwd123456" 
if login_user == "测试划水老师傅" and login_password == "pwd123456":
    print("登录成功") # 第1个代码块
else:
    print("登录账号或密码错误!") # 第2个代码块

代码块有以下特点:

  1. 增加缩进时,表示代码块的开始。
  2. 代码块可以包含其他代码块。
  3. 缩进减少为0时,或者与外面包围的代码块对齐时,该代码块结束。

在Python中,缩进很重要,大多数新手的代码运行结果与预期不符,发生在缩进错误。

八、控制流语句

代码块的演示,我们用到了两个控制流语句,接下来,我们就重点讲一下控制流语句的内容。

1. if 语句

if语句在任何编程语言中,都是最常见的控制语句,而执行的条件在为True时,执行if语句下的代码块。

如果用通俗的自然语言(日常用语)来描述:“如果条件为真,执行代码。”

if语句在Python中有以下几点特征:

  1. 关键字“if”。
  2. 条件(即求值为True或False的表达式)。
  3. 冒号。
  4. 在下一行开始,要缩进的代码块(行业术语称呼其为“子句”)。
name = "测试划水老师傅"
if name == "测试划水老师傅":
    print("Hi 老师傅!")

「Python编程基础」第3章:控制流_第9张图片

2. else语句

根据实际需要,if后面也可以跟着else语句。当if语句的条件为False时,就会执行else下的子句。

如果用通俗的自然语言(日常用语)来描述:“如果条件为真,执行if的代码,否则执行else的代码。”

else语句在Python中有以下几点特征:

  1. 关键字“else”。
  2. 冒号。
  3. 在下一行开始,要缩进的代码块(行业术语称呼其为“子句”)。

我们回到if的例子,继续增加else语句,输出不同的结果。

name = "老师傅"
if name == "测试划水老师傅":
    print("Hi 老师傅!")
else:
    print("呔,你是假的测试划水老师傅!")

「Python编程基础」第3章:控制流_第10张图片

3. elif语句

虽然已经有了 if 和 else,但是想想现实生活中的需求,这远远不够,比如:如果你知道了老师傅的名字和自媒体ID,怎么向老师傅打招呼呢?

(特征不再赘述)

name = "老师傅"
dy_id = "1234567"
if name == "测试划水老师傅":
    print("Hi 测试划水老师傅!")
elif dy_id == "1234567":
    print("Hi 测试划水老师傅!")
else:
    print("呔,你是假的测试划水老师傅!")

「Python编程基础」第3章:控制流_第11张图片

学完3个控制流语句,有没有发现一个很细微的特点?(思考5分钟)

如果没有发现,试试这个练习题,尝试自己写一遍并运行,如果你发现了Bug(问题),但是不会解决,可以发在老师傅的知识星球上。

name = "老师傅"
age = 30
if name == "测试划水老师傅":
    print("Hi,测试划水老师傅")
elif age == 18:
    print("Hi,测试划水老师傅")

4. 总结

if、elif、else这类控制流结构为:“如果第1个条件为真,则执行第1个事;如果第2个条件为真,则执行第2件事;否则,做另外的事。”

要记得规避练习题中的BUG,仅有一个if,elif永远跟在if之后,其次,如果希望确保至少一条子句被执行,一定要加上else语句。

九、while循环语句

什么是while循环语句,就是可以让一个代码块根据自己需求,一遍又一遍执行。比如生活中,我们吃饭时,要一口一口吃,直到吃完,就会用到循环语句。

while语句在Python中有以下几点特征:

  1. 关键字“while”。
  2. 条件(即求值为True或False的表达式)。
  3. 冒号。
  4. 在下一行开始,要缩进的代码块(行业术语称呼其为“子句”)。

通过特征来看,我们while和if比较相似,不同的是他们的行为。if子句结束时,程序会继续执行if之后的语句,而while在子句结束时,程序会跳回到while循环语句开始处继续执行,直到条件为“假”时结束。

我们用一个相同条件的代码来看看if和while的区别。

num = 0
if num < 5:
    print(f"Hi {num}")
    num = num + 1

num = 0
while num < 5:
    print(f"Hi {num}")
    num = num + 1

「Python编程基础」第3章:控制流_第12张图片

「Python编程基础」第3章:控制流_第13张图片

试试这2个练习题,尝试自己写一遍并运行,如果你发现了Bug(问题),但是不会解决,可以发在老师傅的知识星球上。

name = ""
while name != "":
    name = input("请输入你的名字:")
    print(f"您好,{name},欢迎使用该程序!")
print("谢谢使用该程序!")
name = ""
while name != "请输入你的名字":
    name = input("请输入你的名字:")
    print(f"您好,{name},欢迎使用该程序!")
print("谢谢使用该程序!")

十、break语句

break语句,可以强制跳出循环执行语句。在代码中,break语句仅包含break关键字。

试试在刚才的代码里加上break,运行一下,你会发现不一样的结果。

name = ""
while name != "请输入你的名字":
    name = input("请输入你的名字:")
    print(f"您好,{name},欢迎使用该程序!")
    break
print("谢谢使用该程序!")

「Python编程基础」第3章:控制流_第14张图片

十一、continue语句

与break类似,continue语句用于循环内部,当循环语句中的代码执行到continue时,会马上跳回到循环开始处,重新对循环条件求值。

让我们尝试编写并运行下面的代码,试试效果。

user = "Kevin"
pwd = "123456"
while True:
    input_user = input("请输入登录名:")
    if input_user != user:
        print(f"{input_user} 用户不存在!")
        continue
    input_pwd = input("请输入你的登录密码:")
    if input_pwd != pwd:
        print("密码错误,退出程序!")
        break
    print("欢迎使用!")
    break

当用户输入“input_user” 与user = "Kevin"不相等时,会提示用户不存在,跳回到循环开始处,再次对条件求值。

当用户输入“input_user” 与user = "Kevin"相等时,会提示用户输入密码,不在跳回到循环开始处。

请尝试根据代码自己画出流程图,理解代码的运行原理。

「Python编程基础」第3章:控制流_第15张图片

十二、for循环与range()函数

当条件为真时,while循环会一直运行,但是日常生活中,有些循环一直为真,但是我们需要执行一定次数后就停止运行,比如:约会时,男生通常都会等女生,假设我们等她到1个小时的时候,就不再等下去,该如何实现?

可以通过 for i in range(60): 来实现(这里的60表示60分钟)。

for i in range()语句在Python中有以下几点特征:

  1. 关键字“for”。
  2. 一个变量名。
  3. 关键字“in”。
  4. 调用range()函数,最多传入3个参数。
  5. 冒号
  6. 从下一行开始,缩进的代码块(称之为for子句)。

我们实现这个缺根弦的代码,运行看看结果。

for i in range(60):
    i = i + 1
    re_time = 60 - i
    print(f"我已经等了女朋友{i}分钟,距离我开溜还剩{re_time}分钟!")
print("这是一个缺根弦的代码,大家千万别学!")

「Python编程基础」第3章:控制流_第16张图片

第一次运行时,变量i被设置为0,当然你也可以直接从第60分钟开始(呵呵,男人),当i被判断小于60的时候,会被执行之后的子句。

为什么子句中i要先执行+1操作,那是因为现实里有“等了0分钟”这一说法吗?哈哈,写代码要与现实一致哦。

你可以试试删除一些代码,看看会发生什么变化,比如删掉“i = i + 1”,你会发现有趣的结果!

(有2处,如果你实在照不出来,可以在星球上向老师傅提问)。

「Python编程基础」第3章:控制流_第17张图片

事实上,用while也能实现,但是我不建议这样做,因为我认为Python禁止“简单的事情复杂做”。

十三、细说range()函数

这也许是你接触的第一个多参数函数,range()函数内,可以传入的参数包含“开始、结束、步长”参数,实现各种正数序列。看不懂没关系,我们使用代码来演示一下。

比如最简单的,我们通过这个函数打印1-100的数字。

for i in range(1,101):
    print(i)

「Python编程基础」第3章:控制流_第18张图片

第一次使用range函数,通过这个小练习,我们发现一些小特征:

  1. 通过这个函数,能够快速打印1-100,再也不用傻傻的“写100个print”了。
  2. 你会发现range的“开始”和“结束”,属于前包后不包,还记得小时候学的数学的开闭区间吗?和[1,100)道理一样。

接下来,我们再研究下步长的概念,估计很多人都遇到过一道特别简单的面试题“打印1-100的偶数”,很多培训的同学,遇到这个问题都比较慌,甚至忘了range这个函数,我们使用这个函数来打印1-100的偶数试试。

for i in range(2, 101, 2):
    print(i)

当然还有一种写法,可以不需要用到步长,你想到了吗?

for i in range(1, 101):
    if i % 2 == 0:
        print(i)

思考一下!

还有其他写法吗?

为什么第1段代码为什么起点是从“2”开始?(自己动手改改起点的代码试试结果?)

为什么第2段代码不需要写步长“2”?(自动动手加上步长,又会有什么结果?)

三个参数,都试试“负数”,结果又有什么不一样?

十四、模块导入

Python程序可以调用一组基本的函数,向我们见过的“print()、input()函数都属于函数”,专业属于称这些函数为“内置函数”,而他们所属的模块,称作“标准库”。当然啦,既然有“标准库”,按照剧情发展必然有“非标准库”(暂时不讲)。

那怎么区分“标准库”?“非标准库”?

还记得安装Python吗?安装完之后,你可以去查看这个目录。

(这并不是重点,就理解成手机预装软件即可)

「Python编程基础」第3章:控制流_第19张图片

我们聊聊重点。

在使用模块时,一定要使用语句import导入该模块。

import语句在Python中有以下几点特征:

  1. 关键字“import”。
  2. 模块的名称。
  3. 可选的更多模块名称,模块名称之间用英文逗号隔开。
  4. 再导入模块后,就可以在代码中直接使用该模块内的所有函数。

话不多说,直接练代码。让我们试试random模块。

import random

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

导入random模块后,我们可以直接使用这个模块内的函数,比如randint,可以生成这个区间内的“随机正数”。

「Python编程基础」第3章:控制流_第20张图片

我们不妨按住键盘“Ctrl + 鼠标左键”,查看这个模块的详细内容。

当然现阶段,你并不需要了解模块的写法,只需要了解有这么个玩意就行,放到百度翻译下这个模块的介绍,了解它是关于“随机数”的模块即可。

当然我一般也不看,甚至在我不知道有这么个随机数模块时,我需要用什么,都是百度搜索“Python 随机数(整型、浮点型)生成”的关键字,百度会告诉我用什么模块。

「Python编程基础」第3章:控制流_第21张图片

十五、控制流的压轴戏“sys.exit()”函数,提前结束程序。

认真看教程的同学,看到标题,应该就知道sys.exit()函数其实引入的模块是sys,顾名思义其实是面向Python解释器的一个系统级别的交互模块。

这个模块很重要,虽然还是那句话,可以百度,但是建议在百度过程中,记住几个常用函数,不然每次都百度,估计也该下岗了。

我们写一段代码,了解下如何提前结束程序。

import sys

while True:
    res = input("输入「掀桌子」,程序退出:")
    if res == "掀桌子":
        sys.exit()
    print("如果程序没有退出,会执行这个语句。")

我们之前学过break,可以跳出循环,但是如果没有,这个程序会无线循环,所以使用sys.exit()效果类似break。

「Python编程基础」第3章:控制流_第22张图片

十六、练习题

第一题:猜数字

《猜数字》游戏介绍
亲爱的玩家,你好!
欢迎来到《猜数字》游戏!
我们悄悄的藏起了一个“数字”,这个数字介于1~20之间。
请注意!!!
你共有6次机会进行尝试!
如果猜错,你将永远被困在这个冒险岛!
加油吧,冒险者!
(猜中或猜错都会有提示)

第二题:小孩子们的“石头、剪刀、布”。

《石头剪子布》游戏介绍
亲爱的玩家,你好!
欢迎来到《石头剪子布》游戏!
猜数字这个游戏,想必你已经很熟悉,我就不做过多介绍。
但有一点你需要谨记:我们会有一个计分板,当你赢得次数大于守卫者,你将逃出冒险岛!
输入规则:r(石头),s(剪刀),(布)c,q(退出)
(你可以选择“退出游戏”,但那也代表你将永远留在岛上)

当你完成后,尝试自己改进下代码,比如可以把两个游戏组成一个系列,根据用户选择,玩不同的游戏。

当然如果你有更好的想法和代码实现,可以来老师傅的星球交流。

你可能感兴趣的:(#,Python「编程基础」,python,开发语言,学习,笔记,pycharm)