1
votes

Évaluation de la sortie de plusieurs fonctions qui renvoient Vrai ou Faux

Je suis donc tombé sur ce problème intéressant: il s'agit essentiellement de nombreuses fonctions qui renvoient Vrai ou Faux dans une fonction et je veux que cette fonction secondaire renvoie Vrai ou Faux en appliquant une logique ET ou OU à tous les fonctionne en son sein. Je sais que c'est une manière terrible d'expliquer alors voyons du code qui, espérons-le, l'expliquera mieux

#this is the first function that return True or False
def f(x):
    if x == 1:
        return True
    elif x == 0:
        return False
#this is the function that takes the first one and I want it to return either True or False based on an AND logic
def g(f):

    f(1)
    f(0)
    f(0)
    f(1)
    f(1)
    f(0)
    f(1)

Maintenant, je sais que je peux simplement écrire la deuxième fonction avec 'et' entre tous les f ( x) que j'appelle mais qui semble très moche et je veux donc quelque chose qui évaluera tout cela et me renverra une valeur. Je n'ai pas assez d'expérience avec les méthodes d'écriture qui acceptent plusieurs entrées et aussi plusieurs entrées qui varient donc j'apprécierais toute aide à ce sujet.


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser le all une> fonction qui équivaut à un ET logique:

all(f(i) for i in range(5))

Maintenant concernant la fonction g vous pouvez faire ceci (par exemple):

all(map(f, range(5))) # More or less equivalent to all(g(f, range(5))) 

Ici, vous pouvez remplacer range (5) par l'un des [0, 1, 2, 3, 4] , (0, 1, 2, 3, 4) , {0, 1, 2, 3, 4} , et bien d'autres (c'est-à-dire tout itérable).

Notez qu'une fonction similaire à g existe également en python, elle s'appelle map , vous pouvez l'utiliser de cette façon:

def g(f, inputs):
  for i in inputs:
    yield f(i)

all(g(f, range(5)))

Vous pouvez également créer directement utilisez une expression de générateur ( une alternative au yield générateur em> ):

def f(x):
  return x < 5

all((f(1), f(2), f(3), f(4)))

Laquelle de cette solution est la meilleure dépend vraiment du cas d'utilisation et de vos préférences personnelles (même si la dernière est probablement celui que vous verrez le plus souvent).


2 commentaires

Bonne réponse, bravo pour l'effort, mais c'était aussi très long et je pensais que quiconque rencontrait ce problème voudrait une solution plus rapide, alors j'ai choisi la plus courte. Mais vos détails sont excellents et ils sont très utiles. J'espère que vous ne m'en voulez pas.


Pas de problème, la solution la plus pythonique est probablement all (map (f, ...)) mais celle que la plupart des gens écriraient probablement (et préféreraient donc lire) est all (f ( i) pour i dans ...) .



0
votes

Pour la fonction AND , vous pouvez utiliser de python all , et pour la fonction OR , vous pouvez utiliser any

print(all([f(1),f(1)]))
print(all([f(0),f(0)]))
print(any([f(1), f(0)]))
print(any([f(0), f(0)]))
#True
#False
#True
#False

Ajoutez simplement toutes vos sorties dans une liste et évaluez all ou any , donc considérant la fonction f que vous avez définie

>>> all([True, False])
False
>>> all([True, True])
True
>>> any([True, False])
True
>>> any([True, True])
True
>>> any([False, False])
False


0 commentaires

2
votes

Vous pouvez utiliser all et une compréhension sur les arguments variables ( * args ) de la fonction:

>>> def f(x):
...     if x == 1:
...         return True
...     elif x == 0:
...         return False
... 
>>> def g(f, *args):
...     return all(f(x) for x in args)
... 
>>> g(f, 1, 0, 0, 1)
False
>>> g(f, 1, 1, 1)
True


1 commentaires

Concis et efficace, je le creuse