Python中eval()与format()

今天在做mooc课程《Python语言程序设计》的练习题时,遇到一道题,硬生生纠结了半个小时,结果发现答案居然只是短短的两行,这功力不够果然还是不行啊,用C的思维去写Python怕是要纠结死🤔

先看看题

题目

数值运算

描述

获得用户输入的一个字符串,格式如下:

M OP N

其中,M和N是任何数字,OP代表一种操作,表示为如下四种:+, -, *, /(加减乘除)

根据OP,输出M OP N‬的运算结果,统一保留小数点后两位

注意:M和OP、OP和N之间可以存在多个空格,不考虑输入错误情况

示例输入‪

10 + 100
1 / 20

示例输出

110.00
0.05

解答

我最开始的想法是读入字符串,然后根据空格分为M、OP和N,之后再转换为int型进行计算

然而,我却完全忘记了Python有着eval()的存在….

eval()

|eval()函数用来执行一个字符串表达式,并返回表达式的值 ‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫

eval(expression[, globals[, locals]])

参数

expression – 表达式

globals – 变量作用域,全局命名空间,若被提供,必须是一个字典对象

locals – 变量作用域,局部命名空间,若被提供,可以是任何映射对象

可见,使用eval()后,就不需要我们自己对用户输入的算式进行处理,只需要直接调用,函数会自动帮我们计算结果

之后根据题意,我们还要将运算结果保留两位小数,这时format()就派上了用场

format()

这是一种格式化字符串的函数,基本语法是使用{}: ‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮ |format()‫‬‪‬‪函数‬‪‬‪‬可以接受不限个参数,位置可以不按顺序

>>> "{} {}".format("hello", "world")    # 不设置指定位置,按默认顺序
'hello world'
 
>>> "{0} {1}".format("hello", "world")  # 设置指定位置
'hello world'
 
>>> "{1} {0} {1}".format("hello", "world")  # 设置指定位置
'world hello world'

数字格式化

我们阔以使用str.format()格式化数字

|{:.2f} 保留小数点后两位

|{:+.2f} 带符号保留小数点后两位

|{:0>2d} 数字补0(填充左边,宽度为2)

|{:,} 以逗号分隔的数字形式

|{:.2%} 百分比格式

|{:.2e} 指数记法

|{:>10d} 右对齐(默认,宽度为10)

|{:^10d} 中间对齐(宽度为10)

|{:b} 二进制

Answer

于是,利用eval()format(),我们阔以直接写出答案:

s = input()
print("{:.2f}".format(eval(s)))

怎么样,是不是很简单

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus