Может ли кто-нибудь помочь мне удалить несколько возвратов этой функции, чтобы она имела только один возврат?

#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. Верно, я делал это по одному шагу за раз. Я сделаю это по-твоему, а не по-своему.: -)