Сортировка и обратные списки

Я начал программировать на Python после изучения основ C, поэтому мне нравится описывать пользовательские функции после завершения работы функции main (). Кроме того, мне нравится указывать параметры sep и end для каждой функции print () в моих программах.

После некоторых исследований я узнал, что большинство программистов придерживаются ограничения на количество символов в строке (80, 120 и т. Д.), В то время как другие не беспокоятся о таком ограничении. Я решил ограничить свои строки 80 символами (если нет встроенных комментариев) или 120 символами (включая встроенные комментарии). На мой взгляд, использование этого стиля делает коды очень аккуратными и легкими для понимания.

def main():

    get_the_number_of_students_from_user()

    if (NUMBER_OF_STUDENTS > 0):
        get_the_list_of_names_from_user()
        get_the_list_of_marks_obtained_from_user()
        print_the_names_after_sorting()
        print_the_marks_obtained_after_sorting()
    else:
        print("The number of students should be greater than 0!n",
              sep = "", end = "")



def get_the_number_of_students_from_user():

    global NUMBER_OF_STUDENTS

    NUMBER_OF_STUDENTS = int(input("Enter the number of students enrolled in "
                                   "this course: "))

    print("n", sep = "", end = "")



def get_the_list_of_names_from_user():

    global LIST_OF_NAMES

    LIST_OF_NAMES = []

    for x in range(NUMBER_OF_STUDENTS):
        print("Enter the name of student no. ", x+1, ": ", sep = "", end = "")
        dummyVariable1 = input()
        LIST_OF_NAMES.append(dummyVariable1)

    print("n", sep = "", end = "")



def get_the_list_of_marks_obtained_from_user():

    global MARKS_OBTAINED

    MARKS_OBTAINED = []

    for y in LIST_OF_NAMES:
        print("Enter the marks obtained by ", y, ": ", sep = "", end = "")
        dummyVariable2 = int(input())
        MARKS_OBTAINED.append(dummyVariable2)

    print("n", sep = "", end = "")



def print_the_names_after_sorting():


    listOfNames = LIST_OF_NAMES                                                     # To let LIST_OF_NAMES stay
                                                                                    # constant.

    print("The name(s) of the student(s) enrolled in this course is(are) :-n",
          sep = "", end = "")


    listOfNames.sort()

    for z in range(NUMBER_OF_STUDENTS):                                             # To print listOfNames like
        if (z+1 == NUMBER_OF_STUDENTS):                                             # a, b, c, d & e instead of like
            print(listOfNames[z], sep = "", end = " ")                              # ['a', 'b', 'c', 'd', 'e'].
        elif (z+2 == NUMBER_OF_STUDENTS):
            print(listOfNames[z], sep = "", end = " & ")
        else:
            print(listOfNames[z], sep = "", end = ", ")

    print("(in ascending alphabetical order).n", sep = "", end = "")


    listOfNames.reverse()

    for w in range(NUMBER_OF_STUDENTS):                                             # To print listOfNames like
        if (w+1 == NUMBER_OF_STUDENTS):                                             # a, b, c, d & e instead of like
            print(listOfNames[w], sep = "", end = " ")                              # ['a', 'b', 'c', 'd', 'e'].
        elif (w+2 == NUMBER_OF_STUDENTS):
            print(listOfNames[w], sep = "", end = " & ")
        else:
            print(listOfNames[w], sep = "", end = ", ")

    print("(in descending alphabetical order).nn", sep = "", end = "")



def print_the_marks_obtained_after_sorting():


    marksObtained = MARKS_OBTAINED                                                  # To let MARKS_OBTAINED stay
                                                                                    # constant.

    print("The marks obtained by the student(s) enrolled in this course ",
          "is(are) :-n", sep = "", end = "")


    marksObtained.sort()

    for u in range(NUMBER_OF_STUDENTS):                                             # To print marksObtained like
        if (u+1 == NUMBER_OF_STUDENTS):                                             # 1, 2, 3, 4 & 5 instead of like
            print(marksObtained[u], sep = "", end = " ")                            # [1, 2, 3, 4, 5].
        elif (u+2 == NUMBER_OF_STUDENTS):
            print(marksObtained[u], sep = "", end = " & ")
        else:
            print(marksObtained[u], sep = "", end = ", ")

    print("(in ascending order).n", sep = "", end = "")


    marksObtained.reverse()

    for v in range(NUMBER_OF_STUDENTS):                                             # To print marksObtained like
        if (v+1 == NUMBER_OF_STUDENTS):                                             # 1, 2, 3, 4 & 5 instead of like
            print(marksObtained[v], sep = "", end = " ")                            # [1, 2, 3, 4, 5].
        elif (v+2 == NUMBER_OF_STUDENTS):
            print(marksObtained[v], sep = "", end = " & ")
        else:
            print(marksObtained[v], sep = "", end = ", ")

    print("(in descending order).n", sep = "", end = "")



main()

1 ответ
1

Глобальные переменные в модуле или скрипте — плохая идея, за исключением констант или в редких случаях (у вас их нет). Вместо этого передавайте необходимые данные от одной функции к другой.

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

Я призываю вас отказаться от стиля размещения комментариев, выровненных по всему миру, в крайнем правом углу. Он может иметь эстетическую привлекательность, но его сложнее поддерживать (и я бы поспорил). Проблемы усугубляются, если вы когда-нибудь собираетесь работать над проектами, в которых вы пишете код с другими людьми. Стиль комментариев в приведенном ниже коде легко редактировать, легко перемещать в текстовом файле и гибко использовать с различными типами комментариев.

Точно так же откажитесь от своего стиля в отношении print(). Ключевой проблемой программного обеспечения является то, насколько легко его можно печатать и читать — иногда точно, а часто с помощью быстрого визуального сканирования. Добавление ненужного материала мешает достижению этих целей.

Python позволяет выполнять итерацию непосредственно по коллекциям, а не по индексам. А если вам нужны индексы, используйте enumerate().

# Do this in almost all situations.
for x in xs:
    ...

# Not this.
for i in range(len(xs)):
    x = xs[i]
    ...

Вот краткая иллюстрация некоторых из этих идей:

def main():
    # No global variables. Pass data back and forth among functions.
    n = get_the_number_of_students_from_user()
    if n > 0:
        names = get_the_list_of_names_from_user(n)
        ...
        print_the_names_after_sorting(names)
        ...

def print_the_names_after_sorting(names):
    # Be practical: no unnecessary arguments for print() and
    # no unnecessary text in messages to users.
    print('Students enrolled:')

    # Use loops, functions, and data to reduce code repetition.
    # Here a tuple of data drives the process.
    for rev in (False, True):

        # We use data to control sorting direction.
        #
        # Be practical: join the names on a consistent
        # basis (comma-space) so you don't need special tricks
        # to insert '&' before the last items.
        names_txt=", ".join(sorted(names, reverse = rev))

        # Data is also used to modify the message.
        direction = 'descending' if rev else 'ascending'

        # Python has powerful ways to build strings.
        msg = f'{names_txt} (in {direction} alphabetical order).'
        print(msg)

Вы можете пойти еще дальше, заметив, что
print_the_names_after_sorting() и
print_the_marks_obtained_after_sorting() практически идентичны. Они отличаются только своим исходным посылом. Вы можете обобщить функцию и использовать ее как для names и marks:

def print_items_after_sorting(items, init_msg):
    print(init_msg)
    for rev in (False, True):
        vals_txt=", ".join(sorted(items, reverse = rev))
        direction = 'Descending' if rev else 'Ascending'
        msg = f'{direction}: {vals_txt}'
        print(msg)

  • Я согласен с тем, что использование глобальных переменных — плохая идея. Но я использовал их как константы. Это тоже плохо?

    — Кушагр Джайсвал

  • 2

    @KushagrJaiswal Они не являются константами: они устанавливаются посредством пользовательского ввода и преобразования данных (например, int()) — что может потерпеть неудачу. Константы просто устанавливаются напрямую: DOZEN = 12, DEFAULT_MSG = 'Hello', так далее.

    — FMc


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *