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
作为容器而不是另一个字符串。