定义的Python函数无返回值,执行无结果且变量未定义问题
问题排查与解决:Python函数无输出且变量未定义
问题描述
定义了一个生成DataFrame的Python函数,调用后无结果输出,尝试访问函数内创建的df_results变量时触发NameError,无其他运行报错。
原函数代码
def results(Water_depth,e,intv,Top_res,Base_res,Res_thickness,Depletion, Biot,Cm,C,nu): df_results = pd.DataFrame((np.arange(Water_depth,e,intv)), columns=['Depth']) # Creating data frame for results df_results['Z (m)'] = ((df_results['Depth']) - Water_depth)/Top_res # Creating normalised depth conditions = [ (df_results['Depth'] < Top_res), (df_results['Depth'] >= Top_res) & (df_results['Depth'] <= Base_res), (df_results['Depth'] > Base_res) ] df_results['definition'] = np.select(conditions, ['Overburden','Reservoir','Underburden']) # defining data points as either overburden, reservoir and underburden # Calculation of Uz (broken into smaller componants) Z = df_results['Z (m)'] a = (Cm/2)*Res_thickness*Depletion*Biot b = (C*(Z-1))/pow(1+C*C*(Z-1)*(Z-1),(1/2)) c = ((3-(4*nu))*C*(Z+1))/pow(1+C*C*(Z+1)*(Z+1),(1/2)) d = (2*C*Z)/pow((1+C*C*(Z+1)*(Z+1)),(3/2)) e_OB = 3-(4*nu)+1 # +1 used if overburden e_UB = 3-(4*nu)-1 # -1 used if underburden conditions = [ (df_results['definition'] == 'Overburden'), (df_results['definition'] == 'Reservoir'), (df_results['definition'] == 'Underburden') ] Uz_OB = a*(b-c+d+e_OB) Uz_UB = a*(b-c+d+e_UB) df_results['Uz (m)'] = np.select(conditions, [Uz_OB,Uz_OB,Uz_UB]) # calculation of Uz df_results['Uz (cm)'] = df_results['Uz (m)'] * 100 Uz_end = df_results['Uz (m)'].iloc[-1] # Extracting the end Uz value df_results['Vertical displacement (m)'] = df_results['Uz (m)'] - Uz_end # Calculation of vertical displacement df_results['Vertical displacement (cm)'] = df_results['Vertical displacement (m)']*100 df_results results(Water_depth,e,intv,Top_res,Base_res,Res_thickness,Depletion, Biot,Cm,C,nu)
调用代码及报错信息
调用代码:
results(Water_depth,e,intv,Top_res,Base_res,Res_thickness,Depletion, Biot,Cm,C,nu) df_results
报错信息:
--------------------------------------------------------------------------- NameError Traceback (most recent call last) Cell In[11], line 33 30 df_results 32 results(Water_depth,e,intv,Top_res,Base_res,Res_thickness,Depletion, Biot,Cm,C,nu) ---> 33 df_results NameError: name 'df_results' is not defined
问题原因
- 函数无返回值:函数最后一行仅写了
df_results,这只是在函数内部引用变量,没有使用return语句将其作为函数输出返回,所以调用函数后不会产生任何结果。 - 局部变量无法外部访问:
df_results是函数内部定义的局部变量,作用域仅限于函数内部,函数外部无法直接访问该变量,因此会触发NameError。
解决方法
- 在函数末尾添加
return df_results,让函数执行完毕后返回生成的DataFrame。 - 调用函数时将返回值赋值给一个变量(比如
df_results),之后即可正常访问该变量。
修改后的完整代码
import pandas as pd import numpy as np def results(Water_depth,e,intv,Top_res,Base_res,Res_thickness,Depletion, Biot,Cm,C,nu): df_results = pd.DataFrame((np.arange(Water_depth,e,intv)), columns=['Depth']) # Creating data frame for results df_results['Z (m)'] = ((df_results['Depth']) - Water_depth)/Top_res # Creating normalised depth conditions = [ (df_results['Depth'] < Top_res), (df_results['Depth'] >= Top_res) & (df_results['Depth'] <= Base_res), (df_results['Depth'] > Base_res) ] df_results['definition'] = np.select(conditions, ['Overburden','Reservoir','Underburden']) # defining data points as either overburden, reservoir and underburden # Calculation of Uz (broken into smaller componants) Z = df_results['Z (m)'] a = (Cm/2)*Res_thickness*Depletion*Biot b = (C*(Z-1))/pow(1+C*C*(Z-1)*(Z-1),(1/2)) c = ((3-(4*nu))*C*(Z+1))/pow(1+C*C*(Z+1)*(Z+1),(1/2)) d = (2*C*Z)/pow((1+C*C*(Z+1)*(Z+1)),(3/2)) e_OB = 3-(4*nu)+1 # +1 used if overburden e_UB = 3-(4*nu)-1 # -1 used if underburden conditions = [ (df_results['definition'] == 'Overburden'), (df_results['definition'] == 'Reservoir'), (df_results['definition'] == 'Underburden') ] Uz_OB = a*(b-c+d+e_OB) Uz_UB = a*(b-c+d+e_UB) df_results['Uz (m)'] = np.select(conditions, [Uz_OB,Uz_OB,Uz_UB]) # calculation of Uz df_results['Uz (cm)'] = df_results['Uz (m)'] * 100 Uz_end = df_results['Uz (m)'].iloc[-1] # Extracting the end Uz value df_results['Vertical displacement (m)'] = df_results['Uz (m)'] - Uz_end # Calculation of vertical displacement df_results['Vertical displacement (cm)'] = df_results['Vertical displacement (m)']*100 # 添加return语句返回DataFrame return df_results # 调用函数并赋值给变量 df_results = results(Water_depth,e,intv,Top_res,Base_res,Res_thickness,Depletion, Biot,Cm,C,nu) # 现在可以正常访问df_results print(df_results)
内容的提问来源于stack exchange,提问作者travgeol
相关产品推荐
相关产品推荐

