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

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

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

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

Q&A

解決済

3回答

740閲覧

type(print('hello'))はなぜ'NoneType'を返すのか?

MagMag

総合スコア80

Python

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

0グッド

0クリップ

投稿2022/12/01 23:46

編集2022/12/02 00:30

質問

以下のコードの場合、なぜ、型はNoneTypeになるのでしょうか?
printで出力されるであろうstdout的な型がなぜtypeとして来ないのか、という意図です。

print()関数にreturnがないことが'NoneType'が出る直接的な理由かと思うのですが、一方で、出力(インタープリターの表示)に'hello'って表示されるのに、なぜ、この出力される'hello'に相当されるものがtype判定されないのか、という意図と言った方が正確かもしれません。

シェルコマンドで標準出力と標準エラー出力があるように、インタープリターの出力(表示?)に出すものと、プログラム内に出力(要はreturn)するものがある、というイメージでしょうか?

Python

1print(type(print('hello'))) # <class 'NoneType'>

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

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

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

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

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

guest

回答3

0

ベストアンサー

別回答へのコメントで「print関数の中身を見て」も「画面出力的なコードはありませんでした」prynt関数の実装は以下で確認できます。
https://github.com/python/cpython/blob/master/Python/bltinmodule.c#L1960

このでの関数名は「builtin_print_impl」となっています。

いろいろ確認とかの処理が入っていますが、
出力先を引数「file」で受けていますが、これは指定されなければ、1983行目からの処理でstdoutに設定されます。

さのfile に出力しているのは、2028行目の
err = PyFile_WriteObject(PyTuple_GET_ITEM(args, i), file, Py_PRINT_RAW);
です。
これで、「画面」に指定した文字列が出力されます。

そして最後に、
Py_RETURN_NONE;
となり、何も返しません。


print関数の実装を見て特に何もしていないからということで、結果として返り値が画面出力されているのではないかという考えになって、質問のような内容になるのは筋が違うと思います。

シェルコマンドで標準出力と標準エラー出力があるように、インタープリターの出力(表示?)に出すものと、プログラム内に出力(要はreturn)するものがある、というイメージでしょうか?

そうですね。
プログラム、シェルコマンドもプログラムですが、そのの外部とのやりとりの方法として標準出力等を持っていますので、「プログラムの外」の話です、また、返り値やglobal変数や参照渡しによる値のやりとりは、プログラム内部の話ですので、関連はしますが混じることはなく、それらとのやり取りは「関数的な意味での」副作用としてしか実現できないものになります。

投稿2022/12/02 02:04

TakaiY

総合スコア12743

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

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

0

printで出力されるであろうstdout的な型がなぜtypeとして来ないのか

Pythonなど、一般的な手続き型言語では、画面出力は副作用であって、プログラム内部を流れる値とは全く無関係です。

(なお、関数型言語では、入出力をもプログラム上から考慮する状態として扱う例があります)

投稿2022/12/02 00:31

maisumakun

総合スコア145183

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

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

maisumakun

2022/12/02 00:33 編集

ここで言う「副作用」は、「関数の引数・返り値以外に及ぼす影響」という計算機科学的な意味合いであり、「何を意図して実行するか」という利用者側の視線とは無関係な術語です。
MagMag

2022/12/02 00:41

ありがとうございます。当たり前ですが、自前の関数を作ってもそれが勝手にprint()のように途中の文字列を画面出力をすることはないので、当然、設計として画面出力しているわけですよね。 ただ、print関数の中身を見ても、関数内はpassのみになっていて、画面出力的なコードはありませんでした。コードで画面出力を実装しているわけではないので「画面出力は副作用」と表現をされたのかな?と思いました。ただ、一方、じゃあどこでどうやって画面出力をプログラムに指示しているの?という点が気になりました。 簡単に説明できない分野かもしれないので、その場合検索ワードでもヒントをいただけると助かります。
MagMag

2022/12/05 13:40

ありがとうございます!
guest

0

なぜ、型はNoneTypeになるのでしょうか?

print関数はなにも返さないからです

投稿2022/12/02 00:07

y_waiwai

総合スコア87747

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

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

MagMag

2022/12/02 00:27 編集

ありがとうございます。「なにも返さない」というのはreturnがない、という意味かと思うのですが、一方で、出力に'hello'って表示されるのはなぜでしょうか? シェルコマンドで標準出力と標準エラー出力があるように、インタープリターの出力(表示?)に出すものと、プログラム内に出力(要はreturn)するものがある、というイメージでしょうか? PS 質問の仕方が悪かったですね。申し訳ありません。修正しておきます。
y_waiwai

2022/12/02 01:09

関数が値を返さないってのと、その関数がどういう動作をするってのは全く関係ないです
MagMag

2022/12/05 13:40

なるほど、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問