Dicas úteis

Como gerar dados na linguagem de programação Python

Depois de descobrir em qual ambiente é possível criar e executar programas no Python, você pode começar a aprender o básico dessa linguagem. O mais interessante é que os primeiros programas simples podem ser escritos sem o conhecimento de quaisquer construções complexas e corpo do programa (como em Pascal). Nesta lição, vamos nos familiarizar com as operações de entrada e saída no Python, bem como com a saída rápida de operações aritméticas na tela do computador.



Para descobrir o que acontece como resultado das ações que você executa no programa, você precisa exibi-lo de alguma forma. A maneira mais simples e básica de gerar dados do programa é a boa e antiga saída do resultado para a tela, diretamente da linha de comando do Shell do ambiente de desenvolvimento IDLE.

Para exibir valores na tela, o Python tem uma função print (). Dentro dos parênteses, separados por vírgulas, escreva o que deseja exibir.

Formatação de saída conveniente

No momento, descobrimos duas maneiras de gerar valores: expressões de operador (declarações de expressão) e a função print (). (A terceira maneira é usar o método write () de objetos de arquivo; você pode consultar o arquivo de saída padrão como sys.stdout. Para obter mais informações sobre este item, consulte a Referência da biblioteca.

Freqüentemente, há um desejo de ter mais controle sobre a formatação da saída do que a impressão usual de valores separados por espaços. Existem duas maneiras de formatar sua saída. A primeira maneira é fazer todo o trabalho nas linhas: usando cortes e concatenação de linhas, você pode criar qualquer modelo que desejar. O módulo padrão de strings contém muitas operações úteis para alinhar strings a uma largura de coluna específica (nós as revisaremos brevemente em breve). A segunda maneira é usar o método str.format ().

O módulo string contém a classe Template, que fornece outra maneira de substituir valores em strings.

Uma pergunta permanece, é claro: como converter valores em strings? Felizmente, em Python, existem duas maneiras de converter qualquer valor em uma string - estas são as funções repr () e str ().

O objetivo da função str () é retornar valores de uma forma bastante legível, ao contrário de repr (), cujo objetivo é gerar formulários que podem ser lidos pelo intérprete (ou causar SyntaxError se não houver sintaxe equivalente). Para os objetos que não possuem uma forma legível por humanos, a função str () retornará o mesmo valor que repr (). Muitos valores, como números ou estruturas, como listas e dicionários, têm a mesma forma para ambas as funções. Strings e números de ponto flutuante, em particular, têm duas formas diferentes.

Aqui estão duas maneiras de exibir uma tabela de quadrados e cubos:

(Observe que no primeiro exemplo, espaços únicos entre colunas são adicionados pela função print (): ele sempre insere espaços entre seus parâmetros)

Este exemplo demonstra a operação do método de objeto de string rjust (), que alinha a string à direita no campo da largura passada, recuando com espaços à esquerda. Métodos semelhantes estão disponíveis para ljust () e center (). Esses métodos não imprimem nada, eles retornam apenas uma nova linha. Se a linha de entrada for muito longa, eles não a truncarão, o que geralmente é o menor dos males. (Para truncar, você pode adicionar uma operação de fatia, por exemplo: x.ljust (n) [: n].)

Existe outro método - zfill (), que preenche com zeros o espaço à esquerda da linha numérica. Ele reconhece os sinais de mais e menos:

A principal maneira de usar o método str.format () é a seguinte:

Parênteses com caracteres internos (eles são chamados campos de formato (campos de formato)) são substituídos por objetos passados ​​para o método format. O número entre parênteses indica a posição do objeto na lista de parâmetros passados ​​para o método de formato.

Se o método format usa parâmetros nomeados, você pode referenciar seus valores usando o nome do argumento correspondente.

Os parâmetros posicionais e nomeados podem ser combinados arbitrariamente:

Um especificador de formato ':' opcional pode seguir um nome de campo. Use-o para controlar a formatação de um valor. O exemplo a seguir deixa o Pi apenas três dígitos após o separador decimal.

Após o especificador ':', você pode especificar um número - a largura mínima do campo, expressa em número de caracteres. É conveniente usar isso para criar tabelas bonitas:

Se sua string de formato for muito longa e você não desejar dividi-la em substrings, seria bom se você pudesse se referir a variáveis ​​destinadas à formatação, não por posição, mas por nome. Isso pode ser feito simplesmente passando o dicionário e usando colchetes ‘[]'Para acesso às chaves.

O mesmo pode ser feito passando um dicionário de parâmetros nomeados usando a notação “**”:

Em particular, é conveniente usar esta técnica em combinação com a função interna vars (), que retorna um dicionário com variáveis ​​locais.

Uma descrição detalhada de formatação de strings usando o método str.format () é descrita na seção Sintaxe de formatação da sintaxe de strings.

Saída de tela

Suponha que temos uma variável com algum valor e queremos exibi-la na tela. Para isso em Python existe uma função print (). Dentro dos parênteses, colocamos o nome da nossa variável ou de alguns caracteres. Se você simplesmente digitar um dígito como uma variável numérica, o intérprete jurará.

Cada vez que uma função é acionada print () algumas informações serão exibidas na tela, neste caso, a mesma. Depois print () Impresso tudo o que lhe foi dito, ele recuará a próxima linha. Para impedir que isso aconteça, você precisa adicionar algo ...

Entre aspas, você pode, em princípio, escrever o que seu coração desejar.

Formatação de strings no estilo antigo

Você pode usar a operação% para formatar seqüências de caracteres. Ele interpreta o operando esquerdo como uma string de formato no estilo sprintf que deve ser aplicada ao operando direito e retorna a string resultante dessa conversão. Por exemplo:

Como o método str.format () é relativamente novo, a maioria dos códigos fonte do Python ainda usa a operação%. No entanto, com o tempo, a formatação da linha será removida do idioma, portanto, str.format () deve ser usado na maioria dos casos.

Mais informações podem ser encontradas na seção Formatando operações de formatação de string no estilo antigo.

Entrada do usuário

Lembre-se de que tudo o que o usuário digitou é uma variável de caractere, mesmo que ele tenha digitado apenas um número.
Se precisarmos que o usuário insira um número para alguma ação adicional com ele como um número (para operações matemáticas, por exemplo), precisamos fazer o seguinte truque: converter nosso resultado de sequência em numérico.

Primeiro, o usuário digita os dados, depois que ele digita e pressiona Entrar, as informações da string inseridas por ele são convertidas para um formato numérico. A função nos ajuda nisso. int (). Ele converte todos os dados em um formato inteiro numérico. Porém, se você decidir converter alguns caracteres para um formato numérico, o intérprete apresentará um erro.

Letras não são números!

De uma maneira tão simples, nos familiarizamos com “Entrada e saída na linguagem Python«

Escrevendo e lendo arquivos

A função open () retorna um objeto de arquivo e, na maioria dos casos, é usada com dois argumentos: open (file_name, modo) .

O primeiro parâmetro é uma sequência que contém o nome do arquivo. A segunda é outra linha contendo vários caracteres que descrevem como usar o arquivo. Valor do parâmetro modo pode ser o símbolo 'r' se o arquivo estiver aberto apenas para leitura, 'w' está aberto apenas para gravação (um arquivo existente com o mesmo nome será excluído) e 'a' é o arquivo aberto para adição: qualquer dado gravado no arquivo é automaticamente são adicionados ao final. 'r +' abre o arquivo para leitura e gravação. Parâmetro modo opcional: se for omitido, assume-se que é igual a 'r'.

No caso usual, os arquivos são abertos em modo texto (modo texto) - significa que você está lendo um arquivo e gravando em um arquivo em uma determinada codificação (por padrão, ele é usado Utf-8) Se você adicionar символ b 'ao modo de arquivo, o arquivo será aberto em modo binário (modo binário): agora os dados são lidos e gravados como objetos binários. Este modo deve ser usado para todos os arquivos que não contêm texto.

Ao usar o modo de texto, todas as terminações de linha, por padrão, específicas da plataforma ( n no Unix, r n no Windows) são truncadas para o caractere n ao ler um arquivo e são convertidas novamente de n para uma exibição específica para plataformas ao gravar em um arquivo. Essas alterações nos bastidores dos dados do arquivo funcionam corretamente no caso de arquivos de texto, mas corrompem os dados binários em arquivos como JPEG ou EXE. Tenha cuidado ao usar o modo binário ao ler e gravar esses arquivos.

Métodos de objeto de arquivo

Os exemplos abaixo assumem que um objeto de arquivo chamado f é criado com antecedência.

Para ler o conteúdo de um arquivo, chame f.read (tamanho) - a função lê uma certa quantidade de dados e os retorna como um objeto de string ou byte. tamanho - parâmetro numérico opcional. Se tamanho omitido ou negativo, todo o conteúdo do arquivo será lido e retornado, se o arquivo for duas vezes maior que a RAM do seu computador, a solução para esse problema permanecerá em sua consciência. Caso contrário, um máximo será lido e retornado. tamanho byte Se o final do arquivo foi alcançado, f.read () retornará uma string vazia ().

f.readline () lê uma linha do arquivo, o caractere de nova linha ( n) permanece no final da linha lida e fica ausente ao ler a última linha do arquivo somente se o arquivo não terminar com uma linha vazia. Por esse motivo, o valor retornado se torna inequívoco: se f.readline () retornar uma linha vazia, o final do arquivo será atingido, ao mesmo tempo, a linha vazia representada por ' n' conterá apenas um caractere de nova linha.

f.readlines () retorna uma lista contendo todas as linhas de dados encontradas no arquivo. Se o parâmetro opcional hint_size for passado, a função lerá o número especificado de bytes do arquivo, além de um certo número de bytes, suficiente para completar a linha e formará uma lista de linhas a partir do resultado. A função é frequentemente usada para leitura mais eficiente (arquivo não é carregado na memória completamente) linha a linha de arquivos grandes. Somente linhas completas (concluídas) serão retornadas.

Uma leitura linha por linha alternativa é percorrer um objeto de arquivo. É rápido, eficiente em termos de memória e, como resultado, possui código simples:

Um método alternativo é mais simples, mas não fornece controle sutil sobre o que está acontecendo. Como esses dois métodos funcionam com buffer de linha de maneiras diferentes, eles não devem ser misturados.

f.write (corda) escreve o conteúdo cordas para um arquivo e retorna o número de bytes gravados.

Para escrever algo diferente de uma string em um arquivo, primeiro você precisa converter algo em uma string:

f.tell () retorna um número inteiro que representa a posição atual no arquivo f, medido em bytes desde o início do arquivo. Para alterar a posição de um objeto de arquivo, use f.seek (deslocamento, de onde) A posição é calculada adicionando o deslocamento ao ponto de referência, o ponto de referência é selecionado no parâmetro de onde . Valor do parâmetro 0 de onde mede o deslocamento desde o início do arquivo, um valor 1 aplica a posição atual no arquivo e um valor 2 usa o final do arquivo como ponto de referência. Parâmetro de onde pode ser omitido e definido como 0 por padrão, usando o início do arquivo como ponto de referência.

Ao trabalhar com arquivos de texto (abertos sem o caractere b na linha de modo), a busca é permitida apenas desde o início do arquivo (exceto para rolar até o final do arquivo usando a busca (0, 2)).

Quando você concluir todas as ações no arquivo, chame f.close () para fechá-lo e liberar todos os recursos do sistema usados ​​para abrir esse arquivo. Todas as tentativas de usar o objeto de arquivo após chamar f.close () lançarão uma exceção.

É considerado uma boa prática usar a palavra-chave with ao trabalhar com objetos de arquivo. A vantagem desse método é que o arquivo sempre fecha corretamente após a execução do bloco ou se uma exceção foi lançada durante a execução. Além disso, o código resultante é muito menor que o formulário equivalente com blocos tente - finalmente :

Os objetos de arquivo possuem alguns métodos adicionais, como isatty () e truncate (), que não são usados ​​com frequência, consulte a Referência da biblioteca para obter uma visão geral mais completa dos objetos de arquivo.

Pickle module

As strings podem ser facilmente gravadas e lidas em um arquivo. No caso de números, você precisa usar um pouco mais de esforço: o método read () retorna apenas as linhas que você precisa passar para uma função como int (), que pega uma sequência do formato '123' e retorna seu valor numérico: 123. No entanto, se você pretende preservar tipos de dados mais complexos, como listas, dicionários ou instâncias de classe, as coisas ficam um pouco confusas.

Em vez de forçar o programador a escrever e depurar constantemente códigos para tipos de dados complexos, o Python fornece um módulo padrão chamado pickle. Este é um ótimo módulo que pode pegar qualquer objeto Python (até mesmo algumas formas de código Python!) E convertê-lo em uma representação de string: esse processo é chamado conservação (decapagem) A restauração de um objeto a partir de sua representação em cadeia é chamada des preservação (destemido): uma linha que descreve o objeto pode ser salva em um arquivo, adicionada a alguns dados ou enviada por uma conexão de rede a um computador remoto.

Se você tiver algum objeto xe um objeto de arquivo f aberto para gravação no modo binário (modo binário, com o parâmetro 'wb'), a maneira mais simples preservar um objeto requer uma única linha de código:

Para preservar novamente o objeto, desde que f seja o objeto do arquivo aberto para leitura (também no modo binário, com o parâmetro 'rb'):

(Existem opções para executar essas operações que se aplicam quando des preservação vários objetos ou quando você precisar gravar enlatado dados para um arquivo, consulte a documentação do módulo pickle na Referência da biblioteca.)

pickle é uma maneira padrão de criar objetos Python que podem ser reutilizados por outros programas ou versões futuras do mesmo programa; para eles, existe um termo técnico - objeto fixo (objeto persistente) Como pickle é usado com frequência, muitos autores de extensões Python garantem que novos tipos de dados, como matrizes, possam ser corretamente enlatado e mothballed.

Editor, Autor: Fred L. Drake Jr. (Fred L. Drake, Jr.) e outros

coleções

O Python possui tipos de dados integrados interessantes, mas às vezes eles não se comportam exatamente como gostariam.

Felizmente, a biblioteca interna do Python possui um módulo de coleções com tipos de dados adicionais convenientes:

Já imaginou como procurar dentro de um objeto em Python e examinar seus atributos? Claro, eles pensaram.

1 de agosto às 10:00, Online, grátis

Use a linha de comando:

Isso pode ser útil durante uma sessão interativa em Python, bem como para o estudo dinâmico de objetos e módulos com os quais você trabalha.

$ pip install emoji

E não finja que não deseja tentar:

de __future__ import

Uma das consequências da popularidade do Python é que novas versões são constantemente desenvolvidas e lançadas. Novas versões - novos recursos, mas não para você se você estiver desatualizado.

No entanto, nem tudo é tão ruim. O módulo __future__ torna possível importar a funcionalidade de versões futuras do Python. É como uma viagem no tempo ou mágica:

Pode ser difícil para os programadores navegar na geografia. No entanto, o módulo geopy simplifica as coisas:

$ pip install geopy

Ele funciona abstraindo as APIs de diferentes serviços de geocodificação. Este módulo permite descobrir o endereço completo do local, sua longitude, latitude e até altura.

Também possui uma classe de distância útil. Ele calcula a distância entre dois locais em uma unidade de medida conveniente.

Você está preso a um problema e não consegue se lembrar de sua solução? Precisa ir ao StackOverflow, mas não quer sair do terminal?

Então você não pode prescindir desta ferramenta de linha de comando:

Como instalar o $ pip

Faça qualquer pergunta e ele tentará encontrar a resposta para ela:

Mas tenha cuidado: extrai o código das respostas principais no StackOverflow e nem sempre fornece informações úteis:

$ howdoi exit vim

O módulo de inspeção é útil para entender o que está acontecendo nos bastidores do Python. Você pode até chamar seus métodos neles você mesmo!

A seguir, usa o método inspect.getsource () para gerar seu próprio código-fonte. O método inspect.getmodule () também é usado para gerar o módulo no qual está definido.

O último comando exibe o número da linha em que está localizado:

Obviamente, além de usos triviais, este módulo pode ser útil para entender o que seu código faz. Você também pode usá-lo para escrever código de auto-documentação.

A biblioteca Jedi foi projetada para conclusão e análise de código. Acelera o processo de escrever código e o torna mais produtivo.

Se você não estiver desenvolvendo seu IDE, provavelmente estará mais interessado em usar o Jedi como uma extensão de editor. Felizmente, já existem muitas opções.

Возможно, вы уже встречались с Jedi — IPython использует эту библиотеку для автодополнения.

Когда изучаешь любой язык, на пути встречается множество краеугольных камней. В случае с Python понимание таинственного синтаксиса **kwargs можно считать одним из них.

Две звёздочки впереди объекта словаря дают возможность передавать в функцию содержимое этого словаря как именованные аргументы.

Ключи словаря — это имена аргументов, а значения передаются в функцию. Вам даже не обязательно называть его kwargs :

Это полезно в тех случаях, когда ваши функции должны обрабатывать именованные аргументы, не определённые заранее.

Прим.перев. Também pode ser útil ao escrever funções de wrapper que transmitem todos os argumentos para outra função.

Geradores de lista

Outro recurso interessante do Python que facilita a criação de listas. Tais expressões facilitam a escrita de um código limpo que se parece quase com uma linguagem natural:

O Python possui um bom suporte interno para programação funcional. Um dos recursos mais úteis é a função map (), especialmente em combinação com as funções lambda:

Aqui map () aplica uma função lambda simples em cada elemento x e retorna um objeto de mapa que pode ser convertido em algum objeto iterável, como uma lista ou tupla.

newspaper3k

Se você ainda não o conheceu, prepare-se para que o módulo do jornal o surpreenda.

Permite extrair artigos e metadados relacionados de várias fontes diferentes. Você pode extrair imagens, texto e nomes de autores.

Ele ainda possui funcionalidade PNL embutida.

Portanto, se você estiver usando o BeautifulSoup ou outra biblioteca para raspagem da Web em seu próximo projeto, é melhor economizar seu tempo e esforço e instalar o jornal:

$ pip install newspaper3k

Sobrecarga do operador

O Python tem suporte para sobrecarga de operadores - uma daquelas coisas sobre as quais todos os cientistas da computação estão falando.

De fato, a ideia é simples. Você já se perguntou por que o Python permite que você use o operador + para adicionar números e concatenar strings? Por trás disso está apenas a sobrecarga do operador.

Você pode definir objetos que usem caracteres de operador padrão de qualquer maneira. Isso permite que você os aplique no contexto dos objetos com os quais trabalha:

A função padrão do Python print () faz o truque. Mas se você tentar exibir algum objeto aninhado grande, o resultado não parecerá muito bom.

O módulo da biblioteca pprint padrão (impressão bonita) vem em socorro aqui. Usando-o, você pode exibir objetos com uma estrutura complexa de forma legível.

Um item essencial para qualquer desenvolvedor Python que trabalhe com estruturas de dados personalizadas:

O Python suporta multi-threading, que o módulo padrão da Fila ajuda a usar.

Ele permite implementar uma estrutura de dados como uma fila. As filas permitem adicionar e recuperar elementos de acordo com uma regra específica.

As filas FIFO “primeiro a entrar, primeiro a sair” permitem recuperar objetos na ordem em que foram adicionados. Nas filas “último a entrar, primeiro a sair” (“último a entrar, primeiro a sair”, LIFO), você pode recuperar os últimos objetos adicionados.

Finalmente, as filas de prioridade permitem recuperar objetos de acordo com a ordem de classificação.

Aqui você pode ver um exemplo do uso de filas na programação Python multiencadeada.

Ao definir uma classe ou objeto, é útil adicionar uma maneira "oficial" de representar o objeto como uma string. Por exemplo:

Isso simplifica bastante a depuração. Aqui está tudo o que você precisa fazer:

Aprox. O método __repr __ () permite definir uma representação de string destinada ao programador e conveniente para uso durante a depuração, e o método __str __ () permite definir uma representação de string amigável ao usuário que pode ser exibida na interface do programa.

Python é uma ótima linguagem de script. Às vezes, porém, as bibliotecas OS e subprocessos padrão apenas causam dores de cabeça.

A biblioteca sh pode ser uma boa alternativa.

Ele permite que você chame qualquer programa como uma função regular, útil para automatizar várias tarefas exclusivamente usando o Python:

Aprox. A biblioteca sh suporta apenas plataformas Linux e macOS; para trabalhar no Windows, é necessário procurar outra ferramenta.

Anotações de tipo

Python é uma linguagem de tipo dinâmico. Você não precisa especificar o tipo de dados ao definir variáveis, funções, classes, etc.

Isso acelera o processo de desenvolvimento. No entanto, pouco é irritante tanto quanto um erro de tempo de execução causado por uma incompatibilidade de tipo simples.

Desde o Python 3.5, você pode adicionar anotações de tipo ao definir uma função:

Você pode até definir aliases de tipo:

Embora seu uso seja opcional, com a ajuda das anotações de tipo, o código pode se tornar mais compreensível.

Eles também permitem que você use ferramentas de verificação de tipo para detectar erros de TypeError.

O módulo padrão do uuid é uma maneira rápida e fácil de gerar um UUID (identificador universalmente exclusivo).

Portanto, criamos um número aleatório de 128 bits que quase certamente será único.

Existem mais de 2¹²² UUIDs possíveis. Isso é mais de 5 undecilhões ou 5.000.000.000.000.000.000.000.000.000.000.000.000.

A probabilidade de encontrar duplicatas em um determinado conjunto é extremamente pequena. Mesmo com um trilhão de UUIDs, a probabilidade de haver uma duplicação entre eles é muito menor que um em um bilhão.

Nada mal para duas linhas de código.

Ambientes virtuais

Frequentemente, os programadores Python trabalham em vários projetos ao mesmo tempo. Infelizmente, às vezes dois projetos dependem de versões diferentes da mesma dependência. Qual instalar?

Felizmente, o Python tem suporte para ambientes virtuais que tiram o melhor dos dois mundos. No prompt de comando, digite:

Agora você pode ter diferentes versões independentes do Python na mesma máquina.

A Wikipedia possui uma API legal que permite acessar uma fonte incomparável de informações totalmente gratuitas.

O módulo wikipedia torna o acesso a essa API quase excessivamente conveniente:

Como um site real, o módulo fornece suporte para vários idiomas, resolvendo a ambiguidade das páginas, obtendo uma página aleatória e até o método donate ().

O humor é uma característica essencial do Python. No final, o idioma recebeu o nome do programa de comédia britânico Flying Circus, de Monty Python. Em muitos locais da documentação oficial, você pode encontrar referências aos episódios mais famosos do programa.

Obviamente, um senso de humor não termina com a documentação. Tente inserir a seguinte linha:

Fique, Python. Fique você mesmo.

YAML significa "YAML não é uma linguagem de marcação" ("YAML não é uma linguagem de marcação"). É uma linguagem de formatação de dados que é um superconjunto do JSON.

Diferentemente do JSON, o YAML pode armazenar objetos mais complexos e referenciar seus próprios elementos. Você também pode escrever comentários, o que torna o YAML adequado para arquivos de configuração.

O módulo PyYAML permite usar o YAML no Python. Você pode instalá-lo assim:

$ pip install pyyaml

E depois importe:

O PyYAML permite que você armazene quaisquer objetos e instâncias Python de qualquer classe personalizada.

Finalmente, outra coisa legal. Já teve a necessidade de criar um dicionário a partir de duas listas?

A função zip () interna pega vários objetos iteráveis ​​e retorna uma sequência de tuplas. Cada tupla agrupa os elementos dos objetos por seu índice.

Você pode executar o inverso de zip () usando zip (*).

E quais técnicas ou bibliotecas úteis você conhece? Compartilhe nos comentários.

  1. 0, 0.0 ↩
  2. 0, 1.0 ↩
  3. 0, 1.0 ↩
  4. 0, -2.0 ↩

Como o Yandex usa seus dados e aprendizado de máquina para personalizar serviços - leia e assista ao YaC 2019.