#python #string #add
#питон #строка #Добавить #python
Вопрос:
У меня проблема с добавлением строки к другой строке. Я новичок в Python.
Строка не может запомнить предыдущие значения, которые я добавил.
Кто-нибудь, кто может мне помочь? Ниже приведен фрагмент кода на Python.
Моя проблема заключается в цикле while функции encrypt().
ЗАРАНЕЕ БЛАГОДАРЮ.
class Cipher:
def __init__(self):
self.alphabet = "abcdefghijklmnopqrstuvwxyz1234567890 "
self.mixedalpha = ""
self.finmix = ""
def encrypt(self, plaintext, pw):
keyLength = len(pw)
alphabetLength = len(self.alphabet)
ciphertext = ""
if len(self.mixedalpha) != len(self.alphabet):
#print 'in while loop'
x = 0
**while x < len(self.alphabet):
mixed = self.mixedalpha.__add__(pw)
if mixed.__contains__(self.alphabet[x]):
print 'already in mixedalpha'
else:
add = mixed.__add__(str(self.alphabet[x]))
lastIndex = len(add)-1
fin = add[lastIndex]
print 'fin: ', fin
self.finmix.__add__(fin)
print 'self.finmix: ', self.finmix
x =1**
print 'self.finmix: ', self.finmix
print 'self.mixedalpha: ', self.mixedalpha
for pi in range(len(plaintext)):
#looks for the letter of plaintext that matches the alphabet, ex: n is 13
a = self.alphabet.index(plaintext[pi])
#print 'a: ',a
b = pi % keyLength
#print 'b: ',b
#looks for the letter of pw that matches the alphabet, ex: e is 4
c = self.alphabet.index(pw[b])
#print 'c: ',c
d = (a c) % alphabetLength
#print 'd: ',d
ciphertext = self.alphabet[d]
#print 'self.alphabet[d]: ', self.alphabet[d]
return ciphertext
Комментарии:
1. ошибка… есть ли шанс, что вы укажете, в чем, по вашему мнению, проблема? или, может быть, опубликовать меньший пример … или, по крайней мере, опубликовать выходные данные и ожидаемый результат от вашей программы
2. Обратите внимание, что добавление двух строк — довольно дорогостоящая операция, поскольку она включает в себя создание нового объекта string и копирование в него содержимого двух строк. Если вы выполняете много подобных операций и скорость имеет некоторое значение, рассмотрите возможность использования вместо этого объекта StringIO из модуля cStringIO.
Ответ №1:
Строки Python неизменяемы, поэтому вам следует переназначить имя переменной на новую строку.
Функции с «__» в них обычно не являются тем, что вы действительно хотите использовать. Позвольте интерпретатору выполнить этот вызов за вас, используя встроенные операторы / функции (в данном случае оператор » «).
Итак, вместо:
self.finmix.__add__(fin)
Я предлагаю вам попробовать:
self.finmix = self.finmix fin
или эквивалентный и более краткий:
self.finmix = fin
Если вы внесете такого рода изменения повсюду, ваша проблема, вероятно, исчезнет.
Ответ №2:
У меня нет решения вашей проблемы, но у меня есть пара более общих предложений.
-
Частные методы
.__add__
и.__contains__
не предназначены для прямого использования. Вместо этого вам следует напрямую использовать операторыin
. -
Вместо того, чтобы перебирать индексы
self.alphabet
с помощью цикла while…while x < len(self.alphabet): print self.alphabet[x] x = 1
вы могли бы просто перебирать буквы
for letter in self.alphabet: print letter
-
class Cipher:
запускает своего рода режим обратной совместимости, который не работает с некоторыми новыми функциями. Было бы лучше указатьclass Cipher(object):
.
Ответ №3:
Я предполагаю, но следующее:
self.finmix.__add__(fin)
#should be
self.finmix = self.finmix.__add__(fin)