自然数相加或相乘还是自然数,但自然数减自然数就不一定是自然数了;为此引入了自然数的相反数,自然数就扩展为整数;但相除还是超出了整数的范围,于是引入分数,扩展为有理数;后来人们发现一些数(例如2),开方运算结果无法用分数表示,引入无理数,于是就扩充为实数了;再后来,解方程过程中,有时需要负数开平方,结果无法用一个实数来表示,虚数就因此而诞生了,把实数和虚数组合成复数(例如:3.+4.J)。例如解下面的方程:
x²-2x+5=0。
两边减4得
x²-2x+1=-4,
即
(x-1)²=-4。
解得
x=1±√-4。
x=1±2√-1。
把√-1标记为j或J,上面方程的解是两个复数1+2j、1-2j。
class complex()函数
调用方式1:无参数,complex()。
生成一个0虚数。
>>>complex()
0j
>>>bool(complex())
False
调用方式2:单实数参数,complex(realNum)。
生成一个复数,虚部为0,如果参数是分数,转为浮点数。
>>>complex(123)
(123+0j)
>>>from fractions import Fraction
>>>complex(Fraction(15,17))
(0.8823529411764706+0j)
>>>complex(1.23)
(1.23+0j)
>>>complex(1.234e2)
(123.4+0j)
>>>complex(1.234e20)
(1.234e+20+0j)
调用方式3:单虚数参数,complex(imagNum)。
如果这个参数的系数前无负号“-”,返回参数本身,否则生成一个复数,实部是-0,虚部是原来参数。
>>>complex(1.23j)
1.23j
>>>complex(+1.23j)
1.23j
>>>complex(-1.23j)
(-0-1.23j)
调用方式4:单复数参数,complex(complexNum)。
直接返回该参数,如果参数中有分数,把分数转为浮点数再返回。
>>>complex((1.23+1.23j))
(1.23+1.23j)
>>>from fractions import Fraction
>>>complex((Fraction(15,17)-Fraction(123,100)*1j))
(0.8823529411764706-1.23j)
调用方式5:双实数参数,complex(realNum1, realNum2)。
生成一个复数,实部是第一个实数,虚部是第二个实数,如有分数,把它转为浮点数。
>>>complex(1.2, 1.3)
(1.2+1.3j)
>>>complex(-1.2, -1.3)
(-1.2-1.3j)
>>>from fractions import Fraction
>>>complex(Fraction(5,4), -Fraction(123,100))
(1.25-1.23j)
调用方式6:第一实数、第二虚数参数,complex(realNum, imagNum)。
生成一个复数,由于第二个参数是虚数,在构造复数时,两个虚数单位相乘变成实数-1,所以生成的复数虚部为0,实部是系数之差。
>>>complex(1.2, 1.3j)
(-0.10000000000000009+0j)
>>>complex(-1.2, -1.3j)
(0.10000000000000009-0j)
>>>from fractions import Fraction
>>>complex(Fraction(5,4), -Fraction(123,100)*1J)
(2.48+0j)
调用方式7:第一虚数、第二实数参数,complex(imagNum, realNum)。
生成一个系数为正的虚数或实部为0虚部系数为负的复数。
>>>complex(1.2j, 1.3)
2.5j
>>>complex(-1.2j, -1.3)
(-0-2.5j)
>>>from fractions import Fraction
>>>complex(Fraction(5,4)*1J, -Fraction(123,100))
0.020000000000000018j
调用方式8:双虚数参数,complex(imagNum1, imagNum2)。
生成一个复数,实部是虚部系数的相反数,虚部是第一个参数。
>>>complex(1.2j, 1.3j)
(-1.3+1.2j)
>>>complex(-1.2j, -1.3j)
(1.3-1.2j)
>>>from fractions import Fraction
>>>complex(Fraction(5,4)*1J, -Fraction(123,100)*1J)
(1.23+1.25j)
调用方式9:双复数参数,complex(complexNum1, complexNum2)。双参数一般调用方式。
通过上面几种双参数调用方式,我们得到双参数的运算逻辑:把第一个参数作为实部,第二个参数作为虚部的系数,得到一个复数的算式,运算结果如果虚部系数不小于0,实部为0,则只返回虚部,否则返回结果复数。下面推算返回值公式并验证。
complexNum1=(a+bj),
complexNum2=(a'+b'j),
result=complexNum1 + complexNum2 * 1j
result=(a+bj) + (a'+b'j) * 1j
result=a + bj + a'j -b' #复数拆包后使用乘法分配率
result=((a-b')+(b+a')j) #返回值复数
若complexNum1=(2+3j),complexNum2=(1+2j),
则result=((2-2)+(3+1)j)=(0+4j)。
即返回4j。
验证:
>>>(2+3j)+(1+2j)*1j
4j
>>>complex((2+3j), (1+2j))
4j
>>>(1.23+3.14j)+(-4.5-6j)*1j
(7.23-1.3599999999999999j)
>>>complex((1.23+3.14j), (-4.5-6j))
(7.23-1.3599999999999999j)
调用方式10:单字符串参数,complex(complexStr)。
如果实部不为0,返回一个复数;否则只返回虚数部分。
>>>complex("0123")
(123+0j)
>>>complex("0_1.23e10")
(12300000000+0j)
>>>complex("012_3j")
123j
>>>complex("-01.2_3j")
-1.23j
>>>complex("0123+2j")
(123+2j)
>>>complex("0+2j")
2j
>>>complex((2 + 3j))
(2+3j)
>>>complex("(2+3j)")
(2+3j)
>>>complex("2+3j")
(2+3j)
>>>complex("2 +3j")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: complex() arg is a malformed string
>>>complex("2 -3j")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: complex() arg is a malformed string
>>>complex(" \t2+3j\n")
(2+3j)
字符串参数可以是整数、浮点数字面值,也可以是复数字符串(有小括号或无小括号都可以),两侧可以有空格、制表符等空字符,但实部与虚部之间的“+”或“-”号与实部或虚部之间不可以有空格。另外,虚部系数为0的复数等价于一个实数,实部为0的复数等价于一个虚数,因此别太在意函数不返回规整复数的情况。
调用方式11:单对象参数,complex(obj)。
首先检查__complex__()方法,如果 __complex__() 未定义,则检查 __float__()方法,如果 __float__() 未定义,最后检查 __index__()方法,如果都未定义就抛出TypeError异常。
程序代码(文本代码附录1):
运行结果:
练习题:
1、手动计算complex((3.2+1.5j), (4.7-1.8j))的返回值,然后运行验证。
2、写出下面程序的运行结果,然后复制(文本代码附录2)运行验证。
附录1:
#复数对象
class Default:
pass
class ComplexFun:
def __complex__(self):
return 1+2j
class FloatFun:
def __float__(self):
return 2.
class IndexFun:
def __index__(self):
return 3
class IFFun:
def __index__(self):
return 2
def __float__(self):
return 1.
class CIFFun:
def __index__(self):
return 2
def __float__(self):
return 1.
def __complex__(self):
return 1+2j
print(complex(ComplexFun()))
print(complex(FloatFun()))
print(complex(IndexFun()))
print(complex(IFFun()))
print(complex(CIFFun()))
print(complex(Default()))
附录2:
#复数对象练习题
class CTest:
def __init__(self,num):
self.num=num
def __index__(self):
return 20
def __float__(self):
return 10.
print(complex(CTest(30)))