【问题标题】:Python function with specific parameters as inputs, exceptions [closed]具有特定参数作为输入的 Python 函数,异常 [关闭]
【发布时间】:2020-02-23 17:05:27
【问题描述】:

我有一个具有三个参数的函数 mean_univ,我希望它在满足以下给定条件之一时引发错误,

  1. x 不是列表
  2. x 包含除 int 或 float 以外的其他值,例如字符串
  3. 如果您作为方法输入的字符串不是“mean”或“tmean”
  4. 如果 alpha 不在 0 和 1 之间

当我定义例如x=[1,2,4,10,12] 我的代码没有引发异常(3.),我不知道如何实现 2. 和 4. 谢谢。

def mean_univ(x, method, alpha=-1):
  if type(x) == list:
    if method == mean:
      return mean(x)
    elif method ==tmean:
      return tmean(x,alpha)
    else:
      raise Exception("no available method")
  else:
    raise Exception("no list")



def mean(x):
    return print(float(sum(x)) / max(len(x), 1))

def tmean(x, alpha):
  s = sorted(x)
  a = round(alpha * len(x))
  trimmed_list = s[a:-a]
  if len(trimmed_list) == 0:
    return
  trimmed_ave = sum(trimmed_list)/len(trimmed_list)
  return trimmed_ave

【问题讨论】:

  • 我不知道如何实现 2 和 4。 有什么问题,你在哪个部分苦苦挣扎?
  • 如果 x 是一个列表并且只有 int 或 float 值,该函数应该可以工作。但我不知道如果 x 是一个列表但包含一个字符串,“if 语句”需要如何查看。对于这种情况,我想要一个例外
  • 对,我得到了那部分,我希望得到更具体的东西。您是否尝试过分解问题、编写伪代码等?
  • 你能澄清你的问题吗?您显然已经知道如何检查类型和值。至于2:如果元素不是数字,meantmean 无论如何都会抛出错误。至于3:method isn't 应该是一个字符串,你的函数需要另一个函数。至于 4:检查一个值是否小于/大于一个值是非常基本的,你到底在这里挣扎什么?
  • 对不起,我尝试指定它: 例如: 1. 步骤:用户将输入一个列表 x=[1,2,3,4,5,"red"]。然后他将运行函数 mean_univ(x,mean) 并发生错误。是的,会发生错误,但我想要一个特定的异常来告诉用户他需要调整列表。对于 3:1. 步骤:用户将输入一个列表 x=[1,2,3,4,5,]。然后他将运行函数 mean_univ(x,Hmean) 并出现 Hmean 未定义的错误。在这里,我想要一个特定的异常来告诉用户他尝试运行的方法不存在。对于 4:我想我已经找到了解决方案。

标签: python list if-statement input parameters


【解决方案1】:

在您的代码中,我看到以下问题:

def mean_univ(x, method, alpha=-1):
  if type(x) == list:
    if method == mean:
      return mean(x)
    elif method ==tmean:
      return tmean(x,alpha)
    else:
      return print("no available method")
  else:
    raise Exception("no list")

如果x 是一个列表,则编码表示,然后查看method 以检查它是否在规范范围内。因此,只要为x 输入了list,那么它就不会进入raise Exception("no list") 代码段。您还需要用引号将“mean”和“tmean”括起来。我对您的代码进行了一些更改,它似乎有效:

我的代码

def mean_univ(x, method, alpha=-1):
    if not isinstance(x, list):
        raise Exception("no list")

    if method == "mean":
        return mean(x)
    elif method == "tmean":
        return tmean(x,alpha)
    else:
        return print("no available method")

所以mean_univ([1,2,4,10,12] , method="mean") 给了5.8

mean_univ(3 , method="mean") 抛出 Exception: no list

mean_univ([1,2,3] , method="other")no available method

不确定你所说的第四点是什么意思:

如果 alpha 不在 0 和 1 之间

因为您的默认值 alpha 是 -1。如果要为alpha 添加值检查,则可以在mean_univ 中添加以下几行嵌套

if not 0 <= alpha <= 1:
        return "Invalid alpha value"

【讨论】:

    【解决方案2】:

    我想出了以下解决方案:

    def mean_univ(x, method, alpha=-1):
        if not isinstance(x, list):
            raise ValueError("x is not list")
    
        if any(not isinstance(item, int) and not isinstance(item, float) for item in x):
            raise ValueError("x does not contains proper values")
    
        if method != "mean" and method != "tmean":
            raise ValueError("Incorrect method")
    
        if alpha <= 0 or alpha >= 1:
            raise ValueError("Incorrect alpha")
    
        if method == "mean":
            return mean(x)
        elif method =="tmean":
          return tmean(x,alpha)
        else:
          return print("no available method")
    

    【讨论】:

      猜你喜欢
      • 2022-07-04
      • 2021-10-24
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 2017-10-05
      • 1970-01-01
      相关资源
      最近更新 更多