python,如图选项replace的使用为啥是错的?谢谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python,如图选项replace的使用为啥是错的?谢谢相关的知识,希望对你有一定的参考价值。

python,如图选项replace的使用为什么是错的?谢谢

这个输出结果是对的。只不过只是在输出时修改内容,不会改变变量值。

参考技术A def test1():
test_str="028-123456"
print test_str.replace(old="-",new="")
def test2():
test_str="028-123456"
print test_str.replace("-","")
test2()
结果
Connected to pydev debugger (build 141.1245)
028123456
Process finished with exit code 0
指出参数名进行调用时出错
Traceback (most recent call last):
File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 2357, in <module>
globals = debugger.run(setup['file'], None, None, is_module)
File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1777, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "/Users/function_test/test_builtin_str.py", line 8, in <module>
test1()
File "/Users/function_test/function_test/test_builtin_str.py", line 4, in test1
print test_str.replace(old="-",new="")
TypeError: replace() takes no keyword arguments
没有恶意,但我真的怀疑楼上两位并不太了解Python。
你这么调用在Python中是没问题的,但出现这个问题的真正原因是字符串的
replace
方法不是用Python实现的,而是用C语言实现的,所以它不支持Python里面的
keyword
参数特性。
你可以试一下用
Python版本的replace

from string import replace
s = '012-3456'
print replace(s, new='', old='-') # 即使将old和new调换位置一样可以正确替换,输出0123456
这个
replace
方法在
string
模块中(Lib/string.py文件),是对C语言版本的
relace
方法的封装,有兴趣的话你可以去看看它的源码
replace函数在python2.7的文档中描述如下:
str.replace(old, new[, count])
Return a copy of the string with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced.
在python中的函数参数分为四种:必选参数、默认参数、可变参数、关键字参数
replace函数中old和new输入必选参数,count属于默认参数
你在test1中使用的调用方式必须在函数定义时声明为关键字参数
关键字参数举例:
def test(**kw):
for key in kw:
print "[%s, %s]" % (key, kw[key])
test(x=9)
以上代码输出为[x, 9]

为啥我无法在 python 中正确使用 str.replace() 方法 [关闭]

【中文标题】为啥我无法在 python 中正确使用 str.replace() 方法 [关闭]【英文标题】:Why am I not able to properly use str.replace() method in python [closed]为什么我无法在 python 中正确使用 str.replace() 方法 [关闭] 【发布时间】:2015-05-12 14:23:49 【问题描述】:

这是我第一次在这里发帖,如果我发错了请告诉我。我在这里阅读了很多主题以及其他网站上的信息。他们都说字符串是不可变的,我理解这一点,但我试图在我的自动填充功能中使用str.replace() 方法,但我似乎无法正确地把它放下。根本不可能吗?这是我的代码:

def main():

    fileName = input("Please enter a filename: ") 

    file = open(fileName, 'r')  # opens the file
    content = file.readlines()  # reads in the contents as a list

    x=0                         # x is a random variable used for while loop   
    while x < (len(content)-1): # while loop is used to remove the "\n" at the end
        content[x] = content[x].strip() #strip method is used to remove \n
        x=x+1                   # adds 1 to x to help stop the loop

    printBoard(content)

    move = selection()

    while move != "q" :
        row = (int(move[0]))-1
        column = (int(move[3])) -1

        content = autoFill(content, row, column)

        printBoard(content)

        move = selection()

def autoFill(board, rows, columns):

    if (board[rows][columns]) == 'X' :
        return (board)
    board[rows][columns] = ((board[rows][columns]).replace('O', 'X'))
    print(board)

    return (board)

这里是应该发生的事情的示例:

Please enter a filename: input.txt
OOOOOOXOOOO
OOOOOXOOOOO
OOOOXOOOOOO
XXOOXOOOOOO
XXXXOOOOOOO
OOOOOOOOOOO
Please enter a square to fill, or q to exit: 1, 1
XXXXXXXOOOO
XXXXXXOOOOO
XXXXXOOOOOO
XXXXXOOOOOO
XXXXOOOOOOO
OOOOOOOOOOO

但是当我运行它时。由于我的递归函数永远持续下去(直到运行时崩溃)

【问题讨论】:

您希望替换做什么?反而发生了什么?您为autoFill 函数提供了哪些输入? 你将board反弹到str.replace()返回值;一个新的字符串对象。您是否希望该函数返回整个棋盘? 所以这是一个充满 Os 和 Xs 的板,我希望替换功能将 O 更改为 X。 抱歉,我错误地提交了我的测试代码。但我只是想从列表中替换那个 1 索引。 那么仍然不清楚发生了什么以及您期望发生什么。如果可以,请向我们展示一个示例板(让它变小)以及调用函数时它会发生什么。 【参考方案1】:

我不确定您要做什么,但是,只有几个 cmets:

要从字符串末尾删除 任何\n 字符,您可以使用

string = string.rstrip('\n')

在您使用 replace 的行中,您尝试对矩阵的单个单元格 (board[rows][columns]) 执行替换,并且您正在将该单个单元格的替换结果分配给整个矩阵。我想你的意思实际上是:

board[rows][columns] = board[rows][columns].replace('O', 'X'))

编辑:既然你的单元格总是包含'O''X',为什么不简单地写:

board[rows][columns] = 'X'

board[rows][columns] = 'O'

取决于您希望它们包含的新角色?

编辑2: 顺便说一句,执行剥离部分的更 Pythonic 方式是:

content = [line.rstrip('\n') for line in content]

EDIT3:据我所知,您的问题是字符串是不可变的,我错误地认为您正在使用字符列表。要将您的板子转换为字符列表(因此是可变的),只需执行以下操作:

new_board = []
for line in board:
    new_line = [c for c in line]
    new_board.append(new_line)

【讨论】:

是的,我用那个更新了我的代码:),但我仍然无法替换那个特定的单元格。当我运行它时,单元格实际上并没有被替换:( 我编辑了我的答案,我不确定你为什么要replace() 而不是仅仅覆盖新字符。 我试过你说的,它给了我错误:'str'对象不支持项目分配。这就是我尝试替换的原因,因为 python 有一个内置的 str.replace() 方法 再次编辑,这应该可以解决它。此时replace 不应该工作,因为它是一种字符串方法,而您正在使用字符列表,但您应该能够按照board[i][j] = 'X' 的方式做一些事情。 我试图变得懒惰,只是在不创建列表的情况下工作。但我会尝试的。我认为这将使使用代码变得更加容易。

以上是关于python,如图选项replace的使用为啥是错的?谢谢的主要内容,如果未能解决你的问题,请参考以下文章

已经安装了python,为啥每次打开vs code,python扩展都会出现如图的提示?

为啥 python datetime replace timezone 返回不同的时区?

JS 为啥我用了location.replace,还是会生成历史记录

为啥我的eclipse怎么没有新建java project选项

pycharm编译python3为啥不能直接计算数学结果?

为啥EXCEL做出的折线图 初始点不在0 如图