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

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

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

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

Q&A

解決済

4回答

490閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2019/07/20 01:08

編集2019/07/20 01:48

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

#質問#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()

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

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

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

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

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

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

takasima20

2019/07/20 01:18

#1 は Python じゃなくね?
退会済みユーザー

退会済みユーザー

2019/07/20 01:32

その通りです。。
guest

回答4

0

ベストアンサー

質問1

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

x == y

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

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

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

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

Python

1>>> x = ['foo'] 2>>> y = x 3>>> 4>>> x is y 5True 6>>> x.append('bar') 7>>> 8>>> print(x) 9['foo', 'bar'] 10>>> print(y) 11['foo', 'bar']

Python

1>>> x = ['foo'] 2>>> y = ['foo'] 3>>> 4>>> x is y 5False 6>>> x.append('bar') 7>>> 8>>> print(x) 9['foo', 'bar'] 10>>> print(y) 11['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 03:07

LouiS0616

総合スコア35658

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

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

退会済みユーザー

退会済みユーザー

2019/07/20 03:53

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

0

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

python

1a=10 2 3if a <=10: 4 print('10以下だよ') 5else: 6 print('10より大きいよ') 7 810以下だよ

投稿2019/07/20 01:44

okahijiki

総合スコア404

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

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

退会済みユーザー

退会済みユーザー

2019/07/20 01:49

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

0

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

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

投稿2019/07/20 01:40

otn

総合スコア84423

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

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

退会済みユーザー

退会済みユーザー

2019/07/20 01:42

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

0

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

python

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

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

python

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

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

投稿2019/07/20 04:05

okahijiki

総合スコア404

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問