(Python 2.7) Use a list as an argument in a function?

寵の児 提交于 2019-12-12 12:04:09

问题


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.


回答1:


There are a handful of problems here:

  1. You're trying to iterate over 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).
  2. You're accepting one argument with *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.
  3. You're using your argument, 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.
  4. Some of your variable names could be more descriptive.

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!




回答2:


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



回答3:


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')



回答4:


It must be a typo. You're trying to iterate over the function name.




回答5:


try this:

def fizz_count(x):
    counter = 0
    for element in x:
        if element == "fizz":
            counter += 1
    return counter



回答6:


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.



来源:https://stackoverflow.com/questions/16591941/python-2-7-use-a-list-as-an-argument-in-a-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!