输出结果:
我自己写的代码:
/usr/bin/env python
# _*_ coding:utf-8 _*_
import re
try:
alist = ['12', '23', '-', '1.2', '35Y', '2.3', '---']
total = 0
errors = []
digits = re.compile(r'-?\d+\.?\d*e?-?\d*?') # 所有数值型数据
letters = re.compile(r'[A-Za-z]') # 所有字母
for i, v in enumerate(alist):
# 查找包含数字不包含字母的项
number = digits.search(v)
letter = letters.search(v)
if number and not letter:
continue
# 不符合数值型数据的从原列表弹出
errors.append(alist.pop(i))
print(*alist, sep='+', end='=')
# 将字符串转换成浮点型数据计算总和
alist = list(map(float, alist))
total = sum(alist)
print(total)
except TypeError:
pass # 无操作
else:
# 如果无异常,打印
print('列表中', errors, '不是数值型数据!')
运行结果跟题目给的一样
上面是我自己写的,请问有没有更好的方法把代码量减小呢?
想知道参考代码11行是怎么做的
代码已修改
alist = ['12', '23', '-', '1.2', '35Y', '2.3', '---']
errors = []
for i, v in enumerate(alist):
# 将alist列表里各项进行类型转换
try:
alist[i] = float(v)
# 遇到异常则将该项跳出加入errors列表
except ValueError:
errors.append(alist.pop(i))
# 计算总数
total = sum(list(map(float, alist)))
print(*alist, sep='+', end='=')
print(total)
print('列表中', errors, '不是数值型数据!')
你这代码里哪句话可能引起异常啊,你这try完全是个形式主义啊
try应该写在循环里面,循环里不再需要判断类型,直接都按数值进行转换,转换不成功就会抛错误,抛了错误就把错误的数据添加进list
不要把try包到循环外面,这样完全是个形式主义
此外,alist 本身是个list,你直接for x in alist就行了,不要类型转换来转换去的,越转换越复杂