Je travaille sur un générateur simple qui crache 1 état aléatoire aux États-Unis, suivi d'une ville et d'un code postal de cet état, je veux que mon RNG ait au moins 10 villes parmi lesquelles choisir. (suivi du zip codes de cette ville) Dois-je vraiment créer 50 classes différentes pour chaque état et fournir 10 méthodes pour chaque classe? Chaque méthode renvoie simplement le texte à l'utilisateur. Rien de spécial. Mais j'ai l'impression qu'il y a quelque chose qui ne va pas ici. Je sais qu'il existe un moyen plus simple de le faire avec moins de lignes de code. Ai-je tort? Veuillez regarder la partie de mon code si vous êtes confus.
Comment suis-je supposé obtenir seulement 1 sortie de 50 classes différentes? Puis-je créer un tableau de toutes les classes puis faire random.choice ()
Je ne veux pas écrire une tonne de code sans raison donc je n'ai fourni qu'un Newyork
classe avec 3 méthodes. Mais faisons comme si j'avais 50 de ces classes avec 10 méthodes
import tkinter as tk import random class Newyork: def bronx(self): bronx_zips = [10453, 10457, 10460, 10451, 10474] random_bronx_zips = random.choice(bronx_zips) new_bronx_zip = "Bronx NY,", random_bronx_zips return new_bronx_zip def albany(self): albany_zips = [12084, 12201, 12202, 12203, 12204] random_albany_zips = random.choice(albany_zips) new_albany_zip = 'Albany NY,', random_albany_zips return new_albany_zip def buffalo(self): buffalo_zips = [14201,14202, 14203, 14204, 14205] random_buffalo_zip = random.choice(buffalo_zips) new_buffalo_zip = 'Buffalo NY', random_buffalo_zip return new_buffalo_zip newyork = Newyork() def random_NY_output(): NY_methods = [newyork.bronx(), newyork.albany(),newyork.buffalo()] random_ny_output = random.choice(NY_methods) return random_ny_output def update_entry(): locationstate_entry.delete(0, tk.END) locationstate_entry.insert(0, random_NY_output()) button = tk.Button(root, text="Generate", command=update_entry, activebackground="blue")
Comme vous pouvez le voir, la fonction random_NY_output ()
crache juste tout ce dont j'ai besoin pour connaître la classe newyork. Cela me donne 1 sortie aléatoire. Mais comme je l'ai dit, je n'ai besoin que d'une sortie de 50 classes différentes. Comment cela peut-il être fait?
4 Réponses :
Au lieu d'écrire des classes, utilisez des dictionnaires:
zips = { 'NY': { "Bronx NY":[10453, 10457, 10460, 10451, 10474], 'Albany NY': [12084, 12201, 12202, 12203, 12204], 'Buffalo NY': [14201,14202, 14203, 14204, 14205], }, } location = random.choice(list(zips['NY'].keys())) zip = random.choice(zips['NY'][location])
Pourquoi est-ce mieux que d'utiliser une classe personnalisée?
Et comment cela résout-il le problème du choix entre plusieurs états?
Au lieu d'utiliser une classe différente pour chaque état, créez un dictionnaire contenant toutes vos informations. Ensuite, vous pouvez générer vos chaînes en fonction de cela et coder en dur moins d'informations.
>>> def choose_from(dictionary): ... key = random.choice(list(dictionary.keys())) ... return key, dictionary[key] ... >>> def random_city_state_zip(): ... state, cities = choose_from(states) ... city, zip_codes = choose_from(cities) ... zip_code = random.choice(zip_codes) ... return state, city, zip_code ... >>> random_city_state_zip() ('NY', 'Albany', 12203) >>> random_city_state_zip() ('NY', 'Bronx', 10457)
Si c'était mon code, j'écrirais une fonction pour cela (avec une fonction d'assistance):
>>> import random >>> states = { ... 'NY': { ... 'Albany': [12084, 12201, 12202, 12203, 12204], ... 'Bronx': [10453, 10457, 10460, 10451, 10474], ... 'Buffalo': [14201,14202, 14203, 14204, 14205] ... } ... } >>> state = random.choice(list(states.keys())) >>> state 'NY' >>> cities = states[state] >>> cities {'Albany': [12084, 12201, 12202, 12203, 12204], 'Bronx': [10453, 10457, 10460, 10451, 10474], 'Buffalo': [14201, 14202, 14203, 14204, 14205]} >>> city = random.choice(list(cities.keys())) >>> city 'Bronx' >>> zips = cities[city] >>> zips [10453, 10457, 10460, 10451, 10474] >>> zip_code = random.choice(zips) >>> zip_code 10460 >>> city, state, zip_code ('Bronx', 'NY', 10460)
Pourquoi est-ce mieux que d'utiliser une classe personnalisée?
J'utiliserais toujours une classe à n'importe quel niveau que vous allez créer et l'appeler le plus, mais j'exécuterais la logique sous-jacente de cette façon pour vous simplifier la vie. Au lieu d'avoir à créer une nouvelle fonction pour chaque ville, vous pouvez simplement obtenir les informations nécessaires et avoir une fonction partagée rassembler les données pour vous dans le format que vous voulez.
Oh, je viens de voir que vous vouliez aussi un état aléatoire. Donc, je voudrais plutôt envelopper cela dans une classe qui choisit un état aléatoire, choisit une ville au hasard dans cet état et choisit un code postal aléatoire dans cet état.
@BrettBeatty Je veux un zip aléatoire de la ville. Pas état
ville, état aléatoire, code postal
Exemple: Albany NY, 12084
Ouais, je voulais dire ville, pas état. Et vous pouvez utiliser les informations comme vous le souhaitez. J'ai inclus un exemple de fonction qui les renvoie sous forme de tuple.
Étant donné que chaque État se comporte de la même manière que tous les autres États et que chaque ville se comporte de la même manière que toutes les autres villes, la seule vraie différence réside dans les données propres à chaque ville ou État (noms, codes postaux).
Vous pouvez créer une classe unique qui prend des arguments qui définissent les choses uniques à un état, comme le nom et l'abréviation. Les villes peuvent être un attribut de l'état qui sont soit ajoutés avant, après ou pendant la création de l'état.
Par exemple:
new_york = State("New York", "NY", cities = [ City("Albany", zips=[12084, 12201, 12202, 12203, 12204]), City("Bronx", zips=[0453, 10457, 10460, 10451, 10474]), ])
ou ceci:
albany = City("Albany", zips=[12084, 12201, 12202, 12203, 12204]) bronx = City("Bronx", zips=[0453, 10457, 10460, 10451, 10474]) new_york = State("New York", "NY", cities=[albany, bronx])
ou les combiner avec ceci:
new_york = State("New York", "NY") new_york.add_city("Albany", zips=[12084, 12201, 12202, 12203, 12204]) new_york.add_city("Bronx", [0453, 10457, 10460, 10451, 10474])
Vous pouvez ensuite ajouter vos méthodes de choix aléatoires dans un générique façon, car ils ont juste à tirer de self.zips
pour une ville, ou de self.cities
pour un état. Ou, vous pouvez parcourir chaque État et / ou chaque ville d'un État. Tout cela est assez simple et dépend de ce que vous devez faire.
Le but étant de créer des classes d'état et / ou de ville génériques et des méthodes génériques qui choisissent parmi les données uniques pour chaque instance.
Pour autant que je sache d'après votre exemple de code publié, votre exigence est de fournir à plusieurs reprises un tuple ("City ST", zip)
aléatoire à partir d'un ensemble prédéfini de telles valeurs.
p> Cela n'a même pas besoin d'une seule classe, car il ne fait rien de classe. (Voici une vidéo bonus sur le fait de ne pas écrire de cours: Arrêtez d'écrire des cours .) P >
Faites simplement une grande liste de tuples et utilisez random.choice
(ou .shuffle
si cela a plus de sens pour votre application globale) pour faire le travail:
_places = [] _places.extend((("Albany NY", zip) for zip in (12084, 12201, 12202, 12203, 12204)) _places.extend((("Bronx NY", zip) for zip in (10453, 10457, 10460, 10451, 10474)) _places.extend((("Buffalo NY", zip) for zip in (14201,14202, 14203, 14204, 14205)) # Many, many lines omitted... def random_place(): return random.choice(_places) def update_entry(): locationstate_entry.delete(0, tk.END) locationstate_entry.insert(0, random_place())
J'ai une ligne comme celle-ci Newjersey.extend (("Syracuse1 NY", zip) pour zip dans [08732, 08735, 08751, 08753, 08754, 08755, 08756])
Il semble que cela ne fonctionne pas car tous les codes postaux commencent par un zéro. Pourquoi reçois-je une erreur "jeton non valide"
Ça ne fait rien. Je l'ai compris. Je viens de convertir les codes postaux commençant par 0 en octal. Puis vient d'ajouter "0"
suivi d'un +
Non, vous n'auriez pas de classes séparées pour chaque état, mais vous ne devriez pas non plus avoir de méthodes distinctes pour chaque ville. Qu'essayez-vous de faire?
@DanielRoseman J'essaie juste de générer 1 sortie. Je veux un état aléatoire. Avec une ville et un code postal suivis
Cette conception est horrible (rien de personnel). Le but d'une classe est de servir de modèle abstrait pour des objets concrets. Ce que vous voulez, c'est
class State
et 50 instances de cette classe.