Почему объект 'NoneType' не повторяется в HackerRank, но не в PyCharm? - PullRequest
0 голосов
/ 17 ноября 2018

Используя Python 3.x, я пытаюсь округлить оценки учеников, учитывая странный способ оценки учителя.В основном, если оценка ученика ниже 38, ничего не делайте.Если разница между оценкой и следующим кратным 5 меньше 3, округлите оценку до следующего кратного 5. В противном случае не меняйте оценку.Вот код, который я использовал как в веб-среде разработки PyCharm, так и в HackerRank:

grades = [37, 39, 52, 83, 91]

def gradingStudents(grades):
    for i in range(len(grades)):
        grade = grades[i]
        if grade > 38:
            for j in range(4):
               next_val = grade + j
               if ((next_val-grade) < 3) and (next_val%5 == 0):
                   grade = next_val
        print(grade)

gradingStudents(grades)

Вывод в PyCharm правильный:

37
40
52
85
91

Для сравнения приведем кодfrom из веб-среды IDE в HackerRank (https://www.hackerrank.com/):

#!/bin/python3
import os
import sys

#
# Complete the gradingStudents function below.
#
def gradingStudents(grades):
    for i in range(len(grades)):
        grade = grades[i]
        if grade > 38:
            for j in range(4):
               next_val = grade + j
               if ((next_val-grade) < 3) and (next_val%5 == 0):
                   grade = next_val
        print(grade)

if __name__ == '__main__':
    f = open(os.environ['OUTPUT_PATH'], 'w')

    n = int(input())

    grades = []

    for _ in range(n):
        grades_item = int(input())
        grades.append(grades_item)

    result = gradingStudents(grades)

    f.write('\n'.join(map(str, result))) #<-- This is line 32 from error!
    f.write('\n')

    f.close()

Это приводит к следующей ошибке:

Traceback (most recent call last):
File "solution.py", line 32, in <module>
f.write('\n'.join(map(str, result)))
TypeError: 'NoneType' object is not iterable

Ответы [ 3 ]

0 голосов
/ 17 ноября 2018

Проблема в том, что ваша функция ничего не возвращает или None, и поэтому join вернет ошибку. print только печатает значение и ничего не возвращает, да, оно печатается в вашей среде PyCharm IDE, но из него ничего не возвращается.

Если вы хотите использовать эти значения, я немного изменил ваш код, чтобы он возвращал новый список после применения вашей логики, добавив f_grades, который является списком в функции.

import os
import sys

#
# Complete the gradingStudents function below.
#
def gradingStudents(grades):
    f_grade = []
    for i in range(len(grades)):
        grade = grades[i]
        if grade > 38:
            for j in range(4):
                next_val = grade + j
                if ((next_val-grade) < 3) and (next_val%5 == 0):
                        grade = next_val
                        f_grade.append(grade)
    return f_grade

if __name__ == '__main__':
    #f = open(os.environ['OUTPUT_PATH'], 'w')

    n = int(input())

    grades = []

    for _ in range(n):
        grades_item = int(input())
        grades.append(grades_item)

    result = gradingStudents(grades)

    f.write('\n'.join(map(str, result))) #<-- No more error!
    f.write('\n')

    f.close()

Вместо этого он переписывает весь код: он добавляет эти значения в новый список после прохождения логики и возвращает этот список. Оттуда вы сможете применять функции к этому списку, такие как join.

0 голосов
/ 17 ноября 2018

Вот способ сделать то же самое со списком:

def gradingStudents(grades):
    return [5 * (x // 5) + 5 if x > 38 and x % 5 > 2 else x for x in grades]

print(gradingStudents([37, 39, 52, 83, 91]))
# [37, 40, 52, 85, 91]

Это было бы более эффективно, учитывая, что это понимание, а также сжато.

0 голосов
/ 17 ноября 2018

Хакерранк ожидает, что список оценок будет возвращен из вашей функции, вы ничего не возвращаете, просто печатаете.

def gradingStudents(grades):
    result = []  # make an empty list
    for i in range(len(grades)):  # assuming this logic is correct
        grade = grades[i]
        if grade > 38:
            for j in range(4):
                next_val = grade + j
                if ((next_val-grade) < 3) and (next_val%5 == 0):
                    grade = next_val

        result.append(grade)  # append the grade to list
    return result # return the list, you had no return statement so it was returning none
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...