你好!欢迎来到Python练习题详解系列。为了让小白(也就是我本人)更好的理解代码,打好编程基础,我决定仔细地解说一些练习题。欢迎观看!奥利给!
在开始练习题详解前,我们先简单看看,操作符究竟是什么东东呢~
Python的常用操作符包括但不限于算术,比较,赋值,逻辑等操作符。
算术操作符就是我们熟知的加减乘除,值得注意的有以下几点:
1. 在python中,/ 代表有小数点的精确除法,eg. 6 / 4 = 1.5
而 // 所运算的除法则舍弃了小数点后面的数字, 让答案变成最接近商的整数 eg. 6 // 4 = 1
2. % 代表计算除法的余数,eg. 6 % 4 = 2
3. ** 代表幂运算,eg. 2 ** 3 = 8
4. 优先级问题
先乘除 后加减,遇到括号先算括号里面的。
幂操作里,**比左侧优先级高,比右侧优先级低。(也就是说***的右侧优先于左侧)
也就是说 -3 ** 2 = -9
因为 - 3在左侧,**比 -3优先级高,运算出来就是 -(3**2)
如果是 3 ** -2,那就等于 0.1111111,因为右侧优先级高,就是3的负二次方。
Python支持的数字运算如下:
逻辑操作符包括 and ,or ,和 not。也就是我们熟知的与或非。
and 代表,当左右同时为True,则返回True,
or 代表,左边或者右边任意一边为True,则返回True,
not 代表一个一元操作符,他会返回一个相反类型的值,所以not true 就是 false;
优先级问题:NOT 优先 AND 优先 OR
编程世界里赋值就是等于号,a = b 就是把 b 的值赋给 a,
还有几个比较特殊的赋值符号,让我们一起来看看~(图片来自W3School)
啊噢,好像把知识点都po上来了~复习复习也挺好的!话不多说,马上做题!
请计算:not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9
(旁白:第一眼看这道题目,我是拒绝的,但题目还是要做的嘛!怎么做咧?)
思路:
首先,我们应该想到逻辑运算符的优先级问题:NOT 优先于 AND 优先于 OR
所以,我们根据这个优先级来给我们的式子加上括号~加完括号如下:
(not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)
加完括号,兔子沾沾自喜,以为已经接近答案,其实一看,what?!3 and 4是什么东东,要怎么计算吖。
所以,我们引入一个短路逻辑。(不是脑子短路了噢~)
短路逻辑规则如下:
若 or 的左侧逻辑值为 True ,则输出 or 左侧表达式 。如图,4是true,那么直接输出4。
若 or 的左侧逻辑值为 False ,则输出or右侧的表达式。如图,0是false,那么直接输出4。
若 and 的左侧逻辑值为 True, 则输出and右侧的表达式。如图,4是true,那么输出3。
若 and 的左侧逻辑值为 False , 则输出and左侧的表达式。
回到我们的题目:
(not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)
= 0 or 0 or 4 or 6 or 9
= 0 or 4 or 6 or 9
= 4 or 6 or 9
= 4 or 9
= 4
那么,答案就是4啦~~~
要求玩家输入一个数字,程序判断它是不是闰年~如图所示:
思路:
首先,我们要具备一个小学的知识(虽然兔子也是百度才想起来的),那就是,闰年的条件:能被4整除但不能被100整除,或者能被400整除都是闰年。所以,我们可以运用我们的逻辑运算符和算术运算符来表达对闰年的判断。
于是我们可以列出三个式子:(year % 4 == 0), (year % 100 != 0) , (year % 400 == 0)
这三个式子要用逻辑运算符连接在一起。首先,前两个式子是必须要在一起的,因为“能被4整除但不能被100整除”,这两个条件都必须满足,所以,我们用AND把他们连在一起。第三个式子,我们要用 OR 来跟前面的两个式子连在一起,因为年份只要满足第三个式子,即使不满足前两个式子,也可以是闰年!
于是式子就变成:(year%4 == 0) and (year%100 != 0) or (year % 400==0)
这里出现一个优先级问题,我们需要先比较AND再比较OR, 而在规则里,AND 刚好优先于 OR,所以我们可以不加括号。但是为了让看我们代码的人们可以更好地理解,其实加括号也是非常妥当的选择~ 小小的括号,还生动形象地体现了打代码的小白的细心呢!
于是式子就变成:((year%4) == 0) and ((year%100) != 0) or ((year % 400)==0)
答案(不一定是最好滴!仅供参考!欢迎指教!):
(这里在第3,4行我加了一个上一篇文章中提到的判断数据类型的代码。感兴趣的小伙伴可以点击链接去看看上一篇文章的详解~~。)
现在我们坐上小飞机,开始遨游一下这篇代码。一开始用户输入一个字符串,程序就进入了循环。在第三行,我们首先判断这个循环是不是整数,如果不是,就输出“格式有误,请输入一个整数。”而如果输入的字符串本身就是整数,就不会进入第三行的while循环,直接来到了第五行。给这个字符串整型为int,并叫他year。整型之后,我们来到一个if 函数,判断一下这个年份是不是闰年,如果是,就break。break的意思就是跳出循环,跳出循环之后我们直接来到第11行,输出(year,“是闰年”);如果不是,就会输出(year,“不是闰年”),然后再要求用户重新输入一个年份,用户在第十行输入的这个字符串会继续来到第二行,进行下一次循环~
飞机着陆啦~来看看下一道题目吧。
请写一个程序打印出 0~20 所有的奇数。如图所示。
思路:
看到奇数,聪明的孩子马上就想到,奇数 / 2时,余数不等于0。
于是我们便写出这个式子:i % 2 != 0
然后,我们还需要一个循环,来让这个程序持续输出30以内的奇数。所以while后面跟着的条件应该是让 i 小于或等于 30。
在while循环里面,我们写一个if函数,当 i % 2 不等于0,就代表此时的 i 是一个奇数,我们就把这个 i 打印出来。如果等于0,那就不打印。w
在这里,无论是 if 还是 else,后面都要写一个 i += 1,让 i + 1 赋值给 i,就能确保我们的 i 一直增加,直到30。
答案:
爱因斯坦曾出过这样一道有趣的数学题:有一个长阶梯,若每步上2阶,最后剩1阶;若每步上3阶,最后剩2阶;若每步上5阶,最后剩4阶;若每步上6阶,最后剩5阶;只有每步上7阶,最后刚好一阶也不剩。请编程求解该阶梯有多少阶?
思路1:
这道题又是一道结合了算术运算符和逻辑运算符的题目,如果每步上2阶,最后剩1阶,那用式子表达就是 i % 2 = 1,而爱因斯坦爷爷说的这些条件必须全部同时被满足,所以要用AND把他们连接到一起。以此类推,我们得到这样一个式子:((i % 2 == 1) and (i % 3 == 2)and (i % 5 == 4) and (i % 7 == 0))
剩下的思路是不是就跟上一道题目很像呢~ 让我们来看看思路1的答案:
程序run起来是这样滴,代表了1-1000的范围内所有的答案
思路2:
题目说,只有每步上7阶,最后刚好一阶也不剩。所以我们可不可以去生成一些7的倍数 x ,然后再去判断前面那些条件合不合适呢?yes!进一步地想,7的倍数,也就是 7 * 1, 7 * 2, 7 * 3 ……那么我们就要生成一个变量 s ,让它从1逐渐增长(也就是 i += 1 ) 最后,让 7 * s 就是一连串7的倍数——x啦。
等等,我还有另一个要求,就是如果我们while后面跟着的范围不够大,这个数字找不到,我想让让系统提示“在程序限定的范围内找不到答案!”
看到这里,有的小伙伴可能觉得,呀,那还不简单,直接增加一个变量,再加一个print就好啦~
如图:
粗略来看好像行得通,但是,这样其实是错的!只要是7的倍数但不符合条件的,都会被print “在程序限定的范围内找不到答案!”, 你可能run出来会看到一排眼花缭乱的“在程序限定的范围内找不到答案!”然后才是阶梯的答案。不信我试给你看看~
这里我们还应该增加一个限定,只有在范围内找不到的时候才print那句提示,而不应该在每一次7的倍数print。
我们这里引入一个新的变量flag,目的就是为了让提示的那句话只跟范围有关,跟倍数循环无关。
如下图答案所示,第7行,当符合条件时,我们给flag赋值1,不符合我们就默默让他成为下一个7的倍数。
在第12行,我们再让flag == 1 时,输出答案,而当flag 等于0,则说明while循环里面没有输出一个flag == 1的数,flag还是等于第三行的赋值0,就会print出我们的提示,表示while后面的范围里面找不到符合条件的阶梯数。
好啦!聪明的你看懂了吗~ 喜欢的话可以收藏~也可以给兔子点个赞噢~奥利给!