- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python实现简单的四则运算计算器由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、算法 。
1、算法的主要思想就是将一个中缀表达式(Infix expression)转换成便于处理的后缀表达式(Postfix expression),然后借助于栈这个简单的数据结构,计算出表达式的结果.
2、关于如何讲普通的表达式转换成后缀表达式,以及如何处理后缀表达式并计算出结果的具体算法描述不在此叙述了,书上有详细的说明.
2、简易计算器 。
使用说明 。
使用该计算器类的简单示例如下:
1
2
3
4
5
|
# usage
c
=
Calculator()
print
(
'result: {:f}'
.formart(c.get_result(
'1.11+2.22-3.33*4.44/5.55'
)))
# output:
result:
0.666000
|
测试案例 。
为了对这个计算器进行有效地检验,设计了几组测试案例,测试结果如下:
1
2
3
4
5
6
7
8
9
10
|
Test No.
1
: (
1.11
)
=
1.110000
Test No.
2
:
1.11
+
2.22
-
3.33
*
4.44
/
5.55
=
0.666000
Test No.
3
:
1.11
+
(
2.22
-
3.33
)
*
4.44
/
5.55
=
0.222000
Test No.
4
:
1.11
+
(
2.22
-
3.33
)
*
(
4.44
+
5.55
)
/
6.66
=
-
0.555000
Test No.
5
:
1.11
*
((
2.22
-
3.33
)
*
(
4.44
+
5.55
))
/
(
6.66
+
7.77
)
=
-
0.852992
Test No.
6
: (
1.11
+
2.22
)
*
(
3.33
+
4.44
)
/
5.55
*
6.66
=
31.048920
Test No.
7
: (
1.11
-
2.22
)
/
(
3.33
+
4.44
)
/
5.55
*
(
6.66
+
7.77
)
/
(
8.88
)
=
-
0.041828
Test No.
8
: Error: (
1.11
+
2.22
)
*
(
3.33
+
4.44
: missing
")"
, please check your expression
Test No.
9
: Error: (
1.11
+
2.22
)
*
3.33
/
0
+
(
34
-
45
): divisor cannot be zero
Test No.
10
: Error:
12
+
89
^
7
: invalid character: ^
|
实现代码 。
栈的实现 。
栈实际上就是一个被限制操作的表,所有的操作只能在栈的顶端(入栈、出栈等),以下是使用Python代码实现的简单的栈:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
class
Stack(
object
):
"""
The structure of a Stack.
The user don't have to know the definition.
"""
def
__init__(
self
):
self
.__container
=
list
()
def
__is_empty(
self
):
"""
Test if the stack is empty or not
:return: True or False
"""
return
len
(
self
.__container)
=
=
0
def
push(
self
, element):
"""
Add a new element to the stack
:param element: the element you want to add
:return: None
"""
self
.__container.append(element)
def
top(
self
):
"""
Get the top element of the stack
:return: top element
"""
if
self
.__is_empty():
return
None
return
self
.__container[
-
1
]
def
pop(
self
):
"""
Remove the top element of the stack
:return: None or the top element of the stack
"""
return
None
if
self
.__is_empty()
else
self
.__container.pop()
def
clear(
self
):
"""
We'll make an empty stack
:return: self
"""
self
.__container.clear()
return
self
|
计算器类的实现 。
在计算器类中,我们将表达式的合法性验证单独放在一个函数中完成,但是实际上如果需要,也可以直接放在中缀表达式转后缀表达式的函数中实现,这样只需要一次遍历表达式即可同时完成验证和转换工作。但是为了保持结构清晰,还是分开来实现比较好,每个函数尽可能最好一件事情才是比较实在的.
在该计算器类中,有很多种极端的情况没有被考虑进去,因为那样的话整个实现的代码会更多。不过,可以在后期为整个类继续扩展,添加新的功能也是可以的。目前实现的就是主要框架,包括基本的错误检测和运算,重点时学习运用栈这个看似简单却强大的数据结构解决问题.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
class
Calculator(
object
):
"""
A simple calculator, just for fun
"""
def
__init__(
self
):
self
.__exp
=
''
def
__validate(
self
):
"""
We have to make sure the expression is legal.
1. We only accept the `()` to specify the priority of a sub-expression. Notes: `[ {` and `] }` will be
replaced by `(` and `)` respectively.
2. Valid characters should be `+`, `-`, `*`, `/`, `(`, `)` and numbers(int, float)
- Invalid expression examples, but we can only handle the 4th case. The implementation will
be much more sophisticated if we want to handle all the possible cases.:
1. `a+b-+c`
2. `a+b+-`
3. `a+(b+c`
4. `a+(+b-)`
5. etc
:return: True or False
"""
if
not
isinstance
(
self
.__exp,
str
):
print
(
'Error: {}: expression should be a string'
.
format
(
self
.__exp))
return
False
# Save the non-space expression
val_exp
=
''
s
=
Stack()
for
x
in
self
.__exp:
# We should ignore the space characters
if
x
=
=
' '
:
continue
if
self
.__is_bracket(x)
or
self
.__is_digit(x)
or
self
.__is_operators(x) \
or
x
=
=
'.'
:
if
x
=
=
'('
:
s.push(x)
elif
x
=
=
')'
:
s.pop()
val_exp
+
=
x
else
:
print
(
'Error: {}: invalid character: {}'
.
format
(
self
.__exp, x))
return
False
if
s.top():
print
(
'Error: {}: missing ")", please check your expression'
.
format
(
self
.__exp))
return
False
self
.__exp
=
val_exp
return
True
def
__convert2postfix_exp(
self
):
"""
Convert the infix expression to a postfix expression
:return: the converted expression
"""
# highest priority: ()
# middle: * /
# lowest: + -
converted_exp
=
''
stk
=
Stack()
for
x
in
self
.__exp:
if
self
.__is_digit(x)
or
x
=
=
'.'
:
converted_exp
+
=
x
elif
self
.__is_operators(x):
converted_exp
+
=
' '
tp
=
stk.top()
if
tp:
if
tp
=
=
'('
:
stk.push(x)
continue
x_pri
=
self
.__get_priority(x)
tp_pri
=
self
.__get_priority(tp)
if
x_pri > tp_pri:
stk.push(x)
elif
x_pri
=
=
tp_pri:
converted_exp
+
=
stk.pop()
+
' '
stk.push(x)
else
:
while
stk.top():
if
self
.__get_priority(stk.top()) !
=
x_pri:
converted_exp
+
=
stk.pop()
+
' '
else
:
break
stk.push(x)
else
:
stk.push(x)
elif
self
.__is_bracket(x):
converted_exp
+
=
' '
if
x
=
=
'('
:
stk.push(x)
else
:
while
stk.top()
and
stk.top() !
=
'('
:
converted_exp
+
=
stk.pop()
+
' '
stk.pop()
# pop all the operators
while
stk.top():
converted_exp
+
=
' '
+
stk.pop()
+
' '
return
converted_exp
def
__get_result(
self
, operand_2, operand_1, operator):
if
operator
=
=
'+'
:
return
operand_1
+
operand_2
elif
operator
=
=
'-'
:
return
operand_1
-
operand_2
elif
operator
=
=
'*'
:
return
operand_1
*
operand_2
elif
operator
=
=
'/'
:
if
operand_2 !
=
0
:
return
operand_1
/
operand_2
else
:
print
(
'Error: {}: divisor cannot be zero'
.
format
(
self
.__exp))
return
None
def
__calc_postfix_exp(
self
, exp):
"""
Get the result from a converted postfix expression
e.g. 6 5 2 3 + 8 * + 3 + *
:return: result
"""
assert
isinstance
(exp,
str
)
stk
=
Stack()
exp_split
=
exp.strip().split()
for
x
in
exp_split:
if
self
.__is_operators(x):
# pop two top numbers in the stack
r
=
self
.__get_result(stk.pop(), stk.pop(), x)
if
r
is
None
:
return
None
else
:
stk.push(r)
else
:
# push the converted number to the stack
stk.push(
float
(x))
return
stk.pop()
def
__calc(
self
):
"""
Try to get the result of the expression
:return: None or result
"""
# Validate
if
self
.__validate():
# Convert, then run the algorithm to get the result
return
self
.__calc_postfix_exp(
self
.__convert2postfix_exp())
else
:
return
None
def
get_result(
self
, expression):
"""
Get the result of an expression
Suppose we have got a valid expression
:return: None or result
"""
self
.__exp
=
expression.strip()
return
self
.__calc()
"""
Utilities
"""
@staticmethod
def
__is_operators(x):
return
x
in
[
'+'
,
'-'
,
'*'
,
'/'
]
@staticmethod
def
__is_bracket(x):
return
x
in
[
'('
,
')'
]
@staticmethod
def
__is_digit(x):
return
x.isdigit()
@staticmethod
def
__get_priority(op):
if
op
in
[
'+'
,
'-'
]:
return
0
elif
op
in
[
'*'
,
'/'
]:
return
1
|
总结 。
以上就是利用Python实现简单四则运算计算器的全部内容,希望本文的内容对大家的学习或者工作能有所帮助,如果有疑问大家可以留言交流.
参考 。
《数据结构与算法(C语言)》上相关章节算法描述 。
原文链接:http://blog.chriscabin.com/coding-life/python/python-in-real-world/1101.html 。
最后此篇关于Python实现简单的四则运算计算器的文章就讲到这里了,如果你想了解更多关于Python实现简单的四则运算计算器的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!