题目来源于《Python语言程序设计基础(第2版)》程序与练习5.3,但是参考答案和网络上的不太一样,远比网络的答案复杂,不知道怎么理解,想画个流程图也不知道从何下手,希望有朋友能详细解释一下各行代码是怎么写出来的,以及如何才能想到这样设计。
部分注释是原来就有的,部分是我自己加的,但是从 #进入其他数字类型判断 之后我就理解不了了,一层套一层的。
# python 中合法的数字有十进制整数,浮点数,十六进制整数,复数
# --------------------------3 也是合法数字
def isNum(num):
np = '+-'
numbers = '.0123456789'
numbersE = '.0123456789+-jJEe'
x16 = '0123456789abcdefABCDEF'
if num[0] in np:
try:
return isNum(num[1:])#去掉数字前的正负号,进行后续字符判断
except:
return False
elif num[0] in numbers: #去掉数字前的正负号后,排除开头有不属于数字类型的字符
if num[:2] == '0x': # 进入16进制分支判断
for i in num[2:]:
if i not in x16: #包含不属于16进制的字符,不属于数字类型
return False
return True
else: #进入其他数字类型判断
ele = 0
point = 0
last = ''
numaftere = 0
q = 0
for i in num:
q = q+1
if i not in numbersE: #包含不属于数字的字符,不属于数字类型
return False
else:
if point == 0 and i == '.':
point = 1
continue
if point == 1 and (numaftere == 1 or ele == 0) and i in '+-':
# 一个数字结束,进入了第二个数字(一般是复数)
point = 0
continue
if ele == 0 and i in 'Ee':
# 出现了第一个 E, 一个浮点数中只能出现一个 E
ele = 1
continue
if ele == 1 and i in '0123456789':
numaftere = 1
continue
if ele == 1 and numaftere == 1 and i in '+-':
# 针对复数的特例
ele = 0
numaftere = 0
continue
if last =='.' and i in '+-':
return False
elif (point == 1 or last in 'EeJj') and i == '.':
return False
elif i in 'Jj' and last in '+-':
return False
elif ele == 1 and i in 'Ee.':
return False
last = i
if last == '.' and i in '+-':
return False
elif (point == 1 or last in 'EeJj') and i == '.':
return False
elif i in 'Jj' and last in '+-.':
return False
elif ele == 1 and i in 'Ee.':
return False
else:
return True
else:
return False
# 测试集
print(isNum('Hello'))
print(isNum('+++++++++++++++++++++++++++++++++++++'))
print(isNum('+-+-+-+-+-+-3'))
print(isNum('100'))
print(isNum('10e10'))
print(isNum('10e+10'))
print(isNum('10e10.'))
print(isNum('10e10e'))
print(isNum('10e10+4E10'))
print(isNum('10e'))
print(isNum('10e+1j'))
print(isNum('10e10+1.j'))
print(isNum('1.0e+10-j'))
print(isNum('1.0e+1j-3.e'))
print(isNum('1.0e10+1j-3.e10'))
print(isNum('1.3333'))
print(isNum('.3333'))
print(isNum('.333.3'))
print(isNum('.3333e5'))
print(isNum('12345678'))
print(isNum('0abddf'))
print(isNum('0xabddf'))
这个代码的设计,类似穷举,就是排除一切不可能,找到可能,没有用到任何的内置函数,属于底层的逻辑,核心就是把数字分成几个类别,有符号的,无符号的,然后再细分,整数,小数,复数,16进制数,一点一点缩小范围,要写这样的代码,你需要了解数字表现形式的所有可能,然后逐一判断。但是python有很多已经内置的函数和方法可以更简单的判断。我估计你不理解的部分应该是复数的部分,复数的表现形式。还有就是如何一步步的缩小范围,没必要纠结,看的多了,就懂了。