美文网首页
complex()﹝Python 内置函数﹞

complex()﹝Python 内置函数﹞

作者: import_hello | 来源:发表于2019-01-03 22:05 被阅读0次

转载须注明出处:简书@Orca_J35 | GitHub@orca-j35,所有笔记均托管于 python_notes 仓库

相关笔记:

  • 『数值类型(int,float,complex).md』
  • 『2. Lexical analysis.md.md』-> 2.4.7. 虚数字面值
  • 『numbers - Numeric abstract base classes.md』

该函数是 complex 类型的构造函数,用于创建复数。

有关 complex 类型的详细描述,可阅读 Numeric Types — int, float, complex

Changed in version 3.6: Grouping digits with underscores as in code literals is allowed.

🔨 complex( )

🔨 class complex( )

如果实参为空,由于 imag 的默认值为 0,所以将返回 0j

complex() #> 0j

🔨 complex(real)

🔨 class complex(real)

在仅使用 real 参数时,可分为以下几种情况:

  • real 是一个表示数值的字符串(不能是 bytesbytearray,且绝对不能使用第二参数),此时会将 real 解释为一个复数:

    complex('6+1j') #> (6+1j)
    complex('6') #> (6+0j)
    complex('1j') #> 1j
    

    real 是一个表示复数的字符串时,在 + (或 -)的周围不能包含空白符:

    complex('1+2j') #> (1+2j)
    complex('1 + 2j') #> ValueError: complex() arg is a malformed string
    

    可在字符串中的数值前使用前导符号( +- ) ,数值和 + (或 -)之间不允许有空格(space),但在数值和 + (或 -)的外围允许存在空白符(whitespace):

    complex(' \t-1+1j\t \n') #> (-1+1j)
    
  • real 是数值类型对象(可以是任意数值类型,包括 complex),此时默认 imag0,会将数值 real 转换为 complex 类型的对象:

    complex(6+1j),complex(6.1),complex(3j)
    #> ((6+1j), (6.1+0j), 3j)
    
    from fractions import Fraction
    complex(Fraction(1,2)) #> (0.5+0j)
    
    from decimal import *
    complex(Decimal('1.4')) #> (1.4+0j)
    # Decimal不能与complex相加,否则会抛出异常
    complex(Decimal('1.4')+3j) 
    #> TypeError: unsupported operand type(s) for +: 'decimal.Decimal' and 'complex'
    
  • real 还可以是实现了 __complex__() 方法的对象,此时默认 imag0

    class Sample:
        def __complex__(self):
            return 6+6j
    complex(Sample()) #> (6+6j)
    

    如果 real 对象没有实现 __complex__(),则会尝试调用 __float__(),并默认 imag0

    class Sample:
        def __float__(self):
            return 3.3
    complex(Sample()) #> (3.3+0j)
    

    如果在 real 对象中并没有实现 __complex__()__float__(),则会抛出 TypeError 异常。

🔨 complex(real, imag)

🔨 class complex(real, imag)

如果提供了第二参数 imag (绝对不能将字符串用作第二参数),real 可分为以下几种情况:

  • real 是数值类型对象(可以是任意数值类型,包括 complex),此时 complex(real, imag) 等效于 real+imag*1j

    complex(6+1j,1j) #> (5+1j)
    
  • real 是实现了 __complex__() 方法的对象,此时 complex(real, imag) 等效于 real.__complex__()+imag*1j

    class Sample:
        def __complex__(self):
            return 6+6j
    complex(Sample(),3),complex(Sample(),3j)
    #> ((6+9j), (3+6j))
    

    如果 real 对象没有实现 __complex__(),则会尝试调用 __float__(),此时 complex(real, imag) 等效于 real.__float__()+imag*1j

    class Sample:
        def __float__(self):
            return 3.5
    complex(Sample(),3),complex(Sample(),3j)
    #> ((3.5+3j), (0.5+0j))
    

    如果在 real 对象中并没有实现 __complex__()__float__(),则会抛出 TypeError 异常。

如果提供了第二参数 imag (绝对不能将字符串用作第二参数),imag 可分为以下几种情况:

  • imag 是数值类型对象(可以是任意数值类型,包括 complex),此时 complex(real, imag) 等效于 real+imag*1j

    complex(6+1j,1+1j) #> (5+2j) 
    
  • imag 是实现了 __float__() 方法的对象,此时 complex(real, imag) 等效于 real.+imag.__float__()*1j

    class Sample:
        def __float__(self):
            return 3.5
    complex(6+6j,Sample()) #> (6+9.5j)
    

    如果在 imag 对象中并没有实现 __float__(),则会抛出 TypeError 异常。

支持的操作

complex 类型支持以下操作:

以上所有操作,除 -!= 外均为抽象属性。

  • real - 抽象方法,用于检索数字的实部
  • imag - 抽象方法,用于检索数字的虚部
  • abstractmethod conjugate() - 抽象方法,用于返回共轭(conjugate)复数,例如 (1+3j).conjugate() ==(1-3j).
bool(0j) #> False
(1+2j).real #> 1.0
(1+2j).imag #> 2.0
(1+3j).conjugate() #> (1-3j)
abs(3+4j) #> 5.0
(2+1j) ** 2 #> (3+4j)

更多细节,请参考笔记『numbers - Numeric abstract base classes.md』

__complex__

🔨 object.__complex__(self)

该方法用于实现 complex(real)

如果未实现 __complex__complex(real) 则会尝试调用 __float__,详见 「🔨 complex(real)」和「🔨 complex(real, imag)」小节。

相关文章

网友评论

      本文标题:complex()﹝Python 内置函数﹞

      本文链接:https://www.haomeiwen.com/subject/mtqcrqtx.html