#python
#питон
Вопрос:
Я пытаюсь подсчитать количество SLOC, используя следующий код, но он не работает, он просто печатает 0, может кто-нибудь, пожалуйста, помогите
f = open("/content/drive/MyDrive/Rental.java", "r") #print(f.read()) for l in f: count=0 if (l.strip() and l.startswith('/')): count = 1 print(count)
Комментарии:
1. Если вы ищете строки, которые не являются комментарием, вам следует проверить
not l.startswith('/')
2. там есть 4 проблемы: 1) вы повторно инициализируетесь
count
на каждой итерации, а не один раз вне цикла. 2) вы проверяете наличие одного / вместо//, который является комментарием 3) вы подсчитываете комментарии, а не слоки 4) вы не обнаружите комментарии с отступами
Ответ №1:
Вы сбрасываете count
настройки на каждой итерации, так что вы всегда будете получать ответ только 0
на или 1
. Вместо этого установите его перед циклом.
l.strip()
не изменяется l
. Вместо этого он возвращает новую строку! Вы должны назначить это l
.
Кроме того, вы хотите подсчитать, сколько строк не являются комментарием, поэтому вам нужно проверить not l.startswith('/')
. Возможно, даже имеет смысл проверить .startswith('//')
, потому что один прямой слэш не дает комментария в java. На самом деле, что-то подобное было бы ошибочно идентифицировано как имеющее прокомментированную строку, если вы просто сделаете .startswith('/')
:
double a = 1.0 / 5.0;
Вот ваш фиксированный код:
count = 0 f = open("/content/drive/MyDrive/Rental.java", "r") for l in f: l = l.strip() if l and not l.startswith('//'): count = 1 print(count)
Я игнорирую случай использования многострочных комментариев /* ... */
, поскольку вы не затронули его в своем первоначальном вопросе.
Ответ №2:
Вы можете использовать функцию sum() для прямого подсчета:
with open("/content/drive/MyDrive/Rental.java", "r") as f: SLOC = sum(not line.startswith('//') for line in map(str.strip,f) if line) print(SLOC)
Использование карты(str.strip,… на итераторе строк позволяет легко исключать пустые строки и обнаруживать комментарии с отступами.
Ответ №3:
Попробуйте определить count
перед циклом.
f = open("/content/drive/MyDrive/Rental.java", "r") count = 0 #print(f.read()) for l in f: if (l.strip() and l.startswith('/')): count = 1 print(count)
Комментарии:
1. Этот ответ игнорирует две другие вещи, которые не так с кодом OP.