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

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

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

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

Q&A

解決済

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

MagMag
MagMag

総合スコア79

Python

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

3回答

0グッド

0クリップ

282閲覧

投稿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'>

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答3

1

ベストアンサー

別回答へのコメントで「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

総合スコア10557

MagMag😄を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

1

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

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

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

投稿2022/12/02 00:31

maisumakun

総合スコア141545

MagMag😄を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

maisumakun

2022/12/02 00:33 編集

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

2022/12/02 00:41

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

2022/12/05 13:40

ありがとうございます!

1

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

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

投稿2022/12/02 00:07

y_waiwai

総合スコア86072

spoofy_dragon😄を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

MagMag

2022/12/02 00:27 編集

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

2022/12/02 01:09

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

2022/12/05 13:40

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python

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