事实上,之前学习的代码,都是一行一行执行,但是我们希望可以通过一些代码,让代码按照我们的想法,去执行。
比如:
我们希望可以跳过代码;
重复执行某一段代码;
根据我们的预期结果和实际接轨,执行某一段代码;
就像下面这个简单的“炒菜”一样,告诉你炒菜都需要做些什么事?
前面已经学习过“整型、浮点型、字符串”,他们可以输入无数种值,但布尔值只有两种值。
炒菜例子中,我们有两种判断 “有、没有”,代码中布尔值则用 “True、False”表示,意思为“是、不是”。
a = True
print(a)
b = False
print(b)
代码中,我们将True和False保存在变量a、b中。
提一个问题,变量名能否用True或Flase命名,初学的朋友可以敲下代码试试?
在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。
这里提一个问题,下面这个代码输出是True还是False?请告诉我原因是什么?
print(1 == '1')
原因由于两者的数据类型不一致,在Python的语法中,认为“整数1”与“字符串1”不同。
估计细心的同学已经注意到“=”、“==”这两个符号,那么他们有什么区别?不知道在学习过程中你们有没试错?
比如编写代码“print(1 = 1)”,看看代码会不会报错。
就在刚刚,我们已经学习了“布尔值”和“比较操作符”,那么还有那些“布尔操作符”?
这里介绍剩下的3个操作符,他们的写法与操作符不一样,是以英文字母表示。
操作符 | 含义 |
---|---|
and | 与 |
or | 或 |
not | 否 |
我们写写代码,看看Python运行结果。
# and 操作符
print(True and True)
print(True and False)
print(False and True)
print(False and False)
# or 操作符
print(True or True)
print(True or False)
print(False or True)
print(False or False)
# not 操作符
print(not True)
print(not False)
思考5分钟,你有没有发现一些写法上、结果上的规律呢?试着别看文档,自己想想答案,毕竟作为测试,观察和思考很重要!
写法上:
- and 和 or 都需要接收2个布尔值(或表达式),并将结果求值为一个布尔值。
- not 只接收1个布尔值(或表达式),并将结果求值为一个布尔值。
结果上:
- and 接收的2个布尔值(或表达式),必须都为真,结果才为真,如果有一个是假,则结果是假。
- or 简单来说就是只要有一个为真,结果就为真。
- 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)
你会发现,最后一行代码略显复杂,因为我还没告诉你算数操作符和布尔操作符的优先级,布尔操作符,在所有算数符和比较操作符之后,进行操作,如果你觉得难以立即,试试加上括号()。
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个代码块
代码块有以下特点:
在Python中,缩进很重要,大多数新手的代码运行结果与预期不符,发生在缩进错误。
代码块的演示,我们用到了两个控制流语句,接下来,我们就重点讲一下控制流语句的内容。
if语句在任何编程语言中,都是最常见的控制语句,而执行的条件在为True时,执行if语句下的代码块。
如果用通俗的自然语言(日常用语)来描述:“如果条件为真,执行代码。”
if语句在Python中有以下几点特征:
- 关键字“if”。
- 条件(即求值为True或False的表达式)。
- 冒号。
- 在下一行开始,要缩进的代码块(行业术语称呼其为“子句”)。
name = "测试划水老师傅"
if name == "测试划水老师傅":
print("Hi 老师傅!")
根据实际需要,if后面也可以跟着else语句。当if语句的条件为False时,就会执行else下的子句。
如果用通俗的自然语言(日常用语)来描述:“如果条件为真,执行if的代码,否则执行else的代码。”
else语句在Python中有以下几点特征:
- 关键字“else”。
- 冒号。
- 在下一行开始,要缩进的代码块(行业术语称呼其为“子句”)。
我们回到if的例子,继续增加else语句,输出不同的结果。
name = "老师傅"
if name == "测试划水老师傅":
print("Hi 老师傅!")
else:
print("呔,你是假的测试划水老师傅!")
虽然已经有了 if 和 else,但是想想现实生活中的需求,这远远不够,比如:如果你知道了老师傅的名字和自媒体ID,怎么向老师傅打招呼呢?
(特征不再赘述)
name = "老师傅"
dy_id = "1234567"
if name == "测试划水老师傅":
print("Hi 测试划水老师傅!")
elif dy_id == "1234567":
print("Hi 测试划水老师傅!")
else:
print("呔,你是假的测试划水老师傅!")
学完3个控制流语句,有没有发现一个很细微的特点?(思考5分钟)
如果没有发现,试试这个练习题,尝试自己写一遍并运行,如果你发现了Bug(问题),但是不会解决,可以发在老师傅的知识星球上。
name = "老师傅"
age = 30
if name == "测试划水老师傅":
print("Hi,测试划水老师傅")
elif age == 18:
print("Hi,测试划水老师傅")
if、elif、else这类控制流结构为:“如果第1个条件为真,则执行第1个事;如果第2个条件为真,则执行第2件事;否则,做另外的事。”
要记得规避练习题中的BUG,仅有一个if,elif永远跟在if之后,其次,如果希望确保至少一条子句被执行,一定要加上else语句。
什么是while循环语句,就是可以让一个代码块根据自己需求,一遍又一遍执行。比如生活中,我们吃饭时,要一口一口吃,直到吃完,就会用到循环语句。
while语句在Python中有以下几点特征:
- 关键字“while”。
- 条件(即求值为True或False的表达式)。
- 冒号。
- 在下一行开始,要缩进的代码块(行业术语称呼其为“子句”)。
通过特征来看,我们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
试试这2个练习题,尝试自己写一遍并运行,如果你发现了Bug(问题),但是不会解决,可以发在老师傅的知识星球上。
name = ""
while name != "":
name = input("请输入你的名字:")
print(f"您好,{name},欢迎使用该程序!")
print("谢谢使用该程序!")
name = ""
while name != "请输入你的名字":
name = input("请输入你的名字:")
print(f"您好,{name},欢迎使用该程序!")
print("谢谢使用该程序!")
break语句,可以强制跳出循环执行语句。在代码中,break语句仅包含break关键字。
试试在刚才的代码里加上break,运行一下,你会发现不一样的结果。
name = ""
while name != "请输入你的名字":
name = input("请输入你的名字:")
print(f"您好,{name},欢迎使用该程序!")
break
print("谢谢使用该程序!")
与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"相等时,会提示用户输入密码,不在跳回到循环开始处。
请尝试根据代码自己画出流程图,理解代码的运行原理。
当条件为真时,while循环会一直运行,但是日常生活中,有些循环一直为真,但是我们需要执行一定次数后就停止运行,比如:约会时,男生通常都会等女生,假设我们等她到1个小时的时候,就不再等下去,该如何实现?
可以通过 for i in range(60): 来实现(这里的60表示60分钟)。
for i in range()语句在Python中有以下几点特征:
- 关键字“for”。
- 一个变量名。
- 关键字“in”。
- 调用range()函数,最多传入3个参数。
- 冒号
- 从下一行开始,缩进的代码块(称之为for子句)。
我们实现这个缺根弦的代码,运行看看结果。
for i in range(60):
i = i + 1
re_time = 60 - i
print(f"我已经等了女朋友{i}分钟,距离我开溜还剩{re_time}分钟!")
print("这是一个缺根弦的代码,大家千万别学!")
第一次运行时,变量i被设置为0,当然你也可以直接从第60分钟开始(呵呵,男人),当i被判断小于60的时候,会被执行之后的子句。
为什么子句中i要先执行+1操作,那是因为现实里有“等了0分钟”这一说法吗?哈哈,写代码要与现实一致哦。
你可以试试删除一些代码,看看会发生什么变化,比如删掉“i = i + 1”,你会发现有趣的结果!
(有2处,如果你实在照不出来,可以在星球上向老师傅提问)。
事实上,用while也能实现,但是我不建议这样做,因为我认为Python禁止“简单的事情复杂做”。
这也许是你接触的第一个多参数函数,range()函数内,可以传入的参数包含“开始、结束、步长”参数,实现各种正数序列。看不懂没关系,我们使用代码来演示一下。
比如最简单的,我们通过这个函数打印1-100的数字。
for i in range(1,101):
print(i)
第一次使用range函数,通过这个小练习,我们发现一些小特征:
接下来,我们再研究下步长的概念,估计很多人都遇到过一道特别简单的面试题“打印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吗?安装完之后,你可以去查看这个目录。
(这并不是重点,就理解成手机预装软件即可)
我们聊聊重点。
在使用模块时,一定要使用语句import导入该模块。
import语句在Python中有以下几点特征:
- 关键字“import”。
- 模块的名称。
- 可选的更多模块名称,模块名称之间用英文逗号隔开。
- 再导入模块后,就可以在代码中直接使用该模块内的所有函数。
话不多说,直接练代码。让我们试试random模块。
import random
for i in range(5):
print(random.randint(1, 10))
导入random模块后,我们可以直接使用这个模块内的函数,比如randint,可以生成这个区间内的“随机正数”。
我们不妨按住键盘“Ctrl + 鼠标左键”,查看这个模块的详细内容。
当然现阶段,你并不需要了解模块的写法,只需要了解有这么个玩意就行,放到百度翻译下这个模块的介绍,了解它是关于“随机数”的模块即可。
当然我一般也不看,甚至在我不知道有这么个随机数模块时,我需要用什么,都是百度搜索“Python 随机数(整型、浮点型)生成”的关键字,百度会告诉我用什么模块。
认真看教程的同学,看到标题,应该就知道sys.exit()函数其实引入的模块是sys,顾名思义其实是面向Python解释器的一个系统级别的交互模块。
这个模块很重要,虽然还是那句话,可以百度,但是建议在百度过程中,记住几个常用函数,不然每次都百度,估计也该下岗了。
我们写一段代码,了解下如何提前结束程序。
import sys
while True:
res = input("输入「掀桌子」,程序退出:")
if res == "掀桌子":
sys.exit()
print("如果程序没有退出,会执行这个语句。")
我们之前学过break,可以跳出循环,但是如果没有,这个程序会无线循环,所以使用sys.exit()效果类似break。
《猜数字》游戏介绍
亲爱的玩家,你好!
欢迎来到《猜数字》游戏!
我们悄悄的藏起了一个“数字”,这个数字介于1~20之间。
请注意!!!
你共有6次机会进行尝试!
如果猜错,你将永远被困在这个冒险岛!
加油吧,冒险者!
(猜中或猜错都会有提示)
《石头剪子布》游戏介绍
亲爱的玩家,你好!
欢迎来到《石头剪子布》游戏!
猜数字这个游戏,想必你已经很熟悉,我就不做过多介绍。
但有一点你需要谨记:我们会有一个计分板,当你赢得次数大于守卫者,你将逃出冒险岛!
输入规则:r(石头),s(剪刀),(布)c,q(退出)
(你可以选择“退出游戏”,但那也代表你将永远留在岛上)
当你完成后,尝试自己改进下代码,比如可以把两个游戏组成一个系列,根据用户选择,玩不同的游戏。
当然如果你有更好的想法和代码实现,可以来老师傅的星球交流。