Ваш первый модуль: шаг 7
Этот модуль будет содержать две простые функции, и если Вы хотите узнать, сколько раз эти функции были вызваны, Вам потребуется счетчик, инициализированный значением ноль при импорте модуля.
Вы можете сделать это так:
counter = 0
if __name__ == "__main__":
print("I prefer to be a module.")
else:
print("I like to be a module.")
module.py
Ваш первый модуль: шаг 8
Введение такой переменной абсолютно корректно, но может вызвать важные побочные эффекты, о которых Вы должны знать.
Посмотрите на измененный файл main.py :
import module
print(module.counter)
main.py
Как видите, основной файл пытается получить доступ к переменной счетчика модуля. Это корректно? Да. Это можно использовать? Это может быть очень удобно. Это безопасно?
Зависит - если Вы доверяете пользователям Вашего модуля, то проблем нет; однако Вы можете не захотеть, чтобы остальной мир видел Вашу личную переменную.
В отличие от многих других языков программирования, в Python нет средств, позволяющих скрывать такие переменные от глаз пользователей модуля. Вы можете только сообщить своим пользователям, что это Ваша переменная, что они могут ее прочитать, но они не должны изменять ее ни при каких обстоятельствах.
Это делается путем добавления к имени переменной _
(одно подчеркивание) или __
(два подчеркивания), но помните, что это только конвенция. Пользователи Вашего модуля сами могут определять, подчиняться ему или нет.
Конечно, мы будем следовать конвенции. Теперь давайте поместим две функции в модуль - они будут считать сумму и произведение чисел, собранных в списке.
Кроме того, давайте добавим туда несколько украшений и удалим всё лишнее.
Ваш первый модуль: шаг 9
Хорошо. Давайте напишем новый код в нашем файле module.py . Обновленный модуль готов:
#!/usr/bin/env python3
""" module.py - an example of a Python module """
__counter = 0
def suml(the_list):
global __counter
__counter += 1
the_sum = 0
for element in the_list:
the_sum += element
return the_sum
def prodl(the_list):
global __counter
__counter += 1
prod = 1
for element in the_list:
prod *= element
return prod
if __name__ == "__main__":
print("I prefer to be a module, but I can do some tests for you.")
my_list = [i+1 for i in range(5)]
print(suml(my_list) == 15)
print(prodl(my_list) == 120)
module.py
Нам кажется, что некоторые элементы нуждаются в объяснении:
- строка, начинающаяся с
#!
, имеет много имен - ее можно назвать shabang, shebang, hashbang, poundbang или даже hashpling (не спрашивайте нас, почему). Само название здесь ничего не значит - его роль важнее. С точки зрения Python, это просто комментарий, поскольку он начинается с#
. Для Unix и Unix-подобных ОС (включая MacOS) такая строка указывает ОС, как выполнять содержимое файла (другими словами, какую программу необходимо запустить для интерпретации текста). В некоторых средах (особенно в тех, которые связаны с веб-серверами) отсутствие этой строки вызовет проблемы; - строка (возможно, не одна), помещаемая перед любыми инструкциями модуля (включая import), называется строкой документа и должна кратко объяснять назначение и содержание модуля;
- функции, определенные внутри модуля (
suml()
иprodl()
) доступны для импорта; - мы использовали переменную
__name__
, чтобы определить, когда файл запускается автономно, и воспользовались этой возможностью, чтобы выполнить несколько простых тестов.
Ваш первый модуль: шаг 10
Теперь можно использовать обновленный модуль - вот один из способов:
from module import suml, prodl
zeroes = [0 for i in range(5)]
ones = [1 for i in range(5)]
print(suml(zeroes))
print(prodl(ones))
main.py