Módulos

Durante a nossa jornada de aprendizagem de Python, temos utilizado funções predefinidas como print(), input(), type(), etc. Python possui um grande número de funções, e nem todas estão diretamente acessíveis em um novo script Python. Em vez disso, elas estão armazenadas em arquivos separados, chamados módulos. Para utilizar essas funções, precisamos importar o módulo que as contém. Isso é feito através da instrução import. Vamos ilustrar isso:
import math           # Importando o módulo math

print(math.pi)        # Acessando a constante pi do módulo math
print(math.sqrt(16))  # Acessando a função sqrt do módulo math
Este programa irá imprimir o valor de pi (3.141592653589793) e a raiz quadrada de 16 (4.0).
Também podemos importar atributos ou funções específicas de um módulo usando a instrução from...import:
from math import pi, sqrt  # Importando apenas pi e sqrt do módulo math

print(pi)                  # Podemos usar pi diretamente sem prefixar com o nome do módulo
print(sqrt(16))            # Da mesma forma, podemos usar sqrt diretamente
A saída do programa será a mesma do anterior.
Às vezes, os módulos têm nomes longos, e escrever o nome inteiro toda vez que queremos usar uma função pode ser trabalhoso. Para evitar isso, podemos usar a palavra-chave as para atribuir um nome diferente (alias) ao módulo.
import math as m   # Importando o módulo math e renomeando-o como m

print(m.pi)        # Agora podemos usar o alias curto
print(m.sqrt(16))  # Usando a função sqrt através do alias
A saída também será 3.141592653589793 e 4.0, como antes.
Em conclusão, os módulos em Python são como caixas de ferramentas que contêm funções e variáveis predefinidas que podemos importar e usar em nossos programas. Eles ajudam a organizar o código e torná-lo mais eficiente.
Como os Módulos Funcionam nos Bastidores
Quando você importa um módulo, o Python faz um trabalho nos bastidores que pode não ser imediatamente aparente. Aqui está uma visão geral do que acontece quando você usa a instrução import:
  1. Localizando o Módulo: O Python primeiro procura o módulo verificando os locais especificados na sua lista sys.path. Esta lista inclui o diretório atual, o diretório de pacotes internos do Python e quaisquer caminhos especificados na variável de ambiente PYTHONPATH. Se o Python encontrar o módulo, prossegue para os próximos passos. Se não, lança um ModuleNotFoundError.
  1. Inicialização do Módulo: Uma vez localizado o arquivo do módulo, o Python cria um novo objeto de módulo (types.ModuleType). Em seguida, carrega o conteúdo do módulo neste novo objeto, executando todo o código de nível superior no arquivo do módulo. Isso inclui definições de funções, classes, variáveis e a execução de código de inicialização.
  1. Cache do Módulo: Após a inicialização, o módulo é armazenado em cache em sys.modules (um dicionário). Este passo garante que, quando o mesmo módulo for importado novamente no script (ou por outros scripts), o Python não precise localizar e inicializar o módulo novamente. Em vez disso, pode usar a versão em cache. A chave neste dicionário é o nome do módulo, e o valor é o objeto do módulo.
  1. Adicionando o Módulo ao Espaço de Nomes do Importador: Finalmente, o Python adiciona o nome do módulo ao espaço de nomes do script ou módulo que o importou. O nome refere-se ao objeto do módulo, para que você possa acessar as funções e variáveis do módulo usando a notação de ponto.
Vamos ilustrar isso com algum código:
import sys
import math

print(sys.path)       # O caminho onde o Python procura por módulos
print(sys.modules)    # Os módulos em cache
print(math.sqrt(16))  # Acessando uma função do módulo math
O sys.path imprime uma lista de diretórios onde o Python procura por módulos. O sys.modules imprime um dicionário de nomes de módulos (chaves) e seus respectivos objetos de módulo (valores).

Desafio: Números Aleatórios

No mundo da criptografia, os números aleatórios desempenham um papel incrivelmente crucial. Os algoritmos criptográficos muitas vezes dependem da geração de uma sequência de números aleatórios para manter os dados seguros.
Neste desafio, você está encarregado de simular um simples gerador de números aleatórios que nos ajudará a entender a aleatoriedade de forma mais tangível. Python vem com um módulo integrado chamado random que possui várias funções para gerar números aleatórios. Você deve usar este módulo para gerar uma lista de n números inteiros aleatórios entre dois números dados a e b. A aleatoriedade, entretanto, não deve ser verdadeiramente aleatória - precisamos fixar a semente em 42 para a repetibilidade do experimento. Você pode usar a função seed() para fixar a semente e randint() para gerar um número aleatório.
A primeira linha da entrada contém três inteiros separados por espaços: n, a e b. Os números a e b determinam o intervalo (inclusivo) do qual os números aleatórios devem ser escolhidos, e n determina quantos desses números você precisa gerar.
O programa deve imprimir n números aleatórios separados por espaços gerados dentro do intervalo [a, b] com a semente aleatória fixada em 42.
Entrada
Saída
10 1 100
82 15 4 95 36 32 29 18 95 14
5 1 5
1 1 3 2 2
3 10 20
20 11 10
Nota: Como fixamos a semente aleatória em 42, a sequência da saída deve permanecer a mesma em diversas execuções do programa. Esta é uma característica que exploramos em testes, depurações e outras situações onde é necessário um resultado determinístico.
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue