扫一扫,看视频
如果想要计算一个普通的四则混合计算式,在Python命令行中输入计算式后会直接得到结果。但是如果想要实现一个类似于老式计算器的项目,例如,在实现加法功能时,不能直接通过输入数字来获取加数和被加数,只能选择0~9这10个“键”,并将输入的数字组合为最终的加数与被加数。同时,四则运算符也采用键位的方式选择,这样的计算器应当如何设计呢?本实例将通过类型的转换和循环判定语句完成这个功能。
首先,设计一个支持四则运算的计算器,计算器包含0~9这10个数字键位,以及加、减、乘、除运算符和“=”符号这5个符号键位,这些键位可以通过一个元组类型来表示。
计算器程序的实现流程如图2-38所示。
图2-38 计算器程序的实现流程
每次用户选择键位后,可以通过一个字符串存储整个运算式,用于之后的显示操作,当用户选择的键位是运算符时,将之前输入的数字字符串转换为数字,并且赋值给变量a,等待用户输入等号或其他运算符,将之后输入的数据转换为数字类型并赋值给变量b,计算两个变量的运算结果。
首先创建基础类型,并且将计算器中的键位新建为元组。
以加法为例,首先第一步是加数的获取,通过用户输入的数字找到相应的键位,并进行字符串的连接,如果此时的输入为一个符号,将字符串转换为具体数字a,需要判断的是,如果输入的符号是“=”,应当直接输出a的值。
如果输入的符号不是等号,则开始进行变量b的获取,整体过程和变量a的获取一致,代码如下所示。
注意: 在学习后续章节中的函数时,可以将本实例中很多重复的代码改写为方法,实现代码复用,可以极大地减少代码量,并且使可读性增强。
运行上述程序,尝试计算22*70这个计算式,结果如图2-39所示。
图2-39 计算22*70的结果
提示: 如果想要实现连续计算,应当注意乘除法运算的优先级高于加减法,所以在连续计算时,如果第二个运算符是乘法或除法,第一个运算符是加法或减法,则应当先计算之后的值再和之前的值进行运算。
为了实现这个功能,可以使用“栈”这种先入后出的结构,将计算式中的数字和运算符分别入栈,如果第二个运算符是低优先级的加法或减法,可以将栈中的上两个数字和运算符取出计算,将得到的结果再入栈;如果运算符是乘法或除法,可以直接计算运算符两边的数字,将结果入栈。
这种设计不仅可以解决优先级问题,还可以推广为实现计算带有括号和中括号等复杂类型的算式。感兴趣的读者可以自行实现。
扫一扫,看视频
程序代码中之所以设计循环语句,就是为了解决重复的操作,在忘记密码的情况下重复尝试密码的操作,就非常适合使用循环语句完成。
假设需要获得的一个目标字符串是指定的6位数字,并且要求任意位可以是0。这个密码可能是000000~999999中任意一个数。如果手工进行尝试,基本上是难以完成的工作量,但是可以尝试采用Python完成操作。
暴力法破解密码的基本流程如图2-40所示。
图2-40 暴力法破解密码的基本流程
具体的代码如下所示,需要注意的是,在将字符串转换为数字时,高位的0会被舍去,所以在转换为字符串时应当在高位补0。
上述代码中引用了time模块,通过time模块可以获取系统时间,在代码开始运行时获取了一次,结束时获取了一次,最终显示的是时间差。
随意地输入一个6位数字的目标字符串,运行结果如图2-41所示。
图2-41 得到目标字符串的运行结果
提示: 虽然计算机完成简单而重复的工作速度非常快,但是在真实的密码破解中并不适用暴力法,因为伴随着密码位数的增加,花费的时间会呈几何级数增长。这种情况下一般会选择一些特定的字符串进行尝试,以减少程序的请求次数。所以密码应当设置为较长的且复杂无规律的字符,才能确保密码安全。