

大家好,欢迎回到我的专栏,接下来将会是第一模块第四期的内容。
上一期没控制好,导致信息量较大,以后会吸取教训!
第一模块(Python语言基础)
环境搭建与第一个脚本
变量,用户输入与代码格式
Python的数据类型(字符串,数字与布尔值)
逻辑运算符与流程控制 <--
Python的数据类型(列表与元组)
Python循环(for)
Python循环(while)
Python的数据类型(字典)
Python函数(函数的定义)
Python函数(函数的返回)
第一模块应用(可交互的文字版扫雷,框架)
第一模块应用(可交互的文字版扫雷,实现,第一部分)
第一模块应用(可交互的文字版扫雷,实现,第二部分)



Python中的比较运算符与逻辑运算符
什么是比较运算符?
不同于用于数字计算的算数运算符,比较运算符用于比较两个值之间的关系,比较运算符的结果为布尔值,也就是True或False。
提醒:bool的值为True或False,注意首字母必须大写,写成true和false不能被识别为bool,写成ture更不能...(曾经的我)
等于、不等于:==, !=
这里的等于与算数运算符中的等于有不同意义,比较运算符中的等于是在比较两个值是否相等。String可参加比较,但对象必须也为String,若两个strings相等,则True。Bool可以参加比较,但对象必须也为Bool,若两个bool值相等,则True。
!=的结果即与==相反。
a = 3 == 2 # 比较3是否等于2并存入变量a
type(3 == 2) # 查看“3是否等于2”的数据类型
print(a) # 输出a
b = "abc"
print(b != "abc")
True != False 大于、大于等于、小于、小于等于:>, >=, <, <=
String可以参加比较,但对象必须也为String,String的比较会从第一个字母开始,按字母表排列,越靠后的字母越大。若第一个字母相同,则比较下一个字母,以此类推,若全部字母两桶,则两个Strings相等。
另外,True > False。
5 >= 5 # True
8 > 5 # True
"aba" < "aab" # False
"sss" >= "s" # True
True > False # True 什么是逻辑运算符?
逻辑运算符用于进行逻辑运算,参与计算的均为布尔值,结果也为布尔值,共3个:
与:and
and两边均为True,则结果为True,否则为False
3 == 3 and "abc" == "abc" # 均为True,结果为True
5 > 4 and 7 1 and 3 > 2 and False > True
1 != 2 and "b" > "a" and 9 > 6 and 5.55555 > 5 或:or
or两边均为False,则结果为False,否则为True
3 == 3 or "abc" == "abc" # 均为True,结果为True
5 > 4 or 7 非:not
即将结果的True转换为False, False转换为True
not 3 == 3 # 3 == 3原为Ture,加上not后为False
not 3 < 1 # 3 < 1原为False,加上not后为True 逻辑运算符何以任意组合使用,运算优先级为先算括号,然后从左往右
a = not (1 != 2 and 3 >= 4) or "aaa" == "bbb"
type(a) # 看看类型
print(a) # 看看结果



流程控制
什么是流程控制?
接下来我们来了解流程控制,其逻辑可以用流程图表示。假设我们拥有一串代码,这串代码只有在满足某个条件时才运行,这便是流程控制。
专栏中的所有流程图均在draw.io中绘制,遇到较复杂的流程控制问题时,使用流程图是一个将逻辑可视化的过程,对功能的正确实现有很大帮助。

图1,一个简单的流程图
最基础的流程控制 if
现在,我们从最简单的流程控制开始学起。
如果满足某个条件,就做某事;如果不满足,我们忽略这件事。代码格式如下:
if 某个条件为True:
做点事 if,英文“如果”
需要注意,第一行末尾有个英文冒号,第二行开头直到这个代码块的末尾,均需要进行一次缩进。举个简单的例子,如果饿了,就说“我想吃饭”:
hungry = True
"""定义一个变量hungry,意思是饿,它等于True,意思是饿了"""
if hungry:
print("我想吃饭")
"""
“我想吃饭”将会被打印出来,因为条件为True,注意缩进和冒号
"""
hungry = False
"""
将hungry改为False,意思是没饿
"""
if hungry:
print("我想吃饭")
"""
“我想吃饭”这次将不会被打印出来,因为条件为False,注意缩进和冒号
""" 额外提示:
这串代码中的“if hungry”也可以写成“if hungry == True”,因为True == True的结果为True。如果额外提示让你感觉混乱,那就忽略这个提示,在接下来的应用中会慢慢理解。
if else
else,英文“否则”
刚才我们了解了最简单流程控制,如果满足要求,则做某事。现在我们增加一点复杂度:如果满足要求,则做某事;如果不满足要求,则做另一件事。代码格式如下:
举个例子,为图1流程图的简化版。如果今天放假,就睡觉,否则起床:
holiday = True # 今天放假
if holiday:
print("睡觉!")
else:
print("起床!")
"""
“睡觉!”将会被打印出来,因为此时holiday = True
"""
holiday = False # 今天不放假
if holiday:
print("睡觉!")
else:
print("起床!")
"""
“起床!”将会被打印出来,因为此时holiday = False
""" 思考一下以下代码代表的逻辑意义:
if True:
print("条件为True")
else:
print("条件为False") # 这一行永远不会被运行
if False:
print("条件为True") # 这一行永远不会被运行
else:
print("条件为False") if elif else
elif, 即else if的缩写,英文“否则如果”
最后我们来学习完整的流程控制:如果满足要求1,则做工作1;若满足要求2,则做工作2;若满足要求n,则做工作n;若都不满足,则做工作x:
"""
if 某个条件为True:
做点事
elif 某个条件为True:
做点事
elif 某个条件为True:
做点事
......想有多少个elif就可以有多少个elif
else:
做点事
""" elif可以有无限多个。elif后必须跟上一个条件判断,若为True,则会运行接下来的内容,在一个流程控制中。注意,再长的流程控制,最终都只会落入一个“做点事”的判断中,当第一次满足条件并运行了“做点事”后,整个流程控制就结束了,即使再这个“做点事”后还有其他满足条件的内容。如果所有的if和elif后的条件均为False,则会运行else后的代码。接下来我们完整模拟一次图1的流程图。过程中会用到一些之前学习过的函数,如果对这段代码有任何不理解的地方,一定要在疑惑解决之后再继续前进,可以参考本期的章节“如何自己解决问题”,或是私信我或对专栏进行留言。
holiday = input("今天是假期吗?Y/N")
weekend = input("今天是周末吗?Y/N")
"""常用的表达方式,Y代表yes(是),N代表no(不是)""" 接下来是第一个if语句,根据用户的输入(Y/N)来决定变量holiday与weekend的值,如果用户输入Y,则对应变量值为True,否则为N:
if holiday.upper() == "Y":
holiday = True
else:
holiday = False
if weekend.upper() == "Y":
weekend = True
else:
weelend = False 在这个逻辑中,如果用户输入了除了Y或N以外的东西,变量依旧会被设置为False,在学习到while循环之前,我们没有办法很好地解决这个问题,所以可以暂时忽略。你可以尝试修改代码,使得输入YN以外的内容时,不输出任何内容。
使用.upper()方法的意义在于:当用户输入小写的y与n时依旧能够识别。
接下来是第二段if语句,使用刚才的代码块所获取的holiday和weekend变量作为判断条件:
if weekend:
print("睡觉!")
elif holiday:
print("睡觉!")
else:
print("起床!") 以上代码的另一种写法,当其中一个为True,就可以继续睡觉:
if weekend or holiday:
print("睡觉!")
else:
print("起床!") 流程控制的嵌套
在流程控制中,可以使用嵌套,例如:
当分数大于50,则及格;小于50则不及格。若分数在45到50之间则允许补考,否则不允许。若分数在95到100之间,则可以获得奖学金,否则不获得。
代码写法如下:
"""要求用户输入分数"""
score = int(input("请输入你的得分:"))
if score >= 50:
print("恭喜你,你及格了!")
if score >= 95:
print("奖学金已授予。")
else:
print("你没能获得奖学金,再接再厉。")
else:
print("很遗憾你没有及格。")
if score >= 45:
print("请及时申请补考。")
else:
print("重修吧。") 非唯一写法。
提示:一定要注意缩进的使用,如果在流程控制嵌套练习中出现错误,十有八九是因为缩进。
代码输出如下:

图2

实例1:闰年计算器
注意:本专栏所有“实例”内容建议新建空脚本进行练习,不推荐直接在shell中进行编写
经典题目,每个学习编程的朋友都练习过。输入一个年份,如果年份是闰年,则输出“XXXX年是闰年”,否则输出“XXXX年不是闰年”
闰年遵循以下规律:
年份必须能被4整除
如果年份能被100整除,则它不是闰年,除非年份能被400整除
提示:如果感到逻辑复杂,试着做一个流程图。
参考输出图:

图3,实例1参考输出图




如何自己解决问题
在编程的学习中,不可避免地会遇到许许多多问题,学会通过搜索解决问题,从其他人处搜寻思路是学习编程的重要一环。另外,一门编程语言的功能之多,我们不可能全部背下,在需要实现某个功能时进行搜索是十分必要的。
大家到目前为止的实践中,应该已经出现了许多的错误。在运行代码报错时,可以通过搜索该错误的名字(例如TypeError)查询出错原因。
如果英文较好并且可以科学上网,建议谷歌英文搜索。搜索的同时加上当前语言名称,比如:
“如何生成随机数 python” / "how to generate random values in python"
当出现错误时,若想了解错误出现的原因以及如何解决,可以搜索报错信息的最后一行文字,如图4红圈中的内容:

图4,例如这个错误的名称就是ZeroDivisionError
Python Visualizer
http://www.pythontutor.com/visualize.html
这个网站能够逐行运行Python代码并且显示所有变量当前的数值,若自己的代码未报错但没生成期望的结果,可以尝试使用这个网站。



本期挑战

实例2:快餐店点单器
你需要制做一个快餐店点单器,这家快餐店点餐分为3步:
选择面包类型,标准5元,高级7.5元,豪华10元。默认为标准。
选择夹心,不要夹心不要钱,蔬菜5元,牛肉15元,海鲜18元。默认为牛肉。
选择饮料,不要饮料不要钱,水1.5元,可乐3元,啤酒5元。默认为可乐。
选择完毕后告诉用户应付多少钱。
参考输出如图(我把字体换成了Consolas,这个字体能正常显示中文):

图5,实例2输出图


实例3:计算器
制作一个计算器,用户输入两个数字后选择对应的计算方法,输出结果。参考输出如图:

图6,实例3输出图

不知大家有没有听说过生命线(Lifelilne)这款游戏
https://baike.baidu.com/item/Lifeline/18643428?fr=aladdin
这款游戏的核心思路实际上就是流程控制,现在你已经掌握了相关的技能,你也可以用Python做出一款“类Lifeline”游戏了。



实例答案
本期实例虽然没有用到任何需要额外搜索才能完成的功能,但在流程的设计上需要初学者下一番功夫。和往期一样,我会在答案中附上详细的注释,如果仍有疑问,一定要在继续学习下一期之前将其解决。
"""实例1:闰年计算器"""
"""
一定要注意缩进!
"""
print("------------闰年计算器------------")
year = int(input("请输入年份:"))
if year % 4 == 0:
if year % 100 == 0:
if year % 400 == 0:
print("{}年是闰年".format(year))
else:
print("{}年不是闰年".format(year))
else:
print("{}年是闰年".format(year))
else:
print("{}年不是闰年".format(year))
print("------------闰年计算器------------")
关于闰年计算器,主要就是逻辑的处理,其编码难度不大,图7为闰年计算器的流程图

图7,闰年计算器流程图
"""实例2:快餐店点单器"""
print("------------欢迎点餐------------")
"""
以下这一大段是不同商品的价格
第一组的三个变量代表不同面包的价格
第二块的三个变量代表不同夹心的价格
第三块的三个变量代表不同饮料的价格
不要夹心或者不要饮料的就不需要变量了,直接给价格+0就好
使用变量而不是直接在流程控制中输入价格的原因是:
使用变量会使得代码更加易读
之后流程控制中添加的是哪个的价格一目了然
同时会更方便之后对价格进行修改
若要对价格进行修改,可以直接在上方这些变量处修改
而不用在流程控制中修改
"""
regular = 5
advanced = 7.5
deluxe = 10
vege = 5
beef = 15
seafood = 18
water = 1.5
coke = 3
beer = 5
"""
接下来这六行会让用户进行三次input
分别对应面包、夹心以及饮料
\n\t为转义符,能够在string中输入缩进和换行
若掌握不牢固,可以回看上期内容
前三行使用单行输入加上转义符属于个人的习惯
可以选用多行字符串定义,或许会更加直白
但转义符会更有适配性,熟练后使用也会更为快捷
用户输入三次后
将用户输入的三个string转换为int存储到这三个变量中
这六行代码可以缩减为三行,即用int()函数套在input的外层
"""
choose1 = input("请输入数字选择面包(默认标准):\n\t1.标准\n\t2.高级\n\t3.豪华\n")
choose2 = input("请输入数字选择夹心(默认牛肉):\n\t1.无\n\t2.蔬菜\n\t3.牛肉\n\t4.海鲜\n")
choose3 = input("请输入数字选择饮料(默认可乐):\n\t1.无\n\t2.水\n\t3.可乐\n\t4.啤酒\n")
choose1 = int(choose1)
choose2 = int(choose2)
choose3 = int(choose3)
"""
接来下声明了四个变量
分别存储了总价格以及用户的三次选择
注意这里的选择不再是用户输入的数字
而是数字所对应的内容,作用是最后用于输出
当前总价格为0,用户的选择为空字符串
注意
在流程控制中声明的变量会在流程控制结束时删除
无法在外部使用
所以我们一定要在流程控制开始前先对需要在外部用到的变量进行声明
由于我们的总价格以及物品的名字将会在最终输出时用到
最终输出位于流程控制之外
所以我们需要在这个位置声明变量
这部分内容会在第7期展开
"""
total_fees = 0
choose1_name = ""
choose2_name = ""
choose3_name = ""
"""
接下来就是三段流程控制
需要注意的是,我把默认的选择放到了else中
如果用户输入了一个不在选项中的数字
则会认为用户选择了默认搭配
但当用户输入的不是数字时,会报错导致程序中断
如何避免这个问题,会在第七期wwhile循环中讲到
在用户进行选择后
我们需要将对应商品的价格加在总价格中
并且将这个商品的名字记录
"""
if choose1 == 2:
total_fees += advanced # 将价格添加入总价格中
choose1_name = "高级" # 记录商品名字
elif choose1 == 3:
total_fees += deluxe
choose1_name = "豪华"
else:
total_fees += regular
choose1_name = "标准"
if choose2 == 1:
total_fees += 0
choose2_name = "无"
elif choose2 == 2:
total_fees += vege
choose2_name = "蔬菜"
elif choose2 == 4:
total_fees += seafood
choose2_name = "海鲜"
else:
total_fees += beef
choose2_name = "牛肉"
if choose3 == 1:
total_fees += 0
choose3_name = "无"
elif choose3 == 2:
total_fees += water
choose3_name = "水"
elif choose3 == 4:
total_fees += beer
choose3_name = "啤酒"
else:
total_fees += coke
choose3_name = "可乐"
print("您的选择为如下:\n\t面包:{}\n\t夹心:{}\n\t饮料:{}".format(choose1_name, choose2_name, choose3_name))
print("您总共消费了{}元".format(total_fees))
print("------------点餐完毕------------")
"""实例3:计算器"""
print("------------计算开始------------")
"""
下面两行获取用户的输入并且直接将其转化为int,方便之后的计算
"""
number1 = int(input("请输入第一个数字:"))
number2 = int(input("请输入第二个数字:"))
"""
下面这两行的目的是在获取用户输入的数字后让用户再次输入数字以选择计算方式
可以合并为一行,但我觉得这样好看一些
用户输入了计算方式后,我们将其转化为int存储在变量中
之后会以这个变量进行流程控制
instruction这段可以使用多行字符串的定义方式进行定义
"""
instruction = "请选择计算方法(默认为加):\n\t1.加运算(a+b)\n\t2.减运算(a-b)\n\t3.乘运算(a*b)\n\t4.除运算(a/b)\n\t5.模运算(a%b)\n\t6.指数运算(a^b)\n\t7.整除运算(a//b)\n"
method = int(input(instruction))
"""
两个变量
第二个比较好理解
就是计算的结果,目前为0
在流程控制中进行计算后会将结果存入这个变量中
相当于快餐店点餐器中的total_fees总费用
第一个变量相当于快餐店点餐器中
用于记录商品名字的那三个变量
不同的是在计算器中,我们只需要一个
用户输入数字选择计算方法后
这个变量会存储这个数字所对应的计算符号
同样只是为了输出比较好看
如果在输出中只想输出一个结果
这个变量就不需要
"""
method_symbol = ""
result = 0
if method == 2:
result = number1 - number2 # 计算结果
method_symbol = "-" # 记录符号
elif method == 3:
result = number1 * number2
method_symbol = "*"
elif method == 4:
result = number1 / number2
method_symbol = "/"
elif method == 5:
result = number1 % number2
method_symbol = "%"
elif method == 6:
result = number1 ** number2
method_symbol = "^"
elif method == 7:
result = number1 // number2
method_symbol = "//"
else:
result = number1 + number2
method_symbol = "+"
"""
下面的输出是.format()的另一种写法,通常会更简洁
需要在字符串前方添加小写字母f
之后可以直接将变量名写入{}所留出的空位中
"""
print(f"{number1} {method_symbol} {number2} = {result}")
print("------------计算结束------------")
谢谢大家!在下一期专栏中,我将会介绍Python中的另外两个数据结构:列表和集合。敬请期待下一期~
2021.2.15