Почему выводит 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 шт):
потому что 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"))
def interpretCashier(as_string):
if as_string.isdigit():
return "PIN"
try:
float(as_string)
return "Transaction"
except ValueError:
return 'Password'
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"
Можно реализовать через "каскадный" 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"))