Python在函数之间传递数组

时间:2019-05-14 22:02:02

标签: python pandas

找不到最近几年编写的任何解决方案。

我希望将变量从一个函数传递给另一个函数,而无需重新运行SQL连接。

第一个功能是:

def SQL_Country():
    conn = psq.connect("localhost","root","root","world",cursorclass=psq.cursors.DictCursor)
    query = "SELECT * FROM country"

    with conn:
        cursor = conn.cursor()
        cursor.execute(query)
        country = cursor.fetchall()

        global df 
        df = pd.DataFrame(country, columns=["Code", "Name", "Continent", "Population", "HeadOfState"])

第二个函数,我希望传递SQL_Country()的输出是:

def assignment():

    ## do something here

    elif Choice == 6:
        try:
            x = df
        except NameError:
            x = None

        if x is None:

            print()

            df = SQL_Country(df)

我遇到以下错误:

  File "Python.py", line 185, in assignment
    df = SQL_Country(df)
UnboundLocalError: local variable 'df' referenced before assignment

关于如何将输出从一个功能传递到另一个功能的任何建议?

4 个答案:

答案 0 :(得分:2)

第二个函数缺少参数:

def assignment(df):

答案 1 :(得分:2)

而不是全局,应该在SQL_County内部返回df:

        global df 
        df = pd.DataFrame(country, columns=["Code", "Name", "Continent", "Population", "HeadOfState"])

应为:

        return pd.DataFrame(country, columns=["Code", "Name", "Continent", "Population", "HeadOfState"])

然后使用:

df = SQL_Country()

如果要缓存df的结果,我将使用lru_cache:

import functools

@functools.lru_cache(maxsize=1)
def SQL_Country():
   ...

那样,数据库获取仅执行一次。


In [11]: @functools.lru_cache(maxsize=1)
         def foo():
             print(1)
             return 2

In [12]: foo()
1
Out[12]: 2

In [13]: foo()
Out[13]: 2

答案 2 :(得分:2)

我认为您应该review python functions

您正在使用定义函数

def SQL_Country():

但是,当您要使用该函数时,您将在以下位置提供参数(不希望作为函数输入):

df = SQL_Country(df)

您的其他功能:

def assignment():

可能还应该输入一个数据框,使其看起来像这样:

def assignment(df):

此时对函数的后续调用将是:

assignment(df)

代替

assignment()

答案 3 :(得分:2)

由于已经设置了SQL_Country(),因此无需再次运行df函数。因此,我将进行检查以查看是否已设置,如果已设置,则将其返回。首先在函数外部定义df,而不要使用全局值。

df_country = None

def SQL_Country():
    if df_country is None:
        conn = psq.connect("localhost","root","root","world",cursorclass=psq.cursors.DictCursor)
        query = "SELECT * FROM country"

        with conn:
            cursor = conn.cursor()
            cursor.execute(query)
            country = cursor.fetchall()

            df_country = pd.DataFrame(country, columns=["Code", "Name", "Continent", "Population", "HeadOfState"])
    return df_country

现在,当您调用该函数时,它不会第二次执行,但是您将获得所需的值

def assignment():
    ## do something here
    if Choice == 6:
         # No need to do the name check
        x = SQL_Country()
        if x is None:
            print()