Почему выводит None значение?

Imagine you're writing a cash register application. To make interaction easier on the user, it doesn't have separate areas for passwords, PIN numbers, or cash totals -instead, it looks at what the cashier enters and infers whether it's their PIN number, their password, or the cash total for a transaction. The register makes this decision with the following rules:

  • If the cashier entered only digits, then it's a PIN number.

  • If the cashier entered a decimal number, then it's the transaction amount.

  • If the cashier entered anything else, then it's theirpassword. Write a function named interpretCashier. interpretCashier should take one parameter as input, which will always be a string initially.

  • If the string entered represents a PIN number, return "PIN".

  • If the string entered represents a transaction amount, return "Transaction".

  • If the string entered represents a password, return "Password".

В общем вот такая задача есть!
Ее легко можно решить используя функции isdigit или replace.

    def interpretCashier(as_string):
        if as_string.isdigit() == True:
            return "PIN"
        elif as_string.replace('.', '', 1).isdigit() == True:
            return "Transaction"
        else:
            return "Password" 

Однако нужно помощь в решении без этих функций. И вот тут я застрял:

    def interpretCashier(as_string):
        try:
            if int(as_string) == True:
                return "PIN"
            elif  float(as_string) == True:
                return "Transaction"
        except ValueError:
            return "Password"

    print(interpretCashier("24.59"))
    print(interpretCashier("123456"))
    print(interpretCashier("my$up3rs3cur3p4$$w0rd"))

Почему выводит результат None?
И почему int(as_string) == True эта строка не читается?


Ответы (4 шт):

Автор решения: alex

потому что True это 1, а False это 0

>>> print(1.2 == True)
False
>>> print(1234 == True)
False

У вас нет блока else в условии, а функция по умолчанию возвращает None

>>> def foo(): pass
... 
>>> print(foo())
None

Очевидно, что если перестать сравнивать с True, то все заработает

def interpretCashier(as_string):
    try:
        if int(as_string):
            return "PIN"
        elif  float(as_string):
            return "Transaction"
    except ValueError:
        return "Password"

print(interpretCashier("24.59"))
print(interpretCashier("123456"))
print(interpretCashier("my$up3rs3cur3p4$$w0rd"))
→ Ссылка
Автор решения: Alpensin
def interpretCashier(as_string):
    if as_string.isdigit():
        return "PIN"
    try:
        float(as_string)
        return "Transaction"
    except ValueError:
        return 'Password'
→ Ссылка
Автор решения: Xander

int и float не проверяют принадлежность к типу, а пытаются привести к этому типу.

Поэтому сравнения типа int(as_string) == True будут делать совсем не то, что вы хотите.

Например, если as_string - строка "1234", то int(as_string) будет целым числом 1234. А оно, очевидно, не равно True.

Поэтому это условие оказывается ложное, точно так же как и условие с float. Поэтому ни один из ретурнов не выполняется и выводится None.

На экзепшнах логику можно построить как-то так:

def interpretCashier(as_string):
    
    try:
        int(as_string)
        return "PIN"
    except ValueError:
        pass
    
    try:
        float(as_string)
        return "Transaction"
    except ValueError:
        return "Password"
→ Ссылка
Автор решения: insolor

Можно реализовать через "каскадный" try-except, и вообще без if

def interpretCashier(as_string):
    try:
        int(as_string)
        return "PIN"
    except ValueError:
        try:
            float(as_string)
            return "Transaction"
        except ValueError:
            return "Password"
 

print(interpretCashier("24.59"))
print(interpretCashier("123456"))
print(interpretCashier("my$up3rs3cur3p4$$w0rd"))
→ Ссылка