Для Slider: Запуск update () без передачи переменной не работает, хотя я не использую переменную из update в функции - PullRequest
0 голосов
/ 21 апреля 2020

Я запускаю следующий код для демонстрации центральной предельной теоремы в статистике.

Я использую два ползунка для изменения двух значений, относящихся к циклам, выполняющимся внутри функции обновления, которая вызывается при изменении значения любого из ползунков.

Я передаю val через функцию обновления.

def update(val):

trial = [0]*int(sTrials.val)
print(sTrials.val)
print(sMeasurements.val)
for i in range(int(sTrials.val)):
    x = 0
    for j in range(int(sMeasurements.val)):
        x = x + random.randint(1, 6)

ПРИМЕЧАНИЕ. Я могу изменить «val» на любое имя переменной, потому что я не вызываю его в функция. Я читаю sTrias.val и sMeasurements.val из основной области программы. Я изменил имя переданной переменной с «val» на «none», чтобы доказать это самому себе.

Если я запускаю update (), код не будет работать. Я должен поставить переменную в круглых скобках для его запуска. Я понимаю, почему это так, потому что, когда я запускаю on_change (update)

sTrials.on_changed(update)
sMeasurements.on_changed(update)

, это передает новое значение sTrials в функцию обновления, означая, что ему нужна переменная для получения этого значения, даже хотя он не используется.

Мой вопрос состоит из трех частей:

  1. Правильно ли мое понимание того, что происходит в отношении передачи значений? Для update (val) требуется val, чтобы получить значение, поступающее от on_change.

  2. Правильно ли, что это значение не используется в функции. Я почти уверен, что значение не используется, но я хотел это подтвердить.

  3. Я понимаю, что передача переменной в функцию без ее использования - плохая практика. Это кажется расточительным. Есть ли более эффективный способ написать эти строки относительно ползунков.

Ниже представлена ​​вся программа:

import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
import random

# Slider Widget added to Central Limit Plot

bins = [0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0]

fig, ax = plt.subplots()
plt.subplots_adjust(bottom=0.2)


axTrials = plt.axes([0.25, 0.080, 0.65, 0.05])

axMeasurements = plt.axes([0.25, 0.025, 0.65, 0.05])

sTrials = Slider(axTrials, 'Trials', 1, 500, valinit = 250, valfmt = "%i")
sTrials.label.set_size(20)
sMeasurements = Slider(axMeasurements, 'Measurements', 1, 30, valinit = 15, valfmt = "%i")
sMeasurements.label.set_size(20)


def update(val):

    trial = [0]*int(sTrials.val)
    print(sTrials.val)
    print(sMeasurements.val)
    for i in range(int(sTrials.val)):
        x = 0
        for j in range(int(sMeasurements.val)):
            x = x + random.randint(1, 6)

        trial[i] = x/int(sMeasurements.val)


    ax.cla()
    ax.hist(trial, bins = bins, edgecolor = 'black')
    ax.set_title('Central Limit Theorem with Dice', fontsize = 30)
    ax.set_xlabel('Averages of' + ' ' + str(int(sMeasurements.val)) + ' ' + 'Roles', fontsize = 20, labelpad = 10)
    ax.set_ylabel('Frequency of Means' + ' ' +'(' + str(int(sTrials.val)) + ' ' + 'Trials)', fontsize = 20)
    plt.show()


sTrials.on_changed(update)
sMeasurements.on_changed(update)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...