【问题标题】:Set keyword argument's default value as length of string将关键字参数的默认值设置为字符串的长度
【发布时间】:2022-01-26 22:41:49
【问题描述】:

我接受了重新创建一些流行的 Python 函数的挑战,其中之一是 string.count()。除了子字符串参数和起始索引(可选)之外,它还采用结束索引(也是可选的)。这是我的代码:

def count(self,substring,start=0):
    self.substring = substring
    self.start = start

    self.queue = 0
    self.counter = 0

    for a in self.string[start:]:
        if a == self.substring[0]:
            self.queue += 1
        if a == self.substring[len(self.substring) - 1] and self.queue != 0:
            self.queue -= 1
            self.counter += 1

    return self.counter

我在这个函数之外定义了一些变量:self.string,它是原始字符串本身。你可以看到我没有包含end 参数,这就是我今天在这里的原因。我想将参数设置为:end=len(self.string) - 1,但它只是抛出错误并说:NameError: name 'self' is not defined。这个问题有方法解决吗?到目前为止,我可以说我的代码不是问题,因为它可以在没有参数的情况下完美运行,但我可能错了。

【问题讨论】:

  • 你在使用类吗?因为如果你这样做,请提供完整的代码。如果不是,那么 self 在这里没有任何意义。
  • 尝试在函数内部创建一个变量end 并赋予它len() 值,也许您无法访问参数空间内的变量。
  • 是的,我正在使用类,但我认为我不需要提供整个代码,因为只有 self.string 与此函数相关
  • 在整个代码中,您将本地值存储为实例属性。该类的实例将保留最后计数的子字符串、最后开始位置、计数器的值和队列的值的副本。这些值应该存储在本地(即从一开始就删除“self.”。)

标签: python python-class


【解决方案1】:

尝试添加end 是一个空值,然后在def count() 的括号中添加end = None

def count(substring, start = 0, end = None):
    # implementation omitted

后来,感谢end的空值,可以在函数内部创建一个条件,即如果end是空值,那么end就是-1

你可以写if end is None: end = len (self.string) - 1

【讨论】:

    【解决方案2】:

    让我们将参数分为 3 种类型:

    • 必需的(位置)参数(如substring
    • 可选参数(如startend),通常以None 作为无类型占位符
    • 带有default argument values的参数(如startend

    另见:

    end参数使用切片和默认值

    另见runnable demo on IDEone

    class StringUtil:
    
        def __init__(self, s):
            self.string = s
        
        
        def count(self, substring, start=0, end=-1):  # end index/slice: -1 for the last, instead len(self.substring) - 1
            self.substring = substring
            self.start = start
            self.end = end
            self.queue = 0
            self.counter = 0
    
            for a in self.string[start:]:
                if a == self.substring[0]:
                    self.queue += 1
                if a == self.substring[end] and self.queue != 0:  # -1 for the last, instead len(self.substring) - 1
                    self.queue -= 1
                    self.counter += 1
            
            return self.counter
    
    
    sub = "o*o"
    s =  "Hell" + sub + " W" + sub + "rld"
    cnt = StringUtil(s).count(sub)
    print(f" counted '{sub}' in '{s}' times: {cnt}")
    

    【讨论】:

      【解决方案3】:

      我认为一个简单的解决方案如下

      def count(self,substring,start=0, end=None):
          if end is None:
              end = len(self.string) - 1
          self.substring = substring
          self.start = start
          self.end = end # i suppose this needs to be set
      
          self.queue = 0
          self.counter = 0
      
          for a in self.string[start:]:
              if a == self.substring[0]:
                  self.queue += 1
              if a == self.substring[len(self.substring) - 1] and self.queue != 0:
                  self.queue -= 1
                  self.counter += 1
          
          return self.counter
      

      【讨论】:

      • 带有占位符None的实用解决方案。 ?️评价可以简化为?️conditional assignment到:self.end = len(substring) -1 if not end else end
      猜你喜欢
      • 2011-08-21
      • 2010-09-26
      • 1970-01-01
      • 2017-02-16
      • 2011-04-09
      • 2019-08-25
      • 1970-01-01
      • 2015-08-31
      • 2011-08-25
      相关资源
      最近更新 更多