Neuling sucht Rat

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Eben darauf wollte ich hinaus, man kann es problemlos weglassen. Sollte es nicht gehen, dann ist es ein Zeichen, dass der Code umgeschrieben werden sollte.

Was den Import von Modulen angeht: Vielleicht ist es ja ein Warnzeichen das Buch in die Tonne zu kloppen. Ein Import bringt einem nichts wenn keiner der importierten Namen verwendet wird[1], man kann problemlos (außer bei Sternchenimporten) die Datei danach durchsuchen und so feststellen ob er verwendet wird oder nicht[2].

[1]: Ausnahme sind Importe die mit Nebeneffekten behaftet sind, hatte da mal ein interessantes Zusammenspiel von logging und requests, da requests die Präsenz von logging als Grund auffasste bei jedem Request ausführlich zu schwafeln. Das Setzen des Logging-Levels hat den Spuk beendet.

[2]: Dies wird von PyLint und PyFlakes und dergleichen ausgenutzt, Werkzeugen die deinen Code auf übliche Schnitzer überprüfen ehe du ihn ausführst.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Code: Alles auswählen

def rot13(wort, zahl):
    
    neu = []
    x = len(wort)
    i = 0
    for i in range(0,x,1):
        
        rotiert = ord(wort[i]) + zahl
        print(chr(rotiert))
       
        neu.append(rotiert)
        print(rotiert)


    neu2 = []
    x= 0
    for x in range (0,len(neu),1):
        rotiert = chr(neu[x])
        neu2.append(rotiert)
        
        return neu2

    
Wieso wird in der zweiten Schleife nur der erste String in die Liste gespeichert?
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Weil das "return neu2" in der Schleife steht. Außerdem solltest du aussagekräftigere Namen wählen. Und in python kann man direkt über Listen iterieren, dazu brauchst du dann das range und [x] Zeug nicht:

Code: Alles auswählen

for element in neu:
    neu2.append(chr(element))
return neu2
Und wenn du mal range benutzen solltest musst du nicht unbedingt vorher das x definieren. Das macht nur manchmal Sinn, wenn du leere Listen hast und du später was mit dem x außerhalb der Schleife anfangen willst.

Grüße,
anogayales
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Das mit dem return hab ich auch gerade gemerkt - das mit der kurzschreibweise war mir nicht klar - thx.
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

Hi Tengel,

kennst du str.translate() schon?

Grüße

Xe
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Nein - danke für den Hinweis.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Bin gerade im Kapitel über Dateien lesen/schreiben
Da geht es auch um das Modul os und den md5 Wert

Laut Buch

Code: Alles auswählen

dateiname ="Wortliste.txt"
cmd = "md5sum"+dateiname
fp = os.popen(cmd)
res = fp.read()
stat = fp.close()
print(res)

Unabhängig davon - das ich meine gelesen zu haben das read() bei größeren Dateien nicht richtig arbeitet und man deshalb die Zeilen einzeln auslesen sollte - funktioniert das nicht - das print gibt nur eine leere Zeile aus.

google verweist auf
http://openbook.galileocomputing.de/pyt ... 15_004.htm
das führt bei mir jedoch lediglich zu

Code: Alles auswählen

m = hashlib.md5("Hallo Welt")
Traceback (most recent call last):
  File "<pyshell#140>", line 1, in <module>
    m = hashlib.md5("Hallo Welt")
TypeError: Unicode-objects must be encoded before hashing
Was mach ich falsch?
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Tengel,
die Funktionen in »os« greifen ziemlich direkt auf Betriebssystemfunktionen zurück. Je nachdem was für ein Device an das Filehandle »fd« gebunden ist, kann »read« verschieden arbeiten, tut das aber immer, nach Spezifikation, richtig. Das heißt aber nicht, dass immer bis ganz zu Ende gelesen wird, auch weil es manchmal auch gar kein Ende gibt.
Dein Programm ist ein schönes Beispiel, warum man popen nicht benutzen sollte, sondern immer die höheren Funktionen aus subprocess:

Code: Alles auswählen

import subprocess
res = subprocess.Popen(['md5sum', dateiname], stdout=subprocess.PIPE).communicate()[0]
Bei Dir fehlt ein Leerzeichen.

Den Fehler bei Verwendung von »hashlib« solltest Du inzwischen selbst beheben können, da einige Kapitel zuvor sicher schon Unicode-Strings und Bytes behandelt wurden.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Im Buch gibt der Autor nur an das popen eigentlich veraltet ist - aber da subprocess um einiges komplizierter sei - würde er solange das modul verwenden bis es gelöscht wird.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Die offizielle Dokumentation hat praktischerweise am Ende der passenden Seite Praxis-Beispiele wie man übliche Verwendung von os und popen ersetzt.
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Tengel hat geschrieben:Im Buch gibt der Autor nur an das popen eigentlich veraltet ist - aber da subprocess um einiges komplizierter sei - würde er solange das modul verwenden bis es gelöscht wird.
Damit gibt der Autor ganz schönen Blödsinn von sich, finde ich.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Welche Entwicklungsumgebung nutzt ihr eigentlich so?
BlackJack

@Tengel: Texteditor und IPython zum „live” ausprobieren.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Texteditor oO - das ja wohl für die ganz harten
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Tengel hat geschrieben:Texteditor oO - das ja wohl für die ganz harten
Nee, das ist tatsächlich das Tool, welches wohl die meisten Python-Programmierer benutzen, da bei Python einfach keine IDE nötig ist.

Um's vielleicht etwas deutlicher machen: Würdest du für die Programmierung von Shell-Skripten (je nach Betriebssystem meist *.bat bzw *.sh Dateien) auch direkt eine IDE anwerfen (schließlich sind es ja *Programme*)? :)
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Mit dem Modul webbrower kann man ja z. B. den Standartbrower öffnen
Gibt es auch ein Modul mit dem man Programme(WinAmp) oder Ordner öffnen kann?
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Meinst du damit das automatische Starten von dem Programm, das der jeweiligen Dateiendung zugeordnet ist? Dafür gibt es (allerdings nur für Windows) os.startfile().
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Ja ich denke das mein ich^^ muss mal rumprobieren.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Unter Unices kann man ``xdg-open`` verwenden, sofern installiert. Wenn nicht installiert gibts eh eher keine Standardzuordnungen (außer evtl. ``$EDITOR``)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Bin momentan dabei mein Traffic Programm so zu schreiben das eine GUI Klasse verwendet wird - ..klappt leider nicht so recht, hat jemand einen "guten" Link wo Schnittstellen von Klassen erklärt werden?

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "D:\Phyton\lib\tkinter\__init__.py", line 1442, in __call__
    return self.func(*args)
  File "D:/Phyton/trafficklasse/tr.py", line 20, in standAnzeigen
    anzeige["text"] = "Der momentane Verbrauch liegt bei "+str(self.startWert)+" mb."
TypeError: 'NoneType' object does not support item assignment

Ich würd mal vermuten das liegt daran das die Objekte der Klassen nicht miteinander "kommunizieren" können.
Antworten