python - For循环在python函数中不起作用
问题描述
我尝试创建一个内部带有循环的函数。该脚本在没有函数的情况下工作,但声明 python 函数不起作用。(原始脚本更长,但我认为这部分就足够了)
import numpy as np
import math as mt
from sympy import*
import fractions
init_printing(use_latex='mathjax')
PHnumbers=4
PHnumbers2=2
statetype= 1
for d in range(1,9):
modes=d+1
if statetype==1:
comb=modes
elif statetype==2:
comb=int((modes*(modes+1))/2)
exec(f'Phases{d}=[]'), exec(f'Phasesv{d}=[]')
for i in range(modes):
exec(f'theta_{i+1}= symbols(\'theta_{i+1}\', real=True)')
exec(f'Phases{d}.append(globals()[\'\'.join([\'theta_\',str(i+1)])])')
exec(f'Phasesv{d}.append(globals()[\'\'.join([\'theta_\',str(i+1)])])')
exec(f'v{i+1}=[[0]]*modes')
exec(f'Phasesv{d}[0]*=0')
for i in range(modes):
exec(f'globals()[\'\'.join([\'v\',str(i+1)])][i]=[PHnumbers*diff(Phasesv{d}[i],Phases{d}[i])]')
conteo = d
for j in range(modes):
for i in range(modes):
if j<i:
conteo = conteo + 1
exec(f'v{conteo+1}=[[0]]*modes')
exec(f'globals()[\'\'.join([\'v\',str(conteo+1)])][i]=[PHnumbers2*diff(Phasesv{d}[i],Phases{d}[i])]')
exec(f'globals()[\'\'.join([\'v\',str(conteo+1)])][j]=[PHnumbers2*diff(Phasesv{d}[j],Phases{d}[j])]')
exec(f'Vec{d}=[]'),exec(f'Coeff{d}=[]'), exec(f'Nii{d}=[]'), exec(f'Nij{d}=[]')
for i in range(comb):
exec(f'Vec{d}.append(globals()[\'\'.join([\'v\',str(i+1)])])')
for i in range(len(Vec4)): print(Vec4[i]) 之前的脚本工作,到这里为止没有问题。现在我声明python函数:
def metro(PHnumbers):
statetype=1
PHnumbers2=2
for d in range(1,9):
modes=d+1
if statetype==1:
comb=modes
elif statetype==2:
comb=int((modes*(modes+1))/2)
exec(f'Phases{d}=[]'), exec(f'Phasesv{d}=[]')
for i in range(modes):
exec(f'theta_{i+1}= symbols(\'theta_{i+1}\', real=True)')
exec(f'Phases{d}.append(globals()[\'\'.join([\'theta_\',str(i+1)])])')
exec(f'Phasesv{d}.append(globals()[\'\'.join([\'theta_\',str(i+1)])])')
exec(f'v{i+1}=[[0]]*modes')
exec(f'Phasesv{d}[0]*=0')
for i in range(modes):
exec(f'globals()[\'\'.join([\'v\',str(i+1)])][i]=[PHnumbers*diff(Phasesv{d}[i],Phases{d}[i])]')
conteo = d
for j in range(modes):
for i in range(modes):
if j<i:
conteo = conteo + 1
exec(f'v{conteo+1}=[[0]]*modes')
exec(f'globals()[\'\'.join([\'v\',str(conteo+1)])][i]=[PHnumbers2*diff(Phasesv{d}[i],Phases{d}[i])]')
exec(f'globals()[\'\'.join([\'v\',str(conteo+1)])][j]=[PHnumbers2*diff(Phasesv{d}[j],Phases{d}[j])]')
exec(f'Vec{d}=[]'),exec(f'Coeff{d}=[]'), exec(f'Nii{d}=[]'), exec(f'Nij{d}=[]')
for i in range(comb):
exec(f'Vec{d}.append(globals()[\'\'.join([\'v\',str(i+1)])])')
for i in range(len(Vec4)):
print(Vec4[i])
第二个代码显示问题:'theta_1 is not defined'
解决方案
从文档中exec
:
注意:默认本地变量的作用与下面函数 locals() 的描述相同:不应尝试修改默认的 locals 字典。如果您需要在函数 exec() 返回后查看代码对局部变量的影响,请传递显式局部变量字典。
因此,从本质上讲,出于解释器效率的原因,您不能使用exec
弄乱局部变量。同样的限制不适用于全局变量,这就是您的第一个版本有效的原因。
至于做什么:好吧,这些exec
电话是非常不必要的。只需正常执行 Python 代码,无需繁琐的exec
调用。老实说,它也可能会运行得更快。在您将具有相似名称的变量类组合在一起的所有地方,只需将它们替换为单个数组或字典,具体取决于用例。
推荐阅读
- google-sheets - 谷歌表格汇总多列
- html - When select dropdown directive for submit on press 'Enter' no more work
- javascript - 如何删除事件处理程序的绑定版本?
- qml - 如何在 QML 中检测双指双击?
- nestjs - 如何使用@nestjs/terminus 为 Prisma 创建自定义健康检查?
- plugins - 如何不加载图表之前的数据?
- prolog - 毕达哥拉斯定理用于计算两点之间的距离。序言
- flutter - 自定义方案未调用 webview_flutter navigationDelegate
- python - 安装 trimmomatic 时出现 Anaconda CondaVerificationError
- java - 插件 jsonschema2pojo:属性按要求显示,但它们应该是可选的