J'ai ces deux fonctions qui sont presque identiques à part l'instruction if dans search_genre, y a-t-il un moyen de les combiner en une seule?
La variable books est un dictionnaire où chaque valeur est une liste de dictionnaires, c'est-à-dire:
books = {'Genre1': [{name: value, author: value}, {dict}], 'Genre2': [{dict}], etc.}
view_library () imprime tous les livres et search_genre () prend une entrée utilisateur pour imprimer tous les livres d'un genre spécifique
def view_library():
for genre in books:
print(f'Genre: {genre}')
for book in books[genre]:
for key, value in book.items():
print(f"{key.title()} : {value.title()}")
print()
def search_genre(genre_type):
for genre in books:
if genre_type == genre:
print(f'{genre_type}:')
for book in books[genre_type]:
for key, value in book.items():
print(f"{key.title()} : {value.title()}")
print()
3 Réponses :
Essayez :
def search_genre(genre_type=None):
for genre in books:
if genre_type is None or genre_type == genre:
print(f'{genre_type}:')
for book in books[genre_type]:
for key, value in book.items():
print(f"{key.title()} : {value.title()}")
print()
La différence entre les 2 fonctions est que dans la première, tous les genres sont traités, tandis que dans la seconde, seul le sur choisi l'est.
La clé est l'instruction if qui détermine si le genre est imprimé: pour le moment, il ne se déclenche que si le genre correspond au genre fourni. Nous pouvons ajouter un ou pour qu'il se déclenche également si aucun genre_type n'est fourni. Maintenant, si nous appelons la fonction sans argument genre_type , elle affichera tous les genres:
def test(x=None):
for y in z:
if not x or x == y:
print(y)
z = [1,2,3,4,5,6]
test()
1
2
3
4
5
6
test(5)
5
Puisque vous ne fournissez pas un MCVE de données , voici un exemple simplifié avec des données pour montrer comment cela fonctionne:
def search_genre(genre_type=None):
for genre in books:
if not genre_type or genre_type == genre:
print(f'{genre_type}:')
for book in books[genre_type]:
for key, value in book.items():
print(f"{key.title()} : {value.title()}")
print()
Commencez par implémenter filter_by_genre à l'aide d'un filtre. C'est fondamentalement la même chose que search_genre.
def view_library():
return filter_by_genre(lambda x: True)
def search_genre(genre_type):
return filter_by_genre(lambda x: x == genre_type)
Maintenant, au lieu de passer un genre comme argument, passez un prédicat:
def filter_by_genre(p):
for genre in filter(p, books):
print(f'{genre_type}:')
for book in books[genre]:
for key, value in book.items():
print(f"{key.title()} : {value.title()}")
print()
filter_by_genre(lambda x: x == "mystery")