#python #computer-science
Вопрос:
Я написал этот код, и после того, как я его полностью закончил, я понял из требований, что в нем говорится, что код должен иметь один возврат. Я пытался изменить его и исправить, чтобы получить один возврат, но я продолжаю получать ошибки, и я не знаю, почему.
функции:
def is_valid(name):
if len(name) == 0:
return False
if not (name[0].isalpha() or name[0] == '_'):
return False
if len(name) > 1:
for char in name[1:]:
if not (char.isalnum() or char == '_'):
return False
return True
t01.py:
print("var:", is_valid("var"))
print("var2:", is_valid("var2"))
print("2var", is_valid("2var"))
print("var?", is_valid("var?"))
print("camelCase:", is_valid("camelCase"))
Вопрос:
Write and test the following function:
def is_valid(name):
"""
-------------------------------------------------------
Determines if name is a valid Python variable name.
Variables names must start with a letter or an underscore.
The rest of the variable name may consist of letters, numbers
and underscores.
Use: valid = is_valid(name)
-------------------------------------------------------
Parameters:
name - a string to test as a Python variable name (str)
Returns:
valid - True if name is a valid Python variable name,
False otherwise (boolean)
-------------------------------------------------------
"""
Add this function to the PyDev module functions.py. Test it from t01.py.
Результаты выборки:
var : True
var2 : True
2var : False
var? : False
camelCase : True
Комментарии:
1. если ваш код работает и вы просто хотите его улучшить, вместо этого вам следует опубликовать его на сайте проверки кода
2. Это можно решить с помощью регулярных выражений. Что-то вроде
[A-Za-z_][dA-Za-z_]*
(это непроверено, и, вероятно, есть более простой способ написать это, но это должно быть функционально: regex101.com/r/EgZN0c/1 )3. Для меня ваш код работает… Вы говорите, что у вас есть какие-то ошибки. Можете ли вы сообщить более подробную информацию?
Ответ №1:
Самый простой способ — установить result
переменную:
def is_valid(name):
result = True
if len(name) == 0:
result = False
elif not (name[0].isalpha() or name[0] == '_'):
result = False
elif len(name) > 1:
for char in name[1:]:
if not (char.isalnum() or char == '_'):
result = False
return result
Похоже, вы просто хотите проверить, что имя начинается с буквы или подчеркивания, а остальное-буквенно-цифровое (или подчеркивание). Вы можете обернуть эту логику в any
all
операцию или.
if all(char.isalnum() or char == '_' for char in name[1:]) ...
И это позволяет вам обрабатывать всю проверку в одном заявлении … если вы найдете это читабельным:
return name and
(name[0].isalpha() or name[0] == '_') and
all(char.isalnum() or char == '_' for char in name[1:])
Комментарии:
1. это кажется довольно неэффективным — раньше это было бы
return
рано, если бы оно соответствовало условию, теперь оно может без необходимости повторяться несколько раз в третьемif
. По крайней мере, добавьтеbreak
туда.2. Вероятно, следует внести их в
elif
s с изменением, так как, в отличие от оригинала, это приведет к ошибке приname = ''
3. Верно, я делал это по одному шагу за раз. Я сделаю это по-твоему, а не по-своему.: -)