2017-09-06 3 views
1

J'ai été aux prises avec le problème booléenne suivante:Fonction manipulation des nombres à virgule flottante pour produire un booléen

Ecrivez une even_int fonction qui consomme tout type de données, produit True si elle est un entier pair, et produit Faux sinon.

j'ai écrit:

def even_int(any): 
    return type(any) != type("a") and float(any % 2 == 0.0) 

Commentaires sur votre programme:

Assurez-vous que votre fonction fonctionne lorsque l'entrée est un nombre à virgule flottante.

Je ne comprends pas vraiment ce commentaire. Je mets le flotteur à l'avant donc ça devrait être couvert. J'ai également essayé sans le flotteur ou la décimale sur le 0.

+1

Pourquoi avez-vous un test pour les chaînes au début? Que devrait-il se passer quand quelqu'un passe, disons, une liste? –

+0

Vous produisez également un 'float()', pas un booléen. Vous ne renvoyez pas 'True', vous renvoyez' 1.0'. –

+0

@LiviuIosif Si votre question a été suffisamment traitée, vous pouvez [accepter la réponse qui vous a le plus aidé] (https://stackoverflow.com/help/someone-answers). –

Répondre

0

Je pense que vous devriez juste vérifier directement si tout est un type entier. Je ne pense pas non plus que vous avez besoin de mettre un flotteur autour any % 2 == 0

def even_int(value): 
    return isinstance(value, int) and value % 2 == 0 

EDIT: si vous voulez accepter des flotteurs ainsi,

def even_int(value): 
    return isinstance(value, (float, int)) and value % 2 == 0 
0

Vous êtes probablement des choses overthinking. Un appel isinstance devrait suffire si vous faites le contrôle avec numbers.Real.

import numbers 
def even_int(x): 
    return isinstance(x, numbers.Real) and not x % 2 

Notes:

In [114]: issubclass(int, numbers.Real) 
Out[114]: True 

In [115]: issubclass(float, numbers.Real) 
Out[115]: True 

In [117]: issubclass(str, numbers.Real) 
Out[117]: False 
0

Je voudrais essayer cela - il est pythonique en ce qu'elle demande pardon plutôt que la permission en essayant de convertir en un entier (cela signifie qu'il fonctionne pour les chaînes comme bien) et attrape le TypeError pour retourner False si cela ne fonctionne pas non plus.

def even_int(v): 
    try: 
     return int(v) % 2 == 0 #will trigger exception if v cannot be cast to int 

    except (TypeError, ValueError): 
     return False 

EDIT: simplifié basé sur les commentaires

+1

1) 'any' n'est pas un bon choix pour un nom de variable - il y a une fonction interne appelée' any' qui va s'illusionner (bien que je réalise que vous prenez ça du code OPs) ... 2) 'peut être' return int (valeur)% 2 == 0' ... –

+0

1) bon point - j'utilisais le nom de variable OPs :) va changer 2) oui je me rends compte que, mais j'espérais que ce serait un peu plus clair ce qui se passait mon chemin, mais va modifier pour ajouter :) –

+1

effectivement - un autre problème - even_int (2.3) renvoie vrai que la conversion float tronque –