带有条件语句的 For-Loop 输出问题 - python

Posted

技术标签:

【中文标题】带有条件语句的 For-Loop 输出问题 - python【英文标题】:For-Loop with conditional statement problem with output – python 【发布时间】:2020-07-20 02:43:31 【问题描述】:

这个函数只返回 1 的值。有人可以帮忙吗?这些参数描述了我正在尝试实现的内容,但我不确定为什么会发生这种情况。

def clamp(alist,min,max):
    """
    MODIFIES the list so that every element is between min and max.

    Any number in the list, less than min is replaced with min.  Any 
    number in the list greater than max is replaced with max. Any number 
    between min and max is left unchanged.

    This is a PROCEDURE. It modifies alist, but does not return a new 
    list.

    Example: if alist is [-1, 1, 3, 5], then clamp(thelist,0,4) changes
    alist to have [0,1,3,4] as its contents.

    Parameter alist: the list to modify
    Precondition: alist is a list of numbers (float or int)

    Parameter min: the minimum value for the list
    Precondition: min <= max is a number

    Parameter max: the maximum value for the list
    Precondition: max >= min is a number
    """
    alist.append(min)
    alist.append(max)
    for a in alist:
        if max >= a >= min:
            return a
    alist.sort()
    return alist

返回:1,无论输入。

【问题讨论】:

您不能将条件语句串在一起。使用max &gt;= a and a &gt;= min 在两行或 1 行中,因为我尝试了 1 行,但仍然得到相同的响应。而且我认为 if 语句的语句不能使用两行。 什么是thelist 保持参数一致,它应该是clamp(alist, 0,4) 而不是thelist,它没有在任何地方定义。您不必将minmax 附加到alist,如果您正在检查已填充列表中的值,只需比较值而不是附加然后replace() 值并排序列表。 对不起,这个列表是个意外,它应该是alist,但这在函数描述中,而不是代码的一部分。那只是指一个已经在终端中定义的假设列表。 如果您只是创建一个列表,其中每个元素都在一个范围内“固定”,那么就无法理解alist.append(min), alist.append(max) and alist.sort() 调用的目的。此外,min 和 max 也不是好的变量名,因为它替换了内置函数,从而使代码审查者感到困惑。 【参考方案1】:

代码的三个问题

    只要元素在范围内,return a 就会导致返回 alist.append(min)alist.append(max)alist.sort() 与声明的所需功能无关 不应使用内置函数名作为变量名(即min & max

代码

def clamp(alist, min_, max_):
    for i, a in enumerate(alist):
        if a > max_:
          alist[i] = max_     # limit to max
        elif a < min_:
          alist[i] = min_     # limit to min

    return alist

print((clamp([-1, 1, 3, 5], 0, 4)))
# Output: [0, 1, 3, 4]

替代代码(使用列表理解)

def clamp(alist, min_, max_):
  return [min_ if a < min_ else max_ if a > max_ else a for a in alist]

【讨论】:

您拥有的第一个if 语句检查是多余的,特别是如果您只有pass 则不需要。直接跳到if a &gt; max_:if a &lt; min_:的检查。 我还要补充一点,程序通常不会返回任何东西,例如random.shuffle 打乱一个列表但不返回它。 @FishingCode 我删除了它 :) 随意提交对答案中代码的编辑! @FishingCode--保留 if 条件并传递以尽可能与 OP 代码相似,以便他/她更容易遵循我的建议。同意没有必要,如列表理解版本所示。

以上是关于带有条件语句的 For-Loop 输出问题 - python的主要内容,如果未能解决你的问题,请参考以下文章

带有布尔条件的 if else 语句中的代码[重复]

Sqlite3.c 中的 For-loop 语法错误

循环语句中表名的动态变量

For-loop中的多个printf作为初始化、条件和更新的一部分

Excel VBA:错误 Goto 语句在 For-Loop 中不起作用

For-Loop一个带有负迭代器的“空”向量?