鱼C论坛

 找回密码
 立即注册
查看: 3900|回复: 15

sum函数改进

[复制链接]
发表于 2021-5-14 18:36:12 | 显示全部楼层 |阅读模式

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

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

x
cnt = int(input('请输入数据个数:'))
result = 0
while cnt:
    for i in range(1,cnt + 1):
        if type(i) == int:
            i = int(input('请输入第{}个数:'.format(i)))
            result += i
        elif type(i) == float:
            i = float(input('请输入第{}个数:'.format(i)))
            result += i               
        else:
            continue
        cnt -= 1
print('合计为:',result)


大佬们,请教个问题,我现在想实现输入一个整形、浮点数以及其他类型的能够到自己对应的条件下要怎么设计呢,现在他默认是整形,输入浮点数和其他的时候他就报错了,我希望能够实现整形以及浮点数进行求和,而其他的不进行求和运算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-14 18:49:47 | 显示全部楼层

因为 int 仅支持纯整数字符串,而你字符串如果输入的是小数,因为有“小数点”, 这个特殊符号,所以就会导致报错

但是 float 同时支持整数与浮点数,所以你 input 时候若有可能输入小数那么最好用 float 进行转化,但转化后的值都一定为浮点型

你可以用 find 函数查找字符串中有无 . 来进行判断浮点数还是整型,当然前提是你输入的字符串必须为数值类型规范

另外如果你的需求并不是严谨到 1.0 是浮点型 ,1 是整型的情况。即我们认为字符串小数后面若无有效数字,则都为整数

就可以用 float(number) 先转化你输入的数值

然后在判断 float(number) 是否等于 int(float(number)),若等于,说明本次你输入的是整数,反之输入的是浮点数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-14 19:05:23 | 显示全部楼层
Twilight6 发表于 2021-5-14 18:49
因为 int 仅支持纯整数字符串,而你字符串如果输入的是小数,因为有“小数点”, 这个特殊符号,所以就会 ...

是这样的,比如我要输入的数据里有整型,浮点数,还有字符串,那我如何设计一个能同时区分这三种类型的程序呢,而进行运算的只有浮点数以及整型,字符串会跳过循环,进行下轮我试了改了下,未果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-14 19:21:10 | 显示全部楼层
本帖最后由 qq1151985918 于 2021-5-16 09:23 编辑
张飞小拳拳 发表于 2021-5-14 19:05
是这样的,比如我要输入的数据里有整型,浮点数,还有字符串,那我如何设计一个能同时区分这三种类型的程 ...

  1. def getType(data: str) -> type:
  2.     data = data.lower()
  3.     if data.isdigit():
  4.         return int
  5.     if data.count("-") == 1 and data[0] == "-":
  6.         return getType(data.replace("-",""))
  7.     if data.count("+") == 1 and data[0] == "+":
  8.         return getType(data.replace("+",""))
  9.     if data.count(".") == 1:
  10.         if data.replace(".","").isdigit():
  11.             return float
  12.         elif data.count("e") == 1 :
  13.             dataSplit = data.split("e")
  14.             if (len(dataSplit) == 2 and
  15.                 getType(dataSplit[0]) in [int, float] and
  16.                 getType(dataSplit[-1]) == int):
  17.                 return float
  18.             else:
  19.                 return str
  20.         else:
  21.             return str
  22.     else:
  23.         return str

  24. print(getType("12345"))
  25. print(getType("123.45"))
  26. print(getType("123.4e5"))
  27. print(getType("123.4e-5"))
  28. print(getType("12abc345"))
  29. print(getType("123.4.5"))
  30. print(getType("123-45"))
  31. print(getType("-45"))
  32. print(getType("-45.45"))
  33. print(getType("+45.45"))
  34. print(getType("+45"))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-14 20:29:46 | 显示全部楼层
这样子应该可以吧
  1. if __name__ == '__main__':
  2.     count = int(input('数据个数:'))
  3.     result = 0
  4.    
  5.     for i in range(1,count+1):
  6.         data = input(f'第{i}个数据:')
  7.         try:
  8.             data = float(data)
  9.         except :
  10.             continue
  11.         else:
  12.             result += data
  13.     print('结果是:',result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-14 21:11:49 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-5-14 21:20 编辑

就简单求和,还需要判断数据类型?—— eval() 不香么
  1. In [1]: a = input("input a number: ")
  2. input a number: 3.14

  3. In [2]: a
  4. Out[2]: '3.14'

  5. In [3]: eval(a) + 10
  6. Out[3]: 13.14
复制代码


ps: eval() 还可以直接求一个计算式子的字符串,如 eval('(3.14*5**2) / 2')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-14 21:22:15 | 显示全部楼层
本帖最后由 qq1151985918 于 2021-5-14 21:23 编辑
阿奇_o 发表于 2021-5-14 21:11
就简单求和,还需要判断数据类型?—— eval() 不香么


那要是字符串怎么办,比如列表 [1, 2, 3.14, "98", "FischC"]  他要求 前四个的和
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-14 22:42:53 | 显示全部楼层
qq1151985918 发表于 2021-5-14 21:22
那要是字符串怎么办,比如列表 [1, 2, 3.14, "98", "FischC"]  他要求 前四个的和


你这列表的举例是不是有点小问题:input()本身返回的不就是字符串吗?你这列表里同时有int,float,str,

其次,他也没说要求“前四个的和”,一开始说:“我希望能够实现整形以及浮点数进行求和,而其他的不进行求和运算”,
那 整型和浮点数的求和,不是用eval()就可以搞定吗,其他的用不管,那可以直接捕捉异常处理,不也行? 非得判断是什么类型?
  1. In [19]: try:
  2.     ...:     result = 0
  3.     ...:     for i in range(3):
  4.     ...:         a = input(f"第{i+1}数: ")
  5.     ...:         result += eval(a)
  6.     ...:     print(result)
  7.     ...: except:
  8.     ...:     print("请输入数字,如整数,如-1,0,1,2  或浮点数如 0.5, 3.14。")
  9.     ...:     print("程序已退出")
  10.     ...:
复制代码


你们要判断类型就判断,肯定行呀。我只是提出一种不同的处理方式而已。

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

使用道具 举报

发表于 2021-5-15 02:01:07 | 显示全部楼层
本帖最后由 qq1151985918 于 2021-5-15 02:02 编辑
阿奇_o 发表于 2021-5-14 22:42
你这列表的举例是不是有点小问题:input()本身返回的不就是字符串吗?你这列表里同时有int,float,str, ...


既然你非要用eval()
那么请问 通过input()
我输入的 是 "2021-5-15",请问这是整型还是字符串?
我输入的 是 "2021/5/15",请问这是浮点型还是字符串?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-15 02:30:35 | 显示全部楼层
过来学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-15 09:03:53 | 显示全部楼层
qq1151985918 发表于 2021-5-15 02:01
既然你非要用eval()
那么请问 通过input()
我输入的 是 "2021-5-15",请问这是整型还是字符串?

首先,不是我“非要用eval()”,我说了,只是提供一种处理方式

其次,“通过input()”,从用户的输入获取回来的,返回的肯定是 字符串,永远都是字符串。
——除非你能改input的源码,或自己发明另一种python的input()。。

  1. while True:
  2.     print( type(input("input something what the hell you want: ")))
复制代码


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

使用道具 举报

发表于 2021-5-15 09:11:29 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-15 10:25:52 | 显示全部楼层
阿奇_o 发表于 2021-5-15 09:03
首先,不是我“非要用eval()”,我说了,只是提供一种处理方式。

其次,“通过input()”,从用户的输 ...

哪里需要改源码,自己写个函数十几行就解决了,加个科学计数法也不过多个十几行代码。算了,我跟你计较这个干什么,反正我告诉你了 eval 解决不来这个问题,你愿意怎么用就怎么用愿意怎么理解就怎么理解,当你有一天处理数据库碰到类似问题吃过亏了就知道了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-15 11:50:08 | 显示全部楼层
qq1151985918 发表于 2021-5-15 10:25
哪里需要改源码,自己写个函数十几行就解决了,加个科学计数法也不过多个十几行代码。算了,我跟你计较这 ...


“自己写个函数”,那还是python的input吗?你不是说“通过input()”吗。。  

既然你说到数据库,那不巧了,数据库我也玩过,传统的DBMS,是“写模式”,往数据库表里写数据,首先类型不匹配、不兼容,就写不进去,
所以后端大概率要先进行类型检查,甚至格式检查,然后才能写到数据库里(专业点叫:持久化)。对表的各列字段的操作,加减乘除也会受其类型限制。
而分布式数据库如Hive,是“读模式”,即使类型不兼容,“也可以写进数据文件里”,……

等等,一个python入门的简单求和计算,扯到数据库,这哪跟哪了,哈哈哈,

或许是我哪里冒犯到你了,以至于你始终没看见,我说了:“只是提供一种不同的处理方式而已”

如有冒犯,还望见谅哈~



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

使用道具 举报

发表于 2021-5-15 17:34:06 | 显示全部楼层
阿奇_o 发表于 2021-5-15 11:50
“自己写个函数”,那还是python的input吗?你不是说“通过input()”吗。。  

既然你说到 ...


兄弟,你真是个杠精,这个回复之后,无论你再回什么我都不会回复你,真的无趣。明明自己站不住脚反而偏偏歪理邪说。

楼主需要 通过 input 输入数据,将整型浮点型求和,字符串跳过,你说用 eval
我告知你 eval 不行 ,你说要异常捕获。
我告知你某些特定字符串异常捕获不到,你说只要 input 就都是字符串,还要改 python 源码
我说自己可以写函数,你说写的函数就不是 python 的 input
想来你自己从来不用别人写的模块,也从来不自己 写函数吧。
既然自己也玩过数据库反而还在抬杠
我本来真的不想跟你抬杠,杠精是永远有道理的。但是我真的不想问问题的楼主以及其他可能翻阅类似问题的其他人被你带入误区
eval 解决不了这类问题,多说无益。无论楼主所说的字符串中包含 python 基本六大数据类型的
列表、元组、字典、集合甚至特定字符串,都不能通过 eval 解决。
你要杠就继续吧,我绝不会跟你继续争论。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-16 00:57:14 | 显示全部楼层
qq1151985918 发表于 2021-5-15 17:34
兄弟,你真是个杠精,这个回复之后,无论你再回什么我都不会回复你,真的无趣。明明自己站不住脚反而偏 ...


哦,原来我成了“杠精”呀,哈哈,抱歉抱歉

不过我很好奇:都用了 try..except.. 还有哪些“某些特定字符串 异常捕获不到”?

真·杠精附体,小声bb:
我是和你扛吗,我只是太认真,我仔细查看楼主的帖子,楼主哪里说包含“六大数据类型”了,他不就是只要对整型和浮点数的输入进行求和吗?  
输入用了input(),input()的返回,难道不是字符串?还有别的?难道eval()不能处理input()返回的整型或浮点型的字符串?  用了try..except 难道不能处理其他不需要情况的异常?……

你担心我会误导其他人,而我只是说在这里用eval()也可以,而且我都说三四遍了:只是提供一种处理方式 而已,而已。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 15:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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