Sloganmaker in Python

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
SemperPython

Hallo!
Ich möchte hier mein neues Projekt vorstellen: Sloganmaker
Die Sloganstücke sind von www.sloganmaker.com, der Code von mir.
Wegen der langen Liste sieht der Code etwas merkwuerdig aus.

Code: Alles auswählen

import random
slogans = ["ist gut fuer die Nerven", "kann es better", " - Vorsicht!Zerbrechlich!", "der wahre Traum.", "ist unmoeglich", " - bleibt immer die Nummer 1.", "fuer die Rest der Nacht", "4eva!",
           "wuerde fuer alles kaempfen","mach dich frisch", "fuer Vergnuegen und Energie", "verbindet.", "ist bei dir innen drin", "ist unglaublich", "ist immer frisch", "ist zueruck",
           " - and where is you god now?", " - Solange der Vorrat reicht","drowned too","fuer ein lebendigeres Leben", "- einfach das frischeste","rettet deine Nerven","Nonstop",
           "macht dich besser"," - eine niemals endende Story","geht unter die Haut"]
word = input("Tippen Sie ein Wort ein,wie z.B. ihren Namen, um ein Slogan zu erstellen: ")
def slogans_machen():
    print(word, random.choice(slogans))
        
slogans_machen()
ende = input("Noch ein Slogan? Y/N ")
if ende == "Y":
    slogans_machen()
Zuletzt geändert von SemperPython am Sonntag 19. Mai 2013, 11:22, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3558
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

slogans_machen ist der falsche Begriff. Erstens ist es nur ein Slogan (nicht mehrere) und zweitens macht die Routine den Slogan nicht nur, sondern gibt ihn auch noch aus. Zweiteres würde ich vermeiden, da du dir damit unnötig Flexibilität wegnimmst.

Du kannst damit das Modul nicht sinnvoll woanders einbinden um dir nur einen Slogan erstellen zu lassen und ihn dann beispielsweise auf einer Webseite auszugeben.

Du beschränkst dich auf Slogans in denen das eingegebene Wort am Anfang steht. Mit passender Stringformatierung kann man das auch anders gestalten

Zum Schluss kannst du mit deinem Ansatz nur eine einzige Wiederholung durchführen.

Die lange Liste kannst du problemlos direkt im Sourcecode auf mehrere Zeilen verteilen.

Code: Alles auswählen

import random

slogans = [
    'bedeutet Freundschaft',
    'bringt Erinnerungen zurück',
    'hat es',
    'ist der Unterschied',
    'Ohne {} geht es nicht',
    'Sag es mit {}'
    ]

def create_slogan(word):
    slogan = random.choice(slogans)
    if not '{' in slogan:
        slogan = '{} ' + slogan
    return slogan.format(word)

def main():
    word = raw_input("Geben Sie ein Wort ein, wie z.B. Ihren Namen, um einen Slogan zu erstellen: ")
    while True:
        print(create_slogan(word))
        result = input('Noch einen Slogan? Y/N ')
        if result not in 'yY':
            break

if __name__ == '__main__':
    main()
Bei der Stringformatierung habe ich einfach den passenden Platzhalter an die erste Stelle gesetzt wenn im Slogan-Template nicht bereits ein Platzhalter vorhanden ist. Die Y/N-Abfrage könnte man noch schöner gestalten, aber das soll erst einmal reichen
SemperPython

Ja, ich wollte schon so einiges fixen.Das Programm habe ich mal soeben schnell geschrieben und ich fand ihn gut genug um ihn vorzustellen.Leider stimmt es doch nicht :D .Man lernt nie aus.Das "ende" Problem und das Problem,in dem das eingebebene Wort am Anfang steht.Aufjedenfall; danke fuer deine Antwort.

Was macht :

Code: Alles auswählen

if __name__ == '__main__':
    main()
?
Zuletzt geändert von SemperPython am Donnerstag 6. Dezember 2012, 19:33, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3558
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Bitte keine unnötigen Vollzitate.
SemperPython hat geschrieben:Was macht :

Code: Alles auswählen

if __name__ == '__main__':
    main()
?
__name__ enthält den String '__main__' wenn es sich um das Hauptprogramm handelt. Wurde das Modul hingegen importiert, dann enthält __name__ den Namen des Moduls. Wird das Programm importiert, so ist __name__ nicht '__main__' und der Aufruf von main() wird nicht durchgeführt.

Probiere es einfach mal aus.

foo.py

Code: Alles auswählen

print(__name__)
bar.py

Code: Alles auswählen

import foo
print(__name__)
Ruf einmal foo.py und einmal bar.py auf und achte auf die Ausgaben.

Man erreicht damit, dass man Code viel leichter wiederverwenden kann. So kann man mit diesem Ansatz das slogans-Modul importieren um die Funktion zum Erstellen eines Slogans zu benutzen ohne dass der interaktive Code ausgeführt wird.
SemperPython

Die graphische Oberfläche habe ich schon gemacht:

Code: Alles auswählen

import random
import tkinter

root = tkinter.Tk()

slogans = ["ist gut fuer die Nerven",
           "kann es besser",
           " - Vorsicht!Zerbrechlich!",
           "der wahre Traum.",
           "ist unmoeglich",
           " - bleibt immer die Nummer 1.",
           "fuer die Rest der Nacht",
           "4eva!",
           "wuerde fuer alles kaempfen",
           "mach dich frisch",
           "fuer Vergnuegen und Energie",
           "verbindet.",
           "ist bei dir innen drin",
           "ist unglaublich",
           "ist immer frisch",
           "ist zueruck",
           " - and where is you god now?",
           " - Solange der Vorrat reicht",
           "drowned too",
           "fuer ein lebendigeres Leben",
           "- einfach das frischeste",
           "rettet deine Nerven",
           "Nonstop",
           "macht dich besser",
           " - eine niemals endende Story",
           "geht unter die Haut"
           ]

def slogans_machen():
    word = Textfeld.get()
    label["text"] = word, random.choice(slogans)
    
Textfeld = tkinter.Entry(root)
Textfeld.pack()

button = tkinter.Button(root, text = "Slogan", command=slogans_machen)
button.pack()

label = tkinter.Label(root, text = "")
label.pack()

root.mainloop()
Wie findet ihr ihn?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Zu viel Code der Modul-Global ist. Verpack dass in Funktionen und nutze den ``main()``-Trick den dir /me gerade erklärt hat.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten