(Python 2.7)在函数中使用列表作为参数?

4

我正在尝试通过Codecademy学习Python,但我卡住了。它要求我定义一个以列表作为参数的函数。这是我现有的代码:

# Write your function below!    
def fizz_count(*x):
    count = 0
    for x in fizz_count:
        if x == "fizz":
            count += 1
    return count

我可能做错了一些傻瓜式的事情,但它一直告诉我要确保函数只接受一个名为"x"的参数。def fizz_count(x): 但这也不起作用。我应该怎么办呢?

编辑:谢谢大家的帮助,我现在知道我做错了什么。


可能是 https://dev59.com/IHE95IYBdhLWcg3wadOq 的重复问题。 - devnull
@devnull 那个问题是关于变异的,而这个问题是关于不解包 *args 的。 - askewchan
@askewchan 对的。类似于https://dev59.com/8XRA5IYBdhLWcg3wzhXZ。 - devnull
6个回答

3
这里有几个问题:
  1. 你试图迭代 fizz_count。但是 fizz_count 是你的函数,x 才是你传入的参数。因此应该是 for x in x:(但请看问题 #3)。
  2. 你使用 *x 接受一个参数。 * 会导致 x 成为包含所有参数的元组。如果你只传递一个列表,则列表是 x[0],而列表中的项是 x[0][0]x[0][1] 等等。更简单的方法是直接接受 x
  3. 在迭代列表时,你使用你的参数 x 作为其项的占位符,这意味着在循环后,x 不再指向传入的列表,而是指向它的最后一项。虽然在这种情况下实际上可以工作,因为之后你不再使用 x,但为了清晰起见,最好使用不同的变量名。
  4. 你的某些变量名可能需要更具描述性。
将这些结合起来,我们得到以下内容:
def fizz_count(sequence):
    count = 0
    for item in sequence:
        if item == "fizz":
           count += 1
    return count

我猜你是出于学习目的而选择了这种繁琐的方法,毕竟学习不可能一蹴而就。更好的表达方式可能是:

def fizz_count(sequence):
    return sum(item == "fizz" for item in sequence)

但实际上listtuple都有一个count()方法,因此如果您确信您的参数是一个列表或元组(而不是其他类型的序列),您可以直接执行以下操作:

def fizz_count(sequence):
    return sequence.count("fizz")

事实上,这很简单,你几乎不需要为此编写一个函数!


感谢您抽出时间写下如此有帮助的回复。是的,Codecademy有一个习惯,让你用最长和最低效的方式完成所有任务,但至少我还在学习! - Taint

1
当您将*x传递给函数时,那么x是一个列表。请执行以下操作之一:
def function(x):
   # x is a variable
   ...
function('foo') # pass a single variable
funciton(['foo', 'bar']) # pass a list, explicitly

或者

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

1
你的函数没有以列表作为参数。 *x用来展开传递的参数,所以你的函数期望被这样调用:
f(1, 2, 3)

Not like this:

f([1, 2, 3])

注意在您的第一个示例中缺少列表对象。去掉 *,因为您不需要它:
# Write your function below!    
def fizz_count(lst):
    count = 0

    for elem in lst:
        if elem == "fizz":
            count += 1

    return count

你也可以直接使用list.count

# Write your function below!    
def fizz_count(lst):
    return lst.count('fizz')

0

试试这个:

# Write your function below!    
def fizz_count(x):
    count = 0
    for i in x:
        if i == "fizz":
            count += 1
    return count

示例:

>>> fizz_count(['test','fizz','buzz'])
1

for i in x: 会遍历列表 x 中的每个元素。建议您在这里阅读更多内容。


0

试试这个:

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

0

这一定是个打字错误。你试图迭代函数名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接