python核心编程学习笔记-2016-07-26-01-习题6-13

习题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)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值