For döngüsü bir python işlevi içinde çalışmıyor
İçinde döngü olan bir işlev oluşturmaya çalışıyorum. Komut dosyası işlevsiz çalışır ancak python işlevinin çalışmadığını bildirir. (Orijinal senaryo daha uzun ama bu kısımla bence yeterli)
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)])])')
aralıktaki i için (len (Vec4)): yazdır (Vec4 [i]) Önceki komut dosyası çalışıyor, buraya kadar sorun yok. Şimdi python işlevini açıklıyorum:
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])
İkinci kod sorunu gösteriyor: "theta_1 tanımlı değil"
Yanıtlar
Gönderen belgelerineexec :
Not : Varsayılan yereller, aşağıda işlev yerelleri () için açıklandığı şekilde hareket eder: varsayılan yereller sözlüğünde değişiklik yapılmaya çalışılmamalıdır. Exec () işlevi döndükten sonra kodun yereller üzerindeki etkilerini görmeniz gerekiyorsa, açık bir yereller sözlüğü iletin.
Yani, özünde, execyorumlayıcı verimliliği nedenleriyle yerel değişkenlerle uğraşmak için kullanamazsınız . Aynı kısıtlama globaller için geçerli değildir, bu nedenle ilk sürümünüz çalışır.
Ne yapılacağına gelince: execaramalar son derece gereksiz. Python kodunu dağınık execaramalar olmadan normal şekilde çalıştırın . Dürüst olmak gerekirse muhtemelen daha hızlı da çalışacak. Benzer adlara sahip değişken sınıflarını bir araya getirdiğiniz tüm yerlerde, kullanım durumuna bağlı olarak bunları tek bir dizi veya sözlükle değiştirin.
Görünüşe göre girinti hatası olabilir.
İlk örneğiniz
for d in range(1,9):
modes=d+1
if statetype==1:
yeni tanımınız ise
for d in range(1,9):
modes=d+1
if statetype==1:
4. satır civarında