• 締切済み

pythonZeroDivisionError例外

下記はAIによる説明です 「第二引数」でexceptionとなるのはわかりますが、 「第一引数に対しては、ZeroDivisionErrorは送出されません」 とあります 質問: 1)exception ZeroDivisionError が第二引数のみに適用される理由(または背景) 2)出力が Error: division by zero となる理屈 を教えてください #Aiの説明 ZeroDivisionErrorは、除算や剰余演算の第二引数が0であった場合に送出されます。第一引数に対しては、ZeroDivisionErrorは送出されません。以下は、ZeroDivisionErrorの例です。 #code try: a = 5 b = 0 c = a / b except ZeroDivisionError as e: print(f"Error: {e}") #Error: division by zero 【回答上のご注意】 回答は、解答(答え)を求めています わたしはプログラマーではないので、昭和的な「自分で考えろ」的なものは求めていません わからなければ答えない自由もあなたにはあります 不明点があれば説明いたします

みんなの回答

回答No.7

ちと注釈。 みんな(回答者側)が「AI」に引っかかってるけど、そこは全然関係ないです。 もともと、 > 第一引数に対しては、ZeroDivisionErrorは送出されません と言う文章の中の「第一引数」は、AIが生成したものじゃなくって、Pythonの公式ドキュメントのZeroDivisionErrorについての「説明」なのね。 組み込み例外: https://docs.python.org/ja/3/library/exceptions.html (Python Docより抜粋) 「exception ZeroDivisionError 除算や剰余演算の第二引数が 0 であった場合に送出されます。関連値は文字列で、その演算における被演算子と演算子の型を示します。」 単にこの表現の意味が分からなかったんで、AIに尋ねたんだけど、その回答も要領を得なかった、と。 それだけの話でしょ?多分。 第一引数/第二引数と言う「表現」はAIが作り出したモノじゃなくって、AIが質問投稿者の質問を、あくまで「請けて」出した言い回しなんじゃねぇのかな。恐らく。

ketae
質問者

お礼

お疲れ様です 繰り返しますが、わたしはプログラマーではないですし、なる気もありません リファレンスで納得できればOKというレベルです で、一番カンタンなのは https://docs.python.org/ja/3/library/exceptions.html exception ZeroDivisionError 除算や剰余演算の第二引数が 0 であった場合に送出されます。関連値は文字列で、その演算における被演算子と演算子の型を示します。 をみつけることでした 回答の中では chie65535さんの >「第二引数」つまり「割る数」が0の場合だけ、ZeroDivisionErrorの例外が発生します、と言うだけの話です。 これがすっと入りました ありがとうございます 言語に対するわたしのアプローチが伝わらないと思いますが、たとえば英語という外国語を初心者が学ぶ場合、話したり通訳者・翻訳者になるつもりはないが、文法書のどこにどのように書いてあるかを みつけたい、みたいな感じです笑

回答No.6

追記。 pythonに限らず、色々な言語で、計算に使う「+」や「ー」や「*」や「/」を「オペレーター」と呼びます。 オペレーターの左右には(右辺と左辺には)定数や変数や式を書きます。このオペレーターの左右にある定数や変数を「オペランド」と呼びます。 「1+3」とか「a + b」とかのように「オペランド オペレーター オペランド」と、空白で区切って3つ並べて書いた物を「式」と言います。 左辺に書くオペランドを「第一オペランド」、右辺に書くオペランドは「第二オペランド」と言ったりします。 で、おバカで嘘つきなAIは、「第一オペランド」を「第一引数」、「第二オペランド」を「第二引数」などと、大嘘な表現をして来たりします。AIなど信じないように。 因みに c = a / b の場合「オペレーター『=』の第一オペランドは『c』、第二オペランドは『a / b』」になり、「オペレーター『/』の第一オペランドは『a』、第二オペランドは『b』」になります。 このように「オペランド」の部分には「オペランド オペレーター オペランド」の構文の「式」を書く事が出来ます。 AIが言う「第一引数」とか「第二引数」とかの表現は「間違った、嘘の表現」なので、記憶から削除しましょう。

ketae
質問者

お礼

お疲れ様です 繰り返しますが、わたしはプログラマーではないですし、なる気もありません リファレンスで納得できればOKというレベルです で、一番カンタンなのは https://docs.python.org/ja/3/library/exceptions.html exception ZeroDivisionError 除算や剰余演算の第二引数が 0 であった場合に送出されます。関連値は文字列で、その演算における被演算子と演算子の型を示します。 をみつけることでした 回答の中では chie65535さんの >「第二引数」つまり「割る数」が0の場合だけ、ZeroDivisionErrorの例外が発生します、と言うだけの話です。 これがすっと入りました ありがとうございます 言語に対するわたしのアプローチが伝わらないと思いますが、たとえば英語という外国語を初心者が学ぶ場合、話したり通訳者・翻訳者になるつもりはないが、文法書のどこにどのように書いてあるかを みつけたい、みたいな感じです笑

回答No.5

>「第二引数」でexceptionとなるのはわかりますが、 >「第一引数に対しては、ZeroDivisionErrorは送出されません」 >とあります 第一引数とか第二引数とか、小難しい表現で説明されてますが、簡単にいうと 第一引数:割られる数 第二引数:割る数 のことです。 >1)exception ZeroDivisionError >が第二引数のみに適用される理由(または背景) 「第二引数」つまり「割る数」が0の場合だけ、ZeroDivisionErrorの例外が発生します、と言うだけの話です。 「割られる数」つまり「第一引数」がゼロでも、例外は起きず、正しく計算が実行されます、と言う事を言っているのです。 「割られる数は0でも何でも良いが、割る数が0の時だけ、例外が送出されます」と言うのを小難しく難解に表現すると「exception ZeroDivisionErrorが第二引数のみに適用される」という表現になります。 >2)出力が >Error: division by zero >となる理屈 割り算を実行しようとした時に「割る数がゼロ」なので、ZeroDivisionの例外が送出されます。 例外が送出された場所がtry:~exceptのブロック内なので、処理がexceptのブロックに移ります。 exceptの後ろに「例外の種類」が指定してあって、起きた例外が「ZeroDivisionError」だったので、そこに書いてある「print(f"Error: {e}")」が実行されます(指定されたのと異なる例外の場合は、このexceptブロックは実行されません) exceptの例外の指定の後ろに「as e」と指定しておくと、起きた例外の情報を、変数eに代入してくれます。 情報が代入された「e」の中身は「division by zero」なので、結果としてprintされるのは「Error: division by zero」になります。

ketae
質問者

お礼

お疲れ様です 繰り返しますが、わたしはプログラマーではないですし、なる気もありません リファレンスで納得できればOKというレベルです で、一番カンタンなのは https://docs.python.org/ja/3/library/exceptions.html exception ZeroDivisionError 除算や剰余演算の第二引数が 0 であった場合に送出されます。関連値は文字列で、その演算における被演算子と演算子の型を示します。 をみつけることでした 回答の中では chie65535さんの >「第二引数」つまり「割る数」が0の場合だけ、ZeroDivisionErrorの例外が発生します、と言うだけの話です。 これがすっと入りました ありがとうございます 言語に対するわたしのアプローチが伝わらないと思いますが、たとえば英語という外国語を初心者が学ぶ場合、話したり通訳者・翻訳者になるつもりはないが、文法書のどこにどのように書いてあるかを みつけたい、みたいな感じです笑

回答No.4

> では、第一、第二という位置は意味をもっておらず、 いや、「意味がない」とは言ってない。 「/」と言う表現に対しては意味不明になる、って言ったんです。 前、インタプリタの仕組み、で「構文解析」の話をしたけど。 単純に、例えば 5 / 0 って入力すると内部的にはoperator.truediv(5, 0)と言う表現に変換される。まぁ、そう字面通りに捉えていい。 第一引数は5になる。第二引数は0になる。operator.truedivが第一引数を第二引数で割る関数な以上、第二引数が0だと計算が出来ない。 だからエラーになるわけです。 > 計算できないから0の例外処理が実行されたという認識で合っていますか? そう、try節内で計算がまずは実行されてエラーが出る。そのエラーをexception節でキャッチして、「例外処理」が実行されるわけです。 > Error: division by zero > という「文字の並び」が出た理由、ロジック、がわからないという質問です そりゃException節に「そう出せ」って書いたからでしょ。 多分フォーマット文字列に引っかかってんじゃないか・・・? 例えばだね。こういうコードを書けば、だ。 try: a = 5 b = 0 c = a / b except ZeroDivisionError: print("この結果はクソだ") 「この結果はクソだ」って表示されるよ? つまり、貴方が悩んでるのは、例外処理じゃなくってPythonのフォーマット文字列の書き方を知らない、ってそっちの方なんだ。 まず、 except なんかのエラー as なんとか と書くと、「なんとか」と言うテキトーな変数名にキャプチャしたエラーの情報の(一部である)文字列が束縛される(このケースだと"division by zero"って文字列だ)。 んで、フォーマット文字列f"..."の中に置かれた{}(プレースホルダー等と呼ばれる)の中身には任意のブツを突っ込めるんだよ。 そうすると、exceptが形成するスコープ内で、「なんとか」って変数はprintに与えたフォーマット文字列に埋め込みが可能だ、ってそれだけの話なんだ。 事実次のようにやって実験してみればいい。 try: a = 5 b = 0 c = op.truediv(a, b) except ZeroDivisionError as x: print(f"この結果({x})はクソだ") 印字結果は"この結果(division by zero)はクソだ"になったでしょ? 繰り返すけど、こっちは「フォーマット文字列の使い方」の問題で、例外処理はあんま関係ないですね。

ketae
質問者

お礼

お疲れ様です 繰り返しますが、わたしはプログラマーではないですし、なる気もありません リファレンスで納得できればOKというレベルです で、一番カンタンなのは https://docs.python.org/ja/3/library/exceptions.html exception ZeroDivisionError 除算や剰余演算の第二引数が 0 であった場合に送出されます。関連値は文字列で、その演算における被演算子と演算子の型を示します。 をみつけることでした 回答の中では chie65535さんの >「第二引数」つまり「割る数」が0の場合だけ、ZeroDivisionErrorの例外が発生します、と言うだけの話です。 これがすっと入りました ありがとうございます 言語に対するわたしのアプローチが伝わらないと思いますが、たとえば英語という外国語を初心者が学ぶ場合、話したり通訳者・翻訳者になるつもりはないが、文法書のどこにどのように書いてあるかを みつけたい、みたいな感じです笑

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.3

>1)は、第一、第三、など他の位置変数でもexceptionを検知するのか、という質問です 「ゼロで割る」ことが例外発生の条件であるため、第一引数にどのような数が入っていてもそちらの要因では発生しません。 そして割り算は二項演算子であるため、第三パラメータ以降は存在しません。 >2)は、どうして(どういうロジックで) >Error: division by zero >という文字列が生成されたのかを知りたい 0で割るという演算により"division by zero"という文字列を持ったexception(例外)が発生します それは try 構文により、e に"division by zero" が入ってexcept 以下へ制御が写ります printf("Error: {e}") により、e が展開されて "Error: division by zero" の文字列が生成され、printされます。

回答No.2

ん? いや、AIが書いてる通りでしょ。 そもそも第一引数、とか第二引数、って表現が良くない。 単純に 5/0 は計算出来ない。だから例外が送出されてる、ってそれだけの話なんだけど。 仮に、 try: a = 0 b = 5 c = a / b except ZeroDivisionError as e: print(f"Error: {e}") ってコードなら例外は出ない。0は5で割れるから、だ。 単に除数が0の時には「計算が出来ない」からZeroDivisionErrorが送出される、と。 それだけの話だ。 ちなみに、Pythonにはoperatorと言うモジュールがあって、「第一引数」「第二引数」ってのは次の形式(つまり/演算子の本体)で記述した時に生じてます。 import operator as op try: a = 5 b = 0 c = op.truediv(a, b) except ZeroDivisionError as e: print(f"Error: {e}") つまり、/演算子の本体がこのoperator.truedivと言う「関数」で、a(第一引数)が被除数、b(第二引数)が除数になってて、bが0だったら「割り算が出来ませんよ」と言う当たり前の事を言ってるわけ。

ketae
質問者

お礼

ありがとうございます では、第一、第二という位置は意味をもっておらず、計算できないから0の例外処理が実行されたという認識で合っていますか? また Error: division by zero という「文字の並び」が出た理由、ロジック、がわからないという質問です

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.1

>下記はAIによる説明です >「第二引数」でexceptionとなるのはわかりますが、 >「第一引数に対しては、ZeroDivisionErrorは送出されません」 >とあります AIによるデタラメ回答ですので、理由を考えること自体が不合理です。 AIはそのように、もっともらしく嘘をつくことがよくあるので、AI回答をもらっても「本当にそうであるかどうか?」と検討しなければいけません。 これはプログラマであるかどうかに関係なく、日常すべてにおいて通じる話です。 鵜呑みにしていたら騙されるため、自分で考える癖を付けなければなりません。 >2)出力が >Error: division by zero >となる理屈 数学的に、0による除算の結果は「不定」となります。 しかしコンピュータ的に、「不定」という演算結果を、変数に入る具体的な数値にはできないので、「0除算エラー」という例外(exception)を発生する仕掛けになっています。 もっともご質問のプログラムでは、「try」構文により、わざわざ「エラーが発生した場合」を検出するようにしているから、「Error: division by zero」がprintによって表示されます。 try構文が無かった場合、python本来のエラー表示となります。 例えば、 a = 5 b = 0 c = a / b print(c) というプログラムを実行すると、 >C:\temp>python DivZero.py >Traceback (most recent call last): > File "C:\_Win7\Desktop\OKWave\DivZero.py", line 3, in <module> > c = a / b > ~~^~~ >ZeroDivisionError: division by zero このように実行時エラーが出て止まります。 「print(c)」は実行されません。

ketae
質問者

お礼

ありがとうございます わたしは書いたように「解」をもとめて投稿しています 1)は、第一、第三、など他の位置変数でもexceptionを検知するのか、という質問です 2)は、どうして(どういうロジックで) Error: division by zero という文字列が生成されたのかを知りたい という質問です

関連するQ&A