鱼C论坛

 找回密码
 立即注册
查看: 3383|回复: 21

[技术交流] Python:每日一题 198

[复制链接]
发表于 2018-8-13 09:53:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2018-8-19 18:48 编辑

发表于 昨天 12:50 | 只看该作者
我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
这是一道开放性的题目,用input输入一个算式,如: (3 + 1.5) * 8 ** 0.5 - 6 / 4
然后给出计算结果。
给出的方法越多越好。

=================================================
我想到的方法:
1.直接计算出来,可以用逆波兰表达式,说起来我也不会,看看大侠的答案吧
2.eval这个大家用的最多
3.exec
4.直接在程序文件的后面用文件操作写入算式,但实际操作看,python已经把程序读入内存了,后面修改但部分不被执行
5.在4点基础上变通一下,把算式写入另一个文件,然后import导入

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-13 10:17:23 | 显示全部楼层
本帖最后由 Henriz 于 2018-8-13 11:06 编辑
  1. import re

  2. exp_a = input("请输入一个算式:")
  3. if re.match("[A-Za-z]+",exp_a):
  4.     print("输入错误")
  5. else:
  6.     print(eval(exp_a))
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-13 10:31:29 | 显示全部楼层
本帖最后由 塔利班 于 2018-8-19 18:59 编辑
  1. def fun198(x=input('请输入一个算式:')):
  2.         print(eval(x))
复制代码
  1. exec('p=(3 + 1.5) * 8 ** 0.5 - 6 / 4')
  2. print(p)
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-13 10:44:14 From FishC Mobile | 显示全部楼层
本帖最后由 拉了盏灯 于 2018-8-13 15:55 编辑
  1. def fun198(t):return print(eval(t))
  2. fun198(input('请输入一条算式>>>'))
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-13 10:44:30 | 显示全部楼层
tmp=input('请输入你想计算的式子:')
s=eval(tmp)
print(s)

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-13 10:59:32 | 显示全部楼层
  1. def fun198_1(string):
  2.     print(eval(string))

  3. form = input('请输入一个算式:')
  4. fun198_1(form)
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-13 11:03:04 | 显示全部楼层
temp = input('请给出一个算式:')
print(eval(temp))

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2018-8-13 11:10:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-13 11:26:05 | 显示全部楼层
temp=input('请输入想要计算的公式:')
print(eval(temp))

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-13 12:02:06 | 显示全部楼层
def calc():
    a=input("输入想要计算的数学式:")
    print("计算结果:%s" % eval(a))

if __name__ == '__main__':
    calc()

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-13 14:25:37 | 显示全部楼层
  1. print(eval(input('算式:')))
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-13 17:22:18 | 显示全部楼层
本帖最后由 天圆突破 于 2018-8-14 10:22 编辑
  1. import re

  2. def check(string):
  3.     """
  4.     检查输入算式的合法性
  5.     """
  6.     # step0:去空格
  7.     string = re.sub("\s", "", string)
  8.     #step1:检查非法字符
  9.     res1 = re.search("[^\d()*+\-./]+", string)
  10.     if res1 != None:return None,1, res1.group()
  11.     #step2:检查括号
  12.     checkString = re.sub("[^()]", "", string[:])
  13.     while "()" in checkString:
  14.         checkString = re.sub("\(\)", "", checkString)
  15.     if checkString != "":return None,2, checkString
  16.     #step3:检查算数运算符
  17.     res3 = re.search("[-+/]{2,}|[*]{3,}", string)
  18.     if res3 != None:return None,3, res3.group()
  19.     #step4:检查左括号和算数运算符
  20.     res4 = re.search("\([+*/]", string)
  21.     if res4 != None:return None,4,res4.group()
  22.     #step5:检查小数点
  23.     res5 = re.search("([^\d]\.)|(\.{2,})|(\.[^\d])|(\.\d+\.)", string)
  24.     if res5 != None:return None, 5, res5.group()
  25.     return string

  26. def string_to_num(string):
  27.     """
  28.     把用f表示的负数转换成真正的负数进行运算
  29.     :param string:用f表示的负数字符串
  30.     :return:负数非字符串表示
  31.     """
  32.     string = re.sub("f", "-", string)
  33.     return int(string) if "." not in string else float(string)

  34. def num_to_string(string):
  35.     """
  36.     把负数的-变成f以便于脱括号
  37.     :param string:负数的非字符串表示
  38.     :return:用f表示的负数(字符串)
  39.     """
  40.     string = re.sub("-", "f", str(string))
  41.     return string

  42. def myPower(string):
  43.     """
  44.     若一个字符串中间包含乘方,则计算乘方并替换
  45.     """
  46.     while True:
  47.         parm = re.compile("(?P<first>f{0,1}[\d.]+)[*]{2}(?P<last>f{0,1}[\d.]+)")
  48.         equation = re.search(parm, string)
  49.         if equation == None:return string
  50.         first, last = string_to_num(equation.group("first")), string_to_num(equation.group("last"))
  51.         try:
  52.             res = num_to_string(pow(first, last))
  53.         except Exception as e:
  54.             print("不支持复数运算:", e)
  55.             exit()
  56.         string = string.replace(equation.group(), res)

  57. def multiplication_and_division(string):
  58.     """
  59.     计算乘法和除法
  60.     """
  61.     while True:
  62.         parm = re.compile("(?P<first>f{0,1}[\d.]+)(?P<flag>[*/])(?P<last>f{0,1}[\d.]+)")
  63.         equation = re.search(parm, string)
  64.         if equation == None:return string
  65.         first, flag, last = string_to_num(equation.group("first")), equation.group("flag"), string_to_num(equation.group("last"))
  66.         res = first * last if flag=="*" else first/last
  67.         res = num_to_string(res)
  68.         string = string.replace(equation.group(), res)

  69. def add_and_subtraction(string):
  70.     """
  71.     计算加法和减法
  72.     """
  73.     while True:
  74.         parm = re.compile("(?P<first>f{0,1}[\d.]+)(?P<flag>[+\-])(?P<last>f{0,1}[\d.]+)")
  75.         equation = re.search(parm, string)
  76.         if equation == None:return string
  77.         first, flag, last = string_to_num(equation.group("first")), equation.group("flag"), string_to_num(equation.group("last"))
  78.         res = first + last if flag == "+" else first - last
  79.         res = num_to_string(res)
  80.         string = string.replace(equation.group(), res)

  81. def compute(string):
  82.     string = myPower(string)
  83.     string = multiplication_and_division(string)
  84.     string = add_and_subtraction(string)
  85.     return string

  86. def main(string):
  87.     """
  88.     step1:检查算式合法性
  89.     step2:从内向外脱括号,优先级:乘方,乘除,加减
  90.     step3:反复计算,直到没有括号,然后再算一次
  91.     step4:最后转成数字
  92.     """
  93.     string = check(string)
  94.     if isinstance(string, tuple):
  95.         print("算式不合法,错误代码%d,在"%s"处存在错误."%(string[1], string[2]))
  96.         exit()
  97.     while True:
  98.         parm = re.compile("\([^(]+\)")
  99.         equation_k = re.search(parm, string)
  100.         if equation_k == None:break
  101.         equation = equation_k.group()[1:-1]
  102.         equation2 = compute(equation)
  103.         string = string.replace(equation_k.group(), equation2)
  104.     string = compute(string)
  105.     return string_to_num(string)

  106. if __name__ == '__main__':
  107.     string = "(3 + 1.5) * 8 ** 0.5 - 6 / 4"
  108.     res = main(string)
  109.     print(res)
复制代码


体力活

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-8-13 19:18:25 | 显示全部楼层
  1. a=input('请输入一个算式:')
  2. print(eval(a))
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-14 09:53:37 | 显示全部楼层
  1. expression = input("请输入一个算式:")
  2. print(eval(expression))
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-14 10:41:19 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-14 13:09:46 | 显示全部楼层
  1. n=input()
  2. print(eval(n))
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-14 16:00:22 | 显示全部楼层

suanshi = input('请输入你想计算的算式:')
print(eval(suanshi))

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-14 19:22:54 | 显示全部楼层
可以这么干:
  1. print(eval(input('请输入您要计算的算式(乘方为“**”):')))
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-14 19:33:34 | 显示全部楼层
本帖最后由 黑白、 于 2018-8-14 19:36 编辑
  1. temp = input("请输入一个算式:")
  2. equation = eval(temp)
  3. print("计算结果为:",equation)
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-14 22:15:00 | 显示全部楼层
temp = input("请输入一个算式:")
equation = eval(temp)
print("计算结果为:",equation)

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 06:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表