Найти - Пользователи
Полная версия: Пропущенные комменты, У меня 2 вопроса
Начало » Python для новичков » Пропущенные комменты, У меня 2 вопроса
1
Meacronacer
1) какой лучший выбор алгоритма для этой задачи,
2) щас как бы правильно сформулировать вопрос, допустим я пропускаю каждую строку через цыкл
for i in range(len(x))
и хочу проверить если строка начинаеться с ‘def’ и проверить если первый символ предыдущей строки не равен ‘#’
  if x[i][:3] == 'def' and '#' != x[i-1][0]
но такой вариант не проходит говорит что я выходжу из ренджа поэтому я проверяю если нет ‘#’ в предыдущей строке, такой вариант кода работает а первый вариант нет, можете обьяснить почему? вот задание:

Пропущенные комменты 🌶️
При написании собственных функций рекомендуется в комментарии описывать назначение функции, ее параметры и возвращаемое значение. Часто программисты откладывают написание таких комментариев напоследок, а потом и вовсе забывают о них 😂.

На вход программе подается строка текста с именем текстового файла, в котором написан код на языке Python. Напишите программу, выводящую на экран имена всех функций для которых отсутствует поясняющий комментарий. Будем считать, что любая строка, начинающаяся со слова def и пробела, является началом определения функции. Функция содержит комментарий, если первый символ предыдущей строки - #.

Формат входных данных
На вход программе подается строка текста, содержащая имя существующего текстового файла с кодом на языке Python.

Формат выходных данных
Программа должна вывести названия всех функций (не меняя порядка их следования в исходном файле), каждое на отдельной строке, для которых отсутствует поясняющий комментарий. Если все функции в файле имеют поясняющий комментарий, то следует вывести: Best Programming Team.

Примечание 1. Если бы файл содержал код:

 def powers(a):
    return a, a**2, a**3
# функция вычисляет сумму всех переданных чисел
def sum_all(*args):
    return sum(args)
def matrix():
    pass
# функция возвращает количество переданных аргументов
def count_args(*args):
    return len(args)
def mean(*args):
    total = 0.0
    count = 0  
    for i in args:
        if type(i) in (int, float):
            total += i
            count += 1
    if count == 0:
        return 0.0
    else:
        return total / count
    
def greet(name, *args):
    args = (name,) + args
    return f'Hello, {" and ".join(args)}!'
# функция вычисляет факториал переданного числа
def fact(n):
    res = 1
    for i in range(1, n + 1):
        res *= i
    return res
то результатом будет:

powers
matrix
mean
greet
Примечание 2. Гарантируется, что в файле есть хотя бы одна функция при этом вложенных функций в файле нет.

вот мой код:
 with open(input(), 'r', encoding='UTF-8') as f:
    x = [i.strip() for i in f]
    d = []
    for i in range(len(x)):
        if x[i][:3] == 'def' and '#' not in x[i - 1]:
            d.append(x[i][4:x[i].find('(')])
    print(*d if len(d) > 0 else ['Best Programming Team'], sep='\n')
PEHDOM
Meacronacerиспользуйте функции строк startswith
Meacronacer
но такой вариант не проходит говорит что я выходжу из ренджа
естевенно , если вы сравниваете с передыщей строкой то очевидно нужно начинать не с первого(нулевой индекс) элемента, а с второго(первый индекс). при этом не стоит забывать что первая строка может начинаться с def(тоесть вводить доп. проверку первого элемента).
Или ввести флаг предыдущая_строка_начналась_с_# и проверять построчно:
флаг=False
для стока в файле:
если строка начинается с #:
флаг=True
продолжить.
иначе:
если стока начинается с 'def' и флаг ==False:
все плохо, коментарий отсутвует.
флаг=False

py.user.next
Meacronacer
1) какой лучший выбор алгоритма для этой задачи,
Конечный автомат надо делать в подобных задачах.

В данном случае можно обойтись только двумя флажками. Один флажок означает “встретилась строка с октоторпом в начале”. Второй флажок означает “обнаружена непрокомментированная функция”.

1. Дальше ты читаешь каждую строку.
2. Если в строке стоит октоторп в начале, то включаешь флажок октоторпа и переходишь к пункту 1.
3. Если в строке стоит def в начале и флажок октоторпа включен, то выключаешь флажок октоторпа и переходишь к пункту 1.
4. Если в строке стоит def в начале и флажок октоторпа выключен, то включаешь флажок непрокомментированной функции, а потом берёшь имя функции после def и выводишь его на экран.
5. Если строки прочитаны и выключен флажок непрокомментированной функции, то выводишь на экран текст об отсутствии непрокомментированных функций.

При чтении строк никакие индексы строк в файле не используются. У тебя только два флажка и всё.
Также в коде может и не быть ни одной функции, поэтому при выводе успешного сообщения нужно учитывать, что там могут быть прокомментированы все функции, а может не быть ни одной функции. Текст не должен говорить “все функции прокомментированы”.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB