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

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

ただいまの
回答率

88.59%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,545

rinku316

score 11

 文法が分かりません

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

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

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

 該当のソースコード

# -*- coding: utf-8 -*-
from matplotlib import pyplot as plt
import math

times = [0 for i in range(200)]
sinxs = [0 for i in range(200)]
time = 0
sinx = 0


plt.figure()
li, = plt.plot(times, sinxs)

plt.ylim(-1,1)
plt.xlabel("Time")
plt.ylabel("sin")
plt.title("Real time plot")

#while 1:
while time <= 100:
    time += 0.1
    sinx = math.sin(time)

    times.append(time)
    times.pop(0)
    sinxs.append(sinx)
    sinxs.pop(0)

    li.set_xdata(times)
    li.set_ydata(sinxs)
    plt.xlim(min(times), max(times))
    plt.draw()

    plt.pause(0.01
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

sequence unpackingという構文です。

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

>>> a,b,c = [1,2,3]
>>> a
1
>>> b
2
>>> c
3

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

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


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

>>> la = [0]
>>> lb = [0, 1]
>>> x, = la
>>> x
0
>>> y, = lb
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 1)
>>> x = la[0]
>>> x
0
>>> y = lb[0]
>>> y
0

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


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

>>> 1,2,3
(1, 2, 3)
>>> (d,e,f) = [4,5,6]
>>> d
4
>>> e
5
>>> f
6
>>> g,h,i = f,e,d
>>> g
6
>>> h
5
>>> i
4

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/23 20:31

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

    キャンセル

+1

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

>>> a = [0]
>>> a
[0]
>>>
>>> a, = [0]
>>> a
0
>>>
>>> a, b = [0, 1]
>>> a
0
>>> b
1

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/23 20:31

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

    キャンセル

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

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

関連した質問

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