Найти - Пользователи
Полная версия: Как создать переменную из словаря с именем ключа ?
Начало » Python для новичков » Как создать переменную из словаря с именем ключа ?
1 2 3
winmasta
PEHDOM
Да вы все правильно поняли, но сложность в том, что в этой функции обращения к этим переменным происходят постоянно в том числе циклы, т.е. переменный необходимо поименовать именами которые задаются при создании объекта (т.к. заранее неизвестно сколько полей ввода будет, поэтому как то стандартизировать это не получается видимо) и присвоить им значения из полей ввода и потом уже не зависимо от объекта класса работать с ними в вызванной функции. Окна планируются такие как есть сейчас, меняется только количество полей, подписи к полям, значения и тип значений в полях, имена переменных в которые потом будем эти поля присваивать. Можно даже рассмотреть вариант, что мы знаем заранее количество полей и их порядок, но в вызываемой функции нам надо задать имена переменным такие как мы хотим, в идеале конечно передать имена через объект класса.
PEHDOM
честно говоря не пойму зачем это? Если это тупо перемножить\сложить все аргументы то какая вам разница как назывются переменные?, а если это чтото типа (a+b-(c /d))*e то вам всеравно придеться писать под каждую формулу отдельную функцию. В чем проблема? Создайте функцию с аргументами (a,b,c,d,e) передавайте в окно название полей ‘a’,'b','c','d','e' оно вызовет каллбек функцию с аргументами в том же порядке, зачем вам знать как эти переменные назывались в окне или гдето еще?
или я чегото не понимаю, может вы приведете какойто мнимальный запускаемый код который демонстрирует ваш полет мысли для боьшего понимания?
winmasta
 #!/usr/bin/python3
# coding=utf8
import tkinter
from tkinter import *
from math import factorial
from matplotlib import pyplot as plt
import numpy as np
from scipy.interpolate import spline
# Функция рассчитывает p0
def calc_p0(s, m, ro):
    p0 = 0
    for i in range(0, s):
        p0 += (ro ** i) / factorial(i)
    p0 = 1 / (p0 + (ro ** (s + 1)) / (factorial(s) * s) * ((1 - ((ro / s) ** m)) / (1 - (ro / s))))
    return p0
# Функция рассчитывает вероятность занятости k печей
def calc_p_k(k, s, ro):
    p0 = calc_p0(s, (s - k), ro)
    if k <= s:
        p_k = (p0 * (ro ** k)) / factorial(k)
    else:
        p_k = (p0 * (ro ** k)) / (factorial(s) * (s ** (k - s)))
    return p_k
# Функция рассчитывает среднее число свободных печей
def calc_m2(k, s, ro):
    m2 = 0
    p0 = calc_p0(s, (s - k), ro)
    for i in range(0, s):
        m2 += ((s - i) * (ro ** i) * p0) / factorial(i)
    return m2
# Функция рассчитывает совокупные затраты порта при заданных значениях
def calc_cost(lmbd, m, ro, e, c1, c2, c3, c4, c5, t, s, k):
    p0 = calc_p0(s, m, ro)
    avg_queue = p0 * ((ro**(s+1)) / (s * factorial(s))) * ((1-((ro/s)**m) * (m + 1 - m * (ro/s))) / ((1-(ro/s))**2))
    m1 = avg_queue
    m2 = calc_m2(k, s, ro)
    p_k = calc_p_k(k, s, ro)
    cost = e * c1 * k + c2 * (s - m2) * t + c3 * m2 * t + c5 * t * lmbd * p_k + c4 * m1 * t
    return cost
def calculate(lmbd, mu, e, c1, c2, c3, c4, c5, t, s, smooth):
    lmbd = lmbd.get()
    mu = mu.get()
    e = e.get()
    c1 = c1.get()
    c2 = c2.get()
    c3 = c3.get()
    c4 = c4.get()
    c5 = c5.get()
    t = t.get()
    s = s.get()
    # Считаем приведенную интенсивность (ро)
    ro = lmbd / mu
    cost_arr = []
    x_axis = []
    for i in range(1, s):
        m = s - i
        cost = calc_cost(lmbd, m, ro, e, c1, c2, c3, c4, c5, t, s, i)
        x_axis.append(i)
        cost_arr.append(cost)
    # Вычисляем оптимальное количество печей - индекс в массиве стоимостей с наименьшим членом массива
    opt_furnace_num = cost_arr.index(min(cost_arr)) + 1
    # Строим график зависимости затрат порта от количества причалов при заданных значениях
    plt.subplots(num="График №1", figsize=(10, 10), dpi=80)
    plt.title("Зависимость затрат от соотношения назначения печей")
    xnew = np.linspace(min(x_axis), max(x_axis), (len(x_axis) * 100))
    y_smooth = spline(x_axis, cost_arr, xnew)
    y_axis = cost_arr
    if smooth.get() == 1:
        x_axis = xnew
        y_axis = y_smooth
    line_red, = plt.plot(x_axis, y_axis, "r--", lw=1, linestyle="-", label="затраты, руб")
    plt.legend(handles=[line_red])
    window = Tk()
    window.geometry("300x50")
    window.title("Результаты рассчетов")
    text = "Оптимальное количество печей:"
    w = Message(window, text=text, width=500)
    w.config(font=("times", 14))
    w.grid(row=0, column=0, sticky="w")
    text = round(opt_furnace_num)
    w = Message(window, text=text, width=500)
    w.config(font=("times", 14, "bold"))
    w.grid(row=0, column=1, sticky="w" + "e")
    plt.show()
# Создаем окно для ввода данных
root = Tk()
root.title("Лабораторная работа № 6. ТМО.")
input_intensity = DoubleVar()
input_intensity.set(10)
input_intensity_label = Label(text="Интенсивность прихода слитокв (шт/сут):")
input_intensity_label.grid(sticky="w")
input_intensity_entry = Entry(textvariable=input_intensity)
input_intensity_entry.grid(row=0, column=1)
output_intensity = DoubleVar()
output_intensity.set(2)
output_intensity_label = Label(text="Интенсивность нагрева слитков перед ковкой (шт/сут):")
output_intensity_label.grid(sticky="w")
output_intensity_entry = Entry(textvariable=output_intensity)
output_intensity_entry.grid(row=1, column=1)
capital_efficiency_ratio = DoubleVar()
capital_efficiency_ratio.set(0.15)
capital_efficiency_ratio_label = Label(text="Коэффициент эффективности капитоловложений (руб/год):")
capital_efficiency_ratio_label.grid(sticky="w")
capital_efficiency_ratio_entry = Entry(textvariable=capital_efficiency_ratio)
capital_efficiency_ratio_entry.grid(row=2, column=1)
furnace_cost = DoubleVar()
furnace_cost.set(100000)
furnace_cost_label = Label(text="Цена одной печи (руб):")
furnace_cost_label.grid(sticky="w")
furnace_cost_entry = Entry(textvariable=furnace_cost)
furnace_cost_entry.grid(row=3, column=1)
furnace_keep_cost = DoubleVar()
furnace_keep_cost.set(50)
furnace_keep_cost_label = Label(text="Цена содержания одной печи (руб):")
furnace_keep_cost_label.grid(sticky="w")
furnace_keep_cost_entry = Entry(textvariable=furnace_keep_cost)
furnace_keep_cost_entry.grid(row=4, column=1)
furnace_keep_downtime_cost = DoubleVar()
furnace_keep_downtime_cost.set(30)
furnace_keep_downtime_cost_label = Label(text="Цена содержания одной печи в простое (руб):")
furnace_keep_downtime_cost_label.grid(sticky="w")
furnace_keep_downtime_cost_entry = Entry(textvariable=furnace_keep_downtime_cost)
furnace_keep_downtime_cost_entry.grid(row=5, column=1)
queue_cost = DoubleVar()
queue_cost.set(60)
queue_cost_label = Label(text="Затраты на содержание слитка в копильнике (руб/сут):")
queue_cost_label.grid(sticky="w")
queue_cost_entry = Entry(textvariable=queue_cost)
queue_cost_entry.grid(row=6, column=1)
heat_cost = DoubleVar()
heat_cost.set(1600)
heat_cost_label = Label(text="Затраты на разогрев отосланных на склад слитков (руб/сут):")
heat_cost_label.grid(sticky="w")
heat_cost_entry = Entry(textvariable=heat_cost)
heat_cost_entry.grid(row=7, column=1)
year_worktime_fund = DoubleVar()
year_worktime_fund.set(365)
year_worktime_fund_label = Label(text="Годовой фонд рабочего врмени (сут):")
year_worktime_fund_label.grid(sticky="w")
year_worktime_fund_entry = Entry(textvariable=year_worktime_fund)
year_worktime_fund_entry.grid(row=8, column=1)
furnace_max = IntVar()
furnace_max.set(10)
furnace_max_label = Label(text="Максимальное количество печей (шт):")
furnace_max_label.grid(sticky="w")
furnace_max_entry = Entry(textvariable=furnace_max)
furnace_max_entry.grid(row=9, column=1)
image = PhotoImage(file="tusur3_100x100.png")
label = Label(image=image)
label.image = image
label.grid(row=0, column=2, columnspan=2, rowspan=10, sticky="w" + "e" + "n" + "s", padx=5, pady=5)
smooth_flag = IntVar()
smooth_flag.set(1)
check_button = Checkbutton(text="Сглаживание графиков", variable=smooth_flag, onvalue=1, offvalue=0)
check_button.grid(row=11, column=0, sticky="w")
message_button = Button(text="Рассчитать",
                        command=lambda: calculate(input_intensity, output_intensity, capital_efficiency_ratio,
                                                  furnace_cost, furnace_keep_cost, furnace_keep_downtime_cost,
                                                  queue_cost, heat_cost, year_worktime_fund, furnace_max, smooth_flag))
message_button.grid(row=11, column=2, padx=5, pady=5, sticky="e")
ico = tkinter.Image("photo", file="tusur2.png")
root.iconphoto(root, ico)
root.mainloop()

вот, хочется сделать правильно с точки зрения качества кода, чтобы потом знать как писать продакшн код, поэтому буду рад услышать любые замечания, дополнения, критику
marvellik
winmasta
Вот проблема в том, что хочется построить конструктор для любого количества полей ввода,
так и есть. сколько полей вы подадите в gui_var_lmbd столько их вам и нарисует
winmasta
marvellik
Это только полдела, вторая половина - объявить эти переменные (желательно именами заданными при создании объекта) в вызываемой функции и работать с ними.
PEHDOM
winmasta
вторая половина - объявить эти переменные (желательно именами заданными при создании объекта) в вызываемой функции и работать с ними.
я в принципе не понимаю что вы хотите, в какой функции вы хотите обьявлять переменные заданые при создании какого обьекта? и зачем вам это??
winmasta
PEHDOM
 def calculate(lmbd, mu, e, c1, c2, c3, c4, c5, t, s, smooth):
    lmbd = lmbd.get()
    mu = mu.get()
    e = e.get()
    c1 = c1.get()
    c2 = c2.get()
    c3 = c3.get()
    c4 = c4.get()
    c5 = c5.get()
    t = t.get()
    s = s.get()

Вот тут я объявляю переменный и присваиваю им значения из полей ввода, учитывая, что создание окна ввода мы переделали на создание объекта класса MyWindow и то, что по нажатию кнопки в функцию calculate передается словарь вида {имя_поля: значение_в_поле} хочется так же как я указал выше объявить переменные. При этом: 1) в словарь в качестве ключа вместо имя_поля положить имя_переменной (в моем случае c1, c2, …, s) 2) в функции calculate объявить эти переменные

Зачем все это: в функции calculate мы вызываем другую функцию передавая ей все объявленные в начале функции calculate переменные

 cost = calc_cost(lmbd, m, ro, e, c1, c2, c3, c4, c5, t, s, i)

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

По сути основной вопрос, который возник с самого начала звучит так:
можно ли передав в функцию словарь вида {a: 1, b: 2, c: 3} объявить переменные a, b и с не зная заранее имен ключей (т.е. задавая имя переменной = имя ключа словаря) ну и далее работать с ними в функции как с обычными переменными ? Например::

 d = a + b
e = d - c
print(a, b, c, d, e)
FishHook
winmasta
По сути основной вопрос, который возник с самого начала звучит так:
можно ли передав в функцию словарь вида {a: 1, b: 2, c: 3} объявить переменные a, b и с не зная заранее имен ключей (т.е. задавая имя переменной = имя ключа словаря) ну и далее работать с ними в функции как с обычными переменными ? Например::

Физический смысл переменной - это именованный кусок памяти, по сути просто адрес ячейки памяти с которой начинаются данные заданного типа. Компьютер вообще не оперирует никакими переменными, они ему нафиг не нужны, они нужны программисту, чтобы он не сошел с ума. По сути, что вы хотите, вы получаете указатель на словарь, и хотите завести на стеке N переменных по количеству ключей словаря. Этим переменным надо дать имена, по которым интерпретатор как-то должен получить значения. Как он должен по-вашему это сделать? Видимо, завести некий словарь, в котором имени переменной надо поставить в соответствие адрес памяти, который программа динамически должна выделить в куче для хранения значения этой переменной. Такая конструкция называется словарь, он уже у вас есть. Что вам еще надо?
marvellik
FishHook
По сути основной вопрос, который возник с самого начала звучит так:
можно ли передав в функцию словарь вида {a: 1, b: 2, c: 3} объявить переменные a, b и с не зная заранее имен ключей (т.е. задавая имя переменной = имя ключа словаря)
вы сами себя загоняете в тупик.

winmasta
Всем спасибо большое за помощь, теперь все ясно )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB