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

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

ただいまの
回答率

88.04%

PYTHONの書き方で2点質問があります。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 609
退会済みユーザー

退会済みユーザー

お世話になります。
初心者で構文について調べたのですが意外と回答がなく質問させて頂きました。

質問#1 is演算子は同じ参照を指しているときにTrueを返す為同じfooを入れてもFalseになるのでしょうか?

下のxとyの中身を比較してtrueとする式はどのように書くべきでしょうか?

x = ['foo']
y = x
print x is y #=> True

x = ['foo']
y = ['foo']
x is y #=> Falseになる

というのも短い文字列のときは高速化のためにオブジェクトをキャッシュすることがあるらしく、キャッシュしたオブジェクトを参照するとis演算子でTrueになるということです。いつもではないらしいのですが、稀にTrueになるらしいのでどの構文で比較すればいいか困っています。

x = 'foo'
y = 'foo'
print x is y #=> True !?

質問#2コンストラクタの意味と用語の意味が以下であっているか教えてください。

例題を以下示しましたがコンストラクタをかませる意味あいがわかりません。
具体的にはなぜself.nameを一度defで定義しないといけないのでしょうか?
def init(self, name):
self.name = name
がなくいきなりdef say ではいけないのでしょうか?

用語 この構文の場合どれをさしているのでしょうか。
コンストラクタ:この場合init(self, name):をコンストラクタという
オブジェクトのメソッド:def say(self): sayメソッドとかいう
オブジェクト:dog?Animal("いぬ")?

# クラスの定義
class Animal:
    # コンストラクタの定義
    def __init__(self, name):
        self.name = name

    # オブジェクトのメソッドを定義
    def say(self):
        print("こんにちは! 私は" + self.name + "です。")

# 2つのオブジェクトを作成する。selfは指定しない。nameに該当する値を指定する
dog = Animal("いぬ")
cat = Animal("ねこ")

# それぞれのオブジェクトのsayメソッドを実行
# 別々の結果が出力される
dog.say()
cat.say()


宜しくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • takasima20

    2019/07/20 10:18

    #1 は Python じゃなくね?

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/07/20 10:32

    その通りです。。

    キャンセル

回答 4

checkベストアンサー

+1

質問1

下のxとyの中身を比較してtrueとする式はどのように書くべきでしょうか?

x == y

is演算子は同じ参照を指しているときにTrueを返す

同じオブジェクトを指すという意味なら、はい。

キャッシュしたオブジェクトを参照するとis演算子でTrueになるということです。

ミュータブルなオブジェクトはキャッシュされません。
同じオブジェクトを勝手に指してしまうと困りますので。

>>> x = ['foo']
>>> y = x
>>>
>>> x is y
True
>>> x.append('bar')
>>>
>>> print(x)
['foo', 'bar']
>>> print(y)
['foo', 'bar']
>>> x = ['foo']
>>> y = ['foo']
>>>
>>> x is y
False
>>> x.append('bar')
>>>
>>> print(x)
['foo', 'bar']
>>> print(y)
['foo']

いつもではないらしいのですが、稀にTrueになるらしいのでどの構文で比較すればいいか困っています。

Noneと比較するとき以外に is を使うことはあまりありません。
後は__eq__メソッドの実装など、同一性を判定したい場合に使います。

質問2

例題を以下示しましたがコンストラクタをかませる意味あいがわかりません。
具体的にはなぜself.nameを一度defで定義しないといけないのでしょうか?

設計に依ります。
今回のケースの場合、複数回sayを呼び出すときに毎度引数を与えるのは不自然に思います。

コンストラクタ:この場合init(self, name):をコンストラクタという

厳密にはNoですが、通じはします。
selfを受け取ることから分かるように、__init__が呼ばれたときは既に実体が作られています。

オブジェクトのメソッド:def say(self): sayメソッドとかいう

呼びますね。もう少し踏み込んでインスタンスメソッドと呼ぶこともあります。

オブジェクト:dog?Animal("いぬ")?

全部オブジェクトです。

2つのオブジェクトを作成する。

『インスタンス』の方が意味的にはより近いです。
ただしインスタンスもオブジェクトなので、元の書き方でも問題ありません。

その他

print x is y

Python2系をご利用でしょうか。
Python2.7のサポートは2020年始に打ち切られるので、Python3系への移行を強く推奨します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/20 12:53

    みなさんめちゃめちゃ丁寧でベストアンサーにしたいのですが1名選ばないといけませんので丁寧な方にさせて頂きました。テラテイルのPythonの方優しくてかっこよくて最高です。

    キャンセル

+1

1
Cないし類似の言語ですね。インデントや括弧の位置については、何通りかの流儀があります。
統一されていればなんでもいいです。

2
==を使えば良いのでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/20 10:42

    クリアになりました。ありがとうございます。もう一点追記します。

    キャンセル

+1

質問2については、わかりません〜 ほかの方に、おゆずりするとして、
質問1について、
こちらは、JavaScriptの書き方っぽいですねぇ。
ちなみにJavaScriptなら、2番目の方が一般的だったりします。読みやすいですよね。
pythonなら、if condition:のように書いたりするかもです。こんな感じでしょうか。

a=10

if a <=10:
    print('10以下だよ')
else:
    print('10より大きいよ')

10以下だよ

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/20 10:49

    大変失礼しました。そして丁寧に教えて頂きありがとうございました。ううっなんて丁寧な人なんだ。ありがとうございます。

    キャンセル

0

コンストラクタがないと、
インスタンス作成のとき、

dog = Animal("いぬ")
cat = Animal("ねこ")


クラス内のアトリビュート(変数)や、
メソッド(関数)が

def say(self):
        print("こんにちは! 私は" + self.name + "です。")


参照されないんじゃないですかね
(参照という言葉を使ってみました。もし間違っていたら、ご指摘ください)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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