-1
votes

Récupérer le code à l'intérieur d'une déclaration 'avec'

Ingore cette question Je n'ai clairement pas bien expliqué du tout et aucune des réponses ne semblait être sur le sujet pour ce que j'avais à l'esprit.


Dans l'exemple présenté ci-dessous, j'essaie de faire une boucle plus concise là où elle finira par ressembler à l (n) code>, l * n code> ou quelque chose de similaire. p>

Dans l'exemple indiqué, le code imprimera " bonjour " code> 5 fois (ou tout ce que je l'ai défini pour être), puis exécutez le code dans le avec code> boucle, qui n'est pas inattendu. p>

Cependant, l'idée est la boucle que le code indiqué ( passe code> dans ce cas). Comment puis-je remplacer Imprimer ("Bonjour") CODE> avec le code écrit dans l'instruction with? C'est possible? Je suppose que ce n'est pas ce que doit être utilisé un avec code> de l'instruction code>, y a-t-il une alternative? P>

class loop:
    def __init__(self, loops):
        self.loops = loops
    def __enter__(self):
        pass
    def __exit__(self, *args):
        pass

    
with loop(5):
    print("This will loop 5 times")

with loop(10):
    print("This will loop 10 times")


2 commentaires

Pourquoi pas pour _ dans la plage (5): ?


Remplacement __ non zéro __ et faire tandis que la boucle (5):


3 Réponses :


0
votes

Je ne pense pas que vous puissiez boucler via le code à l'intérieur avec le bloc code>. La chose la plus proche serait de passer Lambda en tant que deuxième paramètre.

def my_printer():
    print("hello")

for _ in range(5):
    my_printer()


9 commentaires

Est-il possible pour vous d'élaborer sur la réponse? Cela fournit simplement une solution mais n'adore pas vraiment l'utilisateur de comprendre pourquoi cela fonctionne.


Je refuserais n'importe quel code comme celui-ci que j'ai vu dans un examen de code.


@ Enthus3D Il est juste un code légèrement modifié fourni dans la question. De mon point de vue, c'est assez simple et n'a besoin d'aucune explication. Vous pensez que cela nécessite une explication, n'hésitez pas à modifier la réponse, Stackoverflow permet à cela et je pense même encourage même.


@cheppner Je voudrais également bloquer ce code dans l'examen (mais pas "rejeter" si cela signifie quelque chose de différent). Bien que je pense que la question était de savoir comment réussir la fonction comme objet de première classe dans dans le but d'apprendre.


Je n'irais pas si loin de modifier votre réponse pour cela, je ne le souligne que de l'indiquer, vous savez donc que les gens peuvent le trouver moins sympathiques si vous donnez un bloc de code sans explication, car il leur permet de rechercher les différences eux-mêmes et pourraient les confondre.


Je conviens que votre réponse est définitivement adéquate pour répondre à la question de l'Asker, et c'est du code propre, je pense que cela aurait pu être mieux si vous aviez une explication.


Non, la question était de savoir comment accéder au corps d'un avec le bloc du gestionnaire de contexte (que vous ne pouvez pas faire). C'est une solution de contournement, mais cela ne signifie pas qu'il faut écrire du code comme celui-ci.


@ Enthus3d j'ai mis à jour la réponse. Je viens de remarquer qu'il veut utiliser avec le corps en boucle. Je ne pense pas que Python permet d'appeler directement le corps.


@cheppner Yep. Le code est mauvais. Mais la question n'était pas d'évaluer la qualité du code. Je crois que c'est plus à des fins d'apprentissage de vous trouver ce que vous pouvez faire avec Python.



3
votes

J'éviterais de créer une classe du tout si vous voulez juste une boucle concise. xxx


0 commentaires

0
votes

N'utilisez pas de boucle.

LOOP DEF (N): pour _ dans la plage (n): Imprimer ("Bonjour")

boucle (5)

alors cela imprimera 5 fois "Bonjour".


6 commentaires

Existe-t-il un moyen de le faire plus «de manière dynamique», par exemple un module que vous pouvez importer cela le permettra? Définir une fonction défaite le point de réduire la quantité de code écrit.


pour _ dans la plage (n):


Imprimer ("Bonjour")


@Doot votre avec l (n): n'augagerait que 8 caractères via pour _ dans la plage (5) , ignorant le code que vous devriez écrire à définir l en premier lieu. Python fournit déjà une façon de concise, évidente de faire ce que vous voulez.


Écouter Cheppner ^^^


J'ai mis à jour la question à mesure que les fonctions ne seraient pas bien meilleures qu'une boucle, comme le dit Chepner