Как передать список из одной функции в другую без использования глобальной переменной? - PullRequest
0 голосов
/ 09 мая 2020

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

Только что у меня есть следующая структура кода:

import csv
import sys
data_set = []

def loadFile(x):
    with open(x, "r") as readfile:
        csv_reader = csv.reader(readfile, delimiter= ';')
        for row in csv_reader:
            data_set.append(row)
    print("Loaded weather data from", (x[0:-4]).capitalize())
    print()

def avgDay(x):
    for line in data_set:
        if(len(x) == 5 and (x[3:5] + "-" + x[0:2]) in line[0]):
           print("The weather on", x, "was on average", line[2], "centigrade")

Есть ли способ вызвать data_set для других функций? (У меня есть еще несколько функций, которые должны работать с данными).

Ответы [ 4 ]

4 голосов
/ 09 мая 2020

Да, просто передайте его как параметр и верните, когда он изначально сгенерирован.

import csv
import sys

def loadFile(x):
    date_set = []
    with open(x, "r") as readfile:
        csv_reader = csv.reader(readfile, delimiter= ';')
        for row in csv_reader:
            data_set.append(row)
    print("Loaded weather data from", (x[0:-4]).capitalize())
    print()
    return data_set

def avgDay(x, data_set):
    for line in data_set:
        if(len(x) == 5 and (x[3:5] + "-" + x[0:2]) in line[0]):
           print("The weather on", x, "was on average", line[2], "centigrade")

def main():
    data_set = loadFile(...)
    avgDay(..., data_set)

if __name__ == 'main':
    main()
1 голос
/ 09 мая 2020

Ваша функция loadFile может возвращать набор данных, который можно использовать внутри avgDay

import csv
import sys


def loadFile(x):

    data_set = []

    with open(x, "r") as readfile:
        csv_reader = csv.reader(readfile, delimiter= ';')
        for row in csv_reader:
            data_set.append(row)
    print("Loaded weather data from", (x[0:-4]).capitalize())
    print()

    return data_set

def avgDay(x):

    data_set = loadFile(x)

    for line in data_set:
        if(len(x) == 5 and (x[3:5] + "-" + x[0:2]) in line[0]):
           print("The weather on", x, "was on average", line[2], "centigrade")
0 голосов
/ 09 мая 2020

Функции могут иметь атрибуты. Вы можете сделать data_set атрибутом loadFile, а затем ссылаться на него в avgDay.

with open(x, "r") as readfile:

    csv_reader = csv.reader(readfile, delimiter= ';')

    for row in csv_reader:

        data_set.append(row)

    loadFile.data_set_attr = data_set

Затем в avgDay укажите loadFile.data_set_attr

0 голосов
/ 09 мая 2020

глобальные переменные могут быть установлены только если вы используете слово глобальные

вы можете получить доступ к глобальным переменным без каких-либо специальных

data_set = "global_var" #global

def print_global_data_set():
    print(data_set)

def set_global_data_set():
    global data_set # you need this line to tell python that you are going to set a global variable
    data_set = 'global_var_set_from_function'

def set_local_data_set():
    data_set = "local" # this will not set the global var but a local var so the global data_set stays unchanged

print(data_set) # outputs "global_var"
set_local_data_set()
print_global_data_set() # outputs "global_var" (set_local_data_set did not set the global var but a local var)
set_global_data_set()
print_global_data_set() # outputs "global_var_set_from_function"
...