TypeError: STR ではなく、実数でなければなりません

Olorunfemi Akinlua 2023年6月21日
TypeError: STR ではなく、実数でなければなりません

TypeError: must be real number, not str エラーには、間違った型と非実数、この場合は str 型の使用が含まれます。

データ型の操作は難しい場合がありますが、このような TypeError を回避するために、正しいデータ型を関数に解析していることを強制または確認することが重要です。

この記事では、そもそも TypeError: must be real number, not str エラーが発生する仕組みと、型変換を使って解決する方法について解説します。

float() または int() を使用して解決する TypeError: must be real number, not str in Python

関数、特に組み込み関数を操作する場合、多くの場合、必要な引数は特定の型です。 プリミティブ データ型intfloatstring、または Boolean のいずれかです。

したがって、処理および解析する値が正しいデータであることを確認することが重要です。

典型的な例は、組み込みの input() 関数を使用して数値を取得し、その数値を単純な数式で処理することです。

number = input("Enter a Number: ")
print(number / 34 + 45 * number)

出力:

Enter a Number: 12
Traceback (most recent call last):
  File "C:\Users\akinl\Documents\Python\steps.py", line 2, in <module>
    print(number/34 + 45 * number)
TypeError: unsupported operand type(s) for /: 'str' and 'int'

ここでは、数値バインディングが文字列データ 12 を保持していたため、TypeError メッセージが表示されます。 整数または浮動小数点数の代わりに、12。

ただし、この TypeError: unsupported operand type(s) for /: 'str' and 'int' は、この TypeError: must be real number, not str エラーとは異なります。 違いは、起こっている操作にあります。

Python の math ライブラリを使用して、ユーザーが入力した数値を切り捨てましょう。

import math

number = input("Enter a Number: ")
print(math.floor(number))

出力:

Enter a Number: 12.45
Traceback (most recent call last):
  File "C:\Users\akinl\Documents\Python\steps.py", line 3, in <module>
    print(math.floor(number))
TypeError: must be real number, not str

ここで、floor() メソッドへの文字列を含む number バインディングを解析しているため、TypeError は異なります。このメソッドには数値、float または integer が必要です。

したがって、この問題を解決するには、必要に応じて、ユーザーが渡す値のデータ型を number バインディングに float または integer に変換する必要があります。

組み込みの float() 関数は、浮動小数点数を扱う場合に最も適しています。 切り上げるには 10 進数が必要なので、float() 関数が必要です。

import math

number = float(input("Enter a Number: "))
print(math.floor(number))

出力:

Enter a Number: 123.45
123

int() 関数は、必要な数が整数である場合に役立ちます。 sin() メソッドに対して整数のみを解析する必要がある場合は、int() メソッドを使用できます。

import math

number = int(input("Enter a Number: "))
print(math.sin(number))

出力:

Enter a Number: 12
-0.5365729180004349

単純なケースの場合は簡単に解決できますが、複雑なシナリオや難しいシナリオの場合は扱いが難しくなります。 たとえば、ランダム化された三角関数の計算を行っている場合、変換する必要がある場所を確認するのが難しい場合があります。

特に操作式の前に、すぐに変換することをお勧めします。 この場合は、数学演算です。

import random
import math


def create():
    global sideA
    sideA = format(random.uniform(1, 100), ".0f")
    global sideB
    sideB = format(random.uniform(1, 100), ".0f")
    global angleA
    angleA = format(random.uniform(1, 180), ",.3f")
    global angleB
    angleB = ANGLE_B()

    return angleB


def ANGLE_B():
    angle = format(math.asin(sideB * (math.sin(angleA) / sideA)), ".3f")
    return angle


print(create())

出力:

Traceback (most recent call last):
  File "c:\Users\akinl\Documents\Python\float.py", line 18, in <module>
    print(create())
  File "c:\Users\akinl\Documents\Python\float.py", line 11, in create
    angle_b = ANGLE_B()
  File "c:\Users\akinl\Documents\Python\float.py", line 15, in ANGLE_B
    ang = format(math.asin(side_b*(math.sin(angle_a)/side_a)), '.3f')
TypeError: must be real number, not str

エラーをトレースすると、print(create()) から始まることがわかります。これは ANGLE_B() 関数を呼び出し、バインディング sideAsideB、および angleA を使用します。

これらのバインディングは、float および int データ値を必要とする math メソッドに解析されます。 ただし、バインディングのデータ型は strings であり、float または int に変換する必要があります。

この場合、コードの問題を解決するためのより責任ある方法は、値を再度変更する必要がないため、数式で使用する前にデータ型を変換することです。

import random
import math


def create():
    global sideA
    sideA = float(format(random.uniform(1, 100), ".0f"))
    global sideB
    sideB = float(format(random.uniform(1, 100), ".0f"))
    global angleA
    angleA = float(format(random.uniform(1, 180), ",.3f"))
    global angleB
    angleB = ANGLE_B()

    return angleB


def ANGLE_B():
    angle = math.asin(sideB * (math.sin(angleA) / sideA))
    return angle


print(create())

出力:

0.7293575839721542

したがって、データ型を扱うときは慎重になり、日付を処理した後、データを必要なデータ型に変換するようにしてください。

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn

関連記事 - Python TypeError

関連記事 - Python Error