开发者学堂课程【Python 开发基础入门:Python 入门必备-编程逻辑判断及案例练习】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/556/detail/7651
Python 入门必备-编程逻辑判断及案例练习
目录:
一、练习题
二、解决习题一
三、解决习题二
一、练习题
Ø输入2个数字,输出最大数
Ø给定一个不超过5位数的正整数,判断其几位
二、解决习题一
先来看第一题,题目说输入两个数字,然后输出最大的数。
现阶段只允许用if判断语句来完成以上事情,当然也可以用函数,比如说max函数判断谁最大。但max函数是以后才能用的。必须懂得原理之后再用它,如果已经懂得原理,那么就不限制使用手段了。
输入两个数应该怎么做呢?
首先输入数字现阶段只能用input这个函数。但input函数获得的数字都会被认为是字符串,返回一个字符串回来,在拿到字符串之后该怎么用呢?
需要把字符串赋值到一个变量里面去,然后变量也是字符串,但现在需要比较是数字的大小。这就是需要思考的问题。
比较两个数字的大小,在之前的案例中已经做过了。两个值要进行大小比较。它们一般来讲,必须要求类型相同。那么接收两个数字就都可以通过下面的代码来接收。
a = input (
“
input a number:
”
)
b = input (
“
input a number:
”
)
着两个a、b都应该比较清楚都是string类型的,都是字符型。那么直接进行a、b的大小比较是没有问题的。
if a > b
那么直接进行大小比较是好还是不好,字符串是可以直接比较大小的,但就比如字符串0、1的比较的结果不一定是想要的。
所以数字的比较和字符串的比较是不一样的。现明确必须要有数字的方式。在一个说是数字但还没有说是整型。比如说拿字符串-1和1比较,或者字符串1和1.5进行比较。结果都未必是想要的。
所以比较时必须转化为数字,可以这样做。
if int(a) > int(b):
pass
pass语句为空语句,可以理解为就从这里通过的意思,就是一个占位语句,它什么都不做是一个空操作的占位语句仅此而已。
如果没有pass语句将会执行错误,因为冒号后不能为空必须要有语句块。为什么只是写了pass呢,因为内容现在什么都没有,先搭出框架。
if int(a) > int(b):
pass
elif int(a)
发现这段中的int反复出现,就可以这样改写。后续a、b就可以反复使用了。
a = int(a)
b = int(b)
if a >b:
pass
elif aint(a)
int不会直接去修改a,int(a)是会把字符串转化为新的值,但需要赋值给新的变量,是a = int(a),原来的a就已经被改变了。从一个字符串变为了一个数字。还可以这样写:
a = int(input(
‘
input a number:
’
))
input内部的为字符串被int拿到后转化为整型,但是有可能失败,如果输入的是1.5,可能成功也可能失败,因为可能是截取1,但也有可能失败。
现假设输入的都是合法的整数,用以上方法先把字符串转化为整数,得到整数之后就可以进行比较了。
下面进行判断谁大谁小把谁输出的问题。
看同学们写的示例:
a = input(
“
>>>
”
)
b = input(
“
>>>
”
)
//获取a和b。
a = int(a)
b = int(b)
//在转化一下。这样写是没什么问题的,熟悉之后就可以写到一起去。现阶段先不关心输入是错误的,因为验证是一件非常繁琐的事情。现在练习的是中间的逻辑部分。
if a > b://丢了等于的判断。
print(a)
esle:
print(b)
//例如a>b走的a,那a=b呢?就该有else去了。
这里需要注意边界的问题,也就是>=问题,大于小于但还需要注意等于。所以每次写完都应该检查一下,避免漏掉了边界。
a = input(
“
>>>
”
)
b = input(
“
>>>
”
)
a = int(a)
b = int(b)
if a >= b:
print(a)
esle:
print(b)
两种写法都没有错,提醒的是在使用if时每一个边界都需要检查,避免漏掉边界。
下一步需要把a、b比较大小,可以用max内置函数,然后再打印出来。
print (max(a,b))
max函数的好处在于已经把中间逻辑已经写好了。现重点在于练习使用if else的严格逻辑。
现在思考如果比较三个数的大小,进行排序谁最大谁最小,用if esle来实现。不允许使用max函数,就是练习if else的使用。
练习逻辑,确保if else 各个分支没有漏洞。熟悉之后再使用技巧,比如使用内置的其他函数。
Ø给定一个不超过5位数的正整数,判断其几位
三、解决习题二
第二题要求稍微复杂了一点,限定5位的正整数,判断是几位数。可以有几个思路可以实现。
看同学的相关示例1:
a=6666
if a<10://小于10为个位。
print(1)
elif 9<100://大于9是可以不用了写的,前面的小于10已经卡住了条件。如果已经大于10就已经隐含大于9的条件了。
print(2)
elif 99
print(3)
elif 999
print(4)
elif 9999
print(5)
这里的大于9其实已经隐含已经测试过了。改为:
elif a<100:
其余分支修改类似于此:
elif a<1000:
elif a<10000:
elif a<100000:
多写的判断会显得很啰嗦。
看同学的相关示例2:
1 = int(input(
“
input a number:
”
))
if i // 10000 :
//给一个数字依次向下除。除以10000都小于0,就是小于5位数的。
print (5)
else i // 1000 :
print (4)
else i // 100 :
print (3)
else i // 10 :
print (2)
else :
print (1)
这里用的反向除法的处理方法,逻辑是行得通的,但不但要比较是不是0,还得先做一次除法运算,本身除法运算就不快。
这是引入的一些不该用的计算,本是可以直接进行比较的,但进行了多余的除法计算。能加就不要减,能乘就不要除。除法还会出现其他问题。能不计算就不计算,能比较就不要算。算是要消耗CPU资源的。
看同学的相关示例3:
a = input (“>>>”)
a = int(a)//给一个数然后转化为数字。
if a < 0:
print (“输入的格式不对,请输入一个不超过5位的数”)
elif a < 100000://做了验证判断。
if a < 10:
print(“是一个1位数”)
elif a < 100:
print(“是一个2位数”)
elif a < 1000:
print(“是一个3位数”)
elif a < 10000:
print(“是一个4位数”)
else:
print(“是一个5位数”)
else:
print(“请输入一个不超过5位的数”)
考虑得比较周全,做了一些输入条件验证,但还是不完整,验证判断实际会很复杂,中间的分支逻辑和案例2比较相似。
看同学的相关示例4:
number = int (input(“number”))//加入输入正确就转化为数字。
if number >= 100://>=写法更顺应思考逻辑,但没有好坏之分。从100折半判断。大于100后判断三位数还是4,5位数。
if number >= 10000:
print(
“
5
”
)
elif number >= 1000:
print(
“
4
”
)
else:
print(
“
3
”
)
else://用到了折半。
if number >= 10://小于100判断是两位数还是一位数。
print(
“
2
”
)
else:
print(
“
1
”
)
//这里给了5位数的判断,其实就可以思考10位数,20位数,30位数等的判断了。
也用到了折半的思想,这里用到折半是很不错的。
看同学的相关示例5:
newnumber = input(
“
number???
”
)
length = len (newnumber)
if length >= 3:
//这里应用了两个很好的东西。用到了字符串处理的方式。如果是字符串其实就可以对字符串的长度直接做判断。字符串最小输入为0。
if length > 4:
print(
“
5
”
)
elif length > 3:
print(
“
4
”
)
else:
print(
“
3
”
)
else://这里的判断做了对半处理。
if length == 2:
print(
“
2
”
)
else:
print(
“
1
”
)
这是用的字符串的处理方法,处理完数字之后已经知道字符串的长度,就没必要折中再进行比较,显得多此一举。
看同学的相关示例6:
a = int(input(“请输入一个不超过5位的正整数:”))
if a <= 0 or a>=100000:
print(“请输入一个不超过5位的正整数:”)
else ://这里进行了计算,且每次都要计算。取对数算肯定是不会快的,哪怕不用折半用if判断都比这快。最简单的方法往往是效率最高的。
import math
b = int(math.log10(a)+1)
print(b)
这里使用了math模块,用了取对数的方式,但计算速度比除法还慢,执行效率较低。可以思考这么去实现,但并不推荐。
练习参考答案:
val = input(
“
>>>
”
)
val = int(val)
if val >= 1000: #fold
if val >= 10000:
print(5)
else:
print(4)
else:
if val >= 100:
print(3)
elif val >= 10;
print(2)
else:
print(1)
做开发千万不要被限制住思维,要解放自己的思想,想到的更多再选择自己认为最后的方式,但自己认为的最优,也不一定是最好的。重要的是第一个版本有没有写出来,有没有写对。
如果没写出来,就要多加练习。现在练习的是思维严谨性。用if写出完完整整,没有漏洞的代码,这就是需要练习的。