Kann Python eine bestimmte Zeile drucken?
Tag zusammen,
ich möchte in dem Programm Python eine geschriebene Zeile drucken, aber ich will nicht einfach nur das Ergebnis der Zeile, sondern Python soll den gesamten Code der entsprechenden Zeile mitdrucken, ohne dass ich den Text selbst kopieren muss.
Gibt es dafür einen Befehl, der mir das Ganze vereinfacht?
Bspw.:
a = 1
b = 2
c = a + b
print(c) --> 3
Ich will aber nicht die 3 drucken, sondern ich suche nach einen Befehl, der die geschriebe Zeile, also
c = a + b
druckt.
2 Antworten
Mir erschließt sich nicht so ganz, warum du das möchtest. Aber ich würde da eine entsprechende Funktion in Script schreiben, die das für dich erledigt, die dir dann zu einer bestimmten Zeilennummer die entsprechende Zeile aus deinem Script printet.
Beispielsweise so:
def print_code_line(line_nr, filepath=__file__):
with open(filepath) as f:
for _ in range(line_nr - 1):
f.readline()
print(f.readline(), end='')
return(None)
a = 1
b = 2
c = a+b
print_code_line(10)
Bzw. mit Zeilennummerierung:
1 | def print_code_line(line_nr, filepath=__file__):
2 | with open(filepath) as f:
3 | for _ in range(line_nr - 1):
4 | f.readline()
5 | print(f.readline(), end='')
6 | return(None)
7 |
8 | a = 1
9 | b = 2
10 | c = a+b
11 | print_code_line(10)
12 |
Du könntest sowas in der Art machen...
import re
def fill_formula(s):
pattern = r"((?![0-9])\w+)"
filled_s = re.sub(pattern, "{\g<1>}", s).format(**globals())
return(filled_s)
# Beispiel:
afafw = 7
ori = 3
t = 52
form = "t = afafw**2+ori"
print(fill_formula(form))
Da hat irgendwas bei mir nicht geklappt in der Ausgabe istb alles rot makiert als falsch.
Bei mir sieht das aktuell so aus:
import math #einfügen für mathematische Operatoren#
def print_code_line(line_nr, filepath=__file__): #Zeile 8-13 mit "print_code_line()"
with open(filepath) as f:
for _ in range(line_nr - 1):
f.readline()
print(f.readline(), end='')
return(None)
import re
def fill_formula(s):
pattern = r"((?![0-9])\w+)"
filled_s = re.sub(pattern, "{\g<1>}", s).format(**globals())
return(filled_s)
a = 1
b = 2
c = 3
d = a+b*c
print(fill_formula(d)
Erst einmal, ist die Darstellung in deinem Kommentar nicht richtig. Da fehlen unter anderem die in Python doch recht wichtigen Einrückungen.
Aber was mir auffällt: Bei print(fill_formula(d)) kannst du die von mir gegebene Funktion so nicht verwenden. Du brauchst da statt der Variablen d einen entsprechenden String, in dem die Variablen ersetzt werden sollen. Also beispielsweise „print(fill_formula("d = a+b*c"))“.
Do wie du es geschrieben hast, wird sieht es für Python bei print(fill_formula(d)) [hier mit d = 7] so aus, dass fill_formula(7) ausgeführt werden soll. Aus dem Wert 7 kann Python doch nicht erkennen, was du da stehen haben möchtest!
Wofür sind die Einrückungen wichtig?
Jetzt klappt zumindest ein Teil der Formel, aber leider kann ich in den Bereich nichrt mehr alle rechen Operationen durchführen bzw. Befehle wie "math.sqrt" funktionieren nicht mehr und die Rechnung wird nicht komplett berechnet
(T_T)
-----------------------------------------------------------------------------------------------
#TestDatei#
import math #einfügen für mathematische Operatoren#
Rho1 = float(1) #Rhodichte von Wasser t/m^3#
g = float(9.81) #Erdbeschleunigung in m/s^2#
pi = math.pi #Die Zahl Pi#
def print_code_line(line_nr, filepath=__file__): #Zeile 8-13 mit "print_code_line()"
with open(filepath) as f:
for _ in range(line_nr - 1):
f.readline()
print(f.readline(), end='')
return(None)
import re
def fill_formula(s):
pattern = r"((?![0-9])\w+)"
filled_s = re.sub(pattern, "{\g<1>}", s).format(**globals())
return(filled_s)
a = 1
b = 2
c = 3
d = a+b*c
print(fill_formula("d = a+b*c*pi*g**(0.5)"))
[Das ist die Antwort von Python]
7 = 1+2*3*3.141592653589793*9.81**(0.5)
Process finished with exit code 0
Wie versendest du deine Antworten so, dass bei dir alles eingerückt bleibt? ich hab alles so kopiert und eingefügt wie es in Python geschrieben ist, aber es wird einfach in so einer normalen Darstellung nach den senden angezeigt.
BAD NEWS .·´¯`(>▂<)´¯`·.
Ich hab nun alles fertig programmiert und dachte mir jetzt check ich ab ob es auch auf meinem Taschenrechner funktioniert.... naja was soll ich sagen es klappt nicht -.-*
Der Taschenrechner kann zwar python, aber mit den Teil der mir das schreiben vereinfachen sollte will er nicht rechnen, also mit diesen Teil hier.
def print_code_line(line_nr, filepath=__file__): #Zeile 8-13 mit "print_code_line()"
with open(filepath) as f:
for _ in range(line_nr - 1):
f.readline()
print(f.readline(), end='')
return(None)
Hoffe du kannst mit meiner Beschreibung etwas anfangen (●ˇ∀ˇ●)
Also ich möchte das machen damit ich mir lästige Schreibarbeit sparen kann. Wenn du weiter unten schaust siehst du, dass ich die Formel immer ein zweites mal tippen muss und wenn ich mir das mit einer funktion sparen könnte würde mir das vieles leichter machen.
import math #einfügen für mathematische Operatoren#
Rho1 = float(1) #Rhodichte von Wasser 1t pro m^3# #Rho als 1 statt der 1000 schreiben damit man sich das umrechnen der Einheit sparen kann#
g = float(9.81) #Erdbeschleunigung in m/s^2#
pi = math.pi #Die Zahl Pi#
D1 = float(input("D1 li [mm]: "))
D2 = float(input("D2 re [mm]: "))
D3 = float(input("D3 un [mm]: "))
v1 = float(input("v1 [m/s]: "))
v3 = float(input("v3 [m/s]: "))
p1 = float(input("p1 [kN/m^2]: "))
zeta = float(input("zeta1-3 [-]: "))
alpha = float(input("alpha zwischen 2 und 3 [°]: "))
A1 = pi*(D1/1000)**2 /4
A3 = pi*(D3/1000)**2 /4
Q1 = v1*A1
Q3 = v3*A3
hv = zeta * (v1**(2) / (2*g))
p3 = ( v1**(2)/(2*g) + p1/(Rho1*g) - v3**(2)/(2*g) - hv) * Rho1*g
Fwd = round(p3*A3,4)
Fwm = round(Rho1*Q3*v3,4)
Fy = round(math.sin(math.radians(alpha))*(Fwd+Fwm),4)
print(v1)
print(p1)
print(v3)
print("A1 = pi*(D1/1000)**2 /4")
print(A1,"m^2")
print("A3 = pi*(D3/1000)**2 /4")
print(A3,"m^2")
print("Q1 = v1*A1")
print(Q1,"m^3/s")
print("Q3 = v3*A3")
print(Q3,"m^3/s")
print("hv = zeta * (v1**(2) / (2*g))")
print(hv,"m")
print("p3 = (v1**(2)/(2*g) + p1/(Rho1*g) - v3**(2)/(2*g) - hv) * Rho1*g")
print(p3,"kN/m^2")
print("Fwd = p3*A3")
print(Fwd,"kN")
print("Fwm = Rho1*Q3*v3")
print(Fwm,"kN")
print("Fy = sin(alpha)*(Fwd+Fwm)")
print(Fy,"kN")
Ich sehe jetzt nicht, was da so aufwendig daran sein sollte, das einfach nochmal zu kopieren.
Ansonsten könntest du überlegen vielleicht auf eval() bzw. exec() zurückzugreifen. Beispielsweise so:
form1 = "A1 = pi*(D1/1000)**2 /4"
exec(form1)
print(form1)
print(A1, "m^2")
statt
A1 = pi*(D1/1000)**2 /4
print("A1 = pi*(D1/1000)**2 /4")
print(A1,"m^2")
Nebenbei bemerkt, finde ich es bei deinem Beispiel merkwürdig, warum du in der Formel, die du printest, Python-mäßig mit ** für die Potenzen arbeitest, aber dann bei "m^2" plötzlich ^ statt ** verwendest. Dementsprechend könntest du sowieso überlegen, ob du nicht vielleicht sowieso in der geprinteten Formel gegenüber dem entsprechenden Code für die Berechnung noch Kleinigkeiten abändern möchtest.
Ansonsten könntest du auch überlegen, ob du nicht vielleicht lieber beispielsweise mit einem Jupyter-Notebook arbeiten möchtest, statt mit einem normalen Python-Script. Dann sieht man im Notebook auch gleich die Code-Zeilen mit den Formeln zu den jeweiligen Ergebnissen.
Was genau macht der exec() Befehl?
Ich hab ** durch ^ ersetzt, weil ich es im Ergebnis ansehnlicher finde den Exponenten in dieser Form dargestellt zu bekommen.
Also das mit den Jupyter-Projekt wird denke ich alles was ich kann weit übersteigen oder überstrapazieren, da ich aktuell meine ersten 2 Programmsparachen lerne für meine Arbeit und meinen Taschrechner.
Mit Printf leitest du einen Wert in den Ausgabestream. Woher soll der denn wissen, dass du eine vorherige Codezeile ausgegeben haben willst, wenn du den Rechner das nicht mitteilst?
ich suche nach einen Befehl der die geschrieben Zeile, also "c = a+b" druckt.
Dann musst du das innerhalb des printf-Befehles auch als Zeichenkette einfügen, sonst wird das nichts mit der Ausgabe.
ohne, dass ich den Text selbst kopieren muss.
Nein.
Hi, ich hab mich heute nochmal ans programmieren gesetzt und muss sagen, dass ich deine Lösung ziemlich gut finde *^____^*
Kannst du mir einen Code schreiben der mir dann nicht nur die Formel wiedergibt sondern alle Variablen mit der entsprechenden Zahl füllt und mir dann erst dann alles wiedergibt? Das wäre echt krass cool q(≧▽≦q)