【问题标题】:How to go through a list without using a "for i" loop [duplicate]如何在不使用“for i”循环的情况下浏览列表[重复]
【发布时间】:2018-11-06 13:58:21
【问题描述】:

当函数被调用时,*args 是一个元组,所以我必须先将每个参数附加到一个列表中。然后我通过将它们的值映射到浮点数并使用 sum() 函数来对它们求和。

这段代码没有任何问题,但我收到一条警告说“未使用的变量 i”。

def function(*args):
    x = []
    y = 0
    for i in range(len(args)):
        x.append(args[y])
        y += 1
   x = list(map(float, x))
   return sum(x)

有没有其他方法可以不使用“for i”循环并且更高效?

【问题讨论】:

  • range(len(something)) 在 Python 中几乎总是错误的做法。始终迭代事物本身:for y in args.
  • 我不确定我是否理解。为什么必须将每个参数附加到列表中? map 不仅接受列表。除其他外,您也可以给它元组。 map(float, args) 应该可以正常工作。
  • 这是一个警告,而不是错误。你没有做错任何事,但你可以做得更好。顺便说一句,在追加时,iy 将始终是相同的值。但是如果你使用例如它会更快。 return sum(map(float, args))
  • @DanielRoseman 保存一些例外情况,例如当您想要提取子集时(例如,'abcd''ab''bc''cd')并想要遍历 len - x 以避免 @ 987654334@。 :)
  • 谢谢大家的回答和建议!

标签: python python-3.x list indexing


【解决方案1】:

pythonic 的方式是这样的:

def function(*args):
    return sum(float(x) for x in args)

现在,通过您的代码解释所有这些。您可以避免使用变量y,因为它的作用与i 完全相同:

def function(*args):
    x = []
    for i in range(len(args)):
        x.append(args[i])
    x = list(map(float, x))
    return sum(x)

然后,您可以避免追加,因为您可以使用map 而不是args

def function(*args):
    x = list(map(float, args))
    return sum(x)

您也可以只使用map(float, args),无需为此目的创建中间列表:

def function(*args):
    x = map(float, args)
    return sum(x)

因此它可以抽象为sumsum(float(x) for x in args) 内部的生成器,或者与映射sum(map(float, args)) 一起使用,效果相同。

【讨论】:

    【解决方案2】:

    i 已经为您工作时,您不必介绍y

    def function(*args):
        x = []
        # y = 0 <-- This is not necessary
        for i in range(len(args)):
            x.append(args[i])   # <-- change to [i]
            # y += 1
            # i increments by 1 each loop.
        x = list(map(float, x))
        return sum(x)
    

    当然,你可以通过直接循环args而不是它的range来进一步减少这个函数:

    def function(*args):
        x = []
        for arg in args:
        # directly loops through the elements within your args
            x.append(arg)
        x = list(map(float, x))
        return sum(x)
    

    您甚至可能希望在追加时结合float 操作以避免之后的map

    def function(*args):
        x = []
        for arg in args:
            x.append(float(arg))
        return sum(x)
    

    更重要的是,您可以利用列表推导来缩短它:

    def function(*args):
        x = [float(arg) for arg in args]
        # does the same thing as above
        return sum(x)
    

    或者,将所有内容合并为一行:

    def function(*args):
        return sum(float(arg) for arg in args)
    

    当然,根据您要求的复杂程度,您可能希望在通过 try... except 块将它们转换为 floats 之前验证每个元素。

    【讨论】:

    • 好吧,我猜这是巧合……
    • 你吃什么打字这么快...现在我看起来完全是个傻瓜。
    • Netwave 的手……并没有闲着。你在这里处于严重的劣势。
    • 反对票来了!不能说我不明白……除非人们真的不喜欢我的答案(老实说这是巧合),否则我暂时将其留给 OP 阅读。
    • 我会赞成它以平衡,它不应该被反对,因为它实际上是一个很好的答案;)
    猜你喜欢
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多