天使と悪魔選手権

プログラミング初心者で、pythonの勉強をしています。
リストの使い方を勉強しているのですが、food_listというリストがあったときに
print(food_list.count(apple))とすれば、中のappleの数をかえしてくれますが、
print(numlist.reverse())とするとnoneが返ってきます。
これはどうしてでしょうか。

A 回答 (3件)

> print(food_list.count(apple))とすれば、中のappleの数をかえしてくれますが、


> print(numlist.reverse())とするとnoneが返ってきます。

うーん、基本的に「仕様」を見るべきなんですが、これはぶっちゃけ説明がややこしい。

まず、例えば

>>> food_list = ["apple", "orange", "apple"]

とでもして、print使わずに

>>> food_list.count('apple')

とでもしてみましょう。

>>> food_list.count('apple')
2
>>>

となりますね。
これはcountと言うメソッドが「返り値」を持ってる事を意味します。この場合は返り値が2ですね。

注: 「返り値を持つ」と言うのは、メソッドcountの設計に於いて、return文が使われてる事を意味する、と今の所は覚えておけば良い。

一方、

>>> numlist = [1, 2, 3, 7, 5]

の時、

>>> numlist.reverse()

してみましょう。

>>> numlist.reverse()
>>>

何も表示されていませんね。つまり、reverse()と言うメソッドは「返り値を持たない」のです。

注: 一般的なプログラミング言語では「返り値を持たない」と表現するが、Pythonの場合は「Noneを返す」と言う言い方をしたりする。だが、あくまで一般的なプログラミング言語の文脈で「返り値を持たない」とここでは表現することにする。
またこれが意味する事は、reverseと言うメソッドの設計に於いてreturn文は使われていない。

しかも、numlistはreverseメソッドを使われた時点で

>>> numlist
[5, 7, 3, 2, 1]
>>>

と「中身が書き換えられて」います。
これを「破壊的変更」と言い、字面で見れば分かる通り、numlistは元々のnumlistではありません。データが「破壊的に」書き換えられて、元(の形のままの)データは既に無くなってしまいました。

つまり、メソッドには(と言うか関数もそうですけど)

1. return文を用いた「返り値」があるもの
2. return文を用いない「返り値」がないもの -> 「副作用目的」の関数と呼ぶ

と言う二種類が存在するのです。

注1: 従って「データの破壊的変更」も「副作用」の一つである。他には「出力」や「入力」も「副作用」である
注2: 一般的なプログラミング用語では「副作用目的の何か」は「関数」と呼ばずに「手続き」あるいは「プロシージャ」と称する。C言語以降では全てを「関数」と称する事が多くなっただけ。

Pythonの学びづらさで最大のトコってのはここでしょうねぇ。
つまり、メソッドと言っても実態は二種類ある、と言う事です。
「返り値」が目的なのか、あるいは「副作用」が目的なのか、当然メソッド名では判断が付きません。
従って、今回のような場合、やはりリファレンスをその度に読んで

「どっちが目的で組み立てられたのか」

一々調べないとならない、と言う事です。

ですから今回のこの発見は幸いですよ。これからはリファレンスでどっちが目的なのか、調べなければいけない、と言う習慣を手にしたのですから。
    • good
    • 0

プログラミングを本気で勉強したいなら


どうしても仕様書を自分で読む必要があります
そんなの覚える必要もない程度なら解答しますがそれでよろしいですか?

ヒント
("apple")
()
の違いに有ります

https://docs.python.jp/3.6/index.html
    • good
    • 0
この回答へのお礼

プログラミング自体初めてだから、というと言い訳かもしれませんが、まだ自分にはこの仕様書を読むだけの語彙力がありません。
とりあえずこの疑問にお答えいただけると助かります。

お礼日時:2018/10/31 16:58

reverse()の使い方は


numlist = [1, 2, 3, 7, 5]
numlist.reverse()
print(numlist)
です
    • good
    • 0
この回答へのお礼

そうなんですが、なんでcountはprint関数の中でも使えているのに、reverseはつかえないのか、またどうしてnoneが帰ってくるのかという質問です。

お礼日時:2018/10/31 16:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!