Python 对于循环和返回语句,我一直存在一个错误

Python 对于循环和返回语句,我一直存在一个错误,python,python-3.x,for-loop,return,return-value,Python,Python 3.x,For Loop,Return,Return Value,每当我尝试创建一个函数,该函数接受字符串或列表的更改,然后返回它时,我就注意到了一个问题 我将用我刚刚编写的代码为您提供一个发生这种情况的示例: def remove_exclamation(string): string.split(' ') for i in string: i.split() for char in i: if char == '!': del char ''.join(i)

每当我尝试创建一个函数,该函数接受字符串或列表的更改,然后返回它时,我就注意到了一个问题

我将用我刚刚编写的代码为您提供一个发生这种情况的示例:

def remove_exclamation(string):
string.split(' ')
for i in string:
    i.split()
    for char in i:
        if char == '!':
            del char
            ''.join(i)
            ' '.join(string)
return string
例如,我创建此代码是为了将字符串作为其参数,删除其中的任何感叹号,并更改其返回值。输入和输出应如下所示:

>>>remove_exclamation('This is an example!')
'This is an example'
但我得到的却是:

>>>remove_exclamation('This is an example!')
'This is an example!'
该函数没有删除输出中的感叹号,也没有执行我今天打算执行的操作


当我创建循环、嵌套循环等时,如何避免这种情况发生?

您编写代码并表述问题,就好像可以在Python中修改字符串一样这是不可能的。

字符串是不可变的。所有操作字符串的函数都返回新字符串。它们不会修改现有字符串

这将返回字符串列表,但您没有使用结果:

string.split(' ')
这还包括:

i.split()
        ' '.join(string)
这将删除名为
char
的变量。它不会影响字符本身:

        del char
这将创建一个您不使用的新字符串:

        ''.join(i)
这还包括:

i.split()
        ' '.join(string)
总而言之,几乎每一行代码都是错误的

您可能想这样做:

def remove_exclamation(string):
    words = string.split(' ')
    rtn_words = []
    for word in words:
        word_without_exclamation = ''.join(ch for ch in word if ch != '!')
        rtn_words.append(word_without_exclamation)
    return ' '.join(rtn_words)
但最终,这也起到了同样的作用:

def remove_exclamation(string):
    return string.replace('!', '')

在不清楚你的职能意图和你试图做什么的情况下。除了zvone给出的答案,我还有其他选择

此选项用于删除未在允许的字符列表中定义的任何字符:

characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ "

test_string = "This is an example!"

test_string = ''.join(list(filter(lambda x: x in characters, test_string)))

print(test_string)
这将产生:

这是一个例子

注意,这是Python3版本

Python 2,您不需要
'.join(list())

这样做将允许您定义任何不希望出现在字符串中的字符,并将它们删除

您甚至可以执行相反的操作:

ignore_characters= "!"

test_string = "This is an example!"

test_string = ''.join(list(filter(lambda x: x not in ignore_characters, test_string)))

print(test_string)

字符串在Python中是不可变的。你不能改变它们。但是,您可以重新分配这些值

这就是你的问题所在。在对字符串调用
.split()
时,永远不会重新指定字符串的值

但您的程序中也存在其他错误,例如:

  • 你的契约
  • 事实上,您只是返回传递到函数中的字符串
  • 您对
    del
    语句的使用
  • 等等
相反,通过列表理解和
'.join()
,通过迭代旧字符串并过滤掉不需要的字符来创建新字符串

但正如@Moses在评论中所说的,为什么不直接使用
str.replace()

string=string.replace(“!”,“)

string
仍然是您的输入参数,我假设它是
类型str
。而且一成不变

最重要的是,如果您导入/使用
字符串
模块,您将对其进行跟踪

你的困惑很大一部分是知道方法何时改变对象以及何时返回新对象。对于字符串,它们永远不会发生变化,您需要将结果分配给一个新变量

然而,在一个列表中,
join()
某处让我觉得您想要使用一个列表,然后方法通常会在适当的位置更改对象

无论如何,关于你的问题:

def remove_exclamation(inputstring, to_remove="!"):
    return "".join([c for c in inputstring if c != to_remove])

print (remove_exclamation('This is an example!'))
输出:

这是一个示例

您的两个输出都是相同的。但是您缺少的是将
string.split(',')
重新绑定到
string
。你看,字符串在python中是不可变的。为什么要在出现
str.replace
时经历所有这些麻烦呢?你的问题之一是你在做
i.split()
而你应该做
i=i.split()
。在您的代码中,结果从未分配给任何对象。您的代码注定会失败,因为您从未分配任何操作的结果。此外,缩进已关闭,我不确定您是否知道
del char
的作用。是的,
list.join
str.split
,以及所有字符串方法都返回一个新值。它们不会就地修改数据。即使假设这是真的,代码的逻辑也是关闭的,但您应该从这里开始。如果您只想删除一个字符--
'',则无需将字符串按空格分割。join(ch表示ch in string,如果ch!=!')
就足够了(如果您不想使用
string.replace
)@AndreaCorbellini当然。本例的目的是通过最小的更改来修复原始函数,以解释如何使用
str.split
str.join
的结果。在Python 3中,您也不需要调用
list
str.join
接受任何iterable。此外,您可以只使用
filter(str.isalnum,test_string)
,或者至少使用
set
作为容器而不是另一个字符串。