Generator Verständnis

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.
Antworten
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

hallo :)

Ich habe eine frage zu den generatoren und zwar:

1. Habe ich es wirklich richtig verstanden, oder kann man da doch noch einiges mehr rausholen ?

2. Kann man es überhaupt hier anwenden ? sprich, ist es für die anwendung an sich, zu viel code, "zu kompliziert für die aufgabe" ? ich bin leie :)

Hier der Code, eines Passwort Generators von mir, ich hoffe man darf ihn überhaupt als solchen bezeichnen ;)

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8

from string import lowercase, uppercase, digits
from random import choice

wahl_liste = lowercase + uppercase + digits

def generator(zeichen_laenge):
    for x in range(0, zeichen_laenge):
        wahl = choice(wahl_liste)
        yield wahl

def main():
    passwort = ""

    print "\nPasswort Generator\n"
    zeichen_laenge = int(input("Wieviele Zeichen soll Ihr Passwort haben: "))

    for x in generator(zeichen_laenge):
        passwort = passwort + x

    print "\nMögliches Passwort: %s\n" % (passwort)

if __name__=='__main__':
    main()
EDIT:

Da ich gerne auf Kritik eingehe und annehme, denn Kritik bedeutet auch einen fortschrit, man wird belehrt, hier noch mein programm "S.I.F.":

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os

def der_sucher(pfad, file_ex, ge_wo):
    for root, folder, files in os.walk(pfad):
        for file in files:
            if file.endswith(file_ex):
                pfad2 = os.path.join(root, file)
                try:
                    f = open(pfad2)
                    eingelesen = f.read()
                    f.close()
                    if ge_wo in eingelesen:
                        print "{%s} -- {%s}" % (root, file)
                except:
                    print "{%s} -- {%s} konne nicht geöffnet werden" % (root,file)                 

def main():
    print "\n{S.I.F} - Search In File\n"

    pfad = raw_input("Bitte Pfad eingeben: ")
    file_ex = raw_input("Datei endung: ")
    ge_wo = raw_input("welches wort suchen: ")

    der_sucher(pfad, file_ex, ge_wo)

if __name__ == '__main__':
    main()
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Der Generator funktioniert hier, ich würde ihn aber nicht als extra Funktion definieren, sondern die komplette Passworterzeugen an sich:

Das Ganze lässt sich elegant als List/Generator Comprehension darstellen:

Code: Alles auswählen

def passwort_erzeugen(zeichen_laenge):
    return "".join(choice(wahl_liste) for _ in xrange(zeichen_laenge))
So musst du auch das passwort="" erst dann definieren, wenn du es auch brauchst.

Zum zweiten Teil: Bei "for file in files:" überschreibst du das builtin file, nehm am besten einen anderen Namen. Dateien werden übrigens mit dem with Statement geöffnet und nicht explizit mit open und close. pfad2 und ge_wo sind auch keine aussagekräftigen Bezeichner, also: Name ändern. Außerdem mischst du Deutsch und Englisch, bleib am besten bei Englisch, dann hat die Welt mehr davon :P

Grüße,
anogayales
Zuletzt geändert von anogayales am Freitag 28. September 2012, 21:25, insgesamt 1-mal geändert.
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

anogayales hat geschrieben: Zum zweiten Teil: Bei "for file in files:" überschreibst du das builtin file, nehm am besten einen anderen Namen. Dateien werden übrigens mit dem with Statement geöffnet und nicht explizit mit open und close.
Vielen dank, es wird gleich umgeschrieben ;) das tolle daran, ich verstehe es, also, ich lerne es nicht auswendig, sonder weis im detail wie ich es besser machen kann und wieso. :)

Zum Zitat, "Builtin file", wird überschieben, wie meinst du das, was ist eine "builtin file". Sorry, aber anstatt google zu fragen, benutz ich doch lieber gerade diesen faden, mit antworten von Menschen. ;) Wie gesagt, ich bin ein leie und hoffe, oder währe zumindest dankbar, fals es was höheres ist, das es Du mir leien-verständlich erklären könntest, bitte.

Post Scriptum:

Das mit dem öffnen ist mir klar, wird auch noch verbessert. Da ersparrt man sich ja auch z.b. das file.close() ;)
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

In python gibt es Variablennamen, die bereits vorbelegt sind: Funktionen zum Beispiel: max, min, map. Eine Liste davon findest du hier [1]. file gehört auch dazu: http://docs.python.org/library/functions.html#file . In der Schleife "for file in files:" überschreibst du diesen aber, sprich du kannst in der Schleife nicht mehr auf das builtin file zugreifen, weil du ihn ja mit Elementen aus files überschrieben hast. Um das zu umgehen, wählst du einfach einen anderen Variablennamen für file.

[1] http://docs.python.org/library/functions.html
smodo
User
Beiträge: 49
Registriert: Dienstag 18. August 2009, 23:45

wunderbar verständlich ;) danke dir anogayales, aber eine frage:

Es funktioniert an sich eig. gut, hab es natürlich ausprobiert.

Code: Alles auswählen


smodus@hobbits:~/Downloads$ python sif.py

{S.I.F} - Search In File

Bitte Pfad eingeben: /
Datei endung: txt
welches wort suchen: gates
{/home/smodus/Downloads/Twisted-12.2.0/twisted/python/zsh} -- {README.txt}
{/usr/lib/python2.7/dist-packages/twisted/python/zsh} -- {README.txt}
{/usr/share/pyshared/twisted/python/zsh} -- {README.txt}
{/usr/share/perl/5.14.2/unicore} -- {Blocks.txt}
{/usr/share/libtextcat/ShortTexts} -- {scots.txt}
{/usr/share/libtextcat/ShortTexts} -- {romanian.txt}
smodus@hobbits:~/Downloads$ 
Ist den trotzdem da ein fehler zu erkennen ?

Für mich z.b. gibt es auf dem Laptop einen, da gibt es immer eine "Clock.txt" die fehlerhaft sein soll.
Das was ich jetzt aber gerade gepostet habe, ist auch vor ca. 2 minuten, auf meinem rechner, ausgeführt worden.

Edit:
Es ist 100% von mir, es ist nur im Download Ordner weil ich es von Ubuntu One holen musste. :)
Der Zynismus ist meine Rüstung, der Sarkasmus mein Schwert und die Ironie mein Schild.
BlackJack

@smodo: Im ersten Program ist das ``int(input(...`` sinnfrei und ein wenig gefährlich. An den ``print``-Anweisungen sieht man, dass es Python 2 ist — da führt `input()` die eingegebene Zeichenkette als Python-Ausdruck aus. Der Benutzer kann damit also beliebige Python-Ausdrücke im Kontext des Programms ausführen lassen. Wenn man eine literale ganze Zahl eingibt, dann wird die auch zu so einer ausgewertet, also ist das `int()` überflüssig. Man sollte aber `input()` besser durch `raw_input()` ersetzen — dann macht auch das `int()` an der Stelle Sinn.

Beim zweiten Programm verwendest Du ein ”nacktes” ``except`` ohne konkrete Ausnahme — damit wird *jede* Ausnahme an der Stelle behandelt, in dem behauptet wird, die Datei konnte nicht geöffnet werden. Das passiert auch wenn Du Dich irgendwo bei einem Namen vertippt hast, oder wenn der Arbeitsspeicher zu voll ist, oder wenn die Ausgabe nicht geschrieben werden konnte, oder…

Es wäre sinnvoller hier wirklich nur Ausnahmen zu behandeln, die Dateiprobleme behandeln und dann auch deren Meldung auszugeben. Dann müsstest Du vielleicht nicht rätseln warum dir eine Datei Probleme bereitet.

Das skaliert übrigens nicht gut wenn man auf Dateien trifft, die nicht komplett in den Arbeitsspeicher gelesen werden können. Und selbst bei solchen wo das noch geht, kann es trotzdem ungünstig sein, wenn sie gross sind.
Antworten