Kann Python eine bestimmte Zeile drucken?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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 | 

Bild zum Beitrag

 - (Python, Programmiersprache)

TasseKaffe 
Beitragsersteller
 02.07.2023, 09:12

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)

mihisu  02.07.2023, 12:29
@TasseKaffe

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))
TasseKaffe 
Beitragsersteller
 02.07.2023, 13:53
@mihisu

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)
mihisu  02.07.2023, 14:43
@TasseKaffe

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!

TasseKaffe 
Beitragsersteller
 02.07.2023, 17:16
@mihisu

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

TasseKaffe 
Beitragsersteller
 02.07.2023, 17:17
@mihisu

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.

TasseKaffe 
Beitragsersteller
 02.07.2023, 19:03
@mihisu

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)

TasseKaffe 
Beitragsersteller
 24.06.2023, 16:45

Hoffe du kannst mit meiner Beschreibung etwas anfangen (●ˇ∀ˇ●)

TasseKaffe 
Beitragsersteller
 24.06.2023, 16:40
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")
mihisu  24.06.2023, 17:03
@TasseKaffe

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.

https://de.wikipedia.org/wiki/Project_Jupyter

TasseKaffe 
Beitragsersteller
 26.06.2023, 08:59
@mihisu

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.