For döngüsü bir python işlevi içinde çalışmıyor

Sep 08 2020

İç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

2 SilvioMayolo Sep 08 2020 at 12:21

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.

2 poproar Sep 08 2020 at 12:22

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