Подтвердить что ты не робот

Код Python. Это оператор запятой?

Я не понимаю, что означает запятая после строк ,: http://matplotlib.org/examples/animation/simple_anim.html

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

Если я удаляю запятую и переменную "строка", становится переменной "строка", тогда программа прерывается. Полный код из приведенного выше URL:

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()

В соответствии с http://docs.python.org/3/tutorial/datastructures.html#tuples-and-sequences запятая после переменной, похоже, связана с кортежами, содержащими только один элемент.

4b9b3361

Ответ 1

ax.plot() возвращает кортеж с одним элементом. Добавив запятую в целевой список назначения, вы попросите Python распаковать возвращаемое значение и назначьте его каждой переменной, названной слева по очереди.

Чаще всего вы видите, что это применяется для функций с более чем одним возвращаемым значением:

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

Левая часть, однако, может содержать любое количество элементов и при условии, что это кортеж или список переменных, распаковка будет иметь место.

В Python это запятая, которая делает что-то кортеж:

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

Скобки в большинстве мест являются необязательными. Вы можете переписать исходный код с круглыми скобками, не изменяя значения:

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

Или вы также можете использовать синтаксис списка:

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

Или вы можете переделать его в строки, которые не используют распаковку:

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

или

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

Подробную информацию о том, как работают задания для распаковки, см. в документации Отчеты о присваивании.

Ответ 2

Если у вас

x, = y

вы распаковываете список или кортеж длины один. например.

x, = [1]

приведет к x == 1, а

x = [1]

дает x == [1]