Python3には、6つの標準データ型があります。
。不変のデータ型:数値(数値)、文字列(文字列)、タプル(タプル)
。変数データ型: リスト(リスト)、辞書(辞書)、セット(コレクション)
各基本データ型には、他にもいくつかの派生型があります。上記の6つは基本的なデータ型です。基本的なデータ型に加えて、他のデータ型には、日時(時刻)、カレンダー(カレンダー)、コレクション(コンテナー)、列挙型(列挙型)などがあります。
この記事では、さまざまなタイプの数値の適用、微分タイプの10進数タイプと分数タイプ、およびデータ型の操作規則について説明します。
番号:
Python3は、int、float、bool、complext、 Decimal、Fraction その他の数値型をサポートし、数値型はパケットに対して直接+、-、*、/
操作できます()
。組み込み関数type()
とisinstance()
変数が参照するオブジェクト型は、すべてのデータ型に適用できます。2つの違いはtype()
、サブクラスがスーパークラス型とは見なされず、サブクラスがスーパークラス型 isinstance()
と見なされることです。
int(整数)
整数(たとえば4,5,6
)型はint 型です。Python3以降は、長整数を表す整数型intのみがあり、以前のlong型はありません。数字0で表されるPythonの2はFalse
、数によって表されTrue
、しかしのpython3直接True
及びFalse
0又は1の値を表すキーワードとして定義され、そして。ブール値は整数のサブタイプであり、整数の精度は無制限です。
>>> a = 1; b=2
>>> isinstance(a, int)
True
>>> type(b)
<class 'int'>
#以上两个函数同样适用于其它Number类型以及String等
整数型の追加メソッド
int型は、抽象基本クラスを実装し、他のメソッドも提供しますnumbers.Integral
bit_length()
int.bit_length()
符号ビットと先行ゼロを除く、整数をバイナリで表すために必要なビット数を返します
>>> a = -13
>>>#转换成二进制
>>> bin(a)
'-0b1101'
>>> a.bit_length()
4
aの値が0の場合、bit_length(
関数は0を返します。aの値が0でない場合、abs(a)を正しい丸め対数を持つのに十分小さくbit_length()
する2**(k-1) <= abs(x)< 2 **k
唯一の正の整数kですk = 1 + int(log(abs(x),2))
。
に相当:
>>> def bit_length(self):
s = bin(self) #将整数转换为二进制
s = s.lstrip('-0b') #将二进制的前缀去掉
return len(s) #返回二进制位的长度
to_bytes()
INT。to_bytes(長さ、BYTEORDER、*、署名された=偽)のPython 3.1の新たに追加された機能である整数のバイト配列を返します
パラメータの意味:
長さ:整数バイト数。指定されたバイト数で表すことができない場合、OverflowErrorが発生します。
byteorder:整数を表すために使用されるバイト順序を決定します。byteorderは「big」です。これは、最上位バイトがバイト位置の先頭に配置されることを意味します。「little」のバイトオーダーは、最上位バイトがバイト配列の最後に配置されることを意味します。
符号付き:整数を表すために2の補数を使用するかどうか、符号付きがFalseで負の整数が指定されている場合、それは発生しOverflowError
ます。デフォルト値はFalseです
>>> a = 1024
>>> a.to_bytes(2, byteorder='big')
b'\x04\x00'
>>> a.to_bytes(10, byteorder='big')
b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
>>> a.to_bytes(10, byteorder='big', signed=True)
b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
>>> b = -1024
>>> b.to_bytes(10, byteorder='big', signed=True)
b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
>>> c = 1000
>>> c.to_bytes((c.bit_length()+7)//8, byteorder='little')
b'\xe8\x03'
from_bytes()
int.from_bytes(bytes、byteorder、*、signed = False)は、指定されたバイト配列で表される整数を返します。これは、Python3.2で追加された機能です。
パラメータの意味:
バイト:バイトのようなオブジェクト またはバイトを生成する反復可能なオブジェクトである必要があります
byteorder:整数のバイト順序を示します 。byteorder がの "big"
場合、最上位バイトはバイト配列の先頭に配置されます。場合 BYTEORDERが あり "little"
、最上位バイトは、バイト配列の最後に置かれ
署名:2の補数表現を使用するかどうか
>>> int.from_bytes(b'\x04\x00',byteorder='big')
1024
>>> int.from_bytes(b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00', byteorder='big')
1024
>>> int.from_bytes(b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00', byteorder='big',signed=True)
-1024
float(浮動小数点数)
小数のある数値(:4.5,6.78
など)はfloatタイプです。float()
関数は数値を浮動小数点型に変換できます。浮動小数点数は通常、Cでdoubleを使用して実装されます。浮動小数点数の精度と内部表現を表示できます。sys.float_info
>>> float(8)
8.0
浮動小数点型の追加メソッド
float型は、抽象基本クラスを実装し ます。floatには、次の追加メソッドがあります。numbers.Real
as_integer_ratio()
float.as_integer_ratio()は、比率証明書が元の浮動小数点数と等しく、分母が整数である整数のペアを返します。無限大の場合 OverflowError
、NaNが発生します。 ValueError
>>> 2.5.as_integer_ratio()
(5, 2)
is_integer()
float.is_integer()floatインスタンスを有限整数で表すことができる場合は、を返しTrue
、そうでない場合はを返します。False
>>> 2.0.is_integer()
True
>>> 3.3.is_integer()
False
注意点:
上記の2つの方法はどちらも、16進数と文字列の間の変換をサポートしています。Python浮動小数点数は内部で2進数として格納されるため、浮動小数点数と10進数 文字列の間の変換では、 多くの場合、小さな丸め誤差が発生します。16進数の文字列を使用すると、浮動小数点数を正確に表現および説明できます。これは、デバッグや数値作業に非常に役立ちます。
hex()
float.hex()
浮動小数点数を16進文字列の形式で返します。それが有限浮動小数点数の場合、この表現には先頭0x
と末尾の p
プラス指数が含まれます 。このメソッドはメソッドの例です。
>>> 4.7.hex()
'0x1.2cccccccccccdp+2'
>>> 3.3.hex()
'0x1.a666666666666p+1'
fromhex()
float.fromhex()
これは、16進文字列sで 表される浮動小数点数を返すクラスメソッドです 。返される文字列には、先頭と末尾のスペースを含めることができます。
>>> float.fromhex('0x1.a666666666666p+1')
3.3
>>> float.fromhex('0x1.2cccccccccccdp+2')
4.7
繁雑
複素数は、実数部reと虚数部imで構成されます。実数部と虚数部はどちらも浮動小数点型です。接尾辞jとJは、a + bjとして表される虚数部を表すために使用されます。関数complex(re,im)
は複素数を作成することもできます。数字。
>>> complex(4.5, 1.2)
(4.5+1.2j)
複素極座標
Pythonの複素数は、基本的に長方形の座標系として実装されるか、デカルト座標系に格納されます。これは、実数部と虚数部として定義されています。
z=z.real + z.imag*1j
極座標系は、複素数を表現する別の方法を提供します。極座標系では、複素数zは、係数rとビット角度phiで構成されるものとして定義されます。モジュラスrは、zから原点までの距離であり、ビット角度phiは、正のx軸から原点とz軸を結ぶ線分までのラジアンで計算された反時計回りの角度です。
The modulus r is the distance from z to the origin, while the phase phi is the counterclockwise angle, measured in radians, from the positive x-axis to the line segment that joins the origin to z
複素極座標の変換関数については、次を表示できます。Python操作(3)cmathモジュール
10進数(10進数の固定小数点と浮動小数点数)
Decimalは、10進数にすばやく正確に丸めることができ、10進数の浮動小数点演算をサポートします。Decimalは浮動小数点モデルに基づいています。これにより、10進数の浮動小数点数の科学的な計算が容易になり、精度が向上します。小数保持仮数ゼロ、など1.30 + 1.70 = 3.00
、 1.20 *1.40 =1.6800
。
不変量が厳密に等しい会計または財務プログラムでは、Decimalタイプが推奨されます。たとえば、1.0-1.0
結果は正確に0ですが、バイナリ値の結果は、5.5511151231257827e-017
0に無限に近いにもかかわらず、エラーが発生します。Decimalの場合が使用されている場合、そのようなエラーは発生せず、結果は0になります。10進数の浮動小数点数としての10進数は、精度を設定できます(デフォルトは28精度)。
Decimalは、10進数、シグナル、および算術コンテキストで構成されます。
10進数の構成-10進数
Decimalの10進数は、整数の10進数とまったく同じではないことに注意してください。Decimalの10進数は、符号、係数番号、および指数で構成されます。係数番号は、末尾のゼロで切り捨てられず、10進数には次のものが含まれます。 (などの特殊文字Infinity
、-Infinity
およびNaN
、さらに分化)-0
と + 0
0を表すが、均等である-0
と+0
小数2つの異なる番号です。
たとえば、整数、文字列、浮動小数点数、またはタプル(これらのタイプについては後で説明します)を使用して、10進インスタンスを作成します。ここでのNaNは、null値を意味するのではなく、「数値ではない」ことを意味します。
>>> getcontext().prec = 6
>>> Decimal(10)
Decimal('10')
>>> Decimal('3.1415')
Decimal('3.1415')
>>> Decimal(3.14)
Decimal('3.140000000000000124344978758017532527446746826171875')
>>> Decimal((0,(3,1,4),-2))
Decimal('3.14')
>>> Decimal(str(2.0**0.5))
Decimal('1.4142135623730951')
>>> Decimal(2) ** Decimal('0.5')
Decimal('1.41421')
>>> Decimal('NaN')
Decimal('NaN')
>>> Decimal('-Infinity')
Decimal('-Infinity')
Decimal(value)のvalueに値が割り当てられていない場合は、を返しDecimal('0')
ます。
値がタプルの場合、上記のコードのように、シンボル、数値タプル、および整数指数の3つのコンポーネントがありますDecimal((0,(3,1,4),-2))
。Decimal('3.14')
値がfloatの場合、2進浮動小数点値はロスレスで正確な10進数に変換されます。この変換には通常、50桁以上の精度の変換が必要です。たとえば、上記のコードは次のようにDecimal(3.14)
変換されます。Decimal('3.140000000000000124344978758017532527446746826171875')
10進数の構成-信号
信号は、計算中に発生する異常な状態です。プログラムの必要に応じて、信号が無視されたり、情報と見なされたり、異常と見なされたりすることがあります。各信号はフラグとトラップイネーブラーで構成されます。信号が検出されると、そのフラグは1に設定されます。トラップイネーブラーが1に設定されている場合、例外が発生し、ユーザーは計算を監視する前にフラグをリセットする必要があります。信号がありますがClamped
、 InvalidOperation
、 DivisionByZero
、 Inexact
、 Rounded
、 Subnormal
、 Overflow
、 Underflow
と FloatOperation
。
FloatOperation信号がキャプチャされた場合、浮動小数点数を使用して10進数を作成するか、浮動小数点数をソートおよび比較操作に使用すると、例外がスローされますが、同等の比較では例外は発生しません。
>>> context = getcontext()
>>> context.traps[FloatOperation] = True
>>> Decimal(3.14)
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
Decimal(3.14)
decimal.FloatOperation: [<class 'decimal.FloatOperation'>]
>>> Decimal('3.4') < 3.5
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
Decimal('3.4') < 3.5
decimal.FloatOperation: [<class 'decimal.FloatOperation'>]
>>> Decimal('3.5')==3.5
True
10進数の構成-算術コンテキスト
算術コンテキストとは、精度、丸め規則、指数制限、操作の結果を示すフラグ、および信号が異常であると見なされるトラップイニシエーターが存在する環境を指します。
丸めオプションは ROUND_CEILING
、 ROUND_DOWN
、 ROUND_FLOOR
、 ROUND_HALF_DOWN
、 ROUND_HALF_EVEN
、 ROUND_HALF_UP
、 ROUND_UP
と ROUND_05UP
。関数getcontext()を使用して、現在のコンテキストにアクセスし、設定を変更します。Context()関数は、算術コンテキストを作成できます。代替コンテキストが有効になっている場合は、setcontext()関数が必要です。
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
>>> getcontext().prec = 6
Decimalは、BasicContext と ExtendedContextの2つの既製のコンテキストを提供します。BasicContextを使用すると、多くのトラップがデバッグで大きな役割を果たすことができます。算術コンテキストのもう1つの機能は、計算中に発生した異常状態の信号サインを監視することです。例については、上記の信号セクションの例を参照してください。
10進定数
定数はC言語モジュールですが、Pythonと調和して共存できます。Decimalの定数は次のとおりです。
定数名 | 32ビット | 64ビット |
---|---|---|
decimal.MAX_PREC | 425000000 | 999999999999999999 |
decimal.MAX_EMAX | 425000000 | 999999999999999999 |
decimal.MIN_EMIN | -425000000 | -999999999999999999 |
decimal.MIN_ETINY | -849999999 | -1999999999999999997 |
さらに、特別な定数が decimal.HAVE_THREADS
あり、デフォルト値はTrue
ですが、Pythonがスレッドなしでコンパイルされている場合、Cはローカルランタイム環境でより高価なスレッドを自動的に強制終了します。この場合、値は次のようになります。False
10進法
Decimalには、標準の数値属性に加えて、多くの特殊なメソッドがあり、多くのメソッドがあります。
メソッド名 | 意味 | コード例 |
---|---|---|
adjuested() | 係数の右端の桁を削除した後、先頭の桁のみが残るまで調整された指数に戻ります | |
as_integer_ratio() | (n、d)整数のペアを返します。これは、Decimalインスタンスが正の分母を持つ分数の最も単純な形式として使用されることを意味します。 | >>> Decimal( '-3.14')。as_integer_ratio() (-157、50) |
as_tuple() | タプルで表される値を返します | DecimalTuple(符号、数字、指数) |
canonical() | パラメータの正規エンコーディングを返します | |
compare() | 2つのDecimalインスタンスの値を比較します | aまたはbはNaNです==> Decimal( 'NaN')a <b ==> Decimal( '-1')a == b ==> Decimal( '0')a> b ==> Decimal( ' 1 ') |
compare_signal() | すべてのNaN信号を除いて、この操作はcompare()メソッドと同じです。 | |
compare_total() | 抽象表現を使用して2つのオペランドを比較します | |
compare_total_mag | 抽象表現を使用して比較しますが、オペランドの符号は無視します | |
活用() | 10進数の仕様に従ってのみ、自分自身を返します | |
copy_abs() | パラメータの絶対値を返します。操作はコンテキストの影響を受けず、丸めは実行されません。 | |
copy_negate() | パラメータの負の値を返します。符号の設定は、第2オペランドの符号と同じです。 | >>> Decimal( '2.3')。copy_sign(Decimal( '-1.5'))Decimal( '-2.3') |
exp(context = None) | 指定された数値の指数関数を返します。結果はROUND_HALF_EVENモードを使用して丸められます。 | >>> Decimal(1).exp()Decimal( '2.718281828459045235360287471')>>> Decimal(321).exp()Decimal( '2.561702493119680037517373933E + 139') |
from_float() | 浮動小数点数を10進数に変換します。これは、Python3.2以降でfloatを使用して直接作成できます。 | |
fma(other、third、context = None) | 乗算と加算の混合、自己を返す* other + third、積は丸められません | >>> Decimal(2).fma(3、5)Decimal( '11') |
is_canonical() | パラメータが標準の場合は[ True ]を返し、そうでない場合は[ False ]になります。 |
|
is_finite() | 参数是有限数 则返回True,否则返回Fasle | |
is_infinite() | 参数为正负无穷大,则返回True,否则为False | |
is_nan() | 如果参数为Nan,则返回True,否则返回False | |
is_normal(context=None) | 如果参数是一个有限正规数,返回 True ,如果参数是0、次正规数、无穷大或是NaN,返回 False |
|
is_qnan() | 同is_nan() | |
is_signed() | 如果参数带有负数,返回True,否则返回False | |
is_snan() | 如果参数为显示NaN,则返回True,否则返回False | |
is_subnormal(context=None) | 如果参数为低于给定值,则返回 True,否则返回 False。 | |
is_zero() | 如果参数是0(正负皆可),则返回True,否则返回False |
Decimal参数很多,这里不一一列举了,更多函数可以参考Deccimal标准库
Decimal 注意点
新版本Python3.3之后,congtext精度不会影响存储的位数,完全由value中的位数决定,context精度和舍入仅在算数期间发挥作用。context参数的目的是确定value是格式错误的字符串时该怎么做,如果context陷阱InvalidOperation
则引发 异常,否则构造函数返回一个新的Decimal,其值为NaN。构造完成后Decimal对象是不可变的。Python3.6之后允许下划线进行分组。
>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal('3.1415926535')
Decimal('3.1415926535')
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
>>> getcontext().rounding = ROUND_UP
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85988')
Fraction(分数):
Fraction分数类型可以由一系列整型数值,或其它数字类型,又或者是string(字符串)构造。
Fraction构建方式
Fraction构建形式为:
Fraction(numerator=0, denominator=1)
Fraction(other_fraction)
Fraction(float)
Fraction(decimal)
Fraction(string)
第一种构建方式,需要一个符合数字类型的数值当分子,和一个符合数字类型的数值当分母,构造函数会返回一个分子/分母
值的Fraction实例。众所周知,分数分母不能为0,如果分母为0,会出现ZeroDivisionError
的错误。
第二种构建方式也必须要求是一个符合数字类型的数值当分子,返回同样值的一个fraction分数实例。
第三种和第四种构建方式接受数字类型为float类型和Decimal类型,返回一个精确的具有同样数值大小的Fraction分数实例。不过由于二进制浮点数问题,类似于Fraction(1.1)并不能准确地返回类似于Fration(11,10)这样的分数实例。具体的构建规则,由函数limit_denominator()
决定(该函数后面会涉及)。
最后一种构建方式用string字符串类型或unicode类型构建,一般形式为:
[符号] 分子'/'分母
如:Fraction('-3/7')
>>> from fractions import Fraction
>>>#第一种构建方式
>>> Fraction(-4, 5)
Fraction(-4, 5)
>>> Fraction(3, 8)
Fraction(3, 8)
>>>#第二种构建方式
>>> Fraction()
Fraction(0, 1)
>>>#第三种构建方式
>>> Fraction(2.30)
Fraction(2589569785738035, 1125899906842624)
>>> Fraction(Decimal ('1.1'))
Fraction(11, 10)
>>>#第四种构建方式
>>> Fraction('-3/7')
Fraction(-3, 7)
>>> Fraction('7e-6')
Fraction(7, 1000000)
Fraction类型继承字基本数据类型(numbers.Rational),并继承了基类中的方法和操作。Fraction类型能够进行哈希运算,并且是不可变类型。
Fraction属性和方法
属性:
numerator: 分子
denominator: 分母
方法:
方法名 | 含义 | 代码 |
---|---|---|
from_float(flt) | 类方法,用float构建Fraction实例 Python3.2之后的方法 | |
from_decimal(dec) | 类方法,用Decimal构建Fraction实例,同样是Python3.2之后才有 | |
limit_denominator (max_denominator=100000) | 查找并返回一个和构造Fraction类数值接近,且分母是不超过设置的max_denominator的最大分母;该方法用来寻找与给定浮点数相近比例数,以及纠正一个近似float类型的比例数值 | >>> from fractions import Fraction >>> Fraction(‘3.1415926’).limit_denominator(1000) Fraction(355, 113) >>> from math import pi, cos >>> Fraction(cos(pi/3)) Fraction(4503599627370497, 9007199254740992) >>> Fraction(cos(pi/3)).limit_denominator() Fraction(1, 2) >>> Fraction(1.1).limit_denominator() Fraction(11, 10) >>> |
floor() | 返回一个<= 分数自身的 int类型值,也可用数学模块中的math.floor() | >>> from math import floor >>> floor(Fraction(335,113)) 2 |
ceil() | 返回一个>=分数自身的最小int值,同样可以用数学模块中的math.ceil() | |
round() /round(ndigits) | round()返回Fraction的四舍五入最接近的int值; round(ndigits)返回Fraction(1, 10*ndigits)最接近的倍数数 | >>> round(Fraction(4.8)) 5 >>> round(Fraction(4.5)) 4 >>> round(Fraction(4.3)) 4 >>> round(Fraction(4.389089), 3) Fraction(4389, 1000) |
fractions.gcd(a,b) | 返回整数a和b最大公约数, Python3.5之后用math.gcd()代替 | >>> import fractions >>> fractions.gcd(2,3) 1 >>> fractions.gcd(36, 24) 12 |
round()函数注意点
round()默认会进行四舍五入,但我们发现在上面的代码中
>>> round(Fraction(4.5))
4
4.5四舍五入值应该为5,但是给出的结果是4。
这是因为Python3.5 之后round()函数如果遇到浮点距离两边一样远,会保留到偶数那一边,doc中的原话为:”values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice.”
因为4.5 距离4 和距离5 都是0.5的距离,但因为4是偶数,所以最后结果是偶数4。如果是5.5的话,结果就是6
>>> round(5.5)
6
不过在Pyton2 中就不会有这个问题,round()函数会保留到离上一位更近的一端,即远离0的一端。
瞬间是不是觉得有点坑,如果代码从Python2 迁移到Python3 涉及到了大量round()函数的话,就比较坑,所以建议如果是要进行数据运算,还是尽量使用math或cmath模块中的函数。
此外,除来以上问题之外,还存在着一个问题:浮点数精度问题
例如代码
>>> round (2.565, 2)
2.56
无论是Python2 还算Python3 以上代码得到的结果都是2.56,显然这不符合常理。这是因为数字的存储都是用二进制,如果换算成二进制后一串1和0后可能是无限位数的,机器已经做出了截断处理,那么2565这个数字就比实际数字要小一点点。这一点点就导致了它离2.56要更近一点点,所以保留两位小数时就近似到了2.56。
那round()函数对精度把控不准,有替代函数吗?
1.像上面提到的,使用math中函数替代 ,如math.ceiling
2.Python自带整除//
3.可以将浮点型做截断转成字符串
有关具体的各类Number运算,详见:Python运算(-)数值、哈希、布尔等运算