I am trying to learn Python for fun. I'm doing an online lesson at codecademy.com, but I have no idea what I have to do.
I'm trying to compare 's' parameter with other parameter (string parameter), and the returned value should be "Sorry".
def shut_down(s):
return s
if s == 'yes':
return "Shutting down"
elif s == 'no':
return "Shutdown aborted"
else:
return "Sorry"
so I call the function:
shut_down('lhagvbs')
It always returns, "Your function failed on the message yes. It returned 'yes' when it should have returned 'Shutting down'"
And i think my code does not work. Not even the def function is correct.
Please explain why, what, where, etc.
Sorry, I do not speak/write English well, but I hope it's understandable.
(This is not homework).
You need to remove the return s as you are returning s regardless, all the code after return s is unreachable so you never evaluate your if/elif or else:
def shut_down(s):
if s == 'yes':
return "Shutting down"
elif s == 'no':
return "Shutdown aborted"
else:
return "Sorry"
In keeping with the fact you can only return once from any function, you can also forget the elif and else:
def shut_down(s):
if s == 'yes':
return "Shutting down"
if s == 'no':
return "Shutdown aborted"
return "Sorry"
Related
The expected output is that it will recur until the user gives a yes or no answer, and if they give yes execute code, in this case just print "yep". everything works if the user inputs "Y" right away, but when the input is illegal and the program asks for another input the user input check stops working.
Example:
(Y/N) y
yep
ends
(Y/N) illegal
Something went wrong, make sure you made the right input and try again!
(Y/N) y
ends
What am I doing wrong ?
def user_choice():
answer = input("(Y/N) ")
if answer.lower() == "n": return False
elif answer.lower() == "y": return True
else:
print("Something went wrong, make sure you made the right input and try again!")
user_choice()
if user_choice(): print("yep")
Couple things:
You're missing the a line with the function signature in your code. I'll assume it's supposed to look like this:
def user_choice():
You're not returning anything when the code takes the else path, so nothing gets returned when the initial choice is illegal (actually None gets returned). So update your function like so:
answer = input("(Y/N) ")
if answer.lower() == "n": return False
elif answer.lower() == "y": return True
else:
print("Something went wrong, make sure you made the right input and try again!")
return user_choice() # <-- need to return a meaningful value here
Recursion is a terrible choice for solving this type of problem. A loop is simpler to write, easier to read, and performs better:
def user_choice():
while True:
answer = input("(Y/N) ")
if answer.lower() == "n": return False
elif answer.lower() == "y": return True
print("Something went wrong, make sure you made the right input and try again!")
Don't do this recursively. That's simply the wrong choice. The solution to your immediate problem is that you need return user_choice() not just user_choice(), but an iterative solution is much smarter:
def user_choice():
while True:
answer = input("(Y/N) ")
if answer.lower() == "n":
return False
elif answer.lower() == "y":
return True
else:
print("Something went wrong, make sure you made the right input and try again!")
if user_choice():
print("yep")
You did not return the result of the recursion. You can use something like this.
def user_choice():
answer = input("(Y/N) ")
if answer.lower() == "n": return False
elif answer.lower() == "y": return True
else:
print("Something went wrong, make sure you made the right input and try again!")
user_choice()
if user_choice(): print("yep")
Here is my pyhton practice program:
def shut_down(s):
return s
if yes():
shut_down("Shutting down")
elif no():
shut_down("Shutdown aborted")
else:
shut_down("Sorry")
the question given to me are:
if the shut_down function receives an s equal to "yes", it should return "Shutting down"
elif s is equal to "no", then the function should return "Shutdown aborted".
if shut_down gets anything other than those inputs, the function should return "Sorry"
Couple of points:
Misplaced return statement. Should be at end.
if yes(): It is wrong. You want to compare function input with yes. It should be if s == 'yes':. Same for rest also.
Since you have written function definition as def shut_down(s):, it is expecting one argument. You should pass one argument while calling this function as shutdown(yes)
Once you called function and since your function has return statement, it will return some value, which you should catch like ret = shutdown(yes)
def shut_down(s):
if s == "yes":
r = "Shutting down"
elif s == "no":
r = "Shutdown aborted"
else:
r = "Sorry"
return r
ret = shut_down("yes")
print (ret)
something shorter than the best answer:
def shut_down(s):
if s == "yes":
return "Shutting down"
elif s == "no":
return "Shutdown aborted"
else:
return "Sorry"
print shut_down("algo")
def shut_down(s):
if s == "Yes":
return s == "Shutting down"
elif s == "No":
return s == "Shutdown aborted"
else:
return s == "Sorry"
As others pointed out in comments your return should at the logical end of your function.
def shut_down(s):
if s == "yes":
r = "Shutting down"
elif s == "no":
r = "Shutdown aborted"
else:
r = "Sorry"
return r
I don't understand why this function doesn't print the text I want it to print, what could I change?
def shut_down(answer):
if answer == "Yes" or "YES" or "yes":
print "Shutting down..."
return "Shutting down..."
if answer == "No"or "NO" or "no":
print "Shutdown aborted!"
return "Shutdown aborted!"
else:
print "Sorry, I didn't understand you."
return "Sorry, I didn't understand you."
shut_down(yes)
I guess the language is Python. The or operator operate between conditions, so you need to do
answer == "yes" OR answer == "YES"
etc ....
Your answer == "Yes" Or "YES" is always true because "YES" is considered as an true condition.
if answer.lower() == 'yes':
That's how you should do it. Actually, do this: if answer.lower() in ('yes', 'y'): to make it more convenient for lazy people like myself.
Anyway, the proper way to check for a list of strings is this:
if answer in ('foo', 'bar', 'foobar'):
The following is not correct (the body of the if always executes):
if answer == "Yes" or "YES" or "yes":
Instead, write
if answer in {"Yes", "YES", "yes"}:
or
if answer.lower() == "yes":
You want to change it to this:
if answer == "Yes" or answer == "YES" or answer == "yes":
print "Shutting down..."
return "Shutting down..."
Or even tidier:
if answer in ["Yes", "YES", "yes"]:
or even moar tidier:
if answer.lower() == "yes":
You code probably has an error because you do not have the variable yes defined anywhere.
Define it, and then you should be good.
I am talking about the variable you are passing to your shut_down function
This question already has answers here:
Why does "a == x or y or z" always evaluate to True? How can I compare "a" to all of those?
(8 answers)
Closed last year.
I'm learning python on codecademy and my current task is this:
Write a function, shut_down, that takes one parameter (you can use
anything you like; in this case, we'd use s for string). The shut_down
function should return "Shutting down..." when it gets "Yes", "yes",
or "YES" as an argument, and "Shutdown aborted!" when it gets "No",
"no", or "NO".
If it gets anything other than those inputs, the function should
return "Sorry, I didn't understand you."
Seemed easy to me but somehow I still can't do it.
My code I made to test the function:
def shut_down(s):
if s == "Yes" or s == "yes" or s == "YES":
return "Shutting down..."
elif s == "No" or "no" or "NO":
return "Shutdown aborted!"
else:
return "Sorry, I didn't understand you."
i = input("Do you want to shutdown?")
print(i) #was to test the input
print(shut_down(i)) #never returns "Sorry, I didn't understand you"
It works fine for the no's and yes', but somehow if I put a space before any yes or even if I just type in "a" it prints "Shutdown aborted!" although it should print "Sorry, I didn't understand you".
What am I doing wrong?
You forgot to write s == "no" in your first elif:
def shut_down(s):
if s == "Yes" or s == "yes" or s == "YES":
return "Shutting down..."
elif s == "No" or "no" or "NO": # you forgot the s== in this line
return "Shutdown aborted!"
else:
return "Sorry, I didn't understand you."
Do this:
def shut_down(s):
if s == "Yes" or s == "yes" or s == "YES":
return "Shutting down..."
elif s == "No" or s == "no" or s == "NO": # fixed it
return "Shutdown aborted!"
else:
return "Sorry, I didn't understand you."
This is because:
elif s == "No" or "no" or "NO": #<---this
elif s == "No" or True or True: #<---is the same as this
Since this is the accepted answer I'll elaborate to include standard practices: The convention for comparing strings regardless of capitalization (equalsIgnoreCase) is to use .lower() like this
elif s.lower() == "no":
Instead of checking for different combinations of capitalization you could uses the lower function to return a copy of s in lowercase and compare against that.
def shut_down(s):
if s.lower() == "yes":
return "Shutting down..."
elif s.lower() == "no":
return "Shutdown aborted!"
else:
return "Sorry, I didn't understand you."
This is much cleaner and easier to debug. Alternatively you could use upper also and compare against "YES" and "NO".
If this doesn't help because of matching cases like nO then I'd go with the in statement:
def shut_down(s):
if s in ("yes","Yes","YES"):
return "Shutting down..."
elif s in ("no","No","NO"):
return "Shutdown aborted!"
else:
return "Sorry, I didn't understand you."
Python evaluates non empty strings to be True, so your elif condition is always evaluated to True.
>>> bool('No')
True
>>> bool('NO')
True
Doing a boolean or with a True value would always return True, so it never reaches the else condition and gets stuck on the elif one.
You need to test the conditions using.
elif choice == 'no' or choice == 'NO' or choice == 'No':
EDIT - As glglgl pointed out in the comment, == binds harder than or, so your condition gets evaluated as (s == 'No') or 'no' or 'NO' and not s == ('No' or 'no' or 'NO'), in which case you would have gotten to the else part even for a user input of 'NO'.
Write a function, shut_down, that takes one parameter (you can use anything you like; in this case, we'd use s for string).
The shut_down function should return "Shutting down..." when it gets "Yes", "yes", or "YES" as an argument, and "Shutdown aborted!" when it gets "No", "no", or "NO".
If it gets anything other than those inputs, the function should return "Sorry, I didn't understand you."
The code I wrote so far is below. It makes errors, e.g. given "No" as the argument, it does not return "Shutdown aborted!" as expected.
def shut_down(s):
if s == "Yes" or "yes" or "YES":
return "Shutting down..."
elif s == "No" or "no" or "NO":
return "Shutdown aborted!"
else:
return "Sorry, I didn't understand you."
This:
s == "Yes" or "yes" or "YES"
is equivalent to this:
(s == "Yes") or ("yes") or ("YES")
Which will always return True, since a non-empty string is True.
Instead, you want to compare s with each string individually, like so:
(s == "Yes") or (s == "yes") or (s == "YES") # brackets just for clarification
It should end up like this:
def shut_down(s):
if s == "Yes" or s == "yes" or s == "YES":
return "Shutting down..."
elif s == "No" or s == "no" or s == "NO":
return "Shutdown aborted!"
else:
return "Sorry, I didn't understand you."
You can do it a couple of ways:
if s == 'Yes' or s == 'yes' or s == 'YES':
return "Shutting down..."
Or:
if s in ['Yes', 'yes', 'YES']:
return "Shutting down..."
Welcome to SO. I am going to walk through the answer, step-by-step.
s = raw_input ("Would you like to shut down?")
This asks if the user would like to shut down.
def shut_down(s):
if s.lower() == "yes":
print "Shutting down..."
elif s.lower() == "no":
print "Shutdown aborted!"
else:
print "Sorry, I didn't understand you."
This is probably new to you. If you have a string, and then .lower() it changes all input from s to lowercase. This is simpler than giving a list of all possibilities.
shut_down(s)
This calls the function.
def shut_down(s):
return ("Shutting down..." if s in("Yes","yes","YES")
else "Shutdown aborted!" if s in ("No","no","NO")
else "Sorry, I didn't understand you.")
GordonsBeard's idea is a good one. Probably "yEs" and "yES" etc are acceptable criteria;
Then I propose in this case:
def shut_down(s,d = {'yes':"Shutting down...",'no':"Shutdown aborted!"}):
return d.get(s.lower(),"Sorry, I didn't understand you.")
I know this doesn't exactly fit the specification but this is another common option which would catch a few more permutations:
def shut_down(s):
s = s.upper()
if s == "YES":
return "Shutting down..."
elif s == "NO":
return "Shutdown aborted!"
else:
return "Sorry, I didn't understand you."
def shut_down(phrase):
word = phrase
return word
take_action = input(shut_down('do you want to shutdown the program?: '.title()))
if take_action.lower() == 'yes':
print('Shutting down...')
elif take_action.lower() == 'no':
print('Shutdown aborted!')
else:
print('Sorry, I didn\'t understand you.')
I'm a python programmer and have finished Codecademy. I see that you have a problem and let me give you my answer. It runs perfectly
def shut_down(s):
if s == "yes":
return "Shutting down"
elif s == "no":
return "Shutdown aborted"
else:
return "Sorry"
You can try this code:
def shut_down(s):
if s =="yes":
return "Shutting Down"
elif s =="no":
return "Shutdown aborted"
else:
return "Sorry"
print shut_down("yes")
The code from the user 'grc' posted here, almost worked for me. I had to tweak the return message to get it right.
If the message (meaning all returned strings) are not exactly the same as described on Codecademy, then the workspace will not validate your response.
def shut_down(s):
if s == "Yes" or s == "yes" or s == "YES":
return "Shutting down"
elif s == "No" or s == "no" or s == "NO":
return "Shutdown aborted"
else:
return "Sorry"