【问题标题】:Return a string by using if...else in a for loop在 for 循环中使用 if...else 返回一个字符串
【发布时间】:2019-09-09 05:56:41
【问题描述】:

所以我在这里尝试将字符串' ABcsad f!,' 转换为
字符串'abcsadf', 所以基本上我正在尝试将空间和非 alpha 替换为 '' 但是我的代码根本不起作用...

s = ' ABcsad f!,'

def norm(s):
    b=''
    i=0
    for i in range(0,len(s)+1):
        if (s[i].isalpha() is False) or (s[i].isspace() is False) :
            return b+=''
        else:
            return b+=s[i]
        i = i+1   

print(norm(s))

谁能告诉我哪里出错了?

【问题讨论】:

  • b+="" 甚至可以在 python 中工作吗?每次都返回吗?并返回一个表达式?
  • @gst1502 是的,但与其他一些语言不同,它不是一个有值的表达式,所以你不能返回它。
  • 你是不是回的太早了,应该回b不行?

标签: python python-3.x for-loop


【解决方案1】:

试试这个:

s = ' ABcsad f!,'
def norm(s):
    return ''.join(i for i in s.lower() if i.isalpha())
print(norm(s))

输出

'abcsadf'

【讨论】:

  • ''.join(i for i in s if i.isalpha()).lower() 效率更高(函数调用更少)。
【解决方案2】:

这就是你出错的地方

  1. 您将 return 放在 for 循环中。 Return 退出整个 norm 函数,而不是让 for 循环完成。它需要搬到外面。

  2. len(s) + 1 导致超出范围错误。应该只是len(s)

  3. 当您要删除空格时,应检查s[i].isspace() 是否为真。

  4. 如果你想要全部小写,你需要把s[i]变成s[i].lower()

  5. 您可以使用b += ...,但不能在其自己的返回语句中使用它。无论如何,这无关紧要,因为您不应该在那里使用 return 。

def norm(s):
    b=''
    for i in range(0,len(s)):
        if (s[i].isalpha() is False) or (s[i].isspace() is True):
            b += ""
        else:
            b += s[i].lower()
        i = i+1
    return b

s = ' ABcsad f!,'
print(norm(s))

【讨论】:

    【解决方案3】:

    可能使用正则表达式:

    import re
    
    mystring = ' ABcsad f!,'
    print (re.sub('[^A-Za-z0-9]+', '', mystring)).lower()
    

    输出:

    abcsadf
    

    【讨论】:

      【解决方案4】:

      问题在于,您的代码有错误,因为您试图在无效位置返回 b

      你的代码

      return b+=''
      

      在 python 中不能按预期在 Java 等语言中工作。您必须明确返回b

      虽然这不是最好的方法,但只是尝试使用您编写的相同代码,但是以正确的方式(不是 python 方式;-))

      s = ' ABcsad f!,'
      
      def norm(s):
          b=''
          i=0
          for i in range(0, len(s)):
              if not s[i].isalpha() or s[i].isspace():
                  b += ''
              else:
                  b += s[i]
              i = i+1
          return b
      
      print(norm(s))
      

      还有更多的方法,比如使用 regex , replace 操作在 python 中更有效地执行此操作。希望你能理解错误。

      【讨论】:

      • 为什么还要b += ''?如果您想要一个不执行任何操作的代码行,请使用 pass
      【解决方案5】:

      您在第一次迭代后返回了b。无论第一个字符是什么,您都返回了b,它不会让循环通过您的字符串。因此,您需要保持return b 不在循环中。而且也不需要return b+=s[i]。只要return b+s[i] 就可以了。事实上,你不能在 return 语句中赋值。但是,代码可以缩短如下:

      s = ' ABcsad f!,'
      
      def norm(s):
          b=''
          i=0
          for i in range(0, len(s)):
              if s[i].isalpha():
                  b+=s[i]
          return b.lower()
      
      print(norm(s))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 2017-08-02
        • 2019-12-04
        • 2018-09-09
        • 2020-03-30
        • 2016-01-29
        相关资源
        最近更新 更多