Вызов функции изнутри функции

#python #function #plot #nested #nested-function

#python #функция #график #вложенный #вложенная функция

Вопрос:

 from numpy import *
from matplotlib.pyplot import *



c = 299792458 # m/s 
lamda = 643.5 *10**-9 # m

def read_file(filename):
    text_array = loadtxt(filename)
    time = text_array[:, 0]
    obs_lambda = text_array[:, 1]
    flux = text_array[:, 2]
    return [flux,time,obs_lambda]


def rad_vel(data):
    v_r = zeros(len(data[2]))
    for i in range(len(data[2])):
        v_r = c*(((data[2][i] - lamda))/(lamda))
    print v_r
    plot(data[1],v_r)
    show()
    return v_r

    test1 = read_file("test.txt")
    print test1
  

Когда я вызывал функцию, это была разница в размерах с v_r и временем. len (время) или len(данные[2]) представляли собой массив из 5087 элементов, но v_r был скаляром. Не могу понять, как v_r является скаляром?

Комментарии:

1. Есть ли причина, по которой вы вкладываете другую функцию? В любом случае, rad_vel недоступен, поскольку он следует после return инструкции заключающей функции. Что именно вы задумали?

2. Как еще я могу вызвать read_file(имя файла) внутри rad_vel() для передачи времени и obs_lambda?

3. Я предполагаю, что вы хотите вернуться rad_vel из read_file . Это сработало бы, но я бы не советовал использовать этот шаблон в данной ситуации.

4. У вас должны быть полностью отдельные (не вложенные) функции rad_vel и read_file . Затем вы можете вызвать одну из другой.

5. Да, я хочу построить график (time, v_r)

Ответ №1:

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

 def read_file(filename): # Reads file
    def rad_vel(flux,time,obs_lambda): # Finds radial velocity

        # should you declare v_r in here? 
        v_r = 0  

        for i in range(len(obs_lambda)):
            v_r = obs_lambda[i] - 2
        plot(time,v_r)
        show()
        return v_r

    text_array = loadtxt(filename)
    ...
    flux = ... # array read from .txt
    time = ... # array read from .txt
    obs_lambda = ... # array read from .txt
    return rad_vel(flux,time,obs_lambda)
  

Комментарии:

1. Хорошо выглядит для 1 функции, но в моей программе у меня будет 3-4 функции внутри read_file (). Тогда это может усложниться

Ответ №2:

Я не могу попробовать это без файла или модулей, но вот тот, который использует класс.

 from numpy import *
from matplotlib.pyplot import *
def readFileData(filename): # Reads file
    text_array = loadtxt(filename)
    ...
    flux = ... # array read from .txt
    time = ... # array read from .txt
    obs_lambda = ... # array read from .txt
    return [flux,time,obs_lambda]

def rad_vel(data): # Finds radial velocity
    for i in range(len(data[2])):
        v_r = data[2][i] - 2
    plot(data[1],v_r)
    show()
    return v_r
textData=readFileData("test.txt")
print(rad_vel(textData))
  

Комментарии:

1. v_r вероятно, должен быть список.

2. Трудно сказать, работает ли это вообще, не зная, какие модули необходимы или на что похож текстовый файл. Все, что я сделал, это взял две функции и превратил их в классы.

3. Я не очень знаком с классами, поэтому проще всего будет использовать только функции

4. Да, v_r — это список

5. Спасибо! Классы в основном позволяют вам создавать объект, в котором вы создаете функции для взаимодействия с ним. Я посмотрю, смогу ли я преобразовать это в функции, но это сложно сделать без текстового файла для его тестирования.

Ответ №3:

Наряду с другими значениями вы также должны возвращать внутреннюю функцию, например

 return [rad_vel,flux,time,obs_lambda]

test1 = read_file("test.txt")

test1[0]('test.txt')