习题6-13
将复数字符串转变成复数,由例子'-1.23e+4-5.67j',要考虑用科学计数法表示数字的情况。
代码如下:
#-*-coding: utf-8-*-
import string
num = string.digits
valid = num + '.' + '+' + '-' + 'e' + 'E' # 复数字符串中可能出现的字符,包括以科学计数法表示的数字
def getInput():
while True:
str = raw_input("Please enter a complex number: ")
new_str = ''.join(str.split()) # 需要去掉空格,不然后面截得的实部和虚部会含有空格,而float(' +3.4')会报错。
is_valid = True
if new_str[-1] not in ['J', 'j']: # 复数字符串的最后一位必定是j或J
is_valid = False
else:
for i in range(-2, -len(new_str), -1):
if new_str[i] == '+' or new_str[i] == '-':
if new_str[i - 1] != 'e' and new_str[i - 1] != 'E': # +或-的前面有两种可能性,一是例如'3+4j',二是例如'3e+4 - 5j',需要排除'e+'这种情况。
str_real = new_str[-len(new_str):i]
str_imag = new_str[i:-1]
break
try:
real = float(str_real)
except ValueError, e:
is_valid = False
else:
try:
imag = float(str_imag)
except ValueError, e:
is_valid = False
if is_valid:
return new_str
else:
print "Your enter is invalid."
def atoc(new_str):
real = ''
imag = ''
for i in range(-2, -len(new_str), -1):
if new_str[i] == '+' or new_str[i] == '-':
if new_str[i - 1] != 'e' and new_str[i - 1] != 'E':
str_real = new_str[-len(new_str):i]
str_imag = new_str[i:-1]
real = float(str_real)
imag = float(str_imag)
break
return complex(real, imag)
if __name__ == "__main__":
str = getInput()
print atoc(str)