#python #string #function #split #boolean
#python #строка #функция #разделение #логическое
Вопрос:
Я написал базовую функцию, которая принимает любую строку из двух слов, переданную в качестве аргумента, проверяет совпадение индексов обоих слов и возвращает True , в противном случае False .
def alliteration_check(str):
sp1, sp2 = str.split()
if sp1[0].upper() == sp2[0].upper():
return True
else:
return False
Я хотел знать, можно ли изменить параметр str здесь, чтобы принимать ** kwargs? Я только недавно узнал об этой концепции, поэтому пытаюсь понять, как я могу применить ее на практике.
По сути, мой предполагаемый результат функции будет заключаться в том, что пользователь может поместить столько слов в качестве аргумента, и он возвращает True только в том случае, если ВСЕ первые индексы каждой строки совпадают. Я просто не уверен, как написать функцию или возможно ли это вообще?
Заранее спасибо!
Ответ №1:
Не называйте переменную (включая параметр) str
, потому что это затенит встроенную str
функцию / тип! Вы можете использовать str
в качестве аннотации типа, но она должна идти после имени параметра, например foo: str
.
Идея **kwargs
заключается в том, чтобы ваша функция могла принимать произвольный набор аргументов ключевого слова (не аргументы позиции). Внутри реализации функции аргументы доступны как dict
.
def alliteration_check(**kwargs: str) -> bool:
for s in kwargs.values():
w1, w2 = s.split()
if w1[0].upper() != w2[0].upper():
return False
return True
Вам нужно вызвать эту функцию с аргументами ключевого слова, например:
alliteration_check(thing1="zig zag", other_thing="awkward alligator")
Если вы хотите, чтобы пользователь мог вызывать функцию с произвольным количеством позиционных аргументов, а не аргументов ключевого слова, используйте *args
:
def alliteration_check(*args: str) -> bool:
for s in args:
w1, w2 = s.split()
if w1[0].upper() != w2[0].upper():
return False
return True
alliteration_check("zig zag", "awkward alligator")
Вы также можете объединить их оба (т. Е. Иметь функцию, которая принимает оба *args
и **kwargs
), чтобы иметь возможность обрабатывать аргументы в любом синтаксисе:
def alliteration_check(*args: str, **kwargs: str) -> bool:
for s in (*args, *kwargs.values()):
w1, w2 = s.split()
if w1[0].upper() != w2[0].upper():
return False
return True
Комментарии:
1. Спасибо за этот очень полезный ответ! Я еще не узнал о -> bool, поэтому я попытаюсь собрать код построчно, чтобы понять, что он делает. Спасибо за исправление о том, что вы не используете str в качестве var или param, я отмечу это для будущей ссылки!
2.
-> bool
Это аннотация типа, означающая «эта функция возвращает abool
«. Это полезный способ указать людям, читающим код (а также такие инструменты, какmypy
), как вы должны использовать функцию и что она должна делать.
Ответ №2:
Возможно, было бы более уместно использовать *args — список аргументов переменной длины, не содержащий ключевых слов, в вашем случае, потому что вы хотите проверить переменное количество слов. Затем вы можете повторить это как список.
В вашем случае вы просто хотите проверить, что первая буква каждого слова одинакова без учета регистра. Я бы построил набор и проверил, содержит ли он только один элемент:
def alliteration_check(*args):
return len(set(s[0].upper() for s in args)) == 1
Вы бы использовали это так:
print(alliteration_check("hello", "Hello", "hi"))
Вывод:
True
Ответ №3:
def alliteration_check(*args):
initialWord = args[0]
allEqual=true
for word in args:
if (word != initialWord):
allEqual=false
break
return allEqual
alliteration_check("4", "5")
alliteration_check("10", "9")
alliteration_check('2', "3", "4")
Ответ №4:
Вот решение, которое я получил. Для вашей конкретной ситуации вы должны использовать * args, а не ** kwargs
def alliteration_check(*args):
allit = True
for arg in args:
if arg[0].upper() != args[(args.index(arg))-1][0].upper():
allit = False
return allit
в основном это проверяет каждый аргумент, введенный в функцию, на предыдущий и проверяет, что первая буква во всех них одинакова. Если в какой-либо момент оно не равно, оно изменяет переменную allit на false и выходит из цикла.