在生活和工作中,我们常会对一些情况进行假设,如果这次考试能拿到5个及以上的A则可以获得奖学金;如果模型训练的样本量增加一倍,那么预测的准确率将提高10%,如果增加两倍,那么预测的准确率将提高15%。
这些假设都是基于某种条件作出的一种判断,并依据判断结果作出响应。
计算机之所以可以自动化执行任务,是因为人们将多种假设和对应结果以程序的形式存储到计算机,让计算机根据用户的指令自动作出条件判断。
这里我们将接触一个重要的概念,即计算思维。
计算思维是运用计算机科学的基础概念进行问题求解、系统设计以及人类行为理解等涵盖计算机科学之广度的一系列思维活动。计算思维最根本的内容,是抽象和自动化。通过约简、嵌入、转化和仿真等方法,把一个看来困难的问题重新阐释成一个我们知道问题怎样解决的方法。[1]
运用计算思维解决问题的基本步骤有分解、抽象、模式识别(规律整合)、建模(算法)。
接下来给出一个具体任务,尝试使用计算思维和算法来解决这个问题:实现一个计算机程序判断某个数是否为素数?(素数是指在大于1的自然数中,除了1和它本身外,不能被其他自然数整除(除0以外)的数称之为素数(质数))
第一步:分解问题(分解关键问题)
1.不能被其他自然数整除的其他自然数指的是哪些数?
2.如何判断能否整除?
第二步:抽象具体问题(形成任务清单)
1.假设这个数为N,则让其除以2至N-1中的每一个数
2.取余数
3.判断余数是否为0
4.如果都不为0,则结果输出为素数。
第三步:模式识别(找到解决问题的方法)
1.使用for循环语句
2.使用%运算符得到余数
3.使用if条件语句判断余数是否为0
4.使用if条件语句判断并输出最终结果
第四步:建立算法(建立解决问题的流程)
1.获取输入
2.定义isprime变量初始值
3.循环条件判断,如果其中有一个余数为0,更改isprime变量的值并提前退出循环
4.条件判断,根据isprime的值输出结果
接下来,我们就可以使用编程语言将这个算法实现出来。
num = int(input('请任意输入一个整数'))
isprime = True
for i in range(2,int(num)-1):
if num % i == 0:
isprime = False
break
if isprime:
print("this is a prime")
else:
print("this is not a prime")
到这里,大家有没有感觉到,计算思维是一种解决问题的思考方式。其实不一定要会编程,无论你未来是音乐家、艺术家、医生、科学家、创业者,掌握计算思维,都会给你多一种解决问题的思考方式。从完全开放的角度来讲,如果你是一位工程师,你也可以从了解艺术家、医生、科学家等其他职业的思考方式中受益。
在学习一门编程语言的时候,我们会有意无意的训练计算思维,训练的过程就像搭房子,逐步完善形成体系化的思维框架。除了用以编程,这种思维方式也会影响到你其他领域的学习、工作以及生活。
叮铃~~请暂时把思绪收回来,回到学习编程中。这一节,我们将学习条件判断if语句。条件判断是对N种可能发生情况的响应机制设定,N可以是1,也可以大于1。
简单if语句指在满足某一种情况时要做的事情。
if <逻辑表达式>:
<条件为真时执行的语句1>
<条件为真时执行的语句2>
…………
<条件为真时执行的语句N>
if语句的结构是以 if 作为起始,在if后空一格,紧跟着是一个逻辑表达式,逻辑表达式后紧跟一个冒号(:),代表下一层级代码块的开始。从第二行开始,是当逻辑表达式的值为真或非0、非空将要执行的语句,可以是一行语句也可以是多行语句。这种结构的if语句,如果逻辑表达式的值为假、为0或为空,将不执行if下一层级代码块的任何语句。
下面我们补充一点Python中关于代码块的讨论。
代码块与缩进:与其他编程语言不同,在python中使用缩进来确定代码块(在C语言和JAVA使用一对大括号{}标识一个代码块的起止)。一般来说,使用4个空格来区分不同的代码块。例如下图中,从for开始到break结束是代码块1,在代码块1内部嵌套了一个if语句的代码块2,所以图中的第一个if相比较for的起始位置差了4个空格,isprime作为第一个if语句的下一个层级,相比较if的起始位置相差了4个空格,相比较for的起始位置相差了8个空格。通过观察我们还可以看到,第二个if的起始位置与for是平齐的,所以 第二个if语句不在for循环内,并且它组成了第三个程序块。
作为python语言的初学者,我们应严格遵守缩进的使用规则,编写出结构清晰的代码。如果在运行时出现“IndentationError: unindent does not match any outer indentation level”的提示,就意味着你该去检查一下是不是某个地方的缩进出现了错误。
接下来,我们来看看简单if语句能帮我们做些什么。
简单if语句类似温感探测器的运行机制,只有在满足某一特定条件的时候才会执行,对于条件范围以外的任何情况与它都无关(简直高冷的不行)。
if temperature > 54: #当温度超过54摄氏度时,报警器响,自动向119报火警。
alarm_on = 1
call_119 = 1
使用简单If语句适用于我们只需聚焦某个条件下,而不需要去关心其他可能性的发生。如果同时对真假两面都要响应时,则需要用到if_else语句。
if_else语句不仅实现了当条件满足时要做的事情,还实现了当条件不满足时要做的事情。
if <逻辑表达式>:
<条件为真时执行的语句1>
<条件为真时执行的语句2>
…………
<条件为真时执行的语句N>
else:
<条件为假时执行的语句1>
<条件为假时执行的语句2>
…………
<条件为假时执行的语句N>
if_else的语句结构的前半部分与简单if语句一致,说明了在何种条件为真时要执行的语句,不同的是多了else,else的位置与if的起始位置平齐,在else后紧跟一个冒号(:),从else下一行开始,明确了当if后的逻辑表达式的值为假的时候需要执行的语句,这里同样要注意缩进。
if_else的语句结构使用频率较高,代表的是如果……就……,否则……的逻辑关系。
在使用if_else语句时,我们需要解决三个问题,一是如何设定界限,也就是判定条件;二是满足条件时做什么?三是不满足条件时做什么?
下面给出几个使用if_else语句的实例。
实例1:判断学生成绩是否合格,并输出相应结果。
如果课程成绩大于等于60分则为合格,否则为不合格。
scores = [70,80,50,90,55] #scores为列表,其中包含了5名同学的成绩
for score in scores: #使用for循环逐一从列表中获取每位同学的成绩存到score中
if score >= 60: #如果score的值大于等于60,输出“合格”
print('合格')
else: #否则输出“不合格”
print('不合格')
输出结果为合格、合格、不合格、合格、不合格
实例2:根据年份判断是否为闰年,并输出相应结果。
判断闰年的规则是年份可以被4整除且不能被100整除,或者年份可以被400整除。
yearlist = [2018,2000,2020,2024,2100] #yearlist为列表,其中包含了5个年份
for year in yearlist: #使用for循环逐一从列表中获取每个年份存入到year中
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): #如果符合判定规则,则输出是闰年
print(year," is leap year")
else:
print(year," is not leap year") #否则输出不是闰年
输出:
2018 is not leap year
2000 is leap year
2020 is leap year
2024 is leap year
2100 is not leap year
练习:判断用户名的长度是否大于8个字符。
#account_list是一串用户名列表,要求对其中用户名的长度逐一判断,如果大于等于8字符,输出'correct username',如果小于8字符,输出'The username is less than 8 characters'
account_list = ['Robin','Elizabeth','Garfield','Judy']
for username in account_list:
#Todo 从此处开始写你的代码,注意缩进。
#如果代码正确,你将得到如下结果
The username is less than 8 characters
correct username
correct username
The username is less than 8 characters
以上我们都是对一个条件进行判断,如果判断的条件多于1个,我们就需要用到if_elif语句(else根据具体情况再选择是否需要)
“双十一折扣”问题:正值“双十一”期间,各大电商平台给出了极具吸引力的优惠活动,其中有一个平台的优惠政策如下:
(1)全场9.5折优惠,如果提前预付,则打9折。
(2)折后总价跨店满299减40元,满599减60,满899减80。
要求根据总价和预付情况,计算实际支付金额。
分解问题(分解关键问题):(1)是否有预付?(2)折后总价满足哪一个条件?这里需要对两个情况以上两个情况进行判断。
抽象问题(形成任务清单):(1)判断预付情况,获得折扣;(2)计算折后总价;(3)判断折后总价符合哪一个满减条件;(4)计算实际支付金额。
模式识别(找到解决问题的方法):(1)if_else语句判断预付情况;(2)计算折后总价;(3)if_elif_else语句判断满减金额,计算实际支付金额。
if_elif_else语句的结构:
if 条件1:
代码块1
elif 条件2:
代码块2
elif 条件3:
代码块3
elif ……:
代码块n-1
else:
代码块n
if_elif_else的执行流程:先判断条件1,如果满足,则执行代码块1并结束整个if语句,如果不满足,则去判断条件2是否满足,如果满足,则执行代码块2并结束整个if语句,否则继续判断下一个条件,以此类推。如果没有任何一个条件满足,则if语句将不会执行任何代码块。如果最后设置有else部分(也可不设置),则当前面所有条件都不满足时,则执行else下的代码块n。
我们看下“双十一折扣”问题的代码部分。
# 条件1:全场9.5折优惠,如果提前预付,则打9折。
# 条件2:折后总价跨店满299减40元,满599减60,满899减80。
# prepay=0代表未预付,prepay=1代表已预付
sale_data = [{'name':'Tom', 'price' : 433, 'prepay':1}, {'name':'Judy', 'price' : 1107, 'prepay':1}]
# 定义函数calu,作用是根据价格(price)和预付情况(prepay)计算实际支付总额(total)
# 因为条件2是基于条件1的折后总价进行判断,因此需先判断预付情况,并计算折后总价.
# 条件2是满减的标准,根据金额大小共设有三个级别,我们这里需要用到if_elif_else语句。
def calu(price, prepay):
if prepay == 1:
discount = 0.9
else:
discount = 0.95
discount_price = price * discount # 计算折后总价
if discount_price >= 899: # 类似多个数值区间的条件判断,我们习惯使用大于比较运算,判断的层级按从大到小。
total = discount_price - 80
elif discount_price >= 599:
total = discount_price - 60
elif discount_price >= 299:
total = discount_price - 40
else:
total = discount_price # 折后总价小于299元,没有满减
return total
for content in sale_data:
price = content['price']
prepay = content['prepay']
pay_amount = calu(price, prepay)
content['pay_amount'] = round(pay_amount,2)
print(sale_data)
if_elif_else语句适用于需要多个条件的判断,且这些条件之间都是相斥的。
作业:当学习了if语句后,我们就可以完成一些意思的任务。下面提供了两道作业题,欢迎大家将自己编写的代码和运行结果贴到留言区,下一篇我们将提供本次作业的建议答案,并使用if语句玩一些更有意思的事情,祝大家玩的开心!
# 作业1:
# 编写一段代码,实现根据用户输入的月份判断并输出该月份的天数。(2月按28天计算)
# 作业2:
# 编写一段代码,实现对学生成绩等级的判断并输出判定结果。
# 判定规则:
# 90分及以上为优秀;
# 80分及以上到90分(不含90分)为良好;
# 70分及以上到80分(不含80分)为中等;
# 60分及以上到70分(不含70分)为及格;
# 60分以下(不含60分)为不及格。
def judge_grade(score):
# 在此位置编写你的代码
return grade
scores = [95,70,73,87,52,25,66,89,30,99]
for score in scores:
grade = judge_grade(score)
print(grade)
[1]周以真.Computational thinking and thinking about computing.《Communications of the ACM》49卷第三期.