Reputation: 67
So I'm trying to learn Python using codecademy but I'm stuck. It's asking me to define a function that takes a list as an argument. This is the code I have:
# Write your function below!
def fizz_count(*x):
count = 0
for x in fizz_count:
if x == "fizz":
count += 1
return count
It's probably something stupid I've done wrong, but it keeps telling me to make sure the function only takes one parameter, "x". def fizz_count(x):
doesn't work either though. What am I supposed to do here?
Edit: Thanks for the help everyone, I see what I was doing wrong now.
Upvotes: 4
Views: 12963
Reputation: 184081
There are a handful of problems here:
fizz_count
. But fizz_count
is your function. x
is your passed-in argument. So it should be for x in x:
(but see #3).*x
. The *
causes x
to be a tuple of all arguments. If you only pass one, a list, then the list is x[0]
and items of the list are x[0][0]
, x[0][1]
and so on. Easier to just accept x
.x
, as the placeholder for items in your list when you iterate over it, which means after the loop, x
no longer refers to the passed-in list, but to the last item of it. This would actually work in this case because you don't use x
afterward, but for clarity it's better to use a different variable name.Putting these together we get something like this:
def fizz_count(sequence):
count = 0
for item in sequence:
if item == "fizz":
count += 1
return count
I assume you're taking the long way 'round for learning porpoises, which don't swim so fast. A better way to write this might be:
def fizz_count(sequence):
return sum(item == "fizz" for item in sequence)
But in fact list
has a count()
method, as does tuple
, so if you know for sure that your argument is a list or tuple (and not some other kind of sequence), you can just do:
def fizz_count(sequence):
return sequence.count("fizz")
In fact, that's so simple, you hardly need to write a function for it!
Upvotes: 3
Reputation: 298106
Your function isn't taking a list as an argument. *x
expands to consume your passed arguments, so your function is expecting to be called like this:
f(1, 2, 3)
Not like this:
f([1, 2, 3])
Notice the lack of a list object in your first example. Get rid of the *
, as you don't need it:
# Write your function below!
def fizz_count(lst):
count = 0
for elem in lst:
if elem == "fizz":
count += 1
return count
You can also just use list.count
:
# Write your function below!
def fizz_count(lst):
return lst.count('fizz')
Upvotes: 1
Reputation: 5683
Try this:
# Write your function below!
def fizz_count(x):
count = 0
for i in x:
if i == "fizz":
count += 1
return count
Sample :
>>> fizz_count(['test','fizz','buzz'])
1
for i in x:
will iterate through every elements of list x
. Suggest you to read more here.
Upvotes: 0
Reputation: 2149
try this:
def fizz_count(x):
counter = 0
for element in x:
if element == "fizz":
counter += 1
return counter
Upvotes: 0
Reputation: 24816
It must be a typo. You're trying to iterate over the function name.
Upvotes: 0
Reputation: 33817
when you pass *x
to a function, then x
is a list. Do either
def function(x):
# x is a variable
...
function('foo') # pass a single variable
funciton(['foo', 'bar']) # pass a list, explicitly
or
def function(*args):
# args is a list of unspecified size
...
function('foo') # x is list of 1 element
function('foo', 'bar') # x is list with two elements
Upvotes: 1