質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2013閲覧

try-catch文を使った構造がわからない

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2017/11/18 08:30

try-catch文を使った構造がわからないです。

from string import ascii_uppercase ALLOW_CHARS = ' ' + ascii_uppercase def encrypt(value): nums = [] for c in value: n = ALLOW_CHARS.index(c.upper()) nums.append(n) return nums def send_data(nums): with open('send.txt', 'wt', encoding='utf-8') as f: f.write(nums) def input_loop(): while True: value = input('Input sentence[A-Z,Space]:') try: nums = encrypt(value) except: print(value, 'is not letter or space') else: send_data(nums) def main(): input_loop() if __name__ == '__main__': main()

というサンプルコードがありました。
try-catch文の説明で、

try: <1,例外が発生する可能性のある処理> except: <2,例外処理> else: <3,例外が起こらなかった場合に実行したい処理>

という説明が出てきました。
まずこの例外が発生する可能性のある処理と例外が起こらなかった場合に実行したい処理 の違いがわかりません。

try: <1,例外が発生する可能性のある処理>

else: <3,例外が起こらなかった場合に実行したい処理>

が両方呼ばれるときは存在するのでしょうか?
また通常のメソッドなら

def test(): return 2

のようにreturn があるはずなのですが、このサンプルコードのtry-catch文ではreturnがなく、それでなにをinput_loopメソッドでは返しているのだろうと思います。
どのようにこのコードを解釈すれば良いのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

try-catch文は、次のような処理の流れで進みます。

Python

1try: 2 function1() 3except: 4 function2() 5else: 6 fucntion3()

の場合、

  1. まず、function1()を実行する。

2.1 もし、function1()の実行中に例外が起きたら、function2()を実行する。
2.2 もし、fucntion1()の実行中に例外が起きなかったら、function3()を実行する。

となります。イメージ的には、if-elseと似ています。


まずこの例外が発生する可能性のある処理と例外が起こらなかった場合に実行したい処理 の違いがわかりません。

例外が発生する可能性のある処理は、例えばファイルの読み書きなどです。例えば、ファイルを読み込もうとしたけど、そのファイルが存在しなかった場合などは例外が発生します。

例外が発生した場合の処理は、この例ではプログラムを終了することです。

一方、もしファイル読み込み時に例外が発生しなければ、ファイルから読み込んだデータを使って何らかの処理(例えば、読み込んだテキストデータを別の言語に翻訳、等)を行います。

「例外が発生する可能性のある処理」と「例外が起こらなかった場合に実行したい処理」の違いがわかりましたでしょうか。
この例では、「例外が発生する可能性のある処理」はファイルの読み込みに、「例外が起こらなかった場合に実行したい処理」は読み込んだテキストデータを別の言語に翻訳に対応します。


tryとelseが両方呼ばれるときは存在するのでしょうか?

例外は発生しなかった場合は、tryとelseが両方呼ばれます。


通常のメソッドなら return があるはずなのですが、このサンプルコードのtry-catch文ではreturnがなく、それでなにをinput_loopメソッドでは返しているのだろうと思います。

確かに多くのメソッドがreturn文で計算した値を返しますが、ただ単に文字を表示するだけのメソッドやファイルにデータを書き出すためのメソッドは必ずしもreturn文は必要とされません。例えば、helloと表示するだけの次のような関数には、returnは必要ありません。

Python

1def hello(): 2 print('hello') 3``` 4 5このようにreturnを必要としないケースがあるので、Pythonではreturnを省略することが許されています。ちなみに、returnを省略した場合、Pythonは`return None`を最後に実行しているとみなします。 6 7今回の`input_loop()`メソッドは、ユーザーが入力した文字をファイルに保存するというメソッドです。したがって、値を返す必要がないのでreturnが省略されています。

投稿2017/11/18 09:40

Takahito_Ogawa

総合スコア229

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

この例外が発生する可能性のある処理と例外が起こらなかった場合に実行したい処理 の違い

あまりPythonは詳しくないですが、こういうことです。

あなたは、会社を退社し、家でのんびりするとします。 try: <1,例外が発生する可能性のある処理>   あなたは、下記の行動をしている最中に上司から呼び出しをくらう恐れがあるとします。    飯を食べる()   テレビを見る()   風呂に入る() except: <2,例外処理> 上司から呼び出しがあったため、会社へ向かう 会社へ行く() else: <3,例外が起こらなかった場合に実行したい処理> 何もなければ寝ます 寝る()

例外は、発生した時点で、実行中の処理を中断し、例外処理へ移ります。
上記のサンプルの場合、下記の通りです。

飯を食べている時点で呼び出しを食らえば、飯を中途半端に食べている状態で会社に行きます。
テレビを見ている時点で呼び出しを食らえば、飯は食べ終わった状態で会社にいきます。

Pythonでは例外を発生させるために、以下のような命令があるので、挙動を確認したらどうでしょうか。

raise NameError('message')

通常のメソッドなら return があるはず

何をもってして、returnで値を返すのが通常と言っているのでしょうか?
なぜ、値を受け取りたいのですか?
何の値を受け取りたいのですか?
受け取った値をどうしたいのですか?

あなたは、レジでお金を払い、対価として商品を受け取るとする。

商品を受け取りたいから、商品を渡すのであって、
もし、あなたが、商品はいりませんというのであれば、商品を渡す必要もないです。

受け取りたいものがあるから、返す。
受け取らなくてもいいなら、返さなくてもよい。
それだけのことです。

投稿2017/11/18 09:00

編集2017/11/18 09:25
ikasoumen

総合スコア110

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

実例を見ないとわからないと思ったので。こういうことです。

Python

1try: 2 hoge = int(input()) 3except: 4 print('error') 5else: 6 print('ok')

例えば『3』など、整数値に変換できる入力をすると、『ok』と表示されます。
一方、『fuga』など、整数値に変換できない入力をすると、『error』と表示されます。


また通常のメソッドなら...[中略]...のようにreturn があるはず

既にTakahito_Ogawaさんが回答されているとおり、別に戻り値は無くてもいいんです。
なお、戻り値があるファンクションと、それがないプロシージャを呼び分ける言語もあります。
しかし、Pythonの場合それらは区別されません。

投稿2017/11/18 15:55

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問