Как использовать args для предотвращения многократных вызовов функции в этом случае? - PullRequest
0 голосов
/ 09 марта 2019

У меня есть многострочный плоттер, который принимает параметр списков из n списков [u, u1 ...], по существу, строит n линий на одном графике.Однако, чтобы построить их, я должен вызвать их из моей другой функции, которая возвращает индивидуальный список для разных T = 50, 150, ...

x, u = heat_eq(50, both_ice, 0, 0)   # here im calling 8 lists to plot them
x, u2 = heat_eq(150, both_ice, 0, 0)
x, u3 = heat_eq(250, both_ice, 0, 0)
x, u4 = heat_eq(350, both_ice, 0, 0)
x, u5 = heat_eq(450, both_ice, 0, 0)
x, u6 = heat_eq(550, both_ice, 0, 0)
x, u7 = heat_eq(650, both_ice, 0, 0)
multiline(x, [u, u2, u3, u4, u5, u6], "length(m)", "Temperature(Degree Celsius)", [25, 50, 250, 350, 450, 550, 650], "time(s)", 21)

В этом случае мой heat_eq () будет иметьбыть вызванным много раз, если бы я планировал больше линий.Есть ли способ объединения циклов с * args, чтобы он позволял мне

for i in range(*args):
      x, [u, u2, u3, u4, ...] = heat_eq("different T(s) here", both_ice, 0, 0)
return x, [u, u2, u3, ...]

, чтобы я мог

multiline(x, [u, u2, u3, u4, ...], "length(m)", "Temperature(Degree Celsius)", [25, 50, 250, 350, 450, 550, 650], "time(s)", 21)

?манипулирование аргументами на самом деле очень запутанно.

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

def heat_eq(T, bc, ti, tf):
"""
T is a number here
bc is the boundary condition function
ti and tf are both constants
"""
t = np.linspace(0, T, Nx + 1)
x = np.linspace(0, T, Nx + 1)
# define other stuff here


# initiate a matrix here
A = some matrix
A = bc(A, some other constants)  # A gets put into BC spits out A with boundary condition values included.
for n in range(something):
    Here A does something to produce data points into a list u

return x, u

Так что, когда я назову его, скажем, граничное условие both_ice(A, constant) Я бы сделал

x, u = heat_eq(50, both_ice, 0, 0)

Надеюсь, вам хватит информациичтобы понять вопрос.

1 Ответ

0 голосов
/ 09 марта 2019

Я рекомендую вам heat_eq получить список в качестве входного параметра

def heat_eq(my_list):
    # Do whatever
    return x, another_list

Если вы предпочитаете распаковывать аргументы как *args, вам следует передать все, что both_ice, 0, 0, именованным параметрам, и тогда вы сможете распаковать каждый безымянный аргумент в виде списка:

def both_ice():
   pass

def heat_eq(*args, func=both_ice, num_1=0, num_2=0):
    # Now you have a list of arguments
    for elem in args:
        do_whatever(elem)
    return x, list_of_elems
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...