2015-08-20 2 views
1

Я еще новичок в python; поэтому, извините за несколько смутный вопрос. Мне было просто любопытно, если можно добавить несколько аргументов в аргумент. Например:Как сделать аргумент в python принимать несколько входов

def censored(sentence, word): 
    if word in sentence: 
     sentence = sentence.replace(word, "*" * len(word)) 
    return sentence 
print censored("foo off", "foo") 

Это напечатает "**** от". Это то, что я хотел; но, что, если я хочу добавить другой вход, отличный от «foo».

Есть ли другой способ сделать это, не добавляя в функцию третий, четвертый и n-й аргументы?

ответ

7

Конечно, вы можете передать список, но также можете использовать * args. Иногда это зависит от того, как вы ожидаете использовать эту функцию.

def censored(sentence, *args): 
    for word in args:  
    if word in sentence: 
     sentence = sentence.replace(word, "*" * len(word)) 
    return sentence 
print censored("foo off", "foo", "bar") 

Или в виде списка или ИТЭР

def censored(sentence, words): 
    for word in words:  
    if word in sentence: 
     sentence = sentence.replace(word, "*" * len(word)) 
    return sentence 
print censored("foo off", ("foo", "bar")) 
print censored("foo off", ["foo", "bar"]) 

Here is a good SO for *args and **kwargs

+0

Хорошо, что * args для меня новичок. Но это то же самое, просто разные скобки. Я получаю это сейчас. –

+1

Существует также ** kwargs, вы должны действительно узнать их, поскольку они являются неотъемлемой частью языка. http://stackoverflow.com/questions/3394835/args-and-kwargs –

+0

В коде есть небольшая ошибка: операторы return находятся внутри цикла for. –

1

вы можете сделать это как список.

def censored(sentence, words): 
    for word in words: 
     if word in sentence: 
      sentence = sentence.replace(word, "*" * len(word)) 
    return sentence 
print censored("foo off", ["foo","asp"]) 
4

Вы можете перебирать плохие слова и использовать replace для выполнения замены, если любые из слов присутствуют.

def censored(sentence, bad_words): 
    for word in bad_words: 
     sentence = sentence.replace(word, '*' * len(word)) 
    return sentence 

>>> censored('foo off ya dingus', ['foo', 'dingus']) 
'*** off ya ******' 
1

Есть несколько способов сделать это. Самый простой способ - передать набор строк в качестве второго аргумента. Например:

def censored(sentence, words): 
    for word in words: 
     if word in sentence: 
      sentence = sentence.replace(word, "*" * len(word)) 
    return sentence 

Итак, ваше использование может быть:

print("foo that ship", ["foo", "ship"]) # passing a list 
print("foo that ship", {"foo", "ship"}) # passing a set 

Другим способом, но один, что я бы не рекомендовал, чтобы использовать списки переменных аргументов длины, как:

def censored(sentence, *words): 
    for word in words: 
     if word in sentence: 
      sentence = sentence.replace(word, "*" * len(word)) 
    return sentence 

с использованием в качестве:

print("foo that ship", "foo", "ship") # as many arguments as you'd like with the same function definition 

Проблема с этим подходом заключается в том, что вы не можете легко расширить список запрещенных слов. Однако это полезный метод, чтобы знать/понимать.

+0

Да, что он сказал .. и я имею в виду меня .. –

+0

Нет. Я шутил, что этот плакат в основном отправил то же самое, что и я, спустя несколько минут. Я знаю, что он потому что он я, а я он. –

+2

Вы можете передать список в * args, поместив звездочку в вызов функции.Например, цензура (предложение, * ['foo', 'bar'] будет работать так же, как и цензуре (предложение, 'foo', 'bar') –

2

В дополнение к CoryKramer:

Или создать глобальную переменную и использовать значение по умолчанию для слов.

EXLCUDED_WORDS = ['foo', 'dingus'] 

def censored(sentence, bad_words=EXCLUDED_WORDS): 
    # check if the list is not empty 
    if bad_words: 
     for word in bad_words: 
      sentence = sentence.replace(word, '*' * len(word)) 
    return sentence 

censored('foo off ya dingus') 
Смежные вопросы