Передача переменной из одной функции во вторую функцию Python - PullRequest
0 голосов
/ 05 июля 2018

У меня есть две функции, и мне нужна переменная, которую я вычисляю в первой, для вычисления во второй функции. Мой минимальный рабочий пример -

import numpy.ma as ma
import numpy as np

data_1 = [0,2,4,6,8,10,12,14,16,18] 
error_1 = [0,1,2,3,4,5,6,7,8,9]

def mask(data,error): 
      product = np.multiply(data,error)

def plot(perc):
    result = ma.masked_array(product, product >= (np.percentile(product, perc)))

mask(data_1,error_1)
plot(30)
plot(60)
plot(90)

Это дает мне ошибку

NameError: name 'product' is not defined

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

import numpy.ma as ma
import numpy as np

data_1 = [0,2,4,6,8,10,12,14,16,18] 
error_1 = [0,1,2,3,4,5,6,7,8,9]

def mask(data,error,perc): 
    product = np.multiply(data,error)
    result = ma.masked_array(product, product >= (np.percentile(product, perc)))

маска (данные_1, error_1,30) Маска (данные_1, error_1,60) Маска (данные_1, error_1,90)

но при этом я вычислю продукт три раза, и сценарий будет работать вечно. Теперь понятнее, в чем моя проблема?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018
  1. Вы передали значение 3 в первой функции, но не использовали его (я имею в виду x = 3)
  2. Вы произвели расчет в первой функции, но не вернули результат. Значение x передается по значению, поэтому оно не изменяет функцию, а только локально.
  3. Вы должны передать значение x во второй функции

    def mask(y):
        return y ** 2
    
    def plot(z, x):
        z = x + 1
        print(z)
    
    x = mask(3)
    plot(3, x)
    

Результат этого кода равен 10.

Альтернатива: вы можете передать значение по ссылке или использовать глобальные переменные.

0 голосов
/ 05 июля 2018

Измените вашу функцию так, чтобы она на самом деле возвращала значения вместо присвоения локальным переменным (которые уничтожаются при выходе из функции в любом случае):

def mask(y):
    return y ** 2

def plot(x, z):
    # do something with x here

x = mask(3) 
plot(x, whatever)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...