2013-04-16 16 views
21

Nie rozumiem, co to przecinek po zmiennych linii oznacza: http://matplotlib.org/examples/animation/simple_anim.htmlKod w języku Python. Czy to jest operator przecinka?

line, = ax.plot(x, np.sin(x)) 

Jeśli usunąć przecinek i zmienną „linię”, staje się zmienna „linia”, to program jest uszkodzony. Pełny kod z URL podany powyżej:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 

fig = plt.figure() 
ax = fig.add_subplot(111) 

x = np.arange(0, 2*np.pi, 0.01)  # x-array 
line, = ax.plot(x, np.sin(x)) 

def animate(i): 
    line.set_ydata(np.sin(x+i/10.0)) # update the data 
    return line, 

#Init only required for blitting to give a clean slate. 
def init(): 
    line.set_ydata(np.ma.array(x, mask=True)) 
    return line, 

ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), init_func=init, 
    interval=25, blit=True) 
plt.show() 

Według http://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences przecinek po zmiennej wydaje się być związane z krotek zawierających tylko jeden element.

+1

Twoja ostatnia linia uderza sedno. Zakłada on, że już wiesz, że kiedy wykonujesz zadanie między iteracjami, elementy są uporządkowane. Więc 'x, y, z = 1,2,3' jest Pythonicznym sposobem zapisu' x = 1; y = 2; z = 3'. – kojiro

+1

Nie mogę dodać więcej do odpowiedzi poniżej, ale pomyślałem, że dodam czysty wynik: operator przecinka daje Pythonowi możliwość przełączania wartości zmiennych w jednej wyrazistej, czystej linii (widziałem to w The Quick Python Book) : 'x2, x1 = x1, x2'. – Ahmed

Odpowiedz

33

ax.plot() zwraca krotki z jeden elementu. Dodając przecinek do listy docelowej zadania, prosi Pythona o rozpakowanie wartości zwracanej i przypisanie jej do każdej zmiennej o nazwie po lewej stronie.

Najczęściej widać to stosowane dla funkcji o wartości ponad jednego powrotnego:

base, ext = os.path.splitext(filename) 

boczna lewa może jednak zawierać dowolną liczbę elementów, i pod warunkiem, że jest krotką lub lista zmiennych rozpakowanie nastąpi.

W Pythonie, to przecinek sprawia, że ​​coś krotki:

>>> 1 
1 
>>> 1, 
(1,) 

Nawias są opcjonalne w większości lokalizacji. Można przerobić oryginalny kod z nawiasach bez zmiany znaczenia:

(line,) = ax.plot(x, np.sin(x)) 

Albo można użyć listy składni TOO:

[line] = ax.plot(x, np.sin(x)) 

Albo, można przekształcić go na linie, które wykonują nie zastosowanie krotka rozpakowywanie:

line = ax.plot(x, np.sin(x))[0] 

lub

lines = ax.plot(x, np.sin(x)) 

def animate(i): 
    lines[0].set_ydata(np.sin(x+i/10.0)) # update the data 
    return lines 

#Init only required for blitting to give a clean slate. 
def init(): 
    lines[0].set_ydata(np.ma.array(x, mask=True)) 
    return lines 

Aby uzyskać szczegółowe informacje na temat działania zadań związanych z rozpakowywaniem, zobacz dokumentację Assignment Statements.

+3

Tak. Jeśli to pomaga, możesz myśleć o tym, że jest to odpowiednik 'line = ax.plot (x, np.sin (x)) [0]' – Aya

+1

@Aya: z wyjątkiem składni 'line, = ...' wyjątek, gdy prawa strona ma 0 lub więcej niż jeden element w iteracji, podczas korzystania z indeksowania rzuci wyjątek tylko wtedy, gdy jest 0 elementów. –

11

Jeśli masz

x, = y 

rozpakowaniu listy lub krotki długości jednego. np.

x, = [1] 

spowoduje x == 1, natomiast

x = [1] 

daje x == [1]

Powiązane problemy