Ao sair e entrar de novo no interpretador Python, as definições anteriores (funções e variáveis) são perdidas. Portanto, se quiser escrever um programa maior, será mais eficiente usar um editor de texto para preparar as entradas para o interpretador, e executá-lo usando o arquivo como entrada. Isso é conhecido como criar um script. Se o programa se torna ainda maior, é uma boa prática dividi-lo em arquivos menores, para facilitar a manutenção. Também é preferível usar um arquivo separado para uma função que você escreveria em vários programas diferentes, para não copiar a definição de função em cada um deles. Show
Para permitir isso, Python tem uma maneira de colocar as definições em um arquivo e então usá-las em um script ou em uma execução interativa do interpretador. Tal arquivo é chamado de módulo; definições de um módulo podem ser importadas para outros módulos, ou para o módulo principal (a coleção de variáveis a que você tem acesso num script executado como um programa e no modo calculadora). Um módulo é um arquivo contendo definições e instruções Python. O nome do arquivo é o nome do módulo acrescido do sufixo # Fibonacci numbers module def fib(n): # write Fibonacci series up to n a, b = 0, 1 while a < n: print(a, end=' ') a, b = b, a+b print() def fib2(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while a < n: result.append(a) a, b = b, a+b return result Agora, entre no interpretador Python e importe esse módulo com o seguinte comando: Isso não adiciona os nomes das funções definidas em >>> fibo.fib(1000) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>> fibo.fib2(100) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] >>> fibo.__name__ 'fibo' Se você pretende usar uma função muitas vezes, você pode atribui-lá a um nome local: >>> fib = fibo.fib >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 6.1. Mais sobre módulos¶Um módulo pode conter tanto instruções executáveis quanto definições de funções e classes. Essas instruções servem para inicializar o módulo. Eles são executados somente na primeira vez que o módulo é encontrado em uma instrução de importação. 1 (Também rodam se o arquivo é executado como um script.) Cada módulo tem seu próprio espaço de nomes privado, que é usado como espaço de nomes global
para todas as funções definidas no módulo. Assim, o autor de um módulo pode usar variáveis globais no seu módulo sem se preocupar com conflitos acidentais com as variáveis globais do usuário. Por outro lado, se você precisar usar uma variável global de um módulo, poderá fazê-lo com a mesma notação usada para se referir às suas funções, Módulos podem importar outros módulos. É costume, porém não obrigatório, colocar todos os comandos
Existe uma variante da instrução >>> from fibo import fib, fib2 >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 Isso não coloca o nome do módulo de onde foram feitas as importações no espaço de nomes local (assim, no exemplo, Existe ainda uma variante que importa todos os nomes definidos em um módulo: >>> from fibo import * >>> fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 Isso importa todos as declarações de nomes, exceto aqueles que iniciam com um sublinhado ( Note que, em geral, a prática do Se o nome do módulo é seguido pela palavra-chave >>> import fibo as fib >>> fib.fib(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 Isto
efetivamente importa o módulo, da mesma maneira que Também pode ser utilizado com a palavra-chave >>> from fibo import fib as fibonacci >>> fibonacci(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 Nota For efficiency reasons, each module is only imported once per interpreter session. Therefore, if you change your modules, you must restart the
interpreter – or, if it’s just one module you want to test interactively, use 6.1.1. Executando módulos como scripts¶Quando você rodar um módulo Python com python fibo.py <arguments> o código no módulo será executado, da mesma forma que quando é importado, mas com a variável if __name__ == "__main__": import sys fib(int(sys.argv[1])) você pode tornar o arquivo utilizável tanto como script quanto como um módulo importável, porque o código que analisa a linha de comando só roda se o módulo é executado como arquivo “principal”: $ python fibo.py 50 0 1 1 2 3 5 8 13 21 34 Se o módulo é importado, o código não é executado: Isso é frequentemente usado para fornecer uma interface de usuário conveniente para um módulo, ou para realizar testes (rodando o módulo como um script executa um conjunto de testes). 6.1.2. O caminho de busca dos módulos¶Quando um módulo chamado
Mais detalhes em The initialization of the sys.path module search path. Nota Nos sistemas de arquivos que suportam links simbólicos, o diretório contendo o script de entrada é resultante do diretório apontado pelo link simbólico. Em outras palavras o diretório que contém o link simbólico não é adicionado ao caminho de busca de módulos. Após a inicialização, programas Python podem modificar 6.1.3. Arquivos Python “compilados”¶Para acelerar o carregamento de módulos, o Python guarda versões compiladas de cada módulo no diretório O Python verifica a data de modificação do arquivo fonte mediante a versão compilada, para ver se está desatualizada e precisa ser recompilada. É um processo completamente automático. Além disso, os módulos compilados são independentes de plataforma, portanto a mesma biblioteca pode ser compartilhada entre sistemas de arquiteturas diferentes. O Python não verifica as versões compiladas em duas circunstâncias. Primeiro, sempre recompila e não armazena o resultado para módulos carregados diretamente da linha de comando. Segundo, não verifica se não houver um módulo fonte. Para suportar uma distribuição sem fontes (somente as versões compiladas), o módulo compilado deve estar no diretório de fontes, e não deve haver um módulo fonte. Algumas dicas para especialistas:
6.2. Módulos padrões¶O Python traz uma biblioteca padrão de módulos, descrita em um documento em separado, a Referência da Biblioteca Python (doravante “Referência da Biblioteca”). Alguns módulos estão embutidos no interpretador; estes
possibilitam acesso a operações que não são parte do núcleo da linguagem, mas estão no interpretador seja por eficiência ou para permitir o acesso a chamadas do sistema operacional. O conjunto destes módulos é uma opção de configuração que depende também da plataforma utilizada. Por exemplo, o módulo >>> import sys >>> sys.ps1 '>>> ' >>> sys.ps2 '... ' >>> sys.ps1 = 'C> ' C> print('Yuck!') Yuck! C> Essas variáveis só estão definidas se o interpretador está em modo interativo. A
variável >>> import sys >>> sys.path.append('/ufs/guido/lib/python') 6.3. A função dir()¶A função embutida >>> import fibo, sys >>> dir(fibo) ['__name__', 'fib', 'fib2'] >>> dir(sys) ['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_framework', '_getframe', '_git', '_home', '_xoptions', 'abiflags', 'addaudithook', 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix', 'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth', 'getallocatedblocks', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'last_traceback', 'last_type', 'last_value', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'pycache_prefix', 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info', 'warnoptions'] Sem argumentos, >>> a = [1, 2, 3, 4, 5] >>> import fibo >>> fib = fibo.fib >>> dir() ['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys'] Observe que ela lista todo tipo de nomes: variáveis, módulos, funções, etc.
>>> import builtins >>> dir(builtins) ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip'] 6.4. Pacotes¶Os pacotes são uma maneira de
estruturar o “espaço de nomes” dos módulos Python, usando “nomes de módulo com pontos”. Por exemplo, o nome do módulo Suponha que você queira projetar uma coleção de módulos (um “pacote”) para o gerenciamento uniforme de arquivos de som. Existem muitos formatos diferentes (normalmente identificados pela extensão do nome de arquivo, por exemplo sound/ Top-level package __init__.py Initialize the sound package formats/ Subpackage for file format conversions __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... effects/ Subpackage for sound effects __init__.py echo.py surround.py reverse.py ... filters/ Subpackage for filters __init__.py equalizer.py vocoder.py karaoke.py ... Ao importar esse pacote, Python busca pelo subdiretório com mesmo nome, nos diretórios listados em Os arquivos Usuários do pacote podem importar módulos individuais, por exemplo: import sound.effects.echo Isso carrega o submódulo sound.effects.echo.echofilter(input, output, delay=0.7, atten=4) Uma maneira alternativa para a importação desse módulo é: from sound.effects import echo Isso carrega o submódulo echo.echofilter(input, output, delay=0.7, atten=4) Também é possível importar diretamente uma única variável ou função: from sound.effects.echo import echofilter Novamente, isso carrega o submódulo echofilter(input, output, delay=0.7, atten=4) Observe que ao utilizar Em oposição, em uma construção como 6.4.1. Importando * de um pacote¶Agora, o que acontece quando um usuário escreve A única solução é o autor do pacote fornecer um índice explícito do pacote. O comando
__all__ = ["echo", "surround", "reverse"] Isso significaria que Se import sound.effects.echo import sound.effects.surround from sound.effects import * Nesse exemplo, os nomes Apesar de que certos módulos são projetados para exportar apenas nomes conforme algum critério quando se faz Lembre-se, não há nada errado em usar 6.4.2. Referências em um mesmo pacote¶Quando pacotes são estruturados em subpacotes (como no pacote Também é possível escrever imports relativos, com a forma from . import echo from .. import formats from ..filters import equalizer Note
que imports relativos são baseados no nome do módulo atual. Uma vez que o nome do módulo principal é sempre 6.4.3. Pacotes em múltiplos diretórios¶Pacotes possuem mais um atributo especial, Apesar de não ser muito usado, esse mecanismo permite estender o conjunto de módulos encontrados em um pacote. Notas de rodapé 1[#] Na verdade, definições de funções também são ‘instruções’ que são ‘executados’; a execução da definição de uma função adiciona o nome da função no espaço de nomes global do módulo. Como deve ser o nome de uma variável?A primeira dica para nomear variáveis é: “Um nome de variável deve descrever a entidade que representa“, ou seja, ele tem que ser auto descritivo. Por exemplo, uma variável chamada “value” com valor “dpw”, pode até funcionar, mas é um nome de variável que não descreve a entidade que representa.
São dados repassados a ele pelo programa principal os quais ocupam variáveis especificamente declaradas para este fim?A resposta correta é: Barramentos..
Quais são as regras de nomeação de variáveis e constantes?Ao nomear uma constante é importante respeitar algumas regras e convenções:. Não iniciar o nome com números;. Não utilizar espaços em branco;. Não utilizar caracteres especiais. ... . Definir nomes relevantes, para facilitar o entendimento do código;. Utilizar letras maiúsculas, facilitando a distinção em relação às variáveis.. O que é um vetor é uma matriz?Vetores e matrizes são coleções de variáveis contínuas na memória e acessadas através de um número de índice. A diferença entre vetores e matrizes é que vetores são de uma única dimensão, enquanto matrizes podem conter várias dimensões.
|