отображение Python со строками - PullRequest
2 голосов
/ 14 февраля 2010

Я реализовал версию функции str_replace, доступную в php, используя python. Вот мой оригинальный код, который не работал

def replacer(items,str,repl):
    return "".join(map(lambda x:repl if x in items else x,str))

test = "hello world"
print test
test = replacer(test,['e','l','o'],'?')
print test

но это печатает

hello world
???

код, который я должен сделать, как и ожидалось,

def replacer(str,items,repl):
    x = "".join(map(lambda x:repl if x in items else x,str))
    return x

test = "hello world"
print test
test = replacer(test,['e','l','o'],'?')
print test

который печатает

 hello world
 h???? w?r?d

как я и хотел.

Помимо того факта, что, вероятно, есть способ использовать встроенные функции, которого я еще не видел, почему первый способ дает сбой, а второй делает то, что мне нужно?

Ответы [ 3 ]

4 голосов
/ 14 февраля 2010

Порядок аргументов в replacer - это то, что делает различие между ними. Если вы изменили порядок аргументов в первой версии, он будет вести себя как вторая версия.

3 голосов
/ 14 февраля 2010

Не используйте встроенные имена, такие как str, для своих собственных идентификаторов, это просто напрашивается на неприятности и имеет никаких преимуществ вообще.

Кроме того, ваша первая версия зацикливается на str, аргумент second - список ['e', 'l', 'o'] - так что конечно вернет строку ровно три элемента - как вы могли ожидать, что он вернет строку любой другой длины ?! Использование str для именования list аргумент особенно извращенный и подверженный ошибкам.

Вторая версия зацикливается на str, первый аргумент - строка 'hello world', поэтому, конечно, возвращается строка , длина которой .

1 голос
/ 14 февраля 2010

Вы передаете это назад в первом. Должно быть должно быть

test = replacer(['e','l','o'], test, '?')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...