强基初中数学&学Python——第196课 Python内置函数详解数学篇之四:complex(复数)


  自然数相加或相乘还是自然数,但自然数减自然数就不一定是自然数了;为此引入了自然数的相反数,自然数就扩展为整数;但相除还是超出了整数的范围,于是引入分数,扩展为有理数;后来人们发现一些数(例如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)))