Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我必须创建一个空字符串来替换字符串中的所有字符?_Python_String_Rot13 - Fatal编程技术网

Python 为什么我必须创建一个空字符串来替换字符串中的所有字符?

Python 为什么我必须创建一个空字符串来替换字符串中的所有字符?,python,string,rot13,Python,String,Rot13,我正在编写一个ROT13函数,我不明白为什么下面的函数不起作用: def ROT(string): # y = 0 for char in string: x = ord(char) if 97 <= x < 110 or 65 <= x < 78: # string[y]=char.replace(char, chr(x+13)) char=char.replace(char

我正在编写一个ROT13函数,我不明白为什么下面的函数不起作用:

def ROT(string):
    # y = 0
    for char in string:
        x = ord(char)
        if 97 <= x < 110 or 65 <= x < 78:
            # string[y]=char.replace(char, chr(x+13))
            char=char.replace(char, chr(x+13))
            print(char)
            # y+=1
        elif x >= 110 or 78 <= x < 91:
            # string[y]=char.replace(char, chr(x-13))
            char=char.replace(char, chr(x-13))
            print(char)
            # y+=1
    return string

string = ROT('Hello, lorem ipsum dolor sit amet')
print(string)
def ROT(字符串):
#y=0
对于字符串中的字符:
x=ord(字符)

如果97代码中的问题是您没有操作原始字符串。您只是替换临时变量
char
,而不是原始字符串。由于字符串在python中是不可变的,因此可以尝试使用新字符串,而不是替换原始字符串,只需将字符附加到新字符串中即可。比如:

modified_string = ""
for char in string:
     #whatever condition
     modified_string += #value to be added

您正在返回原始字符串,请重试

def ROT(string):
#   y = 0
    result = ""
    for char in string:
        x = ord(char)
        if 97 <= x < 110 or 65 <= x < 78:
#           string[y]=char.replace(char, chr(x+13))
            char=char.replace(char, chr(x+13))
            result = result + char
            print(char)
            continue
#           y+=1
        elif x >= 110 or 78 <= x < 91:
#           string[y]=char.replace(char, chr(x-13))
            char=char.replace(char, chr(x-13))
            print(char)
            result = result + char
            continue
#           y+=1
        result = result + char
    return result

string = ROT('Hello, lorem ipsum dolor sit amet')
print(string)
def ROT(字符串):
#y=0
result=“”
对于字符串中的字符:
x=ord(字符)

如果Python中有97个字符串是不可变的。

其他人已经解决了主要问题——字符串是不可变的,所以在迭代时不能只切换一个字符。您可以使用
bytearray
,但是

FWIW,这是
字符串的一个很好的候选者。翻译

>>> import string
>>> fromchr = ''.join(chr(x) for x in range(97, 110) + range(65, 78))
>>> tochr = ''.join(chr(x+13) for x in range(97, 110) + range(65, 78))
>>> fromchr += ''.join(chr(x) for x in range(110, 256) + range(78, 91))
>>> tochr += ''.join(chr(x-13) for x in range(110, 256) + range(78, 91))
>>> trans = string.maketrans(fromchr, tochr)
>>> 'Hello, lorem ipsum dolor sit amet'.translate(trans)
'Uryyb, yberz vcfhz qbybe fvg nzrg'
这里最棒的是创建翻译表的成本是1倍。创建翻译表后,可以根据需要多次使用它。在优化的C代码中,您的翻译将在~O(n)时间内完成,因此如果您能够得到一个更快(或更简单)的实现,我会感到惊讶

这种方式甚至可以轻松击败内置的
'rot13'
编解码器:

def rot13a(s):
  return s.encode('rot13')

import string
fromchr = ''.join([chr(x) for x in range(97, 110) + range(65, 78)])
tochr = ''.join([chr(x+13) for x in range(97, 110) + range(65, 78)])
fromchr += ''.join(chr(x) for x in range(110, 256) + range(78, 91))
tochr += ''.join(chr(x-13) for x in range(110, 256) + range(78, 91))
trans = string.maketrans(fromchr, tochr)
def rot13b(s):
  return s.translate(trans)

import timeit
test_string = 'Hello, lorem ipsum dolor sit amet'
print rot13a(test_string) == rot13b(test_string)
print timeit.timeit("rot13a(test_string)", "from __main__ import test_string, rot13a")
print timeit.timeit("rot13b(test_string)", "from __main__ import test_string, rot13b")
(我的结果):


请注意,这是python2.x代码。在python3.x中,您不能仅仅添加这样的范围,因为
range
不再返回
list
对象。但是,希望这个想法足够清楚…

你得到的确切错误是什么?这是问题的实际答案,伊姆霍:我明白了。如果我在If语句中做了类似于
string=string+char
的事情,那会起作用吗?你不能在python中做这样的事情。。可以让
temp=string+char
。。检查情况。。如果满足,则分配
string=temp
如果性能是一个问题,这是python中要避免的习惯用法,因为它具有二次时间复杂性。
在循环中修改了_string+=…
。@mgilson还有其他最佳方法吗?
True
1.52055001259  # rot13a
0.21444106102  # rot13b