Я начал программировать на 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 ответ
Глобальные переменные в модуле или скрипте — плохая идея, за исключением констант или в редких случаях (у вас их нет). Вместо этого передавайте необходимые данные от одной функции к другой.
Здорово, что вы пользуетесь функциями. Однако вы воспользовались только одной из их целей — а именно разбить последовательность шагов на значимые группы. Функции также можно использовать для выполнения повторяющихся операций. В этом их величайшая ценность: это избавляет от необходимости слишком часто повторяться в коде.
Я призываю вас отказаться от стиля размещения комментариев, выровненных по всему миру, в крайнем правом углу. Он может иметь эстетическую привлекательность, но его сложнее поддерживать (и я бы поспорил). Проблемы усугубляются, если вы когда-нибудь собираетесь работать над проектами, в которых вы пишете код с другими людьми. Стиль комментариев в приведенном ниже коде легко редактировать, легко перемещать в текстовом файле и гибко использовать с различными типами комментариев.
Точно так же откажитесь от своего стиля в отношении 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)
Я согласен с тем, что использование глобальных переменных — плохая идея. Но я использовал их как константы. Это тоже плохо?
— Кушагр Джайсвал
@KushagrJaiswal Они не являются константами: они устанавливаются посредством пользовательского ввода и преобразования данных (например,
int()
) — что может потерпеть неудачу. Константы просто устанавливаются напрямую:DOZEN = 12
,DEFAULT_MSG = 'Hello'
, так далее.— FMc