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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

5808閲覧

Pythonの文法について教えてください

rinku316

総合スコア11

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/10/23 10:49

文法が分かりません

以下のソースコードでリアルタイムで波形を表示するプログラムを動作させています。
プログラム自体は問題ないのですが li, = plt.plot(times, sinxs) の部分の意味を教えてほしいです。
「,」を除くと以下のようなエラーが起きてしまいます。
「,」の有無によって変数の型?のようなものが変化しているということなのでしょうか。
変数, = ...のような構文があるのでしょうか。初歩的な質問なのですがご教授お願いします。

カンマ(,)を除いた時のエラー文

Python

1AttributeError: 'list'object has no attribute 'set_xdata' 2

該当のソースコード

Python

1# -*- coding: utf-8 -*- 2from matplotlib import pyplot as plt 3import math 4 5times = [0 for i in range(200)] 6sinxs = [0 for i in range(200)] 7time = 0 8sinx = 0 9 10 11plt.figure() 12li, = plt.plot(times, sinxs) 13 14plt.ylim(-1,1) 15plt.xlabel("Time") 16plt.ylabel("sin") 17plt.title("Real time plot") 18 19#while 1: 20while time <= 100: 21 time += 0.1 22 sinx = math.sin(time) 23 24 times.append(time) 25 times.pop(0) 26 sinxs.append(sinx) 27 sinxs.pop(0) 28 29 li.set_xdata(times) 30 li.set_ydata(sinxs) 31 plt.xlim(min(times), max(times)) 32 plt.draw() 33 34 plt.pause(0.01 35

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

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

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

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

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

guest

回答2

0

ベストアンサー

sequence unpackingという構文です。

意味するところは以下の通り。

python

1>>> a,b,c = [1,2,3] 2>>> a 31 4>>> b 52 6>>> c 73

質問文のコードは長さ1のlistをunpackしているのであり、基本的な意味は以下と同義です。

python

1li = plt.plot(times, sinxs)[0]

(ただし、plt.plot(times, sinxs)が複数の要素を持つlistを返した場合、異なる挙動になります)

python

1>>> la = [0] 2>>> lb = [0, 1] 3>>> x, = la 4>>> x 50 6>>> y, = lb 7Traceback (most recent call last): 8 File "<stdin>", line 1, in <module> 9ValueError: too many values to unpack (expected 1) 10>>> x = la[0] 11>>> x 120 13>>> y = lb[0] 14>>> y 150

plt.plot()の返り値はLine2Dオブジェクトのlistであり、複数の線を一度にプロットしなければ返り値のlistの長さは1なので、質問文のような記法で取り扱えます。


余談ですが、左辺のa,b,cは実はtupleを表しています。pythonのtupleはカンマだけで生成することができます。
(ただし他の構文として解釈されえる場所(たとえば関数の引数リストなど)ではその限りではありません)
(また、バイトコードレベルでは必要ないtupleオブジェクトを生成しないような最適化が行われます(処理系依存))

python

1>>> 1,2,3 2(1, 2, 3) 3>>> (d,e,f) = [4,5,6] 4>>> d 54 6>>> e 75 8>>> f 96 10>>> g,h,i = f,e,d 11>>> g 126 13>>> h 145 15>>> i 164

参考:
Pythonでタプルやリストをアンパック(複数の変数に展開して代入) | note.nkmk.me
matplotlib.pyplot.plot — Matplotlib 3.0.0 documentation

投稿2018/10/23 11:02

編集2018/10/23 11:05
hayataka2049

総合スコア30933

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

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

rinku316

2018/10/23 11:31

回答ありがとうございます。 詳しく説明して頂きありがとうございます。 今後、測定データを用いたリアルタイム表示を検討していたので list,の注意点を教えて頂きありがとうございます。
guest

0

ちょっとした実験をしてみると面白いです。

Python

1>>> a = [0] 2>>> a 3[0] 4>>> 5>>> a, = [0] 6>>> a 70 8>>> 9>>> a, b = [0, 1] 10>>> a 110 12>>> b 131

投稿2018/10/23 10:57

LouiS0616

総合スコア35660

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

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

rinku316

2018/10/23 11:31

回答ありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問