Python 3 - Guia rápido

O módulo __future__

Python 3.x introduziu algumas palavras-chave e recursos incompatíveis com Python 2 que podem ser importados por meio do módulo __future__ integrado no Python 2. É recomendado usar importações __future__, se você estiver planejando suporte Python 3.x para seu código.

Por exemplo, se quisermos o comportamento da divisão inteira do Python 3.x no Python 2, adicione a seguinte instrução de importação.

from __future__ import division

A função de impressão

A mudança mais notável e mais amplamente conhecida no Python 3 é como o printfunção é usada. O uso de parênteses () com a função de impressão agora é obrigatório. Era opcional no Python 2.

print "Hello World" #is acceptable in Python 2
print ("Hello World") # in Python 3, print must be followed by ()

A função print () insere uma nova linha no final, por padrão. No Python 2, ele pode ser suprimido colocando ',' no final. No Python 3, "end = ''" acrescenta espaço em vez de nova linha.

print x,           # Trailing comma suppresses newline in Python 2
print(x, end=" ")  # Appends a space instead of a newline in Python 3

Ler entrada do teclado

Python 2 tem duas versões de funções de entrada, input() e raw_input(). A função input () trata os dados recebidos como string se estiverem incluídos entre aspas '' ou "", caso contrário, os dados são tratados como um número.

No Python 3, a função raw_input () está obsoleta. Além disso, os dados recebidos são sempre tratados como string.

In Python 2

>>> x = input('something:') 
something:10 #entered data is treated as number
>>> x
10

>>> x = input('something:')
something:'10' #entered data is treated as string
>>> x
'10'

>>> x = raw_input("something:")
something:10 #entered data is treated as string even without ''
>>> x
'10'

>>> x = raw_input("something:")
something:'10' #entered data treated as string including ''
>>> x
"'10'"

In Python 3

>>> x = input("something:")
something:10
>>> x
'10'

>>> x = input("something:")
something:'10' #entered data treated as string with or without ''
>>> x
"'10'"

>>> x = raw_input("something:") # will result NameError
Traceback (most recent call last):
   File "<pyshell#3>", line 1, in 
  <module>
   x = raw_input("something:")
NameError: name 'raw_input' is not defined

Divisão Inteira

No Python 2, o resultado da divisão de dois inteiros é arredondado para o inteiro mais próximo. Como resultado, 3/2 mostrará 1. Para obter uma divisão de ponto flutuante, o numerador ou denominador deve ser usado explicitamente como flutuante. Portanto, 3,0 / 2 ou 3 / 2,0 ou 3,0 / 2,0 resultará em 1,5

Python 3 avalia 3/2 como 1.5 por padrão, o que é mais intuitivo para novos programadores.

Representação Unicode

O Python 2 requer que você marque uma string com au se quiser armazená-la como Unicode.

O Python 3 armazena strings como Unicode, por padrão. Temos strings Unicode (utf-8) e classes de 2 bytes: byte e arrays de bytes.

Função xrange () removida

No Python 2, range () retorna uma lista, e xrange () retorna um objeto que irá gerar apenas os itens no intervalo quando necessário, economizando memória.

No Python 3, a função range () foi removida e xrange () foi renomeado como range (). Além disso, o objeto range () oferece suporte ao fatiamento no Python 3.2 e posterior.

levantar exceção

Python 2 aceita ambas as notações, a sintaxe 'antiga' e a 'nova'; Python 3 levanta um SyntaxError se não colocarmos o argumento de exceção entre parênteses.

raise IOError, "file error" #This is accepted in Python 2
raise IOError("file error") #This is also accepted in Python 2
raise IOError, "file error" #syntax error is raised in Python 3
raise IOError("file error") #this is the recommended syntax in Python 3

Argumentos em exceções

No Python 3, os argumentos para exceção devem ser declarados com a palavra-chave 'as'.

except Myerror, err: # In Python2
except Myerror as err: #In Python 3

Função next () e Método .next ()

No Python 2, next () como um método de objeto gerador é permitido. No Python 2, a função next (), para iterar sobre o objeto gerador, também é aceita. No Python 3, entretanto, next (0 como método gerador é descontinuado e gera AttributeError.

gen = (letter for letter in 'Hello World') # creates generator object
next(my_generator) #allowed in Python 2 and Python 3
my_generator.next() #allowed in Python 2. raises AttributeError in Python 3

Utilitário 2to3

Junto com o interpretador Python 3, o script 2to3.py geralmente é instalado na pasta tools / scripts. Ele lê o código-fonte do Python 2.x e aplica uma série de fixadores para transformá-lo em um código Python 3.x válido.

Here is a sample Python 2 code (area.py):

def area(x,y = 3.14): 
   a = y*x*x
   print a
   return a

a = area(10)
print "area",a

To convert into Python 3 version:

$2to3 -w area.py

Converted code :

def area(x,y = 3.14): # formal parameters
   a = y*x*x
   print (a)
   return a

a = area(10)
print("area",a)

Python é uma linguagem de script de alto nível, interpretada, interativa e orientada a objetos. Python foi projetado para ser altamente legível. Ele usa palavras-chave em inglês com frequência, enquanto os outros idiomas usam pontuações. Possui menos construções sintáticas do que outras linguagens.

  • Python is Interpreted- Python é processado em tempo de execução pelo interpretador. Você não precisa compilar seu programa antes de executá-lo. Isso é semelhante ao PERL e PHP.

  • Python is Interactive - Você pode realmente sentar em um prompt do Python e interagir com o interpretador diretamente para escrever seus programas.

  • Python is Object-Oriented - Python suporta estilo orientado a objeto ou técnica de programação que encapsula código dentro de objetos.

  • Python is a Beginner's Language - Python é uma ótima linguagem para programadores iniciantes e oferece suporte ao desenvolvimento de uma ampla gama de aplicativos, desde processamento de texto simples a navegadores WWW e jogos.

História do Python

Python foi desenvolvido por Guido van Rossum no final dos anos oitenta e início dos anos noventa no Instituto Nacional de Pesquisa para Matemática e Ciência da Computação na Holanda.

  • Python é derivado de muitas outras linguagens, incluindo ABC, Modula-3, C, C ++, Algol-68, SmallTalk e shell Unix e outras linguagens de script.

  • Python é protegido por direitos autorais. Como o Perl, o código-fonte do Python agora está disponível sob a GNU General Public License (GPL).

  • Python agora é mantido por uma equipe de desenvolvimento central no instituto, embora Guido van Rossum ainda tenha um papel vital no direcionamento de seu progresso.

  • Python 1.0 foi lançado em novembro de 1994. Em 2000, Python 2.0 foi lançado. Python 2.7.11 é a edição mais recente do Python 2.

  • Enquanto isso, Python 3.0 foi lançado em 2008. Python 3 não é compatível com Python 2. A ênfase em Python 3 foi na remoção de construções e módulos de programação duplicados para que "Deve haver um - e de preferência apenas um - maneira óbvia de fazer isso. " Python 3.5.1 é a versão mais recente do Python 3.

Recursos do Python

Os recursos do Python incluem -

  • Easy-to-learn- Python tem poucas palavras-chave, estrutura simples e uma sintaxe claramente definida. Isso permite que o aluno aprenda o idioma rapidamente.

  • Easy-to-read - O código Python é mais claramente definido e visível aos olhos.

  • Easy-to-maintain - O código-fonte do Python é bastante fácil de manter.

  • A broad standard library - A maior parte da biblioteca do Python é muito portátil e compatível com várias plataformas em UNIX, Windows e Macintosh.

  • Interactive Mode - Python tem suporte para um modo interativo que permite teste interativo e depuração de trechos de código.

  • Portable - Python pode ser executado em uma ampla variedade de plataformas de hardware e tem a mesma interface em todas as plataformas.

  • Extendable- Você pode adicionar módulos de baixo nível ao interpretador Python. Esses módulos permitem que os programadores adicionem ou personalizem suas ferramentas para serem mais eficientes.

  • Databases - Python fornece interfaces para todos os principais bancos de dados comerciais.

  • GUI Programming - Python suporta aplicativos GUI que podem ser criados e transferidos para muitas chamadas de sistema, bibliotecas e sistemas Windows, como Windows MFC, Macintosh e o sistema X Window do Unix.

  • Scalable - Python fornece uma estrutura e suporte melhores para programas grandes do que scripts de shell.

Além dos recursos mencionados acima, Python tem uma grande lista de bons recursos. A, alguns estão listados abaixo -

  • Ele suporta métodos de programação funcionais e estruturados, bem como OOP.

  • Ele pode ser usado como uma linguagem de script ou pode ser compilado em código de bytes para a construção de grandes aplicativos.

  • Ele fornece tipos de dados dinâmicos de alto nível e oferece suporte à verificação de tipo dinâmico.

  • Ele oferece suporte à coleta de lixo automática.

  • Pode ser facilmente integrado com C, C ++, COM, ActiveX, CORBA e Java.

Python 3 está disponível para Windows, Mac OS e a maioria dos sistemas operacionais Linux. Embora o Python 2 esteja disponível para muitos outros sistemas operacionais, o suporte ao Python 3 não foi disponibilizado para eles ou foi abandonado.

Configuração de ambiente local

Abra uma janela de terminal e digite "python" para descobrir se já está instalado e qual versão está instalada.

Obtendo Python

Plataforma Windows

Binários da última versão do Python 3 (Python 3.5.1) estão disponíveis nesta página de download

As seguintes opções de instalação diferentes estão disponíveis.

  • Arquivo zip incorporável do Windows x86-64
  • Instalador executável do Windows x86-64
  • Instalador baseado na web do Windows x86-64
  • Arquivo zip incorporável do Windows x86
  • Instalador executável do Windows x86
  • Instalador baseado na web do Windows x86

Note- Para instalar o Python 3.5.1, os requisitos mínimos de SO são Windows 7 com SP1. Para as versões 3.0 a 3.4.x, o Windows XP é aceitável.

Plataforma Linux

Diferentes tipos de Linux usam diferentes gerenciadores de pacotes para a instalação de novos pacotes.

No Ubuntu Linux, o Python 3 é instalado usando o seguinte comando do terminal.

$sudo apt-get install python3-minimal

Instalação da fonte

Baixe o tarball do código-fonte Gzipado do URL de download do Python - https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz

Extract the tarball
tar xvfz Python-3.5.1.tgz
Configure and Install:
cd Python-3.5.1
./configure --prefix = /opt/python3.5.1
make  
sudo make install

Mac OS

Baixe instaladores do Mac OS a partir deste URL - https://www.python.org/downloads/mac-osx/

  • Instalador do Mac OS X 64 bits / 32 bits - python-3.5.1-macosx10.6.pkg
  • Instalador do Mac OS X i386 / PPC de 32 bits - python-3.5.1-macosx10.5.pkg

Clique duas vezes neste arquivo de pacote e siga as instruções do assistente para instalar.

O código-fonte mais atualizado e atual, binários, documentação, notícias, etc., está disponível no site oficial do Python -

Python Official Website - https://www.python.org/

Você pode baixar a documentação do Python no seguinte site. A documentação está disponível nos formatos HTML, PDF e PostScript.

Python Documentation Website- www.python.org/doc/

Configurando PATH

Os programas e outros arquivos executáveis ​​podem estar em vários diretórios. Conseqüentemente, os sistemas operacionais fornecem um caminho de pesquisa que lista os diretórios nos quais pesquisa os executáveis.

Os recursos importantes são -

  • O caminho é armazenado em uma variável de ambiente, que é uma string nomeada mantida pelo sistema operacional. Esta variável contém informações disponíveis para o shell de comando e outros programas.

  • A variável de caminho é nomeada como PATH em Unix ou Path no Windows (o Unix diferencia maiúsculas de minúsculas; o Windows não).

  • No Mac OS, o instalador lida com os detalhes do caminho. Para invocar o interpretador Python de qualquer diretório específico, você deve adicionar o diretório Python ao seu caminho.

Configurando caminho em Unix / Linux

Para adicionar o diretório Python ao caminho para uma sessão particular no Unix -

  • In the csh shell - digite setenv PATH "$ PATH: / usr / local / bin / python3" e pressione Enter.

  • In the bash shell (Linux) - digite export PYTHONPATH = / usr / local / bin / python3.4 e pressione Enter.

  • In the sh or ksh shell - digite PATH = "$ PATH: / usr / local / bin / python3" e pressione Enter.

Note - / usr / local / bin / python3 é o caminho do diretório Python.

Configurando Caminho no Windows

Para adicionar o diretório Python ao caminho para uma sessão específica no Windows -

  • At the command prompt - digite path% path%; C: \ Python e pressione Enter.

Note - C: \ Python é o caminho do diretório Python

Variáveis ​​de ambiente Python

Aqui estão variáveis ​​de ambiente importantes, que são reconhecidas pelo Python -

Sr. Não. Variável e Descrição
1

PYTHONPATH

Ele tem uma função semelhante a PATH. Esta variável informa ao interpretador Python onde localizar os arquivos de módulo importados para um programa. Deve incluir o diretório da biblioteca de origem do Python e os diretórios que contêm o código-fonte do Python. PYTHONPATH às vezes é predefinido pelo instalador Python.

2

PYTHONSTARTUP

Ele contém o caminho de um arquivo de inicialização contendo o código-fonte Python. Ele é executado toda vez que você inicia o interpretador. É denominado .pythonrc.py no Unix e contém comandos que carregam utilitários ou modificam PYTHONPATH.

3

PYTHONCASEOK

É usado no Windows para instruir o Python a encontrar a primeira correspondência sem distinção entre maiúsculas e minúsculas em uma instrução de importação. Defina esta variável com qualquer valor para ativá-la.

4

PYTHONHOME

É um caminho alternativo de pesquisa de módulo. Geralmente é incorporado aos diretórios PYTHONSTARTUP ou PYTHONPATH para facilitar a troca de bibliotecas de módulos.

Executando Python

Existem três maneiras diferentes de iniciar o Python -

Intérprete Interativo

Você pode iniciar o Python a partir do Unix, DOS ou qualquer outro sistema que forneça um interpretador de linha de comando ou janela de shell.

Entrar python a linha de comando.

Comece a codificar imediatamente no interpretador interativo.

$python             # Unix/Linux
or
python%             # Unix/Linux
or
C:>python           # Windows/DOS

Aqui está a lista de todas as opções de linha de comando disponíveis -

Sr. Não. Opção e descrição
1

-d

fornecer saída de depuração

2

-O

gerar bytecode otimizado (resultando em arquivos .pyo)

3

-S

não execute o site de importação para procurar caminhos Python na inicialização

4

-v

saída detalhada (rastreamento detalhado em declarações de importação)

5

-X

desabilite exceções integradas baseadas em classe (apenas use strings); obsoleto a partir da versão 1.6

6

-c cmd

execute o script Python enviado como string cmd

7

file

execute o script Python a partir do arquivo fornecido

Script da linha de comando

Um script Python pode ser executado na linha de comando invocando o interpretador em seu aplicativo, conforme mostrado no exemplo a seguir.

$python  script.py          # Unix/Linux
or
python% script.py           # Unix/Linux
or 
C:>python script.py         # Windows/DOS

Note - Certifique-se de que o modo de permissão de arquivo permite a execução.

Ambiente de desenvolvimento integrado

Você também pode executar o Python a partir de um ambiente de interface gráfica do usuário (GUI), se tiver um aplicativo GUI em seu sistema que suporte Python.

  • Unix - IDLE é o primeiro IDE Unix para Python.

  • Windows - PythonWin é a primeira interface do Windows para Python e é um IDE com uma GUI.

  • Macintosh - A versão do Python para Macintosh junto com o IDLE IDE está disponível no site principal, para download como arquivos MacBinary ou BinHex.

Se você não conseguir configurar o ambiente adequadamente, poderá obter a ajuda do administrador do sistema. Certifique-se de que o ambiente Python esteja configurado corretamente e funcionando perfeitamente bem.

Note - Todos os exemplos dados nos capítulos subsequentes são executados com a versão Python 3.4.1 disponível no Windows 7 e Ubuntu Linux.

Já configuramos o ambiente de programação Python online, para que você possa executar todos os exemplos disponíveis online enquanto aprende a teoria. Sinta-se à vontade para modificar qualquer exemplo e executá-lo online.

A linguagem Python tem muitas semelhanças com Perl, C e Java. No entanto, existem algumas diferenças definidas entre os idiomas.

Primeiro programa Python

Vamos executar os programas em diferentes modos de programação.

Programação de modo interativo

Invocar o interpretador sem passar um arquivo de script como parâmetro traz o seguinte prompt -

$ python

Python 3.3.2 (default, Dec 10 2013, 11:35:01)
[GCC 4.6.3] on Linux
Type "help", "copyright", "credits", or "license" for more information.
>>>

On Windows:

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>

Digite o seguinte texto no prompt do Python e pressione Enter -

>>> print ("Hello, Python!")

Se você estiver executando a versão mais antiga do Python (Python 2.x), use parênteses como inprintfunção é opcional. Isso produz o seguinte resultado -

Hello, Python!

Programação em modo script

Chamar o interpretador com um parâmetro de script começa a execução do script e continua até que o script seja concluído. Quando o script é concluído, o intérprete não está mais ativo.

Vamos escrever um programa Python simples em um script. Os arquivos Python têm a extensão.py. Digite o seguinte código-fonte em um arquivo test.py -

print ("Hello, Python!")

Presumimos que você tenha o interpretador Python definido em PATHvariável. Agora, tente executar este programa da seguinte maneira -

On Linux

$ python test.py

Isso produz o seguinte resultado -

Hello, Python!

On Windows

C:\Python34>Python test.py

Isso produz o seguinte resultado -

Hello, Python!

Vamos tentar outra maneira de executar um script Python no Linux. Aqui está o arquivo test.py modificado -

#!/usr/bin/python3
print ("Hello, Python!")

Presumimos que você tenha um interpretador Python disponível no diretório / usr / bin. Agora, tente executar este programa da seguinte maneira -

$ chmod +x test.py # This is to make file executable $./test.py

Isso produz o seguinte resultado -

Hello, Python!

Identificadores Python

Um identificador Python é um nome usado para identificar uma variável, função, classe, módulo ou outro objeto. Um identificador começa com uma letra de A a Z ou a a z ou um sublinhado (_) seguido por zero ou mais letras, sublinhados e dígitos (0 a 9).

Python não permite caracteres de pontuação como @, $ e% nos identificadores. Python é uma linguagem de programação que diferencia maiúsculas de minúsculas. Portanto,Manpower e manpower são dois identificadores diferentes em Python.

Aqui estão as convenções de nomenclatura para identificadores Python -

  • Os nomes das classes começam com uma letra maiúscula. Todos os outros identificadores começam com uma letra minúscula.

  • Iniciar um identificador com um único sublinhado inicial indica que o identificador é privado.

  • Iniciar um identificador com dois sublinhados iniciais indica um identificador privado forte.

  • Se o identificador também terminar com dois sublinhados à direita, o identificador é um nome especial definido pelo idioma.

Palavras reservadas

A lista a seguir mostra as palavras-chave Python. Estas são palavras reservadas e você não pode usá-las como constantes ou variáveis ​​ou qualquer outro nome de identificador. Todas as palavras-chave Python contêm apenas letras minúsculas.

e exec não
Como finalmente ou
afirmar para passar
pausa de impressão
classe global levantar
continuar E se Retorna
def importar experimentar
del dentro enquanto
elif é com
outro lambda produção
exceto

Linhas e recuo

Python não usa chaves ({}) para indicar blocos de código para definições de classe e função ou controle de fluxo. Blocos de código são denotados por recuo de linha, que é rigidamente aplicado.

O número de espaços no recuo é variável, mas todas as instruções dentro do bloco devem ser recuadas da mesma forma. Por exemplo -

if True:
   print ("True")

else:
   print ("False")

No entanto, o bloco a seguir gera um erro -

if True:
   print ("Answer")
   print ("True")

else:
   print "(Answer")
   print ("False")

Assim, em Python, todas as linhas contínuas recuadas com o mesmo número de espaços formariam um bloco. O exemplo a seguir tem vários blocos de instrução -

Note- Não tente entender a lógica neste momento. Apenas certifique-se de ter entendido os vários blocos, mesmo que eles não tenham chaves.

#!/usr/bin/python3
import sys

file_finish = "end"
file_text = ""
contents=[]

file_name=input("Enter filename: ")
if len(file_name) == 0:
   print("Please enter filename")
   sys.exit()

try:
   # open file stream
   file = open(file_name, "w")

except IOError:
   print ("There was an error writing to", file_name)
   sys.exit()

print ("Enter '", file_finish,)
print ("' When finished")

while file_text != file_finish:
   file_text = input("Enter text: ")
   contents.append(file_text)

   if file_text == file_finish:
      # close the file
      file.close()
      break

print(contents)
data = ' '.join([str(elem) for elem in contents])  
print(data)
file.write(data)
file.close()
file_name = input("Enter filename: ")

if len(file_name) == 0:
   print ("Next time please enter something")
   sys.exit()

try:
   file = open(file_name, "r")

except IOError:
   print ("There was an error reading file")
   sys.exit()
file_text = file.read()
file.close()
print (file_text)

Declarações de várias linhas

As instruções em Python geralmente terminam com uma nova linha. Python, entretanto, permite o uso do caractere de continuação de linha (\) para denotar que a linha deve continuar. Por exemplo -

total = item_one + \
        item_two + \
        item_three

As instruções contidas nos colchetes [], {} ou () não precisam usar o caractere de continuação de linha. Por exemplo -

days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']

Cotação em Python

Python aceita aspas simples ('), duplas (") e triplas (' '' ou" "") para denotar literais de string, desde que o mesmo tipo de aspas inicie e termine a string.

As aspas triplas são usadas para estender a string em várias linhas. Por exemplo, todos os itens a seguir são legais -

word = 'word'
sentence = "This is a sentence."
paragraph = """This is a paragraph. It is
made up of multiple lines and sentences."""

Comentários em Python

Um sinal de hash (#) que não está dentro de um literal de string é o início de um comentário. Todos os caracteres após o #, até o final da linha física, fazem parte do comentário e o interpretador Python os ignora.

#!/usr/bin/python3

# First comment
print ("Hello, Python!") # second comment

Isso produz o seguinte resultado -

Hello, Python!

Você pode digitar um comentário na mesma linha após uma declaração ou expressão -

name = "Madisetti" # This is again comment

Python não possui recurso de comentários de várias linhas. Você deve comentar cada linha individualmente da seguinte forma -

# This is a comment.
# This is a comment, too.
# This is a comment, too.
# I said that already.

Usando linhas em branco

Uma linha contendo apenas espaços em branco, possivelmente com um comentário, é conhecida como linha em branco e o Python a ignora totalmente.

Em uma sessão de intérprete interativa, você deve inserir uma linha física vazia para encerrar uma instrução multilinha.

Esperando pelo Usuário

A linha a seguir do programa exibe o prompt e a instrução dizendo “Pressione a tecla Enter para sair” e, em seguida, aguarda a ação do usuário -

#!/usr/bin/python3

input("\n\nPress the enter key to exit.")

Aqui, "\ n \ n" é usado para criar duas novas linhas antes de exibir a linha real. Assim que o usuário pressiona a tecla, o programa termina. Este é um bom truque para manter uma janela do console aberta até que o usuário conclua o aplicativo.

Várias declarações em uma única linha

O ponto e vírgula (;) permite várias instruções em uma única linha, visto que nenhuma instrução inicia um novo bloco de código. Aqui está um recorte de amostra usando o ponto-e-vírgula -

import sys; x = 'foo'; sys.stdout.write(x + '\n')

Vários grupos de extrato como suítes

Grupos de instruções individuais, que formam um único bloco de código, são chamados suitesem Python. Instruções compostas ou complexas, como if, while, def e class requerem uma linha de cabeçalho e um conjunto.

As linhas de cabeçalho começam a declaração (com a palavra-chave) e terminam com dois pontos (:) e são seguidas por uma ou mais linhas que compõem o conjunto. Por exemplo -

if expression : 
   suite
elif expression : 
   suite 
else : 
   suite

Argumentos de linha de comando

Muitos programas podem ser executados para fornecer algumas informações básicas sobre como devem ser executados. Python permite que você faça isso com -h -

$ python -h
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-c cmd : program passed in as string (terminates option list)
-d     : debug output from parser (also PYTHONDEBUG=x)
-E     : ignore environment variables (such as PYTHONPATH)
-h     : print this help message and exit

[ etc. ]

Você também pode programar seu script de forma que aceite várias opções. Argumentos da linha de comando é um tópico avançado. Vamos entender isso.

As variáveis ​​nada mais são do que locais de memória reservados para armazenar valores. Isso significa que, ao criar uma variável, você reserva algum espaço na memória.

Com base no tipo de dado de uma variável, o interpretador aloca memória e decide o que pode ser armazenado na memória reservada. Portanto, ao atribuir diferentes tipos de dados às variáveis, você pode armazenar inteiros, decimais ou caracteres nessas variáveis.

Atribuição de valores a variáveis

Variáveis ​​Python não precisam de declaração explícita para reservar espaço de memória. A declaração acontece automaticamente quando você atribui um valor a uma variável. O sinal de igual (=) é usado para atribuir valores às variáveis.

O operando à esquerda do operador = é o nome da variável e o operando à direita do operador = é o valor armazenado na variável. Por exemplo -

#!/usr/bin/python3

counter = 100          # An integer assignment
miles   = 1000.0       # A floating point
name    = "John"       # A string

print (counter)
print (miles)
print (name)

Aqui, 100, 1000,0 e "John" são os valores atribuídos às variáveis ​​counter, miles e name, respectivamente. Isso produz o seguinte resultado -

100
1000.0
John

Atribuição múltipla

Python permite que você atribua um único valor a várias variáveis ​​simultaneamente.

Por exemplo -

a = b = c = 1

Aqui, um objeto inteiro é criado com o valor 1, e todas as três variáveis ​​são atribuídas ao mesmo local de memória. Você também pode atribuir vários objetos a várias variáveis. Por exemplo -

a, b, c = 1, 2, "john"

Aqui, dois objetos inteiros com valores 1 e 2 são atribuídos às variáveis ​​aeb respectivamente, e um objeto string com o valor "john" é atribuído à variável c.

Tipos de dados padrão

Os dados armazenados na memória podem ser de vários tipos. Por exemplo, a idade de uma pessoa é armazenada como um valor numérico e seu endereço é armazenado como caracteres alfanuméricos. Python tem vários tipos de dados padrão que são usados ​​para definir as operações possíveis neles e o método de armazenamento para cada um deles.

Python tem cinco tipos de dados padrão -

  • Numbers
  • String
  • List
  • Tuple
  • Dictionary

Números Python

Os tipos de dados numéricos armazenam valores numéricos. Objetos de número são criados quando você atribui um valor a eles. Por exemplo -

var1 = 1
var2 = 10

Você também pode excluir a referência a um objeto de número usando o deldeclaração. A sintaxe dodel declaração é -

del var1[,var2[,var3[....,varN]]]]

Você pode excluir um único objeto ou vários objetos usando o del declaração.

Por exemplo -

del var
del var_a, var_b

Python oferece suporte a três tipos numéricos diferentes -

  • int (inteiros com sinal)
  • float (valores reais de ponto flutuante)
  • complexo (números complexos)

Todos os inteiros em Python3 são representados como inteiros longos. Portanto, não há nenhum tipo de número separado, contanto.

Exemplos

Aqui estão alguns exemplos de números -

int flutuador complexo
10 0,0 3,14j
100 15,20 45.j
-786 -21,9 9.322e-36j
080 32,3 + e18 .876j
-0490 -90. -.6545 + 0J
-0x260 -32.54e100 3e + 26J
0x69 70.2-E12 4.53e-7j

Um número complexo consiste em um par ordenado de números reais de ponto flutuante denotados por x + yj, onde xey são números reais ej é a unidade imaginária.

Python Strings

Strings em Python são identificadas como um conjunto contíguo de caracteres representados entre aspas. Python permite pares de aspas simples ou duplas. Subconjuntos de strings podem ser obtidos usando o operador slice ([] e [:]) com índices começando em 0 no início da string e trabalhando de -1 até o final.

O sinal de mais (+) é o operador de concatenação de string e o asterisco (*) é o operador de repetição. Por exemplo -

#!/usr/bin/python3

str = 'Hello World!'

print (str)          # Prints complete string
print (str[0])       # Prints first character of the string
print (str[2:5])     # Prints characters starting from 3rd to 5th
print (str[2:])      # Prints string starting from 3rd character
print (str * 2)      # Prints string two times
print (str + "TEST") # Prints concatenated string

Isso produzirá o seguinte resultado -

Hello World!
H
llo
llo World!
Hello World!Hello World!
Hello World!TEST

Listas Python

As listas são os mais versáteis dos tipos de dados compostos do Python. Uma lista contém itens separados por vírgulas e colocados entre colchetes ([]). Até certo ponto, as listas são semelhantes às matrizes em C. Uma das diferenças entre elas é que todos os itens pertencentes a uma lista podem ser de tipos de dados diferentes.

Os valores armazenados em uma lista podem ser acessados ​​usando o operador de fatia ([] e [:]) com índices começando em 0 no início da lista e trabalhando até o final -1. O sinal de mais (+) é o operador de concatenação de lista e o asterisco (*) é o operador de repetição. Por exemplo -

#!/usr/bin/python3

list = [ 'abcd', 786 , 2.23, 'john', 70.2 ]
tinylist = [123, 'john']

print (list)          # Prints complete list
print (list[0])       # Prints first element of the list
print (list[1:3])     # Prints elements starting from 2nd till 3rd 
print (list[2:])      # Prints elements starting from 3rd element
print (tinylist * 2)  # Prints list two times
print (list + tinylist) # Prints concatenated lists

Isso produz o seguinte resultado -

['abcd', 786, 2.23, 'john', 70.200000000000003]
abcd
[786, 2.23]
[2.23, 'john', 70.200000000000003]
[123, 'john', 123, 'john']
['abcd', 786, 2.23, 'john', 70.200000000000003, 123, 'john']

Python Tuples

Uma tupla é outro tipo de dados de sequência semelhante à lista. Uma tupla consiste em vários valores separados por vírgulas. Ao contrário das listas, no entanto, as tuplas são colocadas entre parênteses.

A principal diferença entre listas e tuplas é - As listas são colocadas entre colchetes ([]) e seus elementos e tamanho podem ser alterados, enquanto as tuplas são colocadas entre parênteses (()) e não podem ser atualizadas. Tuplas podem ser consideradasread-onlylistas. Por exemplo -

#!/usr/bin/python3

tuple = ( 'abcd', 786 , 2.23, 'john', 70.2  )
tinytuple = (123, 'john')

print (tuple)           # Prints complete tuple
print (tuple[0])        # Prints first element of the tuple
print (tuple[1:3])      # Prints elements starting from 2nd till 3rd 
print (tuple[2:])       # Prints elements starting from 3rd element
print (tinytuple * 2)   # Prints tuple two times
print (tuple + tinytuple) # Prints concatenated tuple

Isso produz o seguinte resultado -

('abcd', 786, 2.23, 'john', 70.200000000000003)
abcd
(786, 2.23)
(2.23, 'john', 70.200000000000003)
(123, 'john', 123, 'john')
('abcd', 786, 2.23, 'john', 70.200000000000003, 123, 'john')

O código a seguir é inválido com tupla, porque tentamos atualizar uma tupla, o que não é permitido. Caso semelhante é possível com listas -

#!/usr/bin/python3

tuple = ( 'abcd', 786 , 2.23, 'john', 70.2  )
list = [ 'abcd', 786 , 2.23, 'john', 70.2  ]
tuple[2] = 1000    # Invalid syntax with tuple
list[2] = 1000     # Valid syntax with list

Dicionário Python

Os dicionários do Python são do tipo tabela de hash. Eles funcionam como matrizes associativas ou hashes encontrados em Perl e consistem em pares de valores-chave. Uma chave de dicionário pode ser quase qualquer tipo Python, mas geralmente são números ou strings. Os valores, por outro lado, podem ser qualquer objeto Python arbitrário.

Os dicionários são colocados entre colchetes ({}) e os valores podem ser atribuídos e acessados ​​usando colchetes ([]). Por exemplo -

#!/usr/bin/python3

dict = {}
dict['one'] = "This is one"
dict[2]     = "This is two"

tinydict = {'name': 'john','code':6734, 'dept': 'sales'}

print (dict['one'])       # Prints value for 'one' key
print (dict[2])           # Prints value for 2 key
print (tinydict)          # Prints complete dictionary
print (tinydict.keys())   # Prints all the keys
print (tinydict.values()) # Prints all the values

Isso produz o seguinte resultado -

This is one
This is two
{'name': 'john', 'dept': 'sales', 'code': 6734}
dict_keys(['name', 'dept', 'code'])
dict_values(['john', 'sales', 6734])

Os dicionários não têm conceito de ordem entre os elementos. É incorreto dizer que os elementos estão "fora de ordem"; eles são simplesmente desordenados.

Conversão de Tipo de Dados

Às vezes, pode ser necessário realizar conversões entre os tipos integrados. Para converter entre tipos, você simplesmente usa os nomes dos tipos como uma função.

Existem várias funções integradas para realizar a conversão de um tipo de dados para outro. Essas funções retornam um novo objeto que representa o valor convertido.

Sr. Não. Descrição da função
1

int(x [,base])

Converte x em um inteiro. A base especifica a base se x for uma string.

2

float(x)

Converte x em um número de ponto flutuante.

3

complex(real [,imag])

Cria um número complexo.

4

str(x)

Converte o objeto x em uma representação de string.

5

repr(x)

Converte o objeto x em uma string de expressão.

6

eval(str)

Avalia uma string e retorna um objeto.

7

tuple(s)

Converte s em uma tupla.

8

list(s)

Converte s em uma lista.

9

set(s)

Converte s em um conjunto.

10

dict(d)

Cria um dicionário. d deve ser uma sequência de tuplas (chave, valor).

11

frozenset(s)

Converte s em um conjunto congelado.

12

chr(x)

Converte um número inteiro em um caractere.

13

unichr(x)

Converte um número inteiro em um caractere Unicode.

14

ord(x)

Converte um único caractere em seu valor inteiro.

15

hex(x)

Converte um número inteiro em uma string hexadecimal.

16

oct(x)

Converte um inteiro em uma string octal.

Os operadores são as construções, que podem manipular o valor dos operandos. Considere a expressão 4 + 5 = 9. Aqui, 4 e 5 são chamados de operandos e + é chamado de operador.

Tipos de Operador

A linguagem Python suporta os seguintes tipos de operadores -

  • Operadores aritméticos
  • Operadores de comparação (relacionais)
  • Operadores de atribuição
  • Operadores lógicos
  • Operadores bit a bit
  • Operadores de associação
  • Operadores de identidade

Vamos dar uma olhada em todos os operadores um por um.

Operadores aritméticos Python

Assumir variável a possui o valor 10 e variável b detém o valor 21, então -

Mostrar exemplo

Operador Descrição Exemplo
+ Adição Adiciona valores em qualquer lado do operador. a + b = 31
- Subtração Subtrai o operando direito do operando esquerdo. a - b = -11
* Multiplicação Multiplica os valores em ambos os lados do operador a * b = 210
/ Divisão Divide operando esquerdo pelo operando direito b / a = 2,1
% Módulo Divide operando esquerdo pelo operando direito e retorna o resto b% a = 1
** Expoente Executa cálculo exponencial (potência) nos operadores a ** b = 10 elevado à potência 20
// Divisão de chão - A divisão de operandos onde o resultado é o quociente em que os dígitos após a vírgula decimal são removidos. Mas se um dos operandos for negativo, o resultado é reduzido, ou seja, arredondado de zero (em direção ao infinito negativo): 9 // 2 = 4 e 9,0 // 2,0 = 4,0, -11 // 3 = -4, -11,0 // 3 = -4,0

Operadores de comparação Python

Esses operadores comparam os valores de cada lado deles e decidem a relação entre eles. Eles também são chamados de operadores relacionais.

Assumir variável a possui o valor 10 e variável b mantém o valor 20, então -

Mostrar exemplo

Operador Descrição Exemplo
== Se os valores de dois operandos forem iguais, a condição se torna verdadeira. (a == b) não é verdade.
! = Se os valores de dois operandos não forem iguais, a condição se torna verdadeira. (a! = b) é verdade.
> Se o valor do operando esquerdo for maior que o valor do operando direito, a condição se torna verdadeira. (a> b) não é verdade.
< Se o valor do operando esquerdo for menor que o valor do operando direito, a condição se torna verdadeira. (a <b) é verdadeiro.
> = Se o valor do operando esquerdo for maior ou igual ao valor do operando direito, a condição se torna verdadeira. (a> = b) não é verdade.
<= Se o valor do operando esquerdo for menor ou igual ao valor do operando direito, a condição se torna verdadeira. (a <= b) é verdadeiro.

Operadores de atribuição Python

Assumir variável a possui o valor 10 e variável b mantém o valor 20, então -

Mostrar exemplo

Operador Descrição Exemplo
= Atribui valores de operandos do lado direito para operando do lado esquerdo c = a + b atribui o valor de a + b em c
+ = Adicionar E Ele adiciona o operando direito ao operando esquerdo e atribui o resultado ao operando esquerdo c + = a é equivalente a c = c + a
- = Subtrair E Ele subtrai o operando direito do operando esquerdo e atribui o resultado ao operando esquerdo c - = a é equivalente a c = c - a
* = Multiplicar E Ele multiplica o operando direito com o operando esquerdo e atribui o resultado ao operando esquerdo c * = a é equivalente a c = c * a
/ = Dividir E Ele divide o operando esquerdo com o operando direito e atribui o resultado ao operando esquerdo c / = a é equivalente a c = c / ac / = a é equivalente a c = c / a
% = Módulo E Leva o módulo usando dois operandos e atribui o resultado ao operando esquerdo c% = a é equivalente a c = c% a
** = Expoente E Executa cálculo exponencial (potência) nos operadores e atribui valor ao operando esquerdo c ** = a é equivalente a c = c ** a
// = Divisão de Andar Ele realiza a divisão de piso nos operadores e atribui valor ao operando esquerdo c // = a é equivalente a c = c // a

Operadores bit a bit Python

O operador bit a bit funciona em bits e executa a operação bit a bit. Suponha que a = 60; e b = 13; Agora, em formato binário, eles serão os seguintes -

a = 0011 1100

b = 0000 1101

-----------------

a & b = 0000 1100

a | b = 0011 1101

a ^ b = 0011 0001

~ a = 1100 0011

A função interna do Python bin () pode ser usada para obter a representação binária de um número inteiro.

Os seguintes operadores bit a bit são suportados pela linguagem Python -

Mostrar exemplo

Operador Descrição Exemplo
& Binário E O operador copia um bit, para o resultado, se existir em ambos os operandos (a & b) (significa 0000 1100)
| Binário OU Ele copia um bit, se existir em qualquer operando. (a | b) = 61 (significa 0011 1101)
^ Binário XOR Ele copia o bit, se estiver definido em um operando, mas não em ambos. (a ^ b) = 49 (significa 0011 0001)
~ Complemento dos binários É unário e tem o efeito de 'inverter' bits. (~ a) = -61 (significa 1100 0011 na forma de complemento de 2 devido a um número binário com sinal.
<< Deslocamento à esquerda binário O valor do operando esquerdo é movido para a esquerda pelo número de bits especificado pelo operando direito. a << 2 = 240 (significa 1111 0000)
>> Deslocamento para a direita binário O valor do operando esquerdo é movido para a direita pelo número de bits especificado pelo operando direito. a >> 2 = 15 (significa 0000 1111)

Operadores lógicos Python

Os seguintes operadores lógicos são suportados pela linguagem Python. Assumir variávela é verdadeiro e variável b detém False então -

Mostrar exemplo

Operador Descrição Exemplo
e lógico E Se ambos os operandos forem verdadeiros, a condição se torna verdadeira. (a e b) é falso.
ou lógico OU Se qualquer um dos dois operandos for diferente de zero, a condição se torna verdadeira. (a ou b) é verdadeiro.
não lógico Usado para reverter o estado lógico de seu operando. Não (aeb) é verdadeiro.

Operadores de associação Python

Os operadores de associação do Python testam a associação em uma sequência, como strings, listas ou tuplas. Existem dois operadores de adesão, conforme explicado abaixo -

Mostrar exemplo

Operador Descrição Exemplo
dentro Avalia como verdadeiro se encontrar uma variável na sequência especificada e como falso caso contrário. x em y, aqui em resulta em 1 se x for um membro da sequência y.
não em Avalia como verdadeiro se não encontrar uma variável na sequência especificada e como falso caso contrário. x não em y, aqui não em resulta em 1 se x não for um membro da sequência y.

Operadores de identidade Python

Operadores de identidade comparam as localizações de memória de dois objetos. Existem dois operadores de identidade, conforme explicado abaixo -

Mostrar exemplo

Operador Descrição Exemplo
é Avalia como verdadeiro se as variáveis ​​em qualquer lado do operador apontam para o mesmo objeto e como falso caso contrário. x é y, aqui is resulta em 1 se id (x) for igual a id (y).
não é Avalia como falso se as variáveis ​​em qualquer lado do operador apontam para o mesmo objeto e como verdadeiro caso contrário. x não é y, aqui is not resulta em 1 se id (x) não for igual a id (y).

Precedência de operadores Python

A tabela a seguir lista todos os operadores da mais alta precedência à mais baixa.

Mostrar exemplo

Sr. Não. Operador e descrição
1

**

Exponenciação (elevar à potência)

2

~ + -

Complemento, mais e menos unários (os nomes dos métodos para os dois últimos são + @ e - @)

3

* / % //

Multiplique, divida, módulo e divisão de piso

4

+ -

Adição e subtração

5

>> <<

Deslocamento bit a bit para direita e esquerda

6

&

'E' bit a bit

7

^ |

"OR" exclusivo bit a bit e "OR" regular

8

<= < > >=

Operadores de comparação

9

<> == !=

Operadores de igualdade

10

= %= /= //= -= += *= **=

Operadores de atribuição

11

is is not

Operadores de identidade

12

in not in

Operadores de associação

13

not or and

Operadores lógicos

A tomada de decisão é a antecipação das condições que ocorrem durante a execução de um programa e as ações específicas executadas de acordo com as condições.

As estruturas de decisão avaliam várias expressões, que produzem VERDADEIRO ou FALSO como resultado. Você precisa determinar qual ação tomar e quais instruções executar se o resultado for VERDADEIRO ou FALSO caso contrário.

A seguir está a forma geral de uma estrutura típica de tomada de decisão encontrada na maioria das linguagens de programação -

A linguagem de programação Python assume qualquer non-zero e non-null valores como TRUE, e qualquer zero ou null values como valor FALSE.

A linguagem de programação Python fornece os seguintes tipos de instruções de tomada de decisão.

Sr. Não. Declaração e descrição
1 declarações if

A if statement consiste em uma expressão booleana seguida por uma ou mais instruções.

2 declarações if ... else

A if statement pode ser seguido por um opcional else statement, que é executado quando a expressão booleana é FALSE.

3 declarações if aninhadas

Você pode usar um if ou else if declaração dentro de outra if ou else if afirmações).

Vamos examinar cada declaração de tomada de decisão rapidamente.

Suítes de declaração única

Se a suíte de um if cláusula consiste apenas em uma única linha, ela pode ir na mesma linha que a instrução de cabeçalho.

Exemplo

Aqui está um exemplo de um one-line if cláusula -

#!/usr/bin/python3

var = 100
if ( var  == 100 ) : print ("Value of expression is 100")
print ("Good bye!")

Resultado

Quando o código acima é executado, ele produz o seguinte resultado -

Value of expression is 100
Good bye!

Em geral, as instruções são executadas sequencialmente - a primeira instrução em uma função é executada primeiro, seguida pela segunda e assim por diante. Pode haver uma situação em que você precise executar um bloco de código várias vezes.

As linguagens de programação fornecem várias estruturas de controle que permitem caminhos de execução mais complicados.

Uma instrução de loop nos permite executar uma instrução ou grupo de instruções várias vezes. O diagrama a seguir ilustra uma instrução de loop -

A linguagem de programação Python fornece os seguintes tipos de loops para lidar com os requisitos de loop.

Sr. Não. Tipo de Loop e Descrição
1 loop while

Repete uma instrução ou grupo de instruções enquanto uma determinada condição for TRUE. Ele testa a condição antes de executar o corpo do loop.

2 para loop

Executa uma sequência de instruções várias vezes e abrevia o código que gerencia a variável de loop.

3 loops aninhados

Você pode usar um ou mais loop dentro de qualquer outro while ou for loop.

Declarações de controle de loop

As instruções de controle de Loop alteram a execução de sua sequência normal. Quando a execução deixa um escopo, todos os objetos automáticos criados nesse escopo são destruídos.

Python suporta as seguintes instruções de controle.

Sr. Não. Declaração de controle e descrição
1 declaração de quebra

Encerra a instrução de loop e transfere a execução para a instrução imediatamente após o loop.

2 continuar declaração

Faz com que o loop pule o restante de seu corpo e teste novamente sua condição imediatamente antes de reiterar.

3 declaração de aprovação

A instrução pass em Python é usada quando uma instrução é necessária sintaticamente, mas você não deseja que nenhum comando ou código seja executado.

Vamos examinar as instruções de controle de loop brevemente.

Iterador e gerador

Iteratoré um objeto que permite a um programador percorrer todos os elementos de uma coleção, independentemente de sua implementação específica. Em Python, um objeto iterador implementa dois métodos,iter() e next().

Objetos String, List ou Tuple podem ser usados ​​para criar um Iterator.

list = [1,2,3,4]
it = iter(list) # this builds an iterator object
print (next(it)) #prints next available element in iterator
Iterator object can be traversed using regular for statement
!usr/bin/python3
for x in it:
   print (x, end=" ")
or using next() function
while True:
   try:
      print (next(it))
   except StopIteration:
      sys.exit() #you have to import sys module for this

UMA generator é uma função que produz ou produz uma sequência de valores usando o método de rendimento.

Quando uma função geradora é chamada, ela retorna um objeto gerador sem nem mesmo iniciar a execução da função. Quando o método next () é chamado pela primeira vez, a função começa a ser executada até atingir a instrução de rendimento, que retorna o valor gerado. O rendimento mantém o controle, ou seja, lembra a última execução e a segunda chamada de next () continua a partir do valor anterior.

Exemplo

O exemplo a seguir define um gerador, que gera um iterador para todos os números de Fibonacci.

#!usr/bin/python3

import sys
def fibonacci(n): #generator function
   a, b, counter = 0, 1, 0
   while True:
      if (counter > n): 
         return
      yield a
      a, b = b, a + b
      counter += 1
f = fibonacci(5) #f is iterator object

while True:
   try:
      print (next(f), end=" ")
   except StopIteration:
      sys.exit()

Os tipos de dados numéricos armazenam valores numéricos. Eles são tipos de dados imutáveis. Isso significa que alterar o valor de um tipo de dados numérico resulta em um objeto recém-alocado.

Objetos de número são criados quando você atribui um valor a eles. Por exemplo -

var1 = 1
var2 = 10

Você também pode excluir a referência a um objeto de número usando o deldeclaração. A sintaxe dodel declaração é -

del var1[,var2[,var3[....,varN]]]]

Você pode excluir um único objeto ou vários objetos usando o deldeclaração. Por exemplo -

del var
del var_a, var_b

Python suporta diferentes tipos numéricos -

  • int (signed integers) - Eles são frequentemente chamados de inteiros ou ints. Eles são números inteiros positivos ou negativos sem vírgula decimal. Os inteiros em Python 3 têm tamanho ilimitado. Python 2 tem dois tipos inteiros - int e long. Não há 'long integer'em Python 3 mais.

  • float (floating point real values)- Também chamados de floats, eles representam números reais e são escritos com um ponto decimal dividindo o inteiro e as partes fracionárias. Os carros alegóricos também podem estar em notação científica, com E ou e indicando a potência de 10 (2,5e2 = 2,5 x 10 2 = 250).

  • complex (complex numbers)- são da forma a + bJ, onde aeb são flutuantes e J (ou j) representa a raiz quadrada de -1 (que é um número imaginário). A parte real do número é a, e a parte imaginária é b. Números complexos não são muito usados ​​na programação Python.

É possível representar um inteiro na forma hexa-decimal ou octal

>>> number = 0xA0F #Hexa-decimal
>>> number
2575

>>> number = 0o37 #Octal
>>> number
31

Exemplos

Aqui estão alguns exemplos de números.

int flutuador complexo
10 0,0 3,14j
100 15,20 45.j
-786 -21,9 9.322e-36j
080 32,3 + e18 .876j
-0490 -90. -.6545 + 0J
-0 × 260 -32.54e100 3e + 26J
0 × 69 70.2-E12 4.53e-7j

Um número complexo consiste em um par ordenado de números reais de ponto flutuante denotados por a + bj, onde a é a parte real eb é a parte imaginária do número complexo.

Conversão de tipo de número

Python converte números internamente em uma expressão contendo tipos mistos em um tipo comum para avaliação. Às vezes, você precisa forçar um número explicitamente de um tipo para outro para satisfazer os requisitos de um operador ou parâmetro de função.

  • Tipo int(x) para converter x em um inteiro simples.

  • Tipo long(x) para converter x em um inteiro longo.

  • Tipo float(x) para converter x em um número de ponto flutuante.

  • Tipo complex(x) para converter x em um número complexo com parte real xe zero parte imaginário.

  • Tipo complex(x, y)para converter xey em um número complexo com parte real xe parte imaginária y. x e y são expressões numéricas

Funções Matemáticas

Python inclui as seguintes funções que realizam cálculos matemáticos.

Sr. Não. Função e retornos (descrição)
1 abs (x)

O valor absoluto de x: a distância (positiva) entre x e zero.

2 ceil (x)

O teto de x: o menor inteiro não inferior a x.

3

cmp(x, y)

-1 se x <y, 0 se x == y ou 1 se x> y. Deprecated em Python 3. Em vez disso, use return (x>y)-(x<y).

4 exp (x)

O exponencial de x: e x

5 fabs (x)

O valor absoluto de x.

6 andar (x)

O piso de x: o maior inteiro não maior que x.

7 log (x)

O logaritmo natural de x, para x> 0.

8 log10 (x)

O logaritmo de base 10 de x para x> 0.

9 máx (x1, x2, ...)

O maior de seus argumentos: o valor mais próximo do infinito positivo

10 min (x1, x2, ...)

O menor de seus argumentos: o valor mais próximo do infinito negativo.

11 modf (x)

As partes fracionárias e inteiras de x em uma tupla de dois itens. Ambas as partes têm o mesmo sinal de x. A parte inteira é retornada como um float.

12 pow (x, y)

O valor de x ** y.

13 rodada (x [, n])

xarredondado para n dígitos da vírgula decimal. Python arredonda a partir de zero como desempate: round (0,5) é 1.0 e round (-0,5) é -1,0.

14 sqrt (x)

A raiz quadrada de x para x> 0.

Funções de números aleatórios

Números aleatórios são usados ​​para jogos, simulações, testes, aplicativos de segurança e privacidade. Python inclui as seguintes funções que são comumente usadas.

Sr. Não. Descrição da função
1 escolha (seq)

Um item aleatório de uma lista, tupla ou string.

2 randrange ([iniciar,] parar [, passo])

Um elemento selecionado aleatoriamente no intervalo (iniciar, parar, passo).

3 aleatória()

Um float aleatório r, tal que 0 é menor ou igual a r e r é menor que 1

4 semente ([x])

Define o valor inicial inteiro usado na geração de números aleatórios. Chame esta função antes de chamar qualquer outra função de módulo aleatório. Retorna nenhum.

5 embaralhar (lst)

Randomiza os itens de uma lista no local. Retorna nenhum.

6 uniforme (x, y)

Um float aleatório r, tal que x é menor ou igual a r e r é menor que y.

Funções trigonométricas

Python inclui as seguintes funções que realizam cálculos trigonométricos.

Sr. Não. Descrição da função
1 acos (x)

Retorne o arco cosseno de x, em radianos.

2 asin (x)

Retorne o arco seno de x, em radianos.

3 atan (x)

Retorne o arco tangente de x, em radianos.

4 atan2 (y, x)

Retorne atan (y / x), em radianos.

5 cos (x)

Retorne o cosseno de x radianos.

6 hipot (x, y)

Retorne a norma euclidiana, sqrt (x * x + y * y).

7 sin (x)

Retorne o seno de x radianos.

8 tan (x)

Retorne a tangente de x radianos.

9 graus (x)

Converte o ângulo x de radianos em graus.

10 radianos (x)

Converte o ângulo x de graus para radianos.

Constantes Matemáticas

O módulo também define duas constantes matemáticas -

Sr. Não. Constantes e Descrição
1

pi

A constante matemática pi.

2

e

A constante matemática e.

Strings estão entre os tipos mais populares em Python. Podemos criá-los simplesmente colocando os caracteres entre aspas. Python trata aspas simples da mesma forma que aspas duplas. Criar strings é tão simples quanto atribuir um valor a uma variável. Por exemplo -

var1 = 'Hello World!'
var2 = "Python Programming"

Acessando Valores em Strings

Python não oferece suporte a um tipo de caractere; estes são tratados como strings de comprimento um, portanto, também considerados substring.

Para acessar substrings, use os colchetes para fatiar junto com o índice ou índices para obter sua substring. Por exemplo -

#!/usr/bin/python3

var1 = 'Hello World!'
var2 = "Python Programming"

print ("var1[0]: ", var1[0])
print ("var2[1:5]: ", var2[1:5])

Quando o código acima é executado, ele produz o seguinte resultado -

var1[0]:  H
var2[1:5]:  ytho

Atualizando Strings

Você pode "atualizar" uma string existente (re) atribuindo uma variável a outra string. O novo valor pode estar relacionado ao seu valor anterior ou a uma string completamente diferente. Por exemplo -

#!/usr/bin/python3

var1 = 'Hello World!'
print ("Updated String :- ", var1[:6] + 'Python')

Quando o código acima é executado, ele produz o seguinte resultado -

Updated String :-  Hello Python

Personagens de Fuga

A tabela a seguir é uma lista de caracteres de escape ou não imprimíveis que podem ser representados com a notação de barra invertida.

Um caractere de escape é interpretado; em strings entre aspas simples e duplas.

Notação de barra invertida Caráter hexadecimal Descrição
\uma 0x07 Sino ou alerta
\ b 0x08 Backspace
\ cx Control-x
\ Cx Control-x
\ e 0x1b Escapar
\ f 0x0c Formfeed
\ M- \ Cx Meta-Control-x
\ n 0x0a Nova linha
\ nnn Notação octal, onde n está no intervalo de 0,7
\ r 0x0d Retorno de carruagem
\ s 0x20 Espaço
\ t 0x09 Aba
\ v 0x0b Aba vertical
\ x Personagem x
\ xnn Notação hexadecimal, em que n está no intervalo 0,9, af ou AF

Operadores especiais de string

Assumir variável de string a contém 'Olá' e variável b contém 'Python', então -

Operador Descrição Exemplo
+ Concatenação - adiciona valores em ambos os lados do operador a + b dará HelloPython
* Repetição - Cria novas strings, concatenando várias cópias da mesma string a * 2 dará -HelloHello
[] Slice - Dá o personagem do índice dado a [1] dará e
[:] Faixa de intervalo - fornece os personagens de um determinado intervalo a [1: 4] dará ell
dentro Membership - Retorna verdadeiro se um caractere existir na string fornecida H em a dará 1
não em Membership - Retorna verdadeiro se um caractere não existir na string fornecida M não em a dará 1
r / R String bruta - suprime o significado real dos caracteres de escape. A sintaxe para strings brutas é exatamente a mesma que para strings normais, com exceção do operador de string bruta, a letra "r", que precede as aspas. O "r" pode ser minúsculo (r) ou maiúsculo (R) e deve ser colocado imediatamente antes da primeira aspa. imprimir r '\ n' impressões \ n e imprimir R '\ n'impressões \ n
% Format - executa formatação de string Veja na próxima seção

Operador de formatação de string

Um dos recursos mais interessantes do Python é o operador de formato de string%. Este operador é exclusivo para strings e compensa o pacote de funções da família printf () de C. A seguir está um exemplo simples -

#!/usr/bin/python3

print ("My name is %s and weight is %d kg!" % ('Zara', 21))

Quando o código acima é executado, ele produz o seguinte resultado -

My name is Zara and weight is 21 kg!

Aqui está a lista do conjunto completo de símbolos que podem ser usados ​​junto com% -

Sr. Não. Símbolo de formato e conversão
1

%c

personagem

2

%s

conversão de string via str () antes da formatação

3

%i

inteiro decimal com sinal

4

%d

inteiro decimal com sinal

5

%u

inteiro decimal sem sinal

6

%o

inteiro octal

7

%x

inteiro hexadecimal (letras minúsculas)

8

%X

inteiro hexadecimal (letras MAIÚSCULAS)

9

%e

notação exponencial (com 'e' minúsculo)

10

%E

notação exponencial (com maiúscula 'E')

11

%f

número real de ponto flutuante

12

%g

o mais curto de% f e% e

13

%G

o mais curto de% f e% E

Outros símbolos e funcionalidades suportados estão listados na tabela a seguir -

Sr. Não. Símbolo e funcionalidade
1

*

argumento especifica largura ou precisão

2

-

justificação à esquerda

3

+

mostrar o sinal

4

<sp>

deixe um espaço em branco antes de um número positivo

5

#

adicione o zero inicial octal ('0') ou o inicial hexadecimal '0x' ou '0X', dependendo se 'x' ou 'X' foram usados.

6

0

preencha da esquerda com zeros (em vez de espaços)

7

%

'%%' deixa você com um único literal '%'

8

(var)

variável de mapeamento (argumentos de dicionário)

9

m.n.

m é a largura total mínima e n é o número de dígitos a serem exibidos após o ponto decimal (se aplicável)

Citações Triplas

As aspas triplas do Python ajudam, permitindo que as strings ocupem várias linhas, incluindo NEWLINEs textuais, TABs e quaisquer outros caracteres especiais.

A sintaxe para aspas triplas consiste em três single or double citações.

#!/usr/bin/python3

para_str = """this is a long string that is made up of
several lines and non-printable characters such as
TAB ( \t ) and they will show up that way when displayed.
NEWLINEs within the string, whether explicitly given like
this within the brackets [ \n ], or just a NEWLINE within
the variable assignment will also show up.
"""
print (para_str)

Quando o código acima é executado, ele produz o seguinte resultado. Observe como cada caractere especial foi convertido em sua forma impressa, até a última NEWLINE no final da string entre o "para cima". e fechar aspas triplas. Observe também que NEWLINEs ocorrem com um retorno de carro explícito no final de uma linha ou seu código de escape (\ n) -

this is a long string that is made up of
several lines and non-printable characters such as
TAB (    ) and they will show up that way when displayed.
NEWLINEs within the string, whether explicitly given like
this within the brackets [
 ], or just a NEWLINE within
the variable assignment will also show up.

As strings brutas não tratam a barra invertida como um caractere especial. Cada caractere que você coloca em uma string bruta permanece do jeito que você escreveu -

#!/usr/bin/python3

print ('C:\\nowhere')

Quando o código acima é executado, ele produz o seguinte resultado -

C:\nowhere

Agora vamos usar a string bruta. Nós colocaríamos expressão emr'expression' como segue -

#!/usr/bin/python3

print (r'C:\\nowhere')

Quando o código acima é executado, ele produz o seguinte resultado -

C:\\nowhere

String Unicode

No Python 3, todas as strings são representadas em Unicode. No Python 2, são armazenadas internamente como ASCII de 8 bits, portanto, é necessário anexar 'u' para torná-lo Unicode. Não é mais necessário agora.

Métodos de string integrados

Python inclui os seguintes métodos integrados para manipular strings -

Sr. Não. Métodos e Descrição
1 capitalizar()

Capitaliza a primeira letra da string

2 centro (largura, fillchar)

Retorna uma string preenchida com fillchar com a string original centralizada em um total de colunas de largura .

3 contagem (str, beg = 0, end = len (string))

Conta quantas vezes str ocorre em string ou em uma substring de string se o índice inicial começar e o fim do índice final forem fornecidos.

4 decodificar (codificação = 'UTF-8', erros = 'estrito')

Decodifica a string usando o codec registrado para codificação. codificação padrão para a codificação de string padrão.

5 codificar (codificação = 'UTF-8', erros = 'estrito')

Retorna a versão da string codificada; em caso de erro, o padrão é gerar um ValueError, a menos que os erros sejam fornecidos com 'ignorar' ou 'substituir'.

6 endswith (sufixo, beg = 0, end = len (string))

Determina se string ou uma substring de string (se o índice inicial começar e o fim do índice final forem fornecidos) termina com sufixo; retorna verdadeiro se sim e falso caso contrário.

7 expandtabs (tabsize = 8)

Expande as tabulações na string para vários espaços; o padrão é 8 espaços por guia se o tamanho da guia não for fornecido.

8 find (str, beg = 0 end = len (string))

Determine se str ocorre em string ou em uma substring de string se o índice inicial beg e o final do índice recebem o índice de retorno se encontrado e -1 caso contrário.

9 índice (str, beg = 0, end = len (string))

O mesmo que find (), mas gera uma exceção se str não for encontrado.

10 isalnum ()

Retorna verdadeiro se a string tiver pelo menos 1 caractere e todos os caracteres são alfanuméricos e falso caso contrário.

11 isalpha ()

Retorna verdadeiro se a string tem pelo menos 1 caractere e todos os caracteres são alfabéticos e falso caso contrário.

12 isdigit ()

Retorna verdadeiro se a string contém apenas dígitos e falso caso contrário.

13 é inferior()

Retorna verdadeiro se a string tem pelo menos 1 caractere maiúsculo e todos os caracteres maiúsculos estão em minúsculas e falso caso contrário.

14 isnumeric ()

Retorna verdadeiro se uma string Unicode contém apenas caracteres numéricos e falso caso contrário.

15 isspace ()

Retorna verdadeiro se a string contém apenas caracteres de espaço em branco e falso caso contrário.

16 istitle ()

Retorna verdadeiro se a string está devidamente "titlecased" e falso caso contrário.

17 isupper ()

Returns true if string has at least one cased character and all cased characters are in uppercase and false otherwise.

18 join(seq)

Merges (concatenates) the string representations of elements in sequence seq into a string, with separator string.

19 len(string)

Returns the length of the string

20 ljust(width[, fillchar])

Returns a space-padded string with the original string left-justified to a total of width columns.

21 lower()

Converts all uppercase letters in string to lowercase.

22 lstrip()

Removes all leading whitespace in string.

23 maketrans()

Returns a translation table to be used in translate function.

24 max(str)

Returns the max alphabetical character from the string str.

25 min(str)

Returns the min alphabetical character from the string str.

26 replace(old, new [, max])

Replaces all occurrences of old in string with new or at most max occurrences if max given.

27 rfind(str, beg = 0,end = len(string))

Same as find(), but search backwards in string.

28 rindex( str, beg = 0, end = len(string))

Same as index(), but search backwards in string.

29 rjust(width,[, fillchar])

Returns a space-padded string with the original string right-justified to a total of width columns.

30 rstrip()

Removes all trailing whitespace of string.

31 split(str="", num=string.count(str))

Splits string according to delimiter str (space if not provided) and returns list of substrings; split into at most num substrings if given.

32 splitlines( num=string.count('\n'))

Splits string at all (or num) NEWLINEs and returns a list of each line with NEWLINEs removed.

33 startswith(str, beg=0,end=len(string))

Determines if string or a substring of string (if starting index beg and ending index end are given) starts with substring str; returns true if so and false otherwise.

34 strip([chars])

Performs both lstrip() and rstrip() on string

35 swapcase()

Inverts case for all letters in string.

36 title()

Returns "titlecased" version of string, that is, all words begin with uppercase and the rest are lowercase.

37 translate(table, deletechars="")

Translates string according to translation table str(256 chars), removing those in the del string.

38 upper()

Converts lowercase letters in string to uppercase.

39 zfill (width)

Returns original string leftpadded with zeros to a total of width characters; intended for numbers, zfill() retains any sign given (less one zero).

40 isdecimal()

Returns true if a unicode string contains only decimal characters and false otherwise.

The most basic data structure in Python is the sequence. Each element of a sequence is assigned a number - its position or index. The first index is zero, the second index is one, and so forth.

Python has six built-in types of sequences, but the most common ones are lists and tuples, which we would see in this tutorial.

There are certain things you can do with all the sequence types. These operations include indexing, slicing, adding, multiplying, and checking for membership. In addition, Python has built-in functions for finding the length of a sequence and for finding its largest and smallest elements.

Python Lists

The list is the most versatile datatype available in Python, which can be written as a list of comma-separated values (items) between square brackets. Important thing about a list is that the items in a list need not be of the same type.

Creating a list is as simple as putting different comma-separated values between square brackets. For example −

list1 = ['physics', 'chemistry', 1997, 2000];
list2 = [1, 2, 3, 4, 5 ];
list3 = ["a", "b", "c", "d"];

Similar to string indices, list indices start at 0, and lists can be sliced, concatenated and so on.

Accessing Values in Lists

To access values in lists, use the square brackets for slicing along with the index or indices to obtain value available at that index. For example −

#!/usr/bin/python3

list1 = ['physics', 'chemistry', 1997, 2000]
list2 = [1, 2, 3, 4, 5, 6, 7 ]

print ("list1[0]: ", list1[0])
print ("list2[1:5]: ", list2[1:5])

When the above code is executed, it produces the following result −

list1[0]:  physics
list2[1:5]:  [2, 3, 4, 5]

Updating Lists

You can update single or multiple elements of lists by giving the slice on the left-hand side of the assignment operator, and you can add to elements in a list with the append() method. For example −

#!/usr/bin/python3

list = ['physics', 'chemistry', 1997, 2000]
print ("Value available at index 2 : ", list[2])

list[2] = 2001
print ("New value available at index 2 : ", list[2])

Note − The append() method is discussed in the subsequent section.

When the above code is executed, it produces the following result −

Value available at index 2 :  1997
New value available at index 2 :  2001

Delete List Elements

To remove a list element, you can use either the del statement if you know exactly which element(s) you are deleting. You can use the remove() method if you do not know exactly which items to delete. For example −

#!/usr/bin/python3

list = ['physics', 'chemistry', 1997, 2000]
print (list)

del list[2]
print ("After deleting value at index 2 : ", list)

When the above code is executed, it produces the following result −

['physics', 'chemistry', 1997, 2000]
After deleting value at index 2 :  ['physics', 'chemistry', 2000]

Note − remove() method is discussed in subsequent section.

Basic List Operations

Lists respond to the + and * operators much like strings; they mean concatenation and repetition here too, except that the result is a new list, not a string.

In fact, lists respond to all of the general sequence operations we used on strings in the prior chapter.

Python Expression Results Description
len([1, 2, 3]) 3 Length
[1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] Concatenation
['Hi!'] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!'] Repetition
3 in [1, 2, 3] True Membership
for x in [1,2,3] : print (x,end = ' ') 1 2 3 Iteration

Indexing, Slicing and Matrixes

Since lists are sequences, indexing and slicing work the same way for lists as they do for strings.

Assuming the following input −

L = ['C++'', 'Java', 'Python']

Python Expression Results Description
L[2] 'Python' Offsets start at zero
L[-2] 'Java' Negative: count from the right
L[1:] ['Java', 'Python'] Slicing fetches sections

Built-in List Functions and Methods

Python includes the following list functions −

Sr.No. Function & Description
1 len(list)

Gives the total length of the list.

2 max(list)

Returns item from the list with max value.

3 min(list)

Returns item from the list with min value.

4 list(seq)

Converts a tuple into list.

Python includes the following list methods −

Sr.No. Methods & Description
1 list.append(obj)

Appends object obj to list

2 list.count(obj)

Returns count of how many times obj occurs in list

3 list.extend(seq)

Appends the contents of seq to list

4 list.index(obj)

Returns the lowest index in list that obj appears

5 list.insert(index, obj)

Inserts object obj into list at offset index

6 list.pop(obj = list[-1])

Removes and returns last object or obj from list

7 list.remove(obj)

Removes object obj from list

8 list.reverse()

Reverses objects of list in place

9 list.sort([func])

Sorts objects of list, use compare func if given

A tuple is a collection of objects which ordered and immutable. Tuples are sequences, just like lists. The main difference between the tuples and the lists is that the tuples cannot be changed unlike lists. Tuples use parentheses, whereas lists use square brackets.

Creating a tuple is as simple as putting different comma-separated values. Optionally, you can put these comma-separated values between parentheses also. For example −

tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"

The empty tuple is written as two parentheses containing nothing −

tup1 = ();

To write a tuple containing a single value you have to include a comma, even though there is only one value −

tup1 = (50,)

Like string indices, tuple indices start at 0, and they can be sliced, concatenated, and so on.

Accessing Values in Tuples

To access values in tuple, use the square brackets for slicing along with the index or indices to obtain the value available at that index. For example −

#!/usr/bin/python3

tup1 = ('physics', 'chemistry', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )

print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])

When the above code is executed, it produces the following result −

tup1[0]:  physics
tup2[1:5]:  (2, 3, 4, 5)

Updating Tuples

Tuples are immutable, which means you cannot update or change the values of tuple elements. You are able to take portions of the existing tuples to create new tuples as the following example demonstrates −

#!/usr/bin/python3

tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')

# Following action is not valid for tuples
# tup1[0] = 100;

# So let's create a new tuple as follows
tup3 = tup1 + tup2
print (tup3)

When the above code is executed, it produces the following result −

(12, 34.56, 'abc', 'xyz')

Delete Tuple Elements

Removing individual tuple elements is not possible. There is, of course, nothing wrong with putting together another tuple with the undesired elements discarded.

To explicitly remove an entire tuple, just use the del statement. For example −

#!/usr/bin/python3

tup = ('physics', 'chemistry', 1997, 2000);

print (tup)
del tup;
print ("After deleting tup : ")
print (tup)

This produces the following result.

Note − An exception is raised. This is because after del tup, tuple does not exist any more.

('physics', 'chemistry', 1997, 2000)
After deleting tup :
Traceback (most recent call last):
   File "test.py", line 9, in <module>
      print tup;
NameError: name 'tup' is not defined

Basic Tuples Operations

Tuples respond to the + and * operators much like strings; they mean concatenation and repetition here too, except that the result is a new tuple, not a string.

In fact, tuples respond to all of the general sequence operations we used on strings in the previous chapter.

Python Expression Results Description
len((1, 2, 3)) 3 Length
(1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) Concatenation
('Hi!',) * 4 ('Hi!', 'Hi!', 'Hi!', 'Hi!') Repetition
3 in (1, 2, 3) True Membership
for x in (1,2,3) : print (x, end = ' ') 1 2 3 Iteration

Indexing, Slicing, and Matrixes

Since tuples are sequences, indexing and slicing work the same way for tuples as they do for strings, assuming the following input −

T=('C++', 'Java', 'Python')

Python Expression Results Description
T[2] 'Python' Offsets start at zero
T[-2] 'Java' Negative: count from the right
T[1:] ('Java', 'Python') Slicing fetches sections

No Enclosing Delimiters

No enclosing Delimiters is any set of multiple objects, comma-separated, written without identifying symbols, i.e., brackets for lists, parentheses for tuples, etc., default to tuples, as indicated in these short examples.

Built-in Tuple Functions

Python includes the following tuple functions −

Sr.No. Function & Description
1 cmp(tuple1, tuple2)

Compares elements of both tuples.

2 len(tuple)

Gives the total length of the tuple.

3 max(tuple)

Returns item from the tuple with max value.

4 min(tuple)

Returns item from the tuple with min value.

5 tuple(seq)

Converts a list into tuple.

Each key is separated from its value by a colon (:), the items are separated by commas, and the whole thing is enclosed in curly braces. An empty dictionary without any items is written with just two curly braces, like this: {}.

Keys are unique within a dictionary while values may not be. The values of a dictionary can be of any type, but the keys must be of an immutable data type such as strings, numbers, or tuples.

Accessing Values in Dictionary

To access dictionary elements, you can use the familiar square brackets along with the key to obtain its value. Following is a simple example −

#!/usr/bin/python3

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print ("dict['Name']: ", dict['Name'])
print ("dict['Age']: ", dict['Age'])

When the above code is executed, it produces the following result −

dict['Name']:  Zara
dict['Age']:  7

If we attempt to access a data item with a key, which is not a part of the dictionary, we get an error as follows −

#!/usr/bin/python3

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
print ("dict['Alice']: ", dict['Alice'])

When the above code is executed, it produces the following result −

dict['Zara']:
Traceback (most recent call last):
   File "test.py", line 4, in <module>
      print "dict['Alice']: ", dict['Alice'];
KeyError: 'Alice'

Updating Dictionary

You can update a dictionary by adding a new entry or a key-value pair, modifying an existing entry, or deleting an existing entry as shown in a simple example given below.

#!/usr/bin/python3

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
dict['Age'] = 8; # update existing entry
dict['School'] = "DPS School" # Add new entry

print ("dict['Age']: ", dict['Age'])
print ("dict['School']: ", dict['School'])

When the above code is executed, it produces the following result −

dict['Age']:  8
dict['School']:  DPS School

Delete Dictionary Elements

You can either remove individual dictionary elements or clear the entire contents of a dictionary. You can also delete entire dictionary in a single operation.

To explicitly remove an entire dictionary, just use the del statement. Following is a simple example −

#!/usr/bin/python3

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}

del dict['Name'] # remove entry with key 'Name'
dict.clear()     # remove all entries in dict
del dict         # delete entire dictionary

print ("dict['Age']: ", dict['Age'])
print ("dict['School']: ", dict['School'])

This produces the following result.

An exception is raised because after del dict, the dictionary does not exist anymore.

dict['Age']:
Traceback (most recent call last):
   File "test.py", line 8, in <module>
      print "dict['Age']: ", dict['Age'];
TypeError: 'type' object is unsubscriptable

Note − The del() method is discussed in subsequent section.

Properties of Dictionary Keys

Dictionary values have no restrictions. They can be any arbitrary Python object, either standard objects or user-defined objects. However, same is not true for the keys.

There are two important points to remember about dictionary keys −

(a) More than one entry per key is not allowed. This means no duplicate key is allowed. When duplicate keys are encountered during assignment, the last assignment wins. For example −

#!/usr/bin/python3

dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'}
print ("dict['Name']: ", dict['Name'])

When the above code is executed, it produces the following result −

dict['Name']:  Manni

(b) Keys must be immutable. This means you can use strings, numbers or tuples as dictionary keys but something like ['key'] is not allowed. Following is a simple example −

#!/usr/bin/python3

dict = {['Name']: 'Zara', 'Age': 7}
print ("dict['Name']: ", dict['Name'])

When the above code is executed, it produces the following result −

Traceback (most recent call last):
   File "test.py", line 3, in <module>
      dict = {['Name']: 'Zara', 'Age': 7}
TypeError: list objects are unhashable

Built-in Dictionary Functions and Methods

Python includes the following dictionary functions −

Sr.No. Function & Description
1 cmp(dict1, dict2)

No longer available in Python 3.

2 len(dict)

Gives the total length of the dictionary. This would be equal to the number of items in the dictionary.

3 str(dict)

Produces a printable string representation of a dictionary

4 type(variable)

Returns the type of the passed variable. If passed variable is dictionary, then it would return a dictionary type.

Python includes the following dictionary methods −

Sr.No. Method & Description
1 dict.clear()

Removes all elements of dictionary dict

2 dict.copy()

Returns a shallow copy of dictionary dict

3 dict.fromkeys()

Create a new dictionary with keys from seq and values set to value.

4 dict.get(key, default=None)

For key key, returns value or default if key not in dictionary

5 dict.has_key(key)

Removed, use the in operation instead.

6 dict.items()

Returns a list of dict's (key, value) tuple pairs

7 dict.keys()

Returns list of dictionary dict's keys

8 dict.setdefault(key, default = None)

Similar to get(), but will set dict[key] = default if key is not already in dict

9 dict.update(dict2)

Adds dictionary dict2's key-values pairs to dict

10 dict.values()

Returns list of dictionary dict's values

A Python program can handle date and time in several ways. Converting between date formats is a common chore for computers. Python's time and calendar modules help track dates and times.

What is Tick?

Time intervals are floating-point numbers in units of seconds. Particular instants in time are expressed in seconds since 12:00am, January 1, 1970(epoch).

There is a popular time module available in Python which provides functions for working with times, and for converting between representations. The function time.time() returns the current system time in ticks since 12:00am, January 1, 1970(epoch).

Example

#!/usr/bin/python3
import time;      # This is required to include time module.

ticks = time.time()
print ("Number of ticks since 12:00am, January 1, 1970:", ticks)

This would produce a result something as follows −

Number of ticks since 12:00am, January 1, 1970: 1455508609.34375

Date arithmetic is easy to do with ticks. However, dates before the epoch cannot be represented in this form. Dates in the far future also cannot be represented this way - the cutoff point is sometime in 2038 for UNIX and Windows.

What is TimeTuple?

Many of the Python's time functions handle time as a tuple of 9 numbers, as shown below −

Index Field Values
0 4-digit year 2016
1 Month 1 to 12
2 Day 1 to 31
3 Hour 0 to 23
4 Minute 0 to 59
5 Second 0 to 61 (60 or 61 are leap-seconds)
6 Day of Week 0 to 6 (0 is Monday)
7 Day of year 1 to 366 (Julian day)
8 Daylight savings -1, 0, 1, -1 means library determines DST

For Example −

import time

print (time.localtime());

This would produce a result as follows −

time.struct_time(tm_year = 2016, tm_mon = 2, tm_mday = 15, tm_hour = 9, 
   tm_min = 29, tm_sec = 2, tm_wday = 0, tm_yday = 46, tm_isdst = 0)

The above tuple is equivalent to struct_time structure. This structure has following attributes −

Index Attributes Values
0 tm_year 2016
1 tm_mon 1 to 12
2 tm_mday 1 to 31
3 tm_hour 0 to 23
4 tm_min 0 to 59
5 tm_sec 0 to 61 (60 or 61 are leap-seconds)
6 tm_wday 0 to 6 (0 is Monday)
7 tm_yday 1 to 366 (Julian day)
8 tm_isdst -1, 0, 1, -1 means library determines DST

Getting current time

To translate a time instant from seconds since the epoch floating-point value into a timetuple, pass the floating-point value to a function (e.g., localtime) that returns a time-tuple with all valid nine items.

#!/usr/bin/python3
import time

localtime = time.localtime(time.time())
print ("Local current time :", localtime)

This would produce the following result, which could be formatted in any other presentable form −

Local current time : time.struct_time(tm_year = 2016, tm_mon = 2, tm_mday = 15, 
   tm_hour = 9, tm_min = 29, tm_sec = 2, tm_wday = 0, tm_yday = 46, tm_isdst = 0)

Getting formatted time

You can format any time as per your requirement, but a simple method to get time in a readable format is asctime()

Demonstração ao vivo
#!/usr/bin/python3
import time

localtime = time.asctime( time.localtime(time.time()) )
print ("Local current time :", localtime)

Isso produziria o seguinte resultado -

Local current time : Mon Feb 15 09:34:03 2016

Obtendo calendário por um mês

O módulo de calendário oferece uma ampla gama de métodos para jogar com calendários anuais e mensais. Aqui, imprimimos um calendário para um determinado mês (janeiro de 2008) -

#!/usr/bin/python3
import calendar

cal = calendar.month(2016, 2)
print ("Here is the calendar:")
print (cal)

Isso produziria o seguinte resultado -

Here is the calendar:
   February 2016
Mo Tu We Th Fr Sa Su
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29

O Módulo de Tempo

Há um popular timemódulo disponível em Python, que fornece funções para trabalhar com tempos e para converter entre representações. Aqui está a lista de todos os métodos disponíveis.

Sr. Não. Descrição da função
1 time.altzone

O deslocamento do fuso horário DST local, em segundos a oeste do UTC, se houver um definido. Isso é negativo se o fuso horário local do DST estiver a leste do UTC (como na Europa Ocidental, incluindo o Reino Unido). Use isto se a luz do dia for diferente de zero.

2 time.asctime ([tupletime])

Aceita uma tupla de tempo e retorna uma string legível de 24 caracteres, como 'Tue Dez 11 18:07:14 2008'.

3 Rélogio de ponto( )

Retorna o tempo de CPU atual como um número de segundos de ponto flutuante. Para medir os custos computacionais de diferentes abordagens, o valor de time.clock é mais útil do que time.time ().

4 time.ctime ([segs])

Como asctime (localtime (secs)) e sem argumentos é como asctime ()

5 time.gmtime ([segs])

Aceita um instante expresso em segundos desde a época e retorna uma tupla de tempo t com a hora UTC. Nota - t.tm_isdst é sempre 0

6 time.localtime ([segs])

Aceita um instante expresso em segundos desde a época e retorna uma tupla de tempo t com a hora local (t.tm_isdst é 0 ou 1, dependendo se o DST se aplica a segundos instantâneos pelas regras locais).

7 time.mktime (tupletime)

Aceita um instante expresso como uma tupla de tempo no horário local e retorna um valor de ponto flutuante com o instante expresso em segundos desde a época.

8 tempo.sono (segundos)

Suspende o thread de chamada por segundos e segundos.

9 time.strftime (fmt [, tupletime])

Aceita um instante expresso como uma tupla de tempo no horário local e retorna uma string que representa o instante, conforme especificado pela string fmt.

10 time.strptime (str, fmt = '% a% b% d% H:% M:% S% Y')

Analisa str de acordo com a string de formato fmt e retorna o instante no formato de tupla de tempo.

11 time.time ()

Retorna o instante de tempo atual, um número de segundos de ponto flutuante desde a época.

12 time.tzset ()

Redefine as regras de conversão de tempo usadas pelas rotinas da biblioteca. A variável de ambiente TZ especifica como isso é feito.

Existem dois atributos importantes disponíveis com o módulo de tempo. Eles são -

Sr. Não. Atributo e descrição
1

time.timezone

O atributo time.timezone é a diferença em segundos do fuso horário local (sem DST) do UTC (> 0 nas Américas; <= 0 na maior parte da Europa, Ásia, África).

2

time.tzname

O atributo time.tzname é um par de strings dependentes da localidade, que são os nomes do fuso horário local sem e com DST, respectivamente.

O Módulo Calendário

O módulo de calendário fornece funções relacionadas ao calendário, incluindo funções para imprimir um calendário de texto para um determinado mês ou ano.

Por padrão, o calendário considera a segunda-feira como o primeiro dia da semana e o domingo como o último. Para mudar isso, ligue para ocalendar.setfirstweekday() função.

Aqui está uma lista de funções disponíveis com o calendar módulo -

Sr. Não. Descrição da função
1

calendar.calendar(year,w = 2,l = 1,c = 6)

Retorna uma string multilinha com um calendário para ano ano formatado em três colunas separadas por c espaços. w é a largura em caracteres de cada data; cada linha tem comprimento 21 * w + 18 + 2 * c. l é o número de linhas para cada semana.

2

calendar.firstweekday( )

Retorna a configuração atual para o dia da semana que começa cada semana. Por padrão, quando o calendário é importado pela primeira vez, é 0, significando segunda-feira.

3

calendar.isleap(year)

Retorna True se o ano for um ano bissexto; caso contrário, False.

4

calendar.leapdays(y1,y2)

Retorna o número total de dias bissextos nos anos dentro do intervalo (y1, y2).

5

calendar.month(year,month,w = 2,l = 1)

Retorna uma string multilinha com um calendário para mês, mês, ano, ano, uma linha por semana mais duas linhas de cabeçalho. w é a largura em caracteres de cada data; cada linha tem comprimento 7 * w + 6. l é o número de linhas para cada semana.

6

calendar.monthcalendar(year,month)

Retorna uma lista de listas de ints. Cada sublista denota uma semana. Os dias fora do mês do ano do ano são definidos como 0; os dias do mês são definidos como o dia do mês, 1 e acima.

7

calendar.monthrange(year,month)

Retorna dois inteiros. O primeiro é o código do dia da semana para o primeiro dia do mês mês no ano ano; o segundo é o número de dias do mês. Os códigos dos dias da semana são 0 (segunda-feira) a 6 (domingo); os números dos meses são de 1 a 12.

8

calendar.prcal(year,w = 2,l = 1,c = 6)

Como imprimir calendar.calendar (ano, w, l, c).

9

calendar.prmonth(year,month,w = 2,l = 1)

Como imprimir calendar.month (year, month, w, l).

10

calendar.setfirstweekday(weekday)

Define o primeiro dia de cada semana como dia da semana de código de dia da semana. Os códigos dos dias da semana são 0 (segunda-feira) a 6 (domingo).

11

calendar.timegm(tupletime)

O inverso de time.gmtime: aceita um instante de tempo na forma de tupla de tempo e retorna o mesmo instante como um número de ponto flutuante de segundos desde a época.

12

calendar.weekday(year,month,day)

Retorna o código do dia da semana para a data fornecida. Os códigos dos dias da semana são 0 (segunda-feira) a 6 (domingo); os números dos meses vão de 1 (janeiro) a 12 (dezembro).

Outros Módulos e Funções

Se estiver interessado, aqui você encontrará uma lista de outros módulos e funções importantes para brincar com data e hora em Python -

  • O Módulo datetime
  • O Módulo pytz
  • O Módulo dateutil

Uma função é um bloco de código organizado e reutilizável que é usado para realizar uma única ação relacionada. As funções fornecem melhor modularidade para seu aplicativo e um alto grau de reutilização de código.

Como você já sabe, Python oferece muitas funções integradas, como print (), etc., mas você também pode criar suas próprias funções. Essas funções são chamadas de funções definidas pelo usuário.

Definindo uma função

Você pode definir funções para fornecer a funcionalidade necessária. Aqui estão regras simples para definir uma função em Python.

  • Os blocos de função começam com a palavra-chave def seguido pelo nome da função e parênteses (()).

  • Quaisquer parâmetros de entrada ou argumentos devem ser colocados entre parênteses. Você também pode definir parâmetros dentro desses parênteses.

  • A primeira instrução de uma função pode ser uma instrução opcional - a string de documentação da função ou docstring .

  • O bloco de código em cada função começa com dois pontos (:) e é indentado.

  • A instrução return [expression] sai de uma função, opcionalmente, passando de volta uma expressão para o chamador. Uma instrução de retorno sem argumentos é igual a return None.

Sintaxe

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]

Por padrão, os parâmetros possuem um comportamento posicional e é necessário informá-los na mesma ordem em que foram definidos.

Exemplo

A função a seguir pega uma string como parâmetro de entrada e a imprime na tela padrão.

def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

Chamando uma função

Definir uma função dá a ela um nome, especifica os parâmetros que devem ser incluídos na função e estrutura os blocos de código.

Depois que a estrutura básica de uma função é finalizada, você pode executá-la chamando-a de outra função ou diretamente do prompt do Python. A seguir está um exemplo para chamar oprintme() função -

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme("This is first call to the user defined function!")
printme("Again second call to the same function")

Quando o código acima é executado, ele produz o seguinte resultado -

This is first call to the user defined function!
Again second call to the same function

Passagem por referência x valor

Todos os parâmetros (argumentos) na linguagem Python são passados ​​por referência. Isso significa que se você alterar a que um parâmetro se refere dentro de uma função, a alteração também se refletirá na função de chamada. Por exemplo -

#!/usr/bin/python3

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   print ("Values inside the function before change: ", mylist)
   mylist[2]=50
   print ("Values inside the function after change: ", mylist)
   return

# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)

Aqui, estamos mantendo a referência do objeto passado e acrescentando valores no mesmo objeto. Portanto, isso produziria o seguinte resultado -

Values inside the function before change:  [10, 20, 30]
Values inside the function after change:  [10, 20, 50]
Values outside the function:  [10, 20, 50]

Há mais um exemplo em que o argumento está sendo passado por referência e a referência está sendo substituída dentro da função chamada.

#!/usr/bin/python3

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist = [1,2,3,4] # This would assi new reference in mylist
   print ("Values inside the function: ", mylist)
   return

# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)

O parâmetro mylisté local para a função changeme. Alterar minha lista dentro da função não afeta minha lista. A função não realiza nada e, finalmente, isso produziria o seguinte resultado -

Values inside the function:  [1, 2, 3, 4]
Values outside the function:  [10, 20, 30]

Argumentos de função

Você pode chamar uma função usando os seguintes tipos de argumentos formais -

  • Argumentos necessários
  • Argumentos de palavras-chave
  • Argumentos padrão
  • Argumentos de comprimento variável

Argumentos Requeridos

Os argumentos necessários são os argumentos passados ​​para uma função na ordem posicional correta. Aqui, o número de argumentos na chamada da função deve corresponder exatamente à definição da função.

Para chamar a função printme(), você definitivamente precisa passar um argumento, caso contrário, ocorrerá um erro de sintaxe da seguinte maneira -

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme()

Quando o código acima é executado, ele produz o seguinte resultado -

Traceback (most recent call last):
   File "test.py", line 11, in <module>
      printme();
TypeError: printme() takes exactly 1 argument (0 given)

Argumentos de Palavras-Chave

Os argumentos de palavra-chave estão relacionados às chamadas de função. Quando você usa argumentos de palavra-chave em uma chamada de função, o chamador identifica os argumentos pelo nome do parâmetro.

Isso permite pular argumentos ou colocá-los fora de ordem porque o interpretador Python pode usar as palavras-chave fornecidas para combinar os valores com os parâmetros. Você também pode fazer chamadas de palavras-chave para oprintme() funcionar das seguintes maneiras -

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme( str = "My string")

Quando o código acima é executado, ele produz o seguinte resultado -

My string

O exemplo a seguir fornece uma imagem mais clara. Observe que a ordem dos parâmetros não importa.

#!/usr/bin/python3

# Function definition is here
def printinfo( name, age ):
   "This prints a passed info into this function"
   print ("Name: ", name)
   print ("Age ", age)
   return

# Now you can call printinfo function
printinfo( age = 50, name = "miki" )

Quando o código acima é executado, ele produz o seguinte resultado -

Name:  miki
Age  50

Argumentos Padrão

Um argumento padrão é um argumento que assume um valor padrão se um valor não for fornecido na chamada de função para esse argumento. O exemplo a seguir dá uma ideia sobre os argumentos padrão, ele imprime a idade padrão se não for passado -

#!/usr/bin/python3

# Function definition is here
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print ("Name: ", name)
   print ("Age ", age)
   return

# Now you can call printinfo function
printinfo( age = 50, name = "miki" )
printinfo( name = "miki" )

Quando o código acima é executado, ele produz o seguinte resultado -

Name:  miki
Age  50
Name:  miki
Age  35

Argumentos de comprimento variável

Você pode precisar processar uma função para mais argumentos do que você especificou ao definir a função. Esses argumentos são chamados de argumentos de comprimento variável e não são nomeados na definição da função, ao contrário dos argumentos obrigatórios e padrão.

A sintaxe para uma função com argumentos variáveis ​​sem palavra-chave é fornecida abaixo -

def functionname([formal_args,] *var_args_tuple ):
   "function_docstring"
   function_suite
   return [expression]

Um asterisco (*) é colocado antes do nome da variável que contém os valores de todos os argumentos de variáveis ​​não-palavra-chave. Essa tupla permanece vazia se nenhum argumento adicional for especificado durante a chamada da função. A seguir está um exemplo simples -

#!/usr/bin/python3

# Function definition is here
def printinfo( arg1, *vartuple ):
   "This prints a variable passed arguments"
   print ("Output is: ")
   print (arg1)
   for var in vartuple:
      print (var)
   return

# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )

Quando o código acima é executado, ele produz o seguinte resultado -

Output is:
10
Output is:
70
60
50

As funções anônimas

Essas funções são chamadas de anônimas porque não são declaradas da maneira padrão usando o defpalavra-chave. Você pode usar olambda palavra-chave para criar pequenas funções anônimas.

  • As formas lambda podem receber qualquer número de argumentos, mas retornam apenas um valor na forma de uma expressão. Eles não podem conter comandos ou expressões múltiplas.

  • Uma função anônima não pode ser uma chamada direta para imprimir porque lambda requer uma expressão.

  • As funções Lambda têm seu próprio namespace local e não podem acessar variáveis ​​diferentes daquelas em sua lista de parâmetros e aquelas no namespace global.

  • Embora pareça que lambdas sejam uma versão de uma linha de uma função, eles não são equivalentes a instruções embutidas em C ou C ++, cujo objetivo é empilhar a alocação passando uma função, durante a chamada por motivos de desempenho.

Sintaxe

A sintaxe de lambda funções contém apenas uma única instrução, que é a seguinte -

lambda [arg1 [,arg2,.....argn]]:expression

A seguir está um exemplo para mostrar como lambda forma de função funciona -

#!/usr/bin/python3

# Function definition is here
sum = lambda arg1, arg2: arg1 + arg2

# Now you can call sum as a function
print ("Value of total : ", sum( 10, 20 ))
print ("Value of total : ", sum( 20, 20 ))

Quando o código acima é executado, ele produz o seguinte resultado -

Value of total :  30
Value of total :  40

A declaração de retorno

A instrução return [expression] sai de uma função, opcionalmente, passando de volta uma expressão para o chamador. Uma instrução de retorno sem argumentos é igual a return None.

Todos os exemplos fornecidos abaixo não estão retornando nenhum valor. Você pode retornar um valor de uma função da seguinte maneira -

#!/usr/bin/python3

# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2
   print ("Inside the function : ", total)
   return total

# Now you can call sum function
total = sum( 10, 20 )
print ("Outside the function : ", total )

Quando o código acima é executado, ele produz o seguinte resultado -

Inside the function :  30
Outside the function :  30

Escopo das Variáveis

Todas as variáveis ​​em um programa podem não estar acessíveis em todos os locais desse programa. Isso depende de onde você declarou uma variável.

O escopo de uma variável determina a parte do programa onde você pode acessar um identificador específico. Existem dois escopos básicos de variáveis ​​em Python -

  • Variáveis ​​globais
  • Variáveis ​​locais

Variáveis ​​globais vs. locais

Variáveis ​​que são definidas dentro de um corpo de função têm um escopo local e aquelas definidas fora têm um escopo global.

Isso significa que as variáveis ​​locais podem ser acessadas apenas dentro da função na qual são declaradas, enquanto as variáveis ​​globais podem ser acessadas em todo o corpo do programa por todas as funções. Quando você chama uma função, as variáveis ​​declaradas dentro dela são trazidas para o escopo. A seguir está um exemplo simples -

#!/usr/bin/python3

total = 0   # This is global variable.
# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2; # Here total is local variable.
   print ("Inside the function local total : ", total)
   return total

# Now you can call sum function
sum( 10, 20 )
print ("Outside the function global total : ", total )

Quando o código acima é executado, ele produz o seguinte resultado -

Inside the function local total :  30
Outside the function global total :  0

Um módulo permite que você organize logicamente seu código Python. O agrupamento do código relacionado em um módulo torna o código mais fácil de entender e usar. Um módulo é um objeto Python com atributos nomeados arbitrariamente que você pode ligar e fazer referência.

Simplesmente, um módulo é um arquivo que consiste em código Python. Um módulo pode definir funções, classes e variáveis. Um módulo também pode incluir código executável.

Exemplo

O código Python para um módulo denominado aname normalmente reside em um arquivo denominado aname.py. Aqui está um exemplo de um módulo simples, support.py -

def print_func( par ):
   print "Hello : ", par
   return

A declaração de importação

Você pode usar qualquer arquivo-fonte Python como um módulo, executando uma instrução de importação em algum outro arquivo-fonte Python. oimport tem a seguinte sintaxe -

import module1[, module2[,... moduleN]

Quando o interpretador encontra uma instrução import, ele importa o módulo se o módulo estiver presente no caminho de pesquisa. Um caminho de pesquisa é uma lista de diretórios que o intérprete pesquisa antes de importar um módulo. Por exemplo, para importar o módulo hello.py, você precisa colocar o seguinte comando no topo do script -

#!/usr/bin/python3

# Import module support
import support

# Now you can call defined function that module as follows
support.print_func("Zara")

Quando o código acima é executado, ele produz o seguinte resultado -

Hello : Zara

Um módulo é carregado apenas uma vez, independentemente do número de vezes que é importado. Isso evita que a execução do módulo aconteça repetidamente, se ocorrerem várias importações.

A declaração de ... import

Python's frominstrução permite importar atributos específicos de um módulo para o namespace atual. ofrom...import tem a seguinte sintaxe -

from modname import name1[, name2[, ... nameN]]

Por exemplo, para importar a função fibonacci do módulo fib, use a seguinte instrução -

#!/usr/bin/python3

# Fibonacci numbers module

def fib(n): # return Fibonacci series up to n
   result = []
   a, b = 0, 1
   while b < n:
      result.append(b)
      a, b = b, a + b
   return result
>>> from fib import fib
>>> fib(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Esta instrução não importa todo o módulo fib para o namespace atual; ele apenas introduz o item fibonacci do módulo fib na tabela de símbolos global do módulo de importação.

A declaração from ... import *

Também é possível importar todos os nomes de um módulo para o namespace atual usando a seguinte instrução de importação -

from modname import *

Isso fornece uma maneira fácil de importar todos os itens de um módulo para o namespace atual; no entanto, essa instrução deve ser usada com moderação.

Executando Módulos como Scripts

Dentro de um módulo, o nome do módulo (como uma string) está disponível como o valor da variável global __name__. O código no módulo será executado, como se você importasse, mas com o __name__ definido como "__main__".

Adicione este código no final do seu módulo -

#!/usr/bin/python3

# Fibonacci numbers module

def fib(n): # return Fibonacci series up to n
   result = []
   a, b = 0, 1
   while b < n:
      result.append(b)
      a, b = b, a + b
   return result
if __name__ == "__main__":
   f = fib(100)
   print(f)

Quando você executa o código acima, a seguinte saída será exibida.

[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Localizando Módulos

Quando você importa um módulo, o interpretador Python procura o módulo nas seguintes sequências -

  • O diretório atual.

  • Se o módulo não for encontrado, o Python pesquisará cada diretório na variável shell PYTHONPATH.

  • Se tudo mais falhar, o Python verifica o caminho padrão. No UNIX, esse caminho padrão é normalmente / usr / local / lib / python3 /.

O caminho de pesquisa do módulo é armazenado no sistema do módulo do sistema como o sys.pathvariável. A variável sys.path contém o diretório atual, PYTHONPATH, e o padrão dependente da instalação.

A variável PYTHONPATH

O PYTHONPATH é uma variável de ambiente que consiste em uma lista de diretórios. A sintaxe de PYTHONPATH é a mesma da variável shell PATH.

Aqui está um PYTHONPATH típico de um sistema Windows -

set PYTHONPATH = c:\python34\lib;

E aqui está um PYTHONPATH típico de um sistema UNIX -

set PYTHONPATH = /usr/local/lib/python

Namespaces e escopo

Variáveis ​​são nomes (identificadores) que mapeiam para objetos. Um namespace é um dicionário de nomes de variáveis ​​(chaves) e seus objetos correspondentes (valores).

  • Uma instrução Python pode acessar variáveis ​​em um namespace local e no namespace global . Se uma variável local e uma global tiverem o mesmo nome, a variável local sombreia a variável global.

  • Cada função tem seu próprio namespace local. Os métodos de classe seguem a mesma regra de escopo das funções comuns.

  • Python faz suposições fundamentadas sobre se as variáveis ​​são locais ou globais. Ele assume que qualquer variável atribuída a um valor em uma função é local.

  • Portanto, para atribuir um valor a uma variável global dentro de uma função, você deve primeiro usar a instrução global.

  • A declaração global VarName informa ao Python que VarName é uma variável global. Python para de pesquisar o namespace local para a variável.

Por exemplo, definimos uma variável Money no namespace global. Dentro da função Money, atribuímos a Money um valor, portanto, Python assume Money como uma variável local.

No entanto, acessamos o valor da variável local Money antes de defini-la, portanto, um UnboundLocalError é o resultado. Descomentar a declaração global corrige o problema.

#!/usr/bin/python3

Money = 2000
def AddMoney():
   # Uncomment the following line to fix the code:
   # global Money
   Money = Money + 1

print (Money)
AddMoney()
print (Money)

A função dir ()

A função interna dir () retorna uma lista classificada de strings contendo os nomes definidos por um módulo.

A lista contém os nomes de todos os módulos, variáveis ​​e funções que são definidas em um módulo. A seguir está um exemplo simples -

#!/usr/bin/python3

# Import built-in module math
import math

content = dir(math)
print (content)

Quando o código acima é executado, ele produz o seguinte resultado -

['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 
'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 
'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log',
'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 
'sqrt', 'tan', 'tanh']

Aqui, a variável de string especial __name__ é o nome do módulo e __file__ é o nome do arquivo a partir do qual o módulo foi carregado.

As funções globals () e locals ()

o globals() e locals() funções podem ser usadas para retornar os nomes nos namespaces globais e locais, dependendo do local de onde são chamados.

  • E se locals() é chamado de dentro de uma função, ele retornará todos os nomes que podem ser acessados ​​localmente a partir dessa função.

  • E se globals() é chamado de dentro de uma função, ele retornará todos os nomes que podem ser acessados ​​globalmente a partir dessa função.

O tipo de retorno de ambas as funções é dicionário. Portanto, os nomes podem ser extraídos usando okeys() função.

A função reload ()

Quando um módulo é importado para um script, o código na parte de nível superior de um módulo é executado apenas uma vez.

Portanto, se você deseja reexecutar o código de nível superior em um módulo, pode usar a função reload () . A função reload () importa um módulo importado anteriormente novamente. A sintaxe da função reload () é esta -

reload(module_name)

Aqui, module_name é o nome do módulo que você deseja recarregar e não a string que contém o nome do módulo. Por exemplo, para recarregar o módulo hello, faça o seguinte -

reload(hello)

Pacotes em Python

Um pacote é uma estrutura de diretório de arquivo hierárquica que define um único ambiente de aplicativo Python que consiste em módulos e subpacotes e subpacotes e assim por diante.

Considere um arquivo Pots.py disponível no diretório Phone. Este arquivo possui a seguinte linha de código-fonte -

#!/usr/bin/python3

def Pots():
print ("I'm Pots Phone")

Similarmente, temos outros dois arquivos com funções diferentes com o mesmo nome acima. Eles são -

  • Arquivo Phone / Isdn.py com a função Isdn ()

  • Arquivo Phone / G3.py com função G3 ()

Agora, crie mais um arquivo __init__.py no diretório Phone -

  • Phone/__init__.py

Para disponibilizar todas as suas funções ao importar o telefone, você precisa colocar instruções de importação explícitas em __init__.py da seguinte maneira -

from Pots import Pots
from Isdn import Isdn
from G3 import G3

Depois de adicionar essas linhas a __init__.py, você terá todas essas classes disponíveis ao importar o pacote Phone.

#!/usr/bin/python3

# Now import your Phone Package.
import Phone

Phone.Pots()
Phone.Isdn()
Phone.G3()

Quando o código acima é executado, ele produz o seguinte resultado -

I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone

No exemplo acima, pegamos o exemplo de uma única função em cada arquivo, mas você pode manter várias funções em seus arquivos. Você também pode definir diferentes classes Python nesses arquivos e, em seguida, criar seus pacotes a partir dessas classes.

Este capítulo cobre todas as funções básicas de I / O disponíveis no Python 3. Para mais funções, consulte a documentação padrão do Python.

Imprimir para a tela

A maneira mais simples de produzir saída é usar a instrução print , onde você pode passar zero ou mais expressões separadas por vírgulas. Esta função converte as expressões que você passa em uma string e grava o resultado na saída padrão da seguinte maneira -

#!/usr/bin/python3

print ("Python is really a great language,", "isn't it?")

Isso produz o seguinte resultado em sua tela padrão -

Python is really a great language, isn't it?

Ler entrada de teclado

Python 2 tem duas funções integradas para ler dados de entrada padrão, que por padrão vem do teclado. Essas funções sãoinput() e raw_input()

No Python 3, a função raw_input () está obsoleta. Além disso, as funções input () lêem os dados do teclado como string, independentemente de estarem entre aspas ('' ou "") ou não.

A função de entrada

o input([prompt]) function é equivalente a raw_input, exceto que assume que a entrada é uma expressão Python válida e retorna o resultado avaliado para você.

#!/usr/bin/python3

>>> x = input("something:")
something:10

>>> x
'10'

>>> x = input("something:")
something:'10' #entered data treated as string with or without ''

>>> x
"'10'"

Abrindo e fechando arquivos

Até agora, você leu e gravou na entrada e na saída padrão. Agora, veremos como usar arquivos de dados reais.

Python fornece funções e métodos básicos necessários para manipular arquivos por padrão. Você pode fazer a maior parte da manipulação de arquivos usando umfile objeto.

A função aberta

Antes de ler ou escrever um arquivo, você deve abri-lo usando a função open () embutida do Python. Esta função cria umfile objeto, que seria utilizado para chamar outros métodos de suporte associados a ele.

Sintaxe

file object = open(file_name [, access_mode][, buffering])

Aqui estão os detalhes dos parâmetros -

  • file_name - O argumento file_name é um valor de string que contém o nome do arquivo que você deseja acessar.

  • access_mode- O access_mode determina o modo em que o arquivo deve ser aberto, ou seja, ler, escrever, anexar, etc. Uma lista completa de valores possíveis é fornecida abaixo na tabela. Este é um parâmetro opcional e o modo de acesso ao arquivo padrão é read (r).

  • buffering- Se o valor do buffer for definido como 0, nenhum buffer ocorrerá. Se o valor do buffer for 1, o buffer de linha é executado durante o acesso a um arquivo. Se você especificar o valor de buffer como um número inteiro maior que 1, a ação de buffer é executada com o tamanho de buffer indicado. Se negativo, o tamanho do buffer é o padrão do sistema (comportamento padrão).

Aqui está uma lista dos diferentes modos de abrir um arquivo -

Sr. Não. Modo e descrição
1

r

Abre um arquivo apenas para leitura. O ponteiro do arquivo é colocado no início do arquivo. Este é o modo padrão.

2

rb

Abre um arquivo para leitura apenas em formato binário. O ponteiro do arquivo é colocado no início do arquivo. Este é o modo padrão.

3

r+

Abre um arquivo para leitura e gravação. O ponteiro do arquivo colocado no início do arquivo.

4

rb+

Abre um arquivo para leitura e gravação em formato binário. O ponteiro do arquivo colocado no início do arquivo.

5

w

Abre um arquivo apenas para gravação. Substitui o arquivo se ele existir. Se o arquivo não existir, cria um novo arquivo para gravação.

6

wb

Abre um arquivo para gravação apenas em formato binário. Substitui o arquivo se ele existir. Se o arquivo não existir, cria um novo arquivo para gravação.

7

w+

Abre um arquivo para escrita e leitura. Substitui o arquivo existente se o arquivo existir. Se o arquivo não existir, cria um novo arquivo para leitura e gravação.

8

wb+

Abre um arquivo para gravação e leitura em formato binário. Substitui o arquivo existente se o arquivo existir. Se o arquivo não existir, cria um novo arquivo para leitura e gravação.

9

a

Abre um arquivo para anexar. O ponteiro do arquivo está no final do arquivo, se o arquivo existir. Ou seja, o arquivo está no modo de acréscimo. Se o arquivo não existir, ele cria um novo arquivo para gravação.

10

ab

Abre um arquivo para anexar em formato binário. O ponteiro do arquivo está no final do arquivo, se o arquivo existir. Ou seja, o arquivo está no modo de acréscimo. Se o arquivo não existir, ele cria um novo arquivo para gravação.

11

a+

Abre um arquivo para anexar e ler. O ponteiro do arquivo está no final do arquivo, se o arquivo existir. O arquivo é aberto no modo anexar. Se o arquivo não existir, ele cria um novo arquivo para leitura e gravação.

12

ab+

Abre um arquivo para anexar e ler em formato binário. O ponteiro do arquivo está no final do arquivo, se o arquivo existir. O arquivo é aberto no modo anexar. Se o arquivo não existir, ele cria um novo arquivo para leitura e gravação.

O arquivo Object Attributes

Depois que um arquivo é aberto e você tem um objeto de arquivo , pode obter várias informações relacionadas a esse arquivo.

Aqui está uma lista de todos os atributos relacionados a um objeto de arquivo -

Sr. Não. Atributo e descrição
1

file.closed

Retorna verdadeiro se o arquivo está fechado, falso caso contrário.

2

file.mode

Retorna o modo de acesso com o qual o arquivo foi aberto.

3

file.name

Retorna o nome do arquivo.

Note - o atributo softspace não é compatível com Python 3.x

Exemplo

#!/usr/bin/python3

# Open a file
fo = open("foo.txt", "wb")
print ("Name of the file: ", fo.name)
print ("Closed or not : ", fo.closed)
print ("Opening mode : ", fo.mode)
fo.close()

Isso produz o seguinte resultado -

Name of the file:  foo.txt
Closed or not :  False
Opening mode :  wb

O método close ()

O método close () de um objeto de arquivo elimina qualquer informação não escrita e fecha o objeto de arquivo, após o qual nenhuma outra gravação pode ser feita.

O Python fecha automaticamente um arquivo quando o objeto de referência de um arquivo é reatribuído a outro arquivo. É uma boa prática usar o método close () para fechar um arquivo.

Sintaxe

fileObject.close();

Exemplo

#!/usr/bin/python3

# Open a file
fo = open("foo.txt", "wb")
print ("Name of the file: ", fo.name)

# Close opened file
fo.close()

Isso produz o seguinte resultado -

Name of the file:  foo.txt

Ler e gravar arquivos

O objeto de arquivo fornece um conjunto de métodos de acesso para tornar nossas vidas mais fáceis. Veríamos como usarread() e write() métodos para ler e gravar arquivos.

O método write ()

o write()método grava qualquer string em um arquivo aberto. É importante observar que as strings Python podem ter dados binários e não apenas texto.

O método write () não adiciona um caractere de nova linha ('\ n') ao final da string -

Sintaxe

fileObject.write(string);

Aqui, o parâmetro passado é o conteúdo a ser escrito no arquivo aberto.

Exemplo

#!/usr/bin/python3

# Open a file
fo = open("foo.txt", "w")
fo.write( "Python is a great language.\nYeah its great!!\n")

# Close opend file
fo.close()

O método acima criaria o arquivo foo.txt e escreveria determinado conteúdo nesse arquivo e, finalmente, fecharia esse arquivo. Se você abrisse este arquivo, ele teria o seguinte conteúdo -

Python is a great language.
Yeah its great!!

Método read ()

o read()método lê uma string de um arquivo aberto. É importante observar que as strings Python podem ter dados binários. além de dados de texto.

Sintaxe

fileObject.read([count]);

Aqui, o parâmetro passado é o número de bytes a serem lidos do arquivo aberto. Este método inicia a leitura desde o início do arquivo e se não houver contagem , ele tenta ler o máximo possível, talvez até o final do arquivo.

Exemplo

Vamos pegar um arquivo foo.txt , que criamos acima.

#!/usr/bin/python3

# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10)
print ("Read String is : ", str)

# Close opened file
fo.close()

Isso produz o seguinte resultado -

Read String is :  Python is

Posições de arquivo

O método tell () informa a posição atual dentro do arquivo; em outras palavras, a próxima leitura ou gravação ocorrerá naquela quantidade de bytes a partir do início do arquivo.

O método de busca (deslocamento [, de]) altera a posição atual do arquivo. ooffsetargumento indica o número de bytes a serem movidos. ofrom argumento especifica a posição de referência de onde os bytes devem ser movidos.

Se de for definido como 0, o início do arquivo é usado como a posição de referência. Se for definido como 1, a posição atual é usada como posição de referência. Se for definido como 2, o final do arquivo será considerado a posição de referência.

Exemplo

Vamos pegar um arquivo foo.txt , que criamos acima.

#!/usr/bin/python3

# Open a file
fo = open("foo.txt", "r+")
str = fo.read(10)
print ("Read String is : ", str)

# Check current position
position = fo.tell()
print ("Current file position : ", position)

# Reposition pointer at the beginning once again
position = fo.seek(0, 0)
str = fo.read(10)
print ("Again read String is : ", str)

# Close opened file
fo.close()

Isso produz o seguinte resultado -

Read String is :  Python is
Current file position :  10
Again read String is :  Python is

Renomeando e Excluindo Arquivos

Pitão os O módulo fornece métodos que ajudam a executar operações de processamento de arquivo, como renomear e excluir arquivos.

Para usar este módulo, você precisa primeiro importá-lo e, em seguida, pode chamar quaisquer funções relacionadas.

O método rename ()

o rename() método leva dois argumentos, o nome do arquivo atual e o novo nome do arquivo.

Sintaxe

os.rename(current_file_name, new_file_name)

Exemplo

A seguir está um exemplo para renomear um arquivo existente test1.txt -

#!/usr/bin/python3
import os

# Rename a file from test1.txt to test2.txt
os.rename( "test1.txt", "test2.txt" )

O método remove ()

Você pode usar o remove() método para excluir arquivos, fornecendo o nome do arquivo a ser excluído como o argumento.

Sintaxe

os.remove(file_name)

Exemplo

A seguir está um exemplo para excluir um arquivo existente test2.txt -

#!/usr/bin/python3
import os

# Delete file test2.txt
os.remove("text2.txt")

Diretórios em Python

Todos os arquivos estão contidos em vários diretórios, e o Python também não tem problemas em lidar com eles. oos O módulo possui vários métodos que ajudam a criar, remover e alterar diretórios.

O método mkdir ()

Você pode usar o mkdir() método do osmódulo para criar diretórios no diretório atual. Você precisa fornecer um argumento para este método, que contém o nome do diretório a ser criado.

Sintaxe

os.mkdir("newdir")

Exemplo

A seguir está um exemplo para criar um teste de diretório no diretório atual -

#!/usr/bin/python3
import os

# Create a directory "test"
os.mkdir("test")

O método chdir ()

Você pode usar o método chdir () para alterar o diretório atual. O método chdir () recebe um argumento, que é o nome do diretório que você deseja tornar o diretório atual.

Sintaxe

os.chdir("newdir")

Exemplo

A seguir está um exemplo para ir para o diretório "/ home / newdir" -

#!/usr/bin/python3
import os

# Changing a directory to "/home/newdir"
os.chdir("/home/newdir")

O método getcwd ()

o getcwd() método exibe o diretório de trabalho atual.

Sintaxe

os.getcwd()

Exemplo

A seguir está um exemplo para fornecer o diretório atual -

#!/usr/bin/python3
import os

# This would give location of the current directory
os.getcwd()

O método rmdir ()

o rmdir() método exclui o diretório, que é passado como um argumento no método.

Antes de remover um diretório, todo o conteúdo dele deve ser removido.

Sintaxe

os.rmdir('dirname')

Exemplo

A seguir está um exemplo para remover o diretório "/ tmp / test". É necessário fornecer o nome completo do diretório, caso contrário, ele pesquisaria esse diretório no diretório atual.

#!/usr/bin/python3
import os

# This would  remove "/tmp/test"  directory.
os.rmdir( "/tmp/test"  )

Métodos relacionados a arquivos e diretórios

Existem três fontes importantes, que fornecem uma ampla gama de métodos utilitários para manipular e manipular arquivos e diretórios nos sistemas operacionais Windows e Unix. Eles são os seguintes -

  • Métodos de objeto de arquivo

    o file objeto fornece funções para manipular arquivos.

  • Métodos de objeto de sistema operacional

    Isso fornece métodos para processar arquivos e diretórios.

Python fornece dois recursos muito importantes para lidar com qualquer erro inesperado em seus programas Python e adicionar recursos de depuração a eles -

  • Exception Handling- Isso seria abordado neste tutorial. Aqui está uma lista de exceções padrão disponíveis em Python - Exceções padrão .

  • Assertions- Isso seria abordado no tutorial Assertions in Python 3 .

Exceções padrão

Aqui está uma lista de exceções padrão disponíveis em Python. -

Sr. Não. Nome e descrição da exceção
1

Exception

Classe base para todas as exceções

2

StopIteration

Gerado quando o método next () de um iterador não aponta para nenhum objeto.

3

SystemExit

Gerado pela função sys.exit ().

4

StandardError

Classe base para todas as exceções integradas, exceto StopIteration e SystemExit.

5

ArithmeticError

Classe base para todos os erros que ocorrem no cálculo numérico.

6

OverflowError

Gerado quando um cálculo excede o limite máximo para um tipo numérico.

7

FloatingPointError

Gerado quando um cálculo de ponto flutuante falha.

8

ZeroDivisonError

Gerado quando a divisão ou módulo por zero ocorre para todos os tipos numéricos.

9

AssertionError

Gerado em caso de falha da declaração Assert.

10

AttributeError

Gerado em caso de falha de referência ou atribuição de atributo.

11

EOFError

Gerado quando não há entrada da função raw_input () ou input () e o final do arquivo é alcançado.

12

ImportError

Gerado quando uma instrução de importação falha.

13

KeyboardInterrupt

Gerado quando o usuário interrompe a execução do programa, geralmente pressionando Ctrl + c.

14

LookupError

Classe base para todos os erros de pesquisa.

15

IndexError

Gerado quando um índice não é encontrado em uma sequência.

16

KeyError

Gerado quando a chave especificada não é encontrada no dicionário.

17

NameError

Gerado quando um identificador não é encontrado no namespace local ou global.

18

UnboundLocalError

Gerado ao tentar acessar uma variável local em uma função ou método, mas nenhum valor foi atribuído a ela.

19

EnvironmentError

Classe base para todas as exceções que ocorrem fora do ambiente Python.

20

IOError

Gerado quando uma operação de entrada / saída falha, como a instrução print ou a função open () ao tentar abrir um arquivo que não existe.

21

OSError

Gerado para erros relacionados ao sistema operacional.

22

SyntaxError

Gerado quando há um erro na sintaxe do Python.

23

IndentationError

Gerado quando o recuo não é especificado corretamente.

24

SystemError

Gerado quando o interpretador encontra um problema interno, mas quando esse erro é encontrado, o interpretador Python não fecha.

25

SystemExit

Gerado quando o interpretador Python é encerrado usando a função sys.exit (). Se não for tratado no código, faz com que o interpretador saia.

26

TypeError

Gerado quando uma operação ou função é tentada e inválida para o tipo de dados especificado.

27

ValueError

Gerado quando a função interna para um tipo de dados tem o tipo válido de argumentos, mas os argumentos têm valores inválidos especificados.

28

RuntimeError

Gerado quando um erro gerado não se enquadra em nenhuma categoria.

29

NotImplementedError

Gerado quando um método abstrato que precisa ser implementado em uma classe herdada não é realmente implementado.

Asserções em Python

Uma asserção é uma verificação de integridade que você pode ativar ou desativar quando terminar de testar o programa.

  • A maneira mais fácil de pensar em uma afirmação é compará-la a um raise-ifdeclaração (ou para ser mais preciso, uma declaração de aumento se não). Uma expressão é testada e, se o resultado for falso, uma exceção é levantada.

  • As asserções são realizadas pela instrução assert, a palavra-chave mais recente do Python, introduzida na versão 1.5.

  • Os programadores costumam colocar asserções no início de uma função para verificar se há uma entrada válida e depois de uma chamada de função para verificar se há uma saída válida.

A declaração de afirmação

Ao encontrar uma declaração assert, o Python avalia a expressão que a acompanha, o que é verdade. Se a expressão for falsa, o Python gerará uma exceção AssertionError .

A sintaxe para assert é -

assert Expression[, Arguments]

Se a declaração falhar, Python usará ArgumentExpression como argumento para AssertionError. As exceções AssertionError podem ser capturadas e tratadas como qualquer outra exceção, usando a instrução try-except. Se eles não forem tratados, eles encerrarão o programa e produzirão um rastreamento.

Exemplo

Aqui está uma função que converte uma determinada temperatura de graus Kelvin para graus Fahrenheit. Já que 0 ° K é o mais frio possível, a função desiste se vê uma temperatura negativa -

#!/usr/bin/python3

def KelvinToFahrenheit(Temperature):
   assert (Temperature >= 0),"Colder than absolute zero!"
   return ((Temperature-273)*1.8)+32

print (KelvinToFahrenheit(273))
print (int(KelvinToFahrenheit(505.78)))
print (KelvinToFahrenheit(-5))

Quando o código acima é executado, ele produz o seguinte resultado -

32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!

O que é exceção?

Uma exceção é um evento que ocorre durante a execução de um programa que interrompe o fluxo normal das instruções do programa. Em geral, quando um script Python encontra uma situação com a qual não pode lidar, ele levanta uma exceção. Uma exceção é um objeto Python que representa um erro.

Quando um script Python levanta uma exceção, ele deve tratar a exceção imediatamente, caso contrário, ele termina e fecha.

Lidando com uma exceção

Se você tiver algum código suspeito que possa gerar uma exceção, você pode defender seu programa colocando o código suspeito em umtry:quadra. Após o bloco try:, inclua umexcept: declaração, seguida por um bloco de código que trata o problema da forma mais elegante possível.

Sintaxe

Aqui está a sintaxe simples de try .... except ... else blocks -

try:
   You do your operations here
   ......................
except ExceptionI:
   If there is ExceptionI, then execute this block.
except ExceptionII:
   If there is ExceptionII, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

Aqui estão alguns pontos importantes sobre a sintaxe mencionada acima -

  • Uma única instrução try pode ter várias instruções except. Isso é útil quando o bloco try contém instruções que podem lançar diferentes tipos de exceções.

  • Você também pode fornecer uma cláusula exceto genérica, que trata de qualquer exceção.

  • Após a (s) cláusula (s) except, você pode incluir uma cláusula else. O código no bloco else é executado se o código no bloco try: não gerar uma exceção.

  • O bloco else é um bom lugar para código que não precisa da proteção do bloco try :.

Exemplo

Este exemplo abre um arquivo, grava conteúdo no arquivo e sai normalmente porque não há nenhum problema -

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print ("Error: can\'t find file or read data")
else:
   print ("Written content in the file successfully")
   fh.close()

Isso produz o seguinte resultado -

Written content in the file successfully

Exemplo

Este exemplo tenta abrir um arquivo onde você não tem permissão de gravação, por isso levanta uma exceção -

#!/usr/bin/python3

try:
   fh = open("testfile", "r")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print ("Error: can\'t find file or read data")
else:
   print ("Written content in the file successfully")

Isso produz o seguinte resultado -

Error: can't find file or read data

A cláusula except sem exceções

Você também pode usar a instrução except sem exceções definidas como segue -

try:
   You do your operations here
   ......................
except:
   If there is any exception, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

Este tipo de try-exceptdeclaração captura todas as exceções que ocorrem. Usar este tipo de instrução try-except não é considerado uma boa prática de programação, porque captura todas as exceções, mas não faz o programador identificar a causa raiz do problema que pode ocorrer.

A cláusula except com múltiplas exceções

Você também pode usar a mesma instrução except para lidar com várias exceções da seguinte forma -

try:
   You do your operations here
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block.

A cláusula try-finally

Você pode usar um finally: bloquear junto com um try:quadra. ofinally:bloco é um local para colocar qualquer código que deva ser executado, quer o bloco try tenha gerado uma exceção ou não. A sintaxe da instrução try-finally é esta -

try:
   You do your operations here;
   ......................
   Due to any exception, this may be skipped.
finally:
   This would always be executed.
   ......................

Note- Você pode fornecer cláusula (s) except, ou uma cláusula finally, mas não ambas. Você não pode usar a cláusula else também junto com uma cláusula finally.

Exemplo

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
finally:
   print ("Error: can\'t find file or read data")
   fh.close()

Se você não tiver permissão para abrir o arquivo no modo de gravação, isso produzirá o seguinte resultado -

Error: can't find file or read data

O mesmo exemplo pode ser escrito de forma mais limpa da seguinte maneira -

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   try:
      fh.write("This is my test file for exception handling!!")
   finally:
      print ("Going to close the file")
      fh.close()
except IOError:
   print ("Error: can\'t find file or read data")

Isso produz o seguinte resultado -

Going to close the file

Quando uma exceção é lançada no bloco try , a execução passa imediatamente para o bloco finally . Depois que todas as instruções no bloco finally são executadas, a exceção é gerada novamente e tratada nas instruções except se presente na próxima camada superior da instrução try-except .

Argumento de uma exceção

Uma exceção pode ter um argumento , que é um valor que fornece informações adicionais sobre o problema. O conteúdo do argumento varia por exceção. Você captura o argumento de uma exceção fornecendo uma variável na cláusula except da seguinte forma -

try:
   You do your operations here
   ......................
except ExceptionType as Argument:
   You can print value of Argument here...

Se você escrever o código para tratar uma única exceção, poderá ter uma variável após o nome da exceção na instrução except. Se você estiver capturando várias exceções, poderá fazer com que uma variável siga a tupla da exceção.

Esta variável recebe o valor da exceção contendo principalmente a causa da exceção. A variável pode receber um único valor ou vários valores na forma de uma tupla. Essa tupla geralmente contém a string de erro, o número do erro e uma localização do erro.

Exemplo

A seguir está um exemplo para uma única exceção -

#!/usr/bin/python3

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError as Argument:
      print ("The argument does not contain numbers\n", Argument)

# Call above function here.
temp_convert("xyz")

Isso produz o seguinte resultado -

The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'

Levantando uma exceção

Você pode levantar exceções de várias maneiras usando a instrução raise. A sintaxe geral para oraise declaração é a seguinte -

Sintaxe

raise [Exception [, args [, traceback]]]

Aqui, Exception é o tipo de exceção (por exemplo, NameError) e argument é um valor para o argumento de exceção. O argumento é opcional; se não for fornecido, o argumento de exceção é Nenhum.

O argumento final, traceback, também é opcional (e raramente usado na prática) e, se presente, é o objeto traceback usado para a exceção.

Exemplo

Uma exceção pode ser uma string, uma classe ou um objeto. A maioria das exceções que o núcleo do Python levanta são classes, com um argumento que é uma instância da classe. Definir novas exceções é muito fácil e pode ser feito da seguinte forma -

def functionName( level ):
   if level <1:
      raise Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

Note- Para capturar uma exceção, uma cláusula "except" deve referir-se à mesma exceção lançada como um objeto de classe ou uma string simples. Por exemplo, para capturar a exceção acima, devemos escrever a cláusula except da seguinte forma -

try:
   Business Logic here...
except Exception as e:
   Exception handling here using e.args...
else:
   Rest of the code here...

O exemplo a seguir ilustra o uso de levantar uma exceção -

#!/usr/bin/python3

def functionName( level ):
   if level <1:
      raise Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

try:
   l = functionName(-10)
   print ("level = ",l)
except Exception as e:
   print ("error in level argument",e.args[0])

Isso produzirá o seguinte resultado

error in level argument -10

Exceções definidas pelo usuário

Python também permite que você crie suas próprias exceções derivando classes das exceções internas padrão.

Aqui está um exemplo relacionado a RuntimeError . Aqui, é criada uma classe que é uma subclasse de RuntimeError . Isso é útil quando você precisa exibir informações mais específicas quando uma exceção é detectada.

No bloco try, a exceção definida pelo usuário é gerada e capturada no bloco except. A variável e é usada para criar uma instância da classe Networkerror .

class Networkerror(RuntimeError):
   def __init__(self, arg):
      self.args = arg

Assim, depois de definir a classe acima, você pode gerar a exceção da seguinte maneira -

try:
   raise Networkerror("Bad hostname")
except Networkerror,e:
   print e.args

Python tem sido uma linguagem orientada a objetos desde o tempo em que existiu. Devido a isso, criar e usar classes e objetos são extremamente fáceis. Este capítulo ajuda você a se tornar um especialista no uso do suporte de programação orientada a objetos do Python.

Se você não tem nenhuma experiência anterior com programação orientada a objetos (OO), pode consultar um curso introdutório sobre ela ou pelo menos um tutorial de algum tipo para que você tenha uma compreensão dos conceitos básicos.

No entanto, aqui está uma pequena introdução à Programação Orientada a Objetos (OOP) para ajudá-lo -

Visão geral da terminologia OOP

  • Class- Um protótipo definido pelo usuário para um objeto que define um conjunto de atributos que caracterizam qualquer objeto da classe. Os atributos são membros de dados (variáveis ​​de classe e variáveis ​​de instância) e métodos, acessados ​​via notação de ponto.

  • Class variable- Uma variável que é compartilhada por todas as instâncias de uma classe. Variáveis ​​de classe são definidas dentro de uma classe, mas fora de qualquer um dos métodos da classe. Variáveis ​​de classe não são usadas com tanta frequência quanto as variáveis ​​de instância.

  • Data member - Uma variável de classe ou variável de instância que contém dados associados a uma classe e seus objetos.

  • Function overloading- A atribuição de mais de um comportamento a uma função específica. A operação executada varia de acordo com os tipos de objetos ou argumentos envolvidos.

  • Instance variable - Uma variável que é definida dentro de um método e pertence apenas à instância atual de uma classe.

  • Inheritance - A transferência das características de uma classe para outras classes que dela derivam.

  • Instance- Um objeto individual de uma determinada classe. Um objeto obj que pertence a uma classe Circle, por exemplo, é uma instância da classe Circle.

  • Instantiation - A criação de uma instância de uma classe.

  • Method - Um tipo especial de função que é definido em uma definição de classe.

  • Object- Uma instância única de uma estrutura de dados definida por sua classe. Um objeto compreende membros de dados (variáveis ​​de classe e variáveis ​​de instância) e métodos.

  • Operator overloading - A atribuição de mais de uma função a um determinado operador.

Criação de classes

A instrução de classe cria uma nova definição de classe. O nome da classe segue imediatamente a palavra-chave class seguida por dois pontos da seguinte forma -

class ClassName:
   'Optional class documentation string'
   class_suite
  • A classe tem uma string de documentação, que pode ser acessada via ClassName.__doc__.

  • o class_suite consiste em todas as instruções do componente que definem os membros da classe, atributos de dados e funções.

Exemplo

A seguir está um exemplo de uma classe Python simples -

class Employee:
   'Common base class for all employees'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print ("Total Employee %d" % Employee.empCount)

   def displayEmployee(self):
      print ("Name : ", self.name,  ", Salary: ", self.salary)
  • A variável empCount é uma variável de classe cujo valor é compartilhado entre todas as instâncias de a nesta classe. Isso pode ser acessado como Employee.empCount de dentro ou fora da classe.

  • O primeiro método __init __ () é um método especial, que é chamado de construtor de classe ou método de inicialização que o Python chama quando você cria uma nova instância dessa classe.

  • Você declara outros métodos de classe como funções normais, com a exceção de que o primeiro argumento para cada método é self . Python adiciona o argumento self à lista para você; você não precisa incluí-lo ao chamar os métodos.

Criação de objetos de instância

Para criar instâncias de uma classe, você chama a classe usando o nome da classe e passa quaisquer argumentos que seu método __init__ aceite.

This would create first object of Employee class
emp1 = Employee("Zara", 2000)
This would create second object of Employee class
emp2 = Employee("Manni", 5000)

Acessando Atributos

Você acessa os atributos do objeto usando o operador ponto com objeto. A variável de classe seria acessada usando o nome da classe da seguinte forma -

emp1.displayEmployee()
emp2.displayEmployee()
print ("Total Employee %d" % Employee.empCount)

Agora, juntando todos os conceitos -

#!/usr/bin/python3

class Employee:
   'Common base class for all employees'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print ("Total Employee %d" % Employee.empCount)

   def displayEmployee(self):
      print ("Name : ", self.name,  ", Salary: ", self.salary)


#This would create first object of Employee class"
emp1 = Employee("Zara", 2000)
#This would create second object of Employee class"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print ("Total Employee %d" % Employee.empCount)

Quando o código acima é executado, ele produz o seguinte resultado -

Name :  Zara ,Salary:  2000
Name :  Manni ,Salary:  5000
Total Employee 2

Você pode adicionar, remover ou modificar atributos de classes e objetos a qualquer momento -

emp1.salary = 7000  # Add an 'salary' attribute.
emp1.name = 'xyz'  # Modify 'age' attribute.
del emp1.salary  # Delete 'age' attribute.

Em vez de usar as instruções normais para acessar atributos, você pode usar as seguintes funções -

  • o getattr(obj, name[, default]) - para acessar o atributo do objeto.

  • o hasattr(obj,name) - para verificar se um atributo existe ou não.

  • o setattr(obj,name,value)- para definir um atributo. Se o atributo não existir, ele será criado.

  • o delattr(obj, name) - para excluir um atributo.

hasattr(emp1, 'salary')    # Returns true if 'salary' attribute exists
getattr(emp1, 'salary')    # Returns value of 'salary' attribute
setattr(emp1, 'salary', 7000) # Set attribute 'salary' at 7000
delattr(emp1, 'salary')    # Delete attribute 'salary'

Atributos de classe integrados

Cada classe Python segue os atributos embutidos e eles podem ser acessados ​​usando o operador ponto como qualquer outro atributo -

  • __dict__ - Dicionário contendo o namespace da classe.

  • __doc__ - String de documentação da classe ou nenhum, se indefinido.

  • __name__ - Nome da classe.

  • __module__- Nome do módulo no qual a classe é definida. Este atributo é "__main__" no modo interativo.

  • __bases__ - Uma tupla possivelmente vazia contendo as classes base, na ordem de sua ocorrência na lista de classes base.

Para a classe acima, vamos tentar acessar todos esses atributos -

#!/usr/bin/python3

class Employee:
   'Common base class for all employees'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print ("Total Employee %d" % Employee.empCount)

   def displayEmployee(self):
      print ("Name : ", self.name,  ", Salary: ", self.salary)

emp1 = Employee("Zara", 2000)
emp2 = Employee("Manni", 5000)
print ("Employee.__doc__:", Employee.__doc__)
print ("Employee.__name__:", Employee.__name__)
print ("Employee.__module__:", Employee.__module__)
print ("Employee.__bases__:", Employee.__bases__)
print ("Employee.__dict__:", Employee.__dict__ )

Quando o código acima é executado, ele produz o seguinte resultado -

Employee.__doc__: Common base class for all employees
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: (<class 'object'>,)
Employee.__dict__: {
   'displayCount': <function Employee.displayCount at 0x0160D2B8>, 
   '__module__': '__main__', '__doc__': 'Common base class for all employees', 
   'empCount': 2, '__init__': 
   <function Employee.__init__ at 0x0124F810>, 'displayEmployee': 
   <function Employee.displayEmployee at 0x0160D300>,
   '__weakref__': 
   <attribute '__weakref__' of 'Employee' objects>, '__dict__': 
   <attribute '__dict__' of 'Employee' objects>
}

Destruindo objetos (coleta de lixo)

Python exclui objetos desnecessários (tipos internos ou instâncias de classe) automaticamente para liberar o espaço de memória. O processo pelo qual o Python recupera periodicamente blocos de memória que não estão mais em uso é denominado coleta de lixo.

O coletor de lixo do Python é executado durante a execução do programa e é disparado quando a contagem de referência de um objeto chega a zero. A contagem de referência de um objeto muda conforme o número de aliases que apontam para ele muda.

A contagem de referência de um objeto aumenta quando ele recebe um novo nome ou é colocado em um contêiner (lista, tupla ou dicionário). A contagem de referência do objeto diminui quando ele é excluído com del , sua referência é reatribuída ou sua referência sai do escopo. Quando a contagem de referência de um objeto chega a zero, o Python a coleta automaticamente.

a = 40      # Create object <40>
b = a       # Increase ref. count  of <40> 
c = [b]     # Increase ref. count  of <40> 

del a       # Decrease ref. count  of <40>
b = 100     # Decrease ref. count  of <40> 
c[0] = -1   # Decrease ref. count  of <40>

Normalmente, você não notará quando o coletor de lixo destrói uma instância órfã e recupera seu espaço. No entanto, uma classe pode implementar o método especial __del __ () , chamado de destruidor, que é invocado quando a instância está para ser destruída. Este método pode ser usado para limpar quaisquer recursos que não sejam de memória usados ​​por uma instância.

Exemplo

Este destruidor __del __ () imprime o nome da classe de uma instância que está prestes a ser destruída -

#!/usr/bin/python3

class Point:
   def __init__( self, x=0, y=0):
      self.x = x
      self.y = y
   def __del__(self):
      class_name = self.__class__.__name__
      print (class_name, "destroyed")

pt1 = Point()
pt2 = pt1
pt3 = pt1
print (id(pt1), id(pt2), id(pt3))   # prints the ids of the obejcts
del pt1
del pt2
del pt3

Quando o código acima é executado, ele produz o seguinte resultado -

140338326963984 140338326963984 140338326963984
Point destroyed

Note- Idealmente, você deve definir suas classes em um arquivo separado, então você deve importá-los em seu arquivo de programa principal usando a instrução import .

No exemplo acima, assumindo que a definição de uma classe Point está contida em point.py e não há nenhum outro código executável nele.

#!/usr/bin/python3
import point

p1 = point.Point()

Herança de classe

Em vez de começar do zero, você pode criar uma classe derivando-a de uma classe pré-existente listando a classe pai entre parênteses após o nome da nova classe.

A classe filha herda os atributos de sua classe pai e você pode usar esses atributos como se estivessem definidos na classe filha. Uma classe filha também pode substituir membros de dados e métodos do pai.

Sintaxe

As classes derivadas são declaradas de maneira muito semelhante à classe pai; no entanto, uma lista de classes base para herdar é fornecida após o nome da classe -

class SubClassName (ParentClass1[, ParentClass2, ...]):
   'Optional class documentation string'
   class_suite

Exemplo

#!/usr/bin/python3

class Parent:        # define parent class
   parentAttr = 100
   def __init__(self):
      print ("Calling parent constructor")

   def parentMethod(self):
      print ('Calling parent method')

   def setAttr(self, attr):
      Parent.parentAttr = attr

   def getAttr(self):
      print ("Parent attribute :", Parent.parentAttr)

class Child(Parent): # define child class
   def __init__(self):
      print ("Calling child constructor")

   def childMethod(self):
      print ('Calling child method')

c = Child()          # instance of child
c.childMethod()      # child calls its method
c.parentMethod()     # calls parent's method
c.setAttr(200)       # again call parent's method
c.getAttr()          # again call parent's method

Quando o código acima é executado, ele produz o seguinte resultado -

Calling child constructor
Calling child method
Calling parent method
Parent attribute : 200

De maneira semelhante, você pode conduzir uma classe a partir de várias classes pai da seguinte maneira -

class A:        # define your class A
.....

class B:         # define your calss B
.....

class C(A, B):   # subclass of A and B
.....

Você pode usar as funções issubclass () ou isinstance () para verificar os relacionamentos de duas classes e instâncias.

  • o issubclass(sub, sup) a função booleana retorna True, se a subclasse fornecida sub é de fato uma subclasse da superclasse sup.

  • o isinstance(obj, Class)a função booleana retorna True, se obj é uma instância da classe Class ou é uma instância de uma subclasse de Class

Métodos de substituição

Você sempre pode substituir seus métodos de classe pai. Uma razão para sobrescrever os métodos parent é que você pode desejar uma funcionalidade especial ou diferente em sua subclasse.

Exemplo

#!/usr/bin/python3

class Parent:        # define parent class
   def myMethod(self):
      print ('Calling parent method')

class Child(Parent): # define child class
   def myMethod(self):
      print ('Calling child method')

c = Child()          # instance of child
c.myMethod()         # child calls overridden method

Quando o código acima é executado, ele produz o seguinte resultado -

Calling child method

Métodos de sobrecarga de base

A tabela a seguir lista algumas funcionalidades genéricas que você pode substituir em suas próprias classes -

Sr. Não. Método, descrição e amostra de chamada
1

__init__ ( self [,args...] )

Construtor (com quaisquer argumentos opcionais)

Chamada de amostra: obj = className (args)

2

__del__( self )

Destruidor, apaga um objeto

Amostra de chamada: del obj

3

__repr__( self )

Representação de string avaliável

Chamada de amostra: repr (obj)

4

__str__( self )

Representação de string para impressão

Amostra de chamada: str (obj)

5

__cmp__ ( self, x )

Comparação de objetos

Chamada de amostra: cmp (obj, x)

Operadores de sobrecarga

Suponha que você tenha criado uma classe Vector para representar vetores bidimensionais. O que acontece quando você usa o operador de adição para adicioná-los? O mais provável é que Python grite com você.

Você poderia, no entanto, definir o método __add__ em sua classe para realizar a adição de vetores e, em seguida, o operador mais se comportaria de acordo com a expectativa -

Exemplo

#!/usr/bin/python3

class Vector:
   def __init__(self, a, b):
      self.a = a
      self.b = b

   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)
   
   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)

v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)

Quando o código acima é executado, ele produz o seguinte resultado -

Vector(7,8)

Ocultação de dados

Os atributos de um objeto podem ou não ser visíveis fora da definição da classe. Você precisa nomear os atributos com um prefixo de sublinhado duplo e esses atributos não ficarão diretamente visíveis para os de fora.

Exemplo

#!/usr/bin/python3

class JustCounter:
   __secretCount = 0
  
   def count(self):
      self.__secretCount += 1
      print (self.__secretCount)

counter = JustCounter()
counter.count()
counter.count()
print (counter.__secretCount)

Quando o código acima é executado, ele produz o seguinte resultado -

1
2
Traceback (most recent call last):
   File "test.py", line 12, in <module>
      print counter.__secretCount
AttributeError: JustCounter instance has no attribute '__secretCount'

Python protege esses membros alterando internamente o nome para incluir o nome da classe. Você pode acessar atributos como object._className__attrName . Se você substituir sua última linha como a seguir, isso funcionará para você -

.........................
print (counter._JustCounter__secretCount)

Quando o código acima é executado, ele produz o seguinte resultado -

1
2
2

Uma expressão regular é uma sequência especial de caracteres que o ajuda a encontrar ou encontrar outras strings ou conjuntos de strings, usando uma sintaxe especializada mantida em um padrão. Expressões regulares são amplamente utilizadas no mundo UNIX.

O módulo refornece suporte completo para expressões regulares semelhantes a Perl em Python. ore módulo levanta a exceção re.error se ocorrer um erro ao compilar ou usar uma expressão regular.

Cobriríamos duas funções importantes, que seriam usadas para lidar com expressões regulares. No entanto, uma pequena coisa primeiro: Existem vários caracteres, que teriam um significado especial quando usados ​​em expressões regulares. Para evitar qualquer confusão ao lidar com expressões regulares, usaríamos Raw Strings comor'expression'.

Padrões básicos que correspondem a caracteres únicos

Sr. Não. Expressão e correspondências
1

a, X, 9, <

caracteres comuns apenas combinam com eles mesmos.

2

. (a period)

corresponde a qualquer caractere único, exceto nova linha '\ n'

3

\w

corresponde a um caractere de "palavra": uma letra ou dígito ou barra [a-zA-Z0-9_].

4

\W

corresponde a qualquer caractere diferente de palavra.

5

\b

limite entre palavra e não palavra

6

\s

corresponde a um único caractere de espaço em branco - espaço, nova linha, retorno, tabulação

7

\S

corresponde a qualquer caractere diferente de espaço em branco.

8

\t, \n, \r

guia, nova linha, retorno

9

\d

dígito decimal [0-9]

10

^

corresponde ao início da string

11

$

coincidir com o final da corda

12

\

inibir o "especialismo" de um personagem.

Sinalizadores de compilação

Sinalizadores de compilação permitem modificar alguns aspectos de como as expressões regulares funcionam. Sinalizadores estão disponíveis no módulo re sob dois nomes, um nome longo, comoIGNORECASE e uma forma curta de uma letra, como I.

Sr. Não. Bandeira e Significado
1

ASCII, A

Faz com que vários escapes, como \ w, \ b, \ se \ d correspondam apenas em caracteres ASCII com a respectiva propriedade.

2

DOTALL, S

Faça, combine qualquer caractere, incluindo novas linhas

3

IGNORECASE, I

Faça correspondências que não diferenciam maiúsculas de minúsculas

4

LOCALE, L

Faça uma correspondência de acordo com a localidade

5

MULTILINE, M

Correspondência multilinha, afetando ^ e $

6

VERBOSE, X (for ‘extended’)

Habilite REs verbosos, que podem ser organizados de forma mais limpa e compreensível

A função de correspondência

Esta função tenta corresponder o padrão RE à string com sinalizadores opcionais .

Aqui está a sintaxe para esta função -

re.match(pattern, string, flags = 0)

Aqui está a descrição dos parâmetros -

Sr. Não. Parâmetro e Descrição
1

pattern

Esta é a expressão regular a ser correspondida.

2

string

Esta é a string, que seria pesquisada para corresponder ao padrão no início da string.

3

flags

Você pode especificar sinalizadores diferentes usando OR bit a bit (|). Esses são modificadores, que estão listados na tabela a seguir.

A função re.match retorna ummatch objeto de sucesso, Noneem caso de falha. Usamos a função group (num) ou groups () dematch objeto para obter a expressão correspondente.

Sr. Não. Método e descrição do objeto de correspondência
1

group(num = 0)

Este método retorna a correspondência inteira (ou número de subgrupo específico)

2

groups()

Este método retorna todos os subgrupos correspondentes em uma tupla (vazio se não houver nenhum)

Exemplo

#!/usr/bin/python3
import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print ("matchObj.group() : ", matchObj.group())
   print ("matchObj.group(1) : ", matchObj.group(1))
   print ("matchObj.group(2) : ", matchObj.group(2))
else:
   print ("No match!!")

Quando o código acima é executado, ele produz o seguinte resultado -

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

A função de pesquisa

Esta função procura a primeira ocorrência do padrão RE dentro da string com sinalizadores opcionais .

Aqui está a sintaxe para esta função -

re.search(pattern, string, flags = 0)

Aqui está a descrição dos parâmetros -

Sr. Não. Parâmetro e Descrição
1

pattern

Esta é a expressão regular a ser correspondida.

2

string

Esta é a string, que seria pesquisada para corresponder ao padrão em qualquer lugar da string.

3

flags

Você pode especificar sinalizadores diferentes usando OR bit a bit (|). Esses são modificadores, que estão listados na tabela a seguir.

A função re.search retorna ummatch objeto de sucesso, noneem caso de falha. Usamos a função group (num) ou groups () dematch objeto para obter a expressão correspondente.

Sr. Não. Método e descrição do objeto de correspondência
1

group(num = 0)

Este método retorna a correspondência inteira (ou número de subgrupo específico)

2

groups()

Este método retorna todos os subgrupos correspondentes em uma tupla (vazio se não houver nenhum)

Exemplo

#!/usr/bin/python3
import re

line = "Cats are smarter than dogs";

searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)

if searchObj:
   print ("searchObj.group() : ", searchObj.group())
   print ("searchObj.group(1) : ", searchObj.group(1))
   print ("searchObj.group(2) : ", searchObj.group(2))
else:
   print ("Nothing found!!")

Quando o código acima é executado, ele produz o seguinte resultado -

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

Correspondência versus pesquisa

Python oferece duas operações primitivas diferentes baseadas em expressões regulares: match verifica se há uma correspondência apenas no início da string, enquanto search verifica se há uma correspondência em qualquer lugar da string (isso é o que Perl faz por padrão).

Exemplo

#!/usr/bin/python3
import re

line = "Cats are smarter than dogs";

matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print ("match --> matchObj.group() : ", matchObj.group())
else:
   print ("No match!!")

searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
   print ("search --> searchObj.group() : ", searchObj.group())
else:
   print ("Nothing found!!")

Quando o código acima é executado, ele produz o seguinte resultado -

No match!!
search --> matchObj.group() :  dogs

Pesquisar e substituir

Um dos mais importantes re métodos que usam expressões regulares é sub.

Sintaxe

re.sub(pattern, repl, string, max=0)

Este método substitui todas as ocorrências do padrão RE em string por repl , substituindo todas as ocorrências, a menos que max seja fornecido. Este método retorna uma string modificada.

Exemplo

#!/usr/bin/python3
import re

phone = "2004-959-559 # This is Phone Number"

# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print ("Phone Num : ", num)

# Remove anything other than digits
num = re.sub(r'\D', "", phone)    
print ("Phone Num : ", num)

Quando o código acima é executado, ele produz o seguinte resultado -

Phone Num :  2004-959-559
Phone Num :  2004959559

Modificadores de expressão regular: sinalizadores de opção

Literais de expressão regular podem incluir um modificador opcional para controlar vários aspectos de correspondência. Os modificadores são especificados como um sinalizador opcional. Você pode fornecer vários modificadores usando OU exclusivo (|), conforme mostrado anteriormente e pode ser representado por um destes -

Sr. Não. Modificador e descrição
1

re.I

Executa correspondência que não diferencia maiúsculas de minúsculas.

2

re.L

Interpreta palavras de acordo com o local atual. Essa interpretação afeta o grupo alfabético (\ w e \ W), bem como o comportamento dos limites das palavras (\ b e \ B).

3

re.M

Faz $ corresponder ao final de uma linha (não apenas ao final da string) e faz ^ corresponder ao início de qualquer linha (não apenas ao início da string).

4

re.S

Faz com que um ponto (ponto) corresponda a qualquer caractere, incluindo uma nova linha.

5

re.U

Interpreta letras de acordo com o conjunto de caracteres Unicode. Este sinalizador afeta o comportamento de \ w, \ W, \ b, \ B.

6

re.X

Permite uma sintaxe de expressão regular "mais bonita". Ele ignora os espaços em branco (exceto dentro de um conjunto [] ou quando escapado por uma barra invertida) e trata # sem escape como um marcador de comentário.

Padrões de Expressão Regular

Exceto para os personagens de controle, (+ ? . * ^ $ ( ) [ ] { } | \), todos os personagens correspondem a si mesmos. Você pode escapar de um caractere de controle precedendo-o com uma barra invertida.

A tabela a seguir lista a sintaxe da expressão regular que está disponível em Python -

Sr. Não. Parâmetro e Descrição
1

^

Corresponde ao início da linha.

2

$

Corresponde ao final da linha.

3

.

Corresponde a qualquer caractere único, exceto nova linha. Usar a opção m permite que ele corresponda a nova linha também.

4

[...]

Corresponde a qualquer caractere único entre colchetes.

5

[^...]

Corresponde a qualquer caractere único que não esteja entre colchetes

6

re*

Corresponde a 0 ou mais ocorrências da expressão anterior.

7

re+

Corresponde a 1 ou mais ocorrências da expressão anterior.

8

re?

Corresponde a 0 ou 1 ocorrência da expressão anterior.

9

re{ n}

Corresponde exatamente ao número n de ocorrências da expressão anterior.

10

re{ n,}

Corresponde a n ou mais ocorrências da expressão anterior.

11

re{ n, m}

Corresponde a pelo menos n e no máximo m ocorrências da expressão anterior.

12

a|b

Corresponde a a ou b.

13

(re)

Agrupa expressões regulares e lembra o texto correspondente.

14

(?imx)

Alterna temporariamente as opções i, m ou x em uma expressão regular. Se estiver entre parênteses, apenas essa área é afetada.

15

(?-imx)

Desativa temporariamente as opções i, m ou x em uma expressão regular. Se estiver entre parênteses, apenas essa área é afetada.

16

(?: re)

Agrupa expressões regulares sem lembrar o texto correspondente.

17

(?imx: re)

Alterna temporariamente as opções i, m ou x entre parênteses.

18

(?-imx: re)

Desativa temporariamente as opções i, m ou x entre parênteses.

19

(?#...)

Comente.

20

(?= re)

Especifica a posição usando um padrão. Não tem alcance.

21

(?! re)

Especifica a posição usando negação de padrão. Não tem alcance.

22

(?> re)

Corresponde ao padrão independente sem retrocesso.

23

\w

Corresponde a caracteres de palavras.

24

\W

Corresponde a caracteres que não sejam palavras.

25

\s

Corresponde ao espaço em branco. Equivalente a [\ t \ n \ r \ f].

26

\S

Corresponde a espaços não brancos.

27

\d

Corresponde a dígitos. Equivalente a [0-9].

28

\D

Corresponde a não dígitos.

29

\A

Corresponde ao início da string.

30

\Z

Corresponde ao final da string. Se houver uma nova linha, ela corresponderá imediatamente antes da nova linha.

31

\z

Corresponde ao final da string.

32

\G

As partidas apontam onde a última partida terminou.

33

\b

Corresponde aos limites da palavra quando fora dos colchetes. Corresponde ao backspace (0x08) quando entre colchetes.

34

\B

Corresponde a limites não-palavra.

35

\n, \t, etc.

Corresponde a novas linhas, retornos de carro, guias, etc.

36

\1...\9

Corresponde à enésima subexpressão agrupada.

37

\10

Corresponde à enésima subexpressão agrupada se já tiver correspondido. Caso contrário, refere-se à representação octal de um código de caractere.

Exemplos de expressão regular

Personagens literais

Sr. Não. Exemplo e descrição
1

python

Corresponde a "python".

Classes de personagens

Sr. Não. Exemplo e descrição
1

[Pp]ython

Corresponde a "Python" ou "python"

2

rub[ye]

Corresponde a "rubi" ou "rube"

3

[aeiou]

Corresponde a qualquer vogal minúscula

4

[0-9]

Corresponde a qualquer dígito; igual a [0123456789]

5

[a-z]

Corresponde a qualquer letra ASCII minúscula

6

[A-Z]

Corresponde a qualquer letra ASCII maiúscula

7

[a-zA-Z0-9]

Combine com qualquer uma das opções acima

8

[^aeiou]

Corresponder a qualquer coisa que não seja uma vogal minúscula

9

[^0-9]

Corresponde a qualquer coisa que não seja um dígito

Classes de personagens especiais

Sr. Não. Exemplo e descrição
1

.

Corresponde a qualquer caractere, exceto nova linha

2

\d

Corresponde a um dígito: [0-9]

3

\D

Corresponde a um não-dígito: [^ 0-9]

4

\s

Corresponde a um caractere de espaço em branco: [\ t \ r \ n \ f]

5

\S

Corresponder a espaços não-brancos: [^ \ t \ r \ n \ f]

6

\w

Corresponde a um caractere de palavra única: [A-Za-z0-9_]

7

\W

Corresponde a um caractere diferente de palavra: [^ A-Za-z0-9_]

Casos de Repetição

Sr. Não. Exemplo e descrição
1

ruby?

Corresponde a "rub" ou "ruby": o y é opcional

2

ruby*

Corresponde a "esfregar" mais 0 ou mais ys

3

ruby+

Corresponde a "esfregar" mais 1 ou mais ys

4

\d{3}

Corresponde exatamente a 3 dígitos

5

\d{3,}

Corresponde 3 ou mais dígitos

6

\d{3,5}

Corresponder 3, 4 ou 5 dígitos

Repetição nada repetitiva

Isso corresponde ao menor número de repetições -

Sr. Não. Exemplo e descrição
1

<.*>

Repetição gananciosa: corresponde a "<python> perl>"

2

<.*?>

Nongreedy: corresponde a "<python>" em "<python> perl>"

Agrupando com parênteses

Sr. Não. Exemplo e descrição
1

\D\d+

Nenhum grupo: + repete-se \ d

2

(\D\d)+

Agrupado: + repete \ D \ d par

3

([Pp]ython(,)?)+

Corresponde a "Python", "Python, python, python" etc.

Referências anteriores

Isso corresponde a um grupo anteriormente correspondido novamente -

Sr. Não. Exemplo e descrição
1

([Pp])ython&\1ails

Corresponder python e pails ou Python e Pails

2

(['"])[^\1]*\1

String entre aspas simples ou duplas. \ 1 corresponde ao que o primeiro grupo correspondeu. \ 2 corresponde ao que o segundo grupo correspondeu, etc.

Alternativas

Sr. Não. Exemplo e descrição
1

python|perl

Corresponde a "python" ou "perl"

2

rub(y|le)

Corresponde a "rubi" ou "rublo"

3

Python(!+|\?)

"Python" seguido por um ou mais! ou um?

Âncoras

Isso precisa especificar a posição de correspondência.

Sr. Não. Exemplo e descrição
1

^Python

Corresponde a "Python" no início de uma string ou linha interna

2

Python$

Corresponde a "Python" no final de uma string ou linha

3

\APython

Corresponde a "Python" no início de uma string

4

Python\Z

Corresponde a "Python" no final de uma string

5

\bPython\b

Corresponde a "Python" em um limite de palavra

6

\brub\B

\ B é um limite sem palavras: corresponde a "esfregar" em "rube" e "ruby", mas não sozinho

7

Python(?=!)

Corresponde a "Python", se seguido por um ponto de exclamação.

8

Python(?!!)

Corresponde a "Python", se não for seguido por um ponto de exclamação.

Sintaxe especial com parênteses

Sr. Não. Exemplo e descrição
1

R(?#comment)

Corresponde a "R". Todo o resto é um comentário

2

R(?i)uby

Não diferencia maiúsculas de minúsculas enquanto corresponde a "uby"

3

R(?i:uby)

O mesmo que acima

4

rub(?:y|le))

Grupo apenas sem criar \ 1 referência anterior

A Common Gateway Interface, ou CGI, é um conjunto de padrões que definem como as informações são trocadas entre o servidor da web e um script personalizado. As especificações CGI são mantidas atualmente pela NCSA.

O que é CGI?

  • A Common Gateway Interface, ou CGI, é um padrão para programas de gateway externo fazerem interface com servidores de informações, como servidores HTTP.

  • A versão atual é CGI / 1.1 e CGI / 1.2 está em andamento.

Navegação na web

Para entender o conceito de CGI, vejamos o que acontece quando clicamos em um hiperlink para navegar em uma determinada página da web ou URL.

  • Seu navegador entra em contato com o servidor da web HTTP e exige a URL, ou seja, o nome do arquivo.

  • O servidor da Web analisa o URL e procura o nome do arquivo. Se ele encontrar o arquivo, o enviará de volta ao navegador; caso contrário, enviará uma mensagem de erro indicando que você solicitou um arquivo errado.

  • O navegador da Web obtém a resposta do servidor da Web e exibe o arquivo recebido ou a mensagem de erro.

No entanto, é possível configurar o servidor HTTP de forma que sempre que um arquivo em um determinado diretório for solicitado esse arquivo não seja enviado de volta; em vez disso, ele é executado como um programa, e tudo o que esse programa produz é enviado de volta para seu navegador exibir. Esta função é chamada de Common Gateway Interface ou CGI e os programas são chamados de scripts CGI. Esses programas CGI podem ser um Python Script, PERL Script, Shell Script, programa C ou C ++, etc.

Diagrama de Arquitetura CGI

Suporte e configuração de servidor web

Antes de prosseguir com a Programação CGI, certifique-se de que seu servidor da Web suporta CGI e está configurado para lidar com programas CGI. Todos os programas CGI a serem executados pelo servidor HTTP são mantidos em um diretório pré-configurado. Esse diretório é denominado Diretório CGI e, por convenção, é denominado / var / www / cgi-bin. Por convenção, os arquivos CGI têm extensão como.cgi, mas você pode manter seus arquivos com a extensão python .py também.

Por padrão, o servidor Linux é configurado para executar apenas os scripts no diretório cgi-bin em / var / www. Se você deseja especificar qualquer outro diretório para executar seus scripts CGI, comente as seguintes linhas no arquivo httpd.conf -

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all
</Directory>

<Directory "/var/www/cgi-bin">
Options All
</Directory>

Aqui, presumimos que você tenha o servidor da Web instalado e funcionando com êxito e seja capaz de executar qualquer outro programa CGI como Perl ou Shell, etc.

Primeiro Programa CGI

Aqui está um link simples, que está vinculado a um script CGI chamado hello.py . Este arquivo é mantido no diretório / var / www / cgi-bin e possui o seguinte conteúdo. Antes de executar seu programa CGI, certifique-se de alterar o modo de arquivo usandochmod 755 hello.py Comando do UNIX para tornar o arquivo executável.

#!/usr/bin/python

print ("Content-type:text/html\r\n\r\n")
print ('<html>')
print ('<head>')
print ('<title>Hello Word - First CGI Program</title>')
print ('</head>')
print ('<body>')
print ('<h2>Hello Word! This is my first CGI program</h2>')
print ('</body>')
print ('</html>')

Note- A primeira linha do script deve ser o caminho para o executável Python. No Linux, deve ser #! / Usr / bin / python3

Insira o seguinte URL no seu navegador

http://localhost:8080/cgi-bin/hello.py

Hello Word! Este é o meu primeiro programa CGI

Este script hello.py é um script Python simples, que grava sua saída no arquivo STDOUT, ou seja, na tela. Há um recurso importante e extra disponível que é a primeira linha a ser impressaContent-type:text/html\r\n\r\n. Essa linha é enviada de volta ao navegador e especifica o tipo de conteúdo a ser exibido na tela do navegador.

Agora você deve ter entendido o conceito básico de CGI e pode escrever muitos programas CGI complicados usando Python. Este script pode interagir com qualquer outro sistema externo também para trocar informações como RDBMS.

Cabeçalho HTTP

A linha Content-type:text/html\r\n\r\nfaz parte do cabeçalho HTTP que é enviado ao navegador para entender o conteúdo. Todo o cabeçalho HTTP estará no seguinte formato -

HTTP Field Name: Field Content

For Example
Content-type: text/html\r\n\r\n

Existem alguns outros cabeçalhos HTTP importantes, que você usará com freqüência em sua programação CGI.

Sr. Não. Cabeçalho e Descrição
1

Content-type:

Uma string MIME que define o formato do arquivo que está sendo retornado. O exemplo é Content-type: text / html

2

Expires: Date

A data em que a informação se torna inválida. Ele é usado pelo navegador para decidir quando uma página precisa ser atualizada. Uma string de data válida está no formato 01 de janeiro de 1998 12:00:00 GMT.

3

Location: URL

O URL que é retornado em vez do URL solicitado. Você pode usar este campo para redirecionar uma solicitação para qualquer arquivo.

4

Last-modified: Date

A data da última modificação do recurso.

5

Content-length: N

O comprimento, em bytes, dos dados que estão sendo retornados. O navegador usa esse valor para relatar o tempo estimado de download de um arquivo.

6

Set-Cookie: String

Defina o cookie passado pela string

Variáveis ​​de ambiente CGI

Todos os programas CGI têm acesso às seguintes variáveis ​​de ambiente. Essas variáveis ​​desempenham um papel importante ao escrever qualquer programa CGI.

Sr. Não. Nome e descrição da variável
1

CONTENT_TYPE

O tipo de dados do conteúdo. Usado quando o cliente está enviando conteúdo anexado ao servidor. Por exemplo, upload de arquivo.

2

CONTENT_LENGTH

O comprimento das informações da consulta. Ele está disponível apenas para solicitações POST.

3

HTTP_COOKIE

Retorna os cookies definidos na forma de par chave e valor.

4

HTTP_USER_AGENT

O campo de cabeçalho de solicitação do Agente do Usuário contém informações sobre o agente do usuário que originou a solicitação. É o nome do navegador da web.

5

PATH_INFO

O caminho para o script CGI.

6

QUERY_STRING

As informações codificadas por URL que são enviadas com a solicitação do método GET.

7

REMOTE_ADDR

O endereço IP do host remoto que está fazendo a solicitação. Este é um registro útil ou para autenticação.

8

REMOTE_HOST

O nome totalmente qualificado do host que está fazendo a solicitação. Se esta informação não estiver disponível, REMOTE_ADDR pode ser usado para obter o endereço de IR.

9

REQUEST_METHOD

O método usado para fazer a solicitação. Os métodos mais comuns são GET e POST.

10

SCRIPT_FILENAME

O caminho completo para o script CGI.

11

SCRIPT_NAME

O nome do script CGI.

12

SERVER_NAME

O nome de host ou endereço IP do servidor

13

SERVER_SOFTWARE

O nome e a versão do software que o servidor está executando.

Aqui está um pequeno programa CGI para listar todas as variáveis ​​CGI. Clique neste link para ver o resultado Get Environment

#!/usr/bin/python

import os

print ("Content-type: text/html\r\n\r\n");
print ("<font size=+1>Environment</font><\br>");
for param in os.environ.keys():
   print ("<b>%20s</b>: %s<\br>" % (param, os.environ[param]))

Métodos GET e POST

Você deve ter se deparado com muitas situações em que precisa passar algumas informações de seu navegador para o servidor da web e, finalmente, para o seu programa CGI. Mais freqüentemente, o navegador usa dois métodos: dois para passar essas informações para o servidor web. Esses métodos são o Método GET e o Método POST.

Passando informações usando o método GET

O método GET envia as informações codificadas do usuário anexadas à solicitação de página. A página e as informações codificadas são separadas por? personagem da seguinte forma -

http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2

O método GET é o método padrão para passar informações do navegador para o servidor da web e produz uma longa string que aparece na caixa Location: do seu navegador. Nunca use o método GET se você tiver uma senha ou outras informações confidenciais para passar para o servidor. O método GET tem limitação de tamanho: apenas 1024 caracteres podem ser enviados em uma string de solicitação. O método GET envia informações usando o cabeçalho QUERY_STRING e estará acessível em seu Programa CGI através da variável de ambiente QUERY_STRING.

Você pode passar informações simplesmente concatenando pares de chave e valor com qualquer URL ou pode usar tags HTML <FORM> para passar informações usando o método GET.

Exemplo de URL simples: Método Get

Aqui está uma URL simples, que passa dois valores para o programa hello_get.py usando o método GET.

/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI

Abaixo está hello_get.pyscript para lidar com a entrada fornecida pelo navegador da web. Vamos usarcgi módulo, o que torna muito fácil acessar as informações passadas -

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
first_name = form.getvalue('first_name')
last_name  = form.getvalue('last_name')

print ("Content-type:text/html\r\n\r\n")
print ("<html>")
print ("<head>")
print ("<title>Hello - Second CGI Program</title>")
print ("</head>")
print ("<body>")
print ("<h2>Hello %s %s</h2>" % (first_name, last_name))
print ("</body>")
print ("</html>")

Isso geraria o seguinte resultado -

Olá ZARA ALI

Exemplo de FORM Simples: Método GET

Este exemplo passa dois valores usando HTML FORM e botão de envio. Usamos o mesmo script CGI hello_get.py para lidar com essa entrada.

<form action = "/cgi-bin/hello_get.py" method = "get">
First Name: <input type = "text" name = "first_name">  <br />

Last Name: <input type = "text" name = "last_name" />
<input type = "submit" value = "Submit" />
</form>

Aqui está o resultado real do formulário acima, você insere o nome e o sobrenome e, a seguir, clica no botão enviar para ver o resultado.

Passando informações usando o método POST

Um método geralmente mais confiável de passar informações para um programa CGI é o método POST. Isso empacota as informações exatamente da mesma maneira que os métodos GET, mas em vez de enviá-las como uma string de texto após um? no URL, ele o envia como uma mensagem separada. Esta mensagem chega ao script CGI na forma de entrada padrão.

Abaixo está o mesmo script hello_get.py que lida com o método GET e também o método POST.

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
first_name = form.getvalue('first_name')
last_name  = form.getvalue('last_name')

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"

Tomemos novamente o mesmo exemplo acima, que passa dois valores usando HTML FORM e o botão enviar. Usamos o mesmo script CGI hello_get.py para lidar com essa entrada.

<form action = "/cgi-bin/hello_get.py" method = "post">
First Name: <input type = "text" name = "first_name"><br />
Last Name: <input type = "text" name = "last_name" />

<input type = "submit" value = "Submit" />
</form>

Aqui está o resultado real do formulário acima. Você insere o nome e o sobrenome e, em seguida, clica no botão enviar para ver o resultado.

Passando os dados da caixa de seleção para o programa CGI

As caixas de seleção são usadas quando mais de uma opção deve ser selecionada.

Aqui está um exemplo de código HTML para um formulário com duas caixas de seleção -

<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on" /> Maths
<input type = "checkbox" name = "physics" value = "on" /> Physics
<input type = "submit" value = "Select Subject" />
</form>

O resultado deste código é o seguinte formato -

Abaixo está o script checkbox.cgi para lidar com a entrada fornecida pelo navegador da web para o botão de caixa de seleção.

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('maths'):
   math_flag = "ON"
else:
   math_flag = "OFF"

if form.getvalue('physics'):
   physics_flag = "ON"
else:
   physics_flag = "OFF"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Checkbox - Third CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> CheckBox Maths is : %s</h2>" % math_flag
print "<h2> CheckBox Physics is : %s</h2>" % physics_flag
print "</body>"
print "</html>"

Passando Dados do Botão de Rádio para o Programa CGI

Os botões de rádio são usados ​​quando apenas uma opção deve ser selecionada.

Aqui está um exemplo de código HTML para um formulário com dois botões de opção -

<form action = "/cgi-bin/radiobutton.py" method = "post" target = "_blank">
<input type = "radio" name = "subject" value = "maths" /> Maths
<input type = "radio" name = "subject" value = "physics" /> Physics
<input type = "submit" value = "Select Subject" />
</form>

O resultado deste código é o seguinte formato -

Abaixo está o script radiobutton.py para lidar com a entrada fornecida pelo navegador da web para o botão de rádio -

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('subject'):
   subject = form.getvalue('subject')
else:
   subject = "Not set"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Radio - Fourth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"

Passando dados da área de texto para o programa CGI

O elemento TEXTAREA é usado quando o texto de várias linhas deve ser passado para o programa CGI.

Aqui está um exemplo de código HTML para um formulário com uma caixa TEXTAREA -

<form action = "/cgi-bin/textarea.py" method = "post" target = "_blank">
<textarea name = "textcontent" cols = "40" rows = "4">
Type your text here...
</textarea>
<input type = "submit" value = "Submit" />
</form>

O resultado deste código é o seguinte formato -

Abaixo está o script textarea.cgi para lidar com a entrada fornecida pelo navegador da web -

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('textcontent'):
   text_content = form.getvalue('textcontent')
else:
   text_content = "Not entered"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Entered Text Content is %s</h2>" % text_content
print "</body>"

Passando os dados da caixa suspensa para o programa CGI

A caixa suspensa é usada quando temos muitas opções disponíveis, mas apenas uma ou duas serão selecionadas.

Aqui está um exemplo de código HTML para um formulário com uma caixa suspensa -

<form action = "/cgi-bin/dropdown.py" method = "post" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit"/>
</form>

O resultado deste código é o seguinte formato -

Abaixo está o script dropdown.py para lidar com a entrada fornecida pelo navegador da web.

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('dropdown'):
   subject = form.getvalue('dropdown')
else:
   subject = "Not entered"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Dropdown Box - Sixth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"

Usando Cookies em CGI

O protocolo HTTP é um protocolo sem estado. Para um site comercial, é necessário manter as informações da sessão entre as diferentes páginas. Por exemplo, o registro de um usuário termina após completar muitas páginas. Como manter as informações da sessão do usuário em todas as páginas da web?

Em muitas situações, o uso de cookies é o método mais eficiente de lembrar e rastrear preferências, compras, comissões e outras informações necessárias para uma melhor experiência do visitante ou estatísticas do site.

Como funciona?

Seu servidor envia alguns dados para o navegador do visitante na forma de um cookie. O navegador pode aceitar o cookie. Em caso afirmativo, ele é armazenado como um registro de texto simples no disco rígido do visitante. Agora, quando o visitante chega a outra página do seu site, o cookie fica disponível para recuperação. Uma vez recuperado, seu servidor sabe / lembra o que foi armazenado.

Cookies são um registro de dados de texto simples de 5 campos de comprimento variável -

  • Expires- A data em que o cookie irá expirar. Se estiver em branco, o cookie irá expirar quando o visitante sair do navegador.

  • Domain - O nome de domínio do seu site.

  • Path- O caminho para o diretório ou página da web que define o cookie. Isso pode ficar em branco se você quiser recuperar o cookie de qualquer diretório ou página.

  • Secure- Se este campo contiver a palavra "seguro", o cookie só poderá ser recuperado com um servidor seguro. Se este campo estiver em branco, não existe tal restrição.

  • Name=Value - Os cookies são definidos e recuperados na forma de pares de chave e valor.

Configurando Cookies

É muito fácil enviar cookies para o navegador. Esses cookies são enviados junto com o cabeçalho HTTP antes do campo Content-type. Presumindo que você deseja definir a ID do usuário e a senha como cookies. A configuração dos cookies é feita da seguinte forma -

#!/usr/bin/python
print "Set-Cookie:UserID = XYZ;\r\n"
print "Set-Cookie:Password = XYZ123;\r\n"
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT;\r\n"
print "Set-Cookie:Domain = www.tutorialspoint.com;\r\n"
print "Set-Cookie:Path = /perl;\n"
print "Content-type:text/html\r\n\r\n"
...........Rest of the HTML Content....

A partir deste exemplo, você deve ter entendido como definir cookies. Nós usamosSet-Cookie Cabeçalho HTTP para definir cookies.

É opcional definir atributos de cookies como Expires, Domain e Path. É notável que os cookies são definidos antes de enviar a linha mágica"Content-type:text/html\r\n\r\n.

Recuperando Cookies

É muito fácil recuperar todos os cookies configurados. Os cookies são armazenados na variável de ambiente CGI HTTP_COOKIE e terão a seguinte forma -

key1 = value1;key2 = value2;key3 = value3....

Aqui está um exemplo de como recuperar cookies.

#!/usr/bin/python

# Import modules for CGI handling 
from os import environ
import cgi, cgitb

if environ.has_key('HTTP_COOKIE'):
   for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):
      (key, value ) = split(cookie, '=');
      if key == "UserID":
         user_id = value

      if key == "Password":
         password = value

print "User ID  = %s" % user_id
print "Password = %s" % password

Isso produz o seguinte resultado para os cookies definidos pelo script acima -

User ID = XYZ
Password = XYZ123

Exemplo de upload de arquivo

Para fazer upload de um arquivo, o formulário HTML deve ter o atributo enctype definido como multipart/form-data. A tag de entrada com o tipo de arquivo cria um botão "Navegar".

<html>
<body>
   <form enctype = "multipart/form-data" 
                     action = "save_file.py" method = "post">
   <p>File: <input type = "file" name = "filename" /></p>
   <p><input type = "submit" value = "Upload" /></p>
   </form>
</body>
</html>

O resultado deste código é o seguinte formato -

O exemplo acima foi desabilitado intencionalmente para salvar pessoas fazendo upload de arquivos em nosso servidor, mas você pode tentar o código acima com seu servidor.

Aqui está o roteiro save_file.py para lidar com o upload de arquivos -

#!/usr/bin/python

import cgi, os
import cgitb; cgitb.enable()

form = cgi.FieldStorage()

# Get filename here.
fileitem = form['filename']

# Test if the file was uploaded
if fileitem.filename:
   # strip leading path from file name to avoid 
   # directory traversal attacks
   fn = os.path.basename(fileitem.filename)
   open('/tmp/' + fn, 'wb').write(fileitem.file.read())

   message = 'The file "' + fn + '" was uploaded successfully'
   
else:
   message = 'No file was uploaded'
   
print """\
Content-Type: text/html\n
<html>
<body>
   <p>%s</p>
</body>
</html>
""" % (message,)

Se você rodar o script acima em Unix / Linux, então você precisa tomar o cuidado de substituir o separador de arquivo como segue, caso contrário, em sua máquina Windows, a instrução open () deve funcionar bem.

fn = os.path.basename(fileitem.filename.replace("\\", "/" ))

Como abrir uma caixa de diálogo "Download de arquivo"?

Às vezes, é desejável que você dê a opção de um usuário clicar em um link e abrir uma caixa de diálogo "Download de arquivo" para o usuário em vez de exibir o conteúdo real. Isso é muito fácil e pode ser feito por meio do cabeçalho HTTP. Este cabeçalho HTTP é diferente do cabeçalho mencionado na seção anterior.

Por exemplo, se você quiser fazer um FileName arquivo para download de um determinado link, então sua sintaxe é a seguinte -

#!/usr/bin/python

# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";

# Actual File Content will go here.
fo = open("foo.txt", "rb")

str = fo.read();
print str

# Close opend file
fo.close()

Espero que tenha gostado desse tutorial. Em caso afirmativo, envie-me seus comentários em: Fale conosco

O padrão Python para interfaces de banco de dados é o Python DB-API. A maioria das interfaces de banco de dados Python segue esse padrão.

Você pode escolher o banco de dados certo para seu aplicativo. A API de banco de dados Python oferece suporte a uma ampla variedade de servidores de banco de dados, como -

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase
  • SQLite

Aqui está a lista de interfaces de banco de dados Python disponíveis - interfaces de banco de dados Python e APIs . Você deve baixar um módulo de API de banco de dados separado para cada banco de dados que você precisa acessar. Por exemplo, se você precisar acessar um banco de dados Oracle, bem como um banco de dados MySQL, deverá fazer download dos módulos de banco de dados Oracle e MySQL.

A API DB fornece um padrão mínimo para trabalhar com bancos de dados usando estruturas e sintaxe Python sempre que possível. Esta API inclui o seguinte -

  • Importando o módulo API.
  • Adquirindo uma conexão com o banco de dados.
  • Emissão de instruções SQL e procedimentos armazenados.
  • Fechando a conexão

Python tem um suporte embutido para SQLite. Nesta seção, aprenderíamos todos os conceitos usando MySQL. O módulo MySQLdb, uma interface popular com MySQL, não é compatível com Python 3. Em vez disso, usaremos o módulo PyMySQL .

O que é PyMySQL?

PyMySQL é uma interface para conexão a um servidor de banco de dados MySQL do Python. Ele implementa a API de banco de dados Python v2.0 e contém uma biblioteca de cliente MySQL em Python puro. O objetivo do PyMySQL é ser um substituto imediato para o MySQLdb.

Como faço para instalar o PyMySQL?

Antes de prosseguir, verifique se o PyMySQL está instalado em sua máquina. Basta digitar o seguinte em seu script Python e executá-lo -

#!/usr/bin/python3

import pymysql

Se produzir o seguinte resultado, significa que o módulo MySQLdb não está instalado -

Traceback (most recent call last):
   File "test.py", line 3, in <module>
      Import pymysql
ImportError: No module named pymysql

A última versão estável está disponível no PyPI e pode ser instalada com pip -

pip install pymysql

Alternativamente (por exemplo, se o pip não estiver disponível), um tarball pode ser baixado do GitHub e instalado com Setuptools da seguinte maneira -

$ # X.X is the desired pymysql version (e.g. 0.5 or 0.6).
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz $ cd PyMySQL*
$ python setup.py install $ # The folder PyMySQL* can be safely removed now.

Note - Certifique-se de ter privilégios de root para instalar o módulo acima.

Conexão de banco de dados

Antes de se conectar a um banco de dados MySQL, certifique-se dos seguintes pontos -

  • Você criou um banco de dados TESTDB.

  • Você criou uma tabela EMPLOYEE em TESTDB.

  • Esta tabela contém os campos FIRST_NAME, LAST_NAME, AGE, SEX e INCOME.

  • O ID do usuário "testuser" e a senha "test123" são definidos para acessar o TESTDB.

  • Módulo Python PyMySQL está instalado corretamente em sua máquina.

  • Você passou pelo tutorial do MySQL para entender os fundamentos do MySQL.

Exemplo

A seguir está um exemplo de conexão com o banco de dados MySQL "TESTDB" -

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# execute SQL query using execute() method.
cursor.execute("SELECT VERSION()")

# Fetch a single row using fetchone() method.
data = cursor.fetchone()
print ("Database version : %s " % data)

# disconnect from server
db.close()

Ao executar este script, ele produz o seguinte resultado.

Database version : 5.5.20-log

Se uma conexão for estabelecida com a fonte de dados, um objeto de conexão é retornado e salvo em db para uso posterior, caso contrário dbestá definido como Nenhum. Próximo,db objeto é usado para criar um cursorobjeto, que por sua vez é usado para executar consultas SQL. Finalmente, antes de sair, ele garante que a conexão com o banco de dados seja fechada e os recursos sejam liberados.

Criando Tabela de Banco de Dados

Uma vez que uma conexão de banco de dados é estabelecida, estamos prontos para criar tabelas ou registros nas tabelas de banco de dados usando execute método do cursor criado.

Exemplo

Vamos criar uma tabela de banco de dados EMPLOYEE -

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Drop table if it already exist using execute() method.
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")

# Create table as per requirement
sql = """CREATE TABLE EMPLOYEE (
   FIRST_NAME  CHAR(20) NOT NULL,
   LAST_NAME  CHAR(20),
   AGE INT,  
   SEX CHAR(1),
   INCOME FLOAT )"""

cursor.execute(sql)

# disconnect from server
db.close()

Operação INSERT

A operação INSERT é necessária quando você deseja criar seus registros em uma tabela de banco de dados.

Exemplo

O exemplo a seguir executa a instrução SQL INSERT para criar um registro na tabela EMPLOYEE -

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
   LAST_NAME, AGE, SEX, INCOME)
   VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

O exemplo acima pode ser escrito da seguinte forma para criar consultas SQL dinamicamente -

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
   LAST_NAME, AGE, SEX, INCOME) \
   VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
   ('Mac', 'Mohan', 20, 'M', 2000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

Exemplo

O segmento de código a seguir é outra forma de execução onde você pode passar parâmetros diretamente -

..................................
user_id = "test123"
password = "password"

con.execute('insert into Login values("%s", "%s")' % \
             (user_id, password))
..................................

Operação READ

Operação READ em qualquer banco de dados significa buscar algumas informações úteis do banco de dados.

Assim que a conexão com o banco de dados for estabelecida, você estará pronto para fazer uma consulta a esse banco de dados. Você pode usar qualquerfetchone() método para buscar um único registro ou fetchall() método para buscar vários valores de uma tabela de banco de dados.

  • fetchone()- Ele busca a próxima linha de um conjunto de resultados de consulta. Um conjunto de resultados é um objeto que é retornado quando um objeto cursor é usado para consultar uma tabela.

  • fetchall()- Ele busca todas as linhas em um conjunto de resultados. Se algumas linhas já foram extraídas do conjunto de resultados, ele recupera as linhas restantes do conjunto de resultados.

  • rowcount - Este é um atributo somente leitura e retorna o número de linhas que foram afetadas por um método execute ().

Exemplo

O procedimento a seguir consulta todos os registros da tabela EMPLOYEE com salário superior a 1000 -

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = "SELECT * FROM EMPLOYEE \
      WHERE INCOME > '%d'" % (1000)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Fetch all the rows in a list of lists.
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
      # Now print fetched result
      print ("fname = %s,lname = %s,age = %d,sex = %s,income = %d" % \
         (fname, lname, age, sex, income ))
except:
   print ("Error: unable to fetch data")

# disconnect from server
db.close()

Resultado

Isso produzirá o seguinte resultado -

fname = Mac, lname = Mohan, age = 20, sex = M, income = 2000

Operação de atualização

ATUALIZAR Operação em qualquer banco de dados significa atualizar um ou mais registros, que já estão disponíveis no banco de dados.

O procedimento a seguir atualiza todos os registros tendo SEXO como 'M'. Aqui, aumentamos a IDADE de todos os homens em um ano.

Exemplo

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to UPDATE required records
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1
                          WHERE SEX = '%c'" % ('M')
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

Operação DELETE

A operação DELETE é necessária quando você deseja excluir alguns registros de seu banco de dados. A seguir está o procedimento para excluir todos os registros do FUNCIONÁRIO onde AGE é maior que 20 -

Exemplo

#!/usr/bin/python3

import pymysql

# Open database connection
db = pymysql.connect("localhost","testuser","test123","TESTDB" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# disconnect from server
db.close()

Realizando transações

As transações são um mecanismo que garante a consistência dos dados. As transações têm as seguintes quatro propriedades -

  • Atomicity - Ou uma transação é concluída ou nada acontece.

  • Consistency - Uma transação deve começar em um estado consistente e deixar o sistema em um estado consistente.

  • Isolation - Os resultados intermediários de uma transação não são visíveis fora da transação atual.

  • Durability - Depois que uma transação foi confirmada, os efeitos são persistentes, mesmo após uma falha do sistema.

O Python DB API 2.0 fornece dois métodos para confirmar ou reverter uma transação.

Exemplo

Você já sabe como implementar transações. Aqui está um exemplo semelhante -

# Prepare SQL query to DELETE required records
sql = "DELETE FROM EMPLOYEE WHERE AGE > '%d'" % (20)
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

Operação COMMIT

Commit é uma operação que dá um sinal verde ao banco de dados para finalizar as alterações e, após esta operação, nenhuma alteração pode ser revertida.

Aqui está um exemplo simples para chamar o commit método.

db.commit()

Operação ROLLBACK

Se você não estiver satisfeito com uma ou mais das mudanças e quiser reverter essas mudanças completamente, use o rollback() método.

Aqui está um exemplo simples para chamar o rollback() método.

db.rollback()

Desconectando banco de dados

Para desconectar a conexão do banco de dados, use o método close ().

db.close()

Se a conexão com um banco de dados for fechada pelo usuário com o método close (), todas as transações pendentes serão revertidas pelo banco de dados. No entanto, em vez de depender de qualquer um dos detalhes de implementação de nível inferior do banco de dados, seria melhor para seu aplicativo chamar commit ou rollback explicitamente.

Tratamento de erros

Existem muitas fontes de erros. Alguns exemplos são um erro de sintaxe em uma instrução SQL executada, uma falha de conexão ou a chamada do método fetch para um identificador de instrução já cancelado ou concluído.

A API DB define uma série de erros que devem existir em cada módulo do banco de dados. A tabela a seguir lista essas exceções.

Sr. Não. Exceção e descrição
1

Warning

Usado para problemas não fatais. Deve subclasse StandardError.

2

Error

Classe base para erros. Deve subclasse StandardError.

3

InterfaceError

Usado para erros no módulo de banco de dados, não no próprio banco de dados. Deve subclasse Error.

4

DatabaseError

Usado para erros no banco de dados. Deve subclasse Error.

5

DataError

Subclasse de DatabaseError que se refere a erros nos dados.

6

OperationalError

Subclasse de DatabaseError que se refere a erros como a perda de uma conexão com o banco de dados. Esses erros geralmente estão fora do controle do criador de scripts Python.

7

IntegrityError

Subclasse de DatabaseError para situações que danificariam a integridade relacional, como restrições de exclusividade ou chaves estrangeiras.

8

InternalError

Subclasse de DatabaseError que se refere a erros internos ao módulo de banco de dados, como um cursor que não está mais ativo.

9

ProgrammingError

Subclasse de DatabaseError que se refere a erros como um nome de tabela incorreto e outras coisas que podem ser atribuídas a você com segurança.

10

NotSupportedError

Subclasse de DatabaseError que se refere à tentativa de chamar uma funcionalidade sem suporte.

Seus scripts Python devem lidar com esses erros, mas antes de usar qualquer uma das exceções acima, certifique-se de que seu MySQLdb tem suporte para essa exceção. Você pode obter mais informações sobre eles lendo a especificação DB API 2.0.

Python fornece dois níveis de acesso aos serviços de rede. Em um nível inferior, você pode acessar o suporte de soquete básico no sistema operacional subjacente, que permite implementar clientes e servidores para protocolos orientados a conexão e sem conexão.

O Python também tem bibliotecas que fornecem acesso de nível superior a protocolos de rede de nível de aplicativo específicos, como FTP, HTTP e assim por diante.

Este capítulo fornece uma compreensão sobre o conceito mais famoso em Rede - Programação de Soquete.

O que é Sockets?

Os soquetes são os terminais de um canal de comunicação bidirecional. Os soquetes podem se comunicar dentro de um processo, entre processos na mesma máquina ou entre processos em continentes diferentes.

Os soquetes podem ser implementados em vários tipos de canais diferentes: soquetes de domínio Unix, TCP, UDP e assim por diante. A biblioteca de soquetes fornece classes específicas para lidar com os transportes comuns, bem como uma interface genérica para lidar com o resto.

Os soquetes têm seu próprio vocabulário -

Sr. Não. Termo e descrição
1

domain

A família de protocolos usada como mecanismo de transporte. Esses valores são constantes como AF_INET, PF_INET, PF_UNIX, PF_X25 e assim por diante.

2

type

O tipo de comunicação entre os dois pontos de extremidade, normalmente SOCK_STREAM para protocolos orientados à conexão e SOCK_DGRAM para protocolos sem conexão.

3

protocol

Normalmente zero, isso pode ser usado para identificar uma variante de um protocolo dentro de um domínio e tipo.

4

hostname

O identificador de uma interface de rede -

  • Uma string, que pode ser um nome de host, um endereço com quatro pontos ou um endereço IPV6 em notação de dois pontos (e possivelmente de ponto)

  • Uma string "<broadcast>", que especifica um endereço INADDR_BROADCAST.

  • Uma string de comprimento zero, que especifica INADDR_ANY, ou

  • Um número inteiro, interpretado como um endereço binário na ordem de bytes do host.

5

port

Cada servidor escuta os clientes chamando em uma ou mais portas. Uma porta pode ser um número de porta Fixnum, uma string contendo um número de porta ou o nome de um serviço.

O Módulo de Soquete

Para criar um socket, você deve usar a função socket.socket () disponível no módulo socket, que tem a sintaxe geral -

s = socket.socket (socket_family, socket_type, protocol = 0)

Aqui está a descrição dos parâmetros -

  • socket_family - Este é AF_UNIX ou AF_INET, conforme explicado anteriormente.

  • socket_type - Este é SOCK_STREAM ou SOCK_DGRAM.

  • protocol - Isso geralmente é deixado de fora, com o padrão de 0.

Depois de ter o objeto de soquete , você pode usar as funções necessárias para criar seu programa cliente ou servidor. A seguir está a lista de funções necessárias -

Métodos de soquete de servidor

Sr. Não. Método e Descrição
1

s.bind()

Este método liga o endereço (nome do host, par de número da porta) ao soquete.

2

s.listen()

Este método configura e inicia o listener TCP.

3

s.accept()

Isso aceita passivamente a conexão do cliente TCP, aguardando até que a conexão chegue (bloqueio).

Métodos de soquete de cliente

Sr. Não. Método e Descrição
1

s.connect()

Este método inicia ativamente a conexão do servidor TCP.

Métodos Gerais de Soquete

Sr. Não. Método e Descrição
1

s.recv()

Este método recebe mensagem TCP

2

s.send()

Este método transmite mensagem TCP

3

s.recvfrom()

Este método recebe mensagem UDP

4

s.sendto()

Este método transmite mensagem UDP

5

s.close()

Este método fecha o soquete

6

socket.gethostname()

Retorna o nome do host.

Um servidor simples

Para escrever servidores de Internet, usamos o socketfunção disponível no módulo de soquete para criar um objeto de soquete. Um objeto de soquete é então usado para chamar outras funções para configurar um servidor de soquete.

Agora chame o bind(hostname, port)função para especificar uma porta para seu serviço no host fornecido.

Em seguida, chame o método de aceitação do objeto retornado. Este método espera até que um cliente se conecte à porta que você especificou e, em seguida, retorna um objeto de conexão que representa a conexão com esse cliente.

#!/usr/bin/python3           # This is server.py file
import socket                                         

# create a socket object
serversocket = socket.socket(
	        socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 9999                                           

# bind to the port
serversocket.bind((host, port))                                  

# queue up to 5 requests
serversocket.listen(5)                                           

while True:
   # establish a connection
   clientsocket,addr = serversocket.accept()      

   print("Got a connection from %s" % str(addr))
    
   msg = 'Thank you for connecting'+ "\r\n"
   clientsocket.send(msg.encode('ascii'))
   clientsocket.close()

Um cliente simples

Vamos escrever um programa cliente muito simples que abre uma conexão para uma determinada porta 12345 e um determinado host. É muito simples criar um cliente de soquete usando a função de módulo de soquete do Python .

o socket.connect(hosname, port )abre uma conexão TCP para o nome do host na porta . Depois de ter um soquete aberto, você pode ler dele como qualquer objeto IO. Quando terminar, lembre-se de fechá-lo, da mesma forma que fecharia um arquivo.

Exemplo

O código a seguir é um cliente muito simples que se conecta a um determinado host e porta, lê todos os dados disponíveis do soquete e sai -

#!/usr/bin/python3           # This is client.py file

import socket

# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 9999

# connection to hostname on the port.
s.connect((host, port))                               

# Receive no more than 1024 bytes
msg = s.recv(1024)                                     

s.close()
print (msg.decode('ascii'))

Agora execute este server.py em segundo plano e execute o client.py acima para ver o resultado.

# Following would start a server in background.
$ python server.py & # Once server is started run client as follows: $ python client.py

Resultado

Isso produziria o seguinte resultado -

on server terminal
Got a connection from ('192.168.1.10', 3747)
On client terminal
Thank you for connecting

Módulos de Internet Python

Uma lista de alguns módulos importantes na rede Python / programação da Internet é fornecida abaixo -

Protocolo Função comum Port No Módulo Python
HTTP paginas web 80 httpplib, urllib, xmlrpclib
NNTP Notícias Usenet 119 nntplib
FTP Transferência de arquivos 20 ftplib, urllib
SMTP Enviando email 25 smtplib
POP3 Buscando e-mail 110 poplib
IMAP4 Buscando e-mail 143 imaplib
Telnet Linhas de comando 23 telnetlib
Gopher Transferências de documentos 70 gopherlib, urllib

Verifique todas as bibliotecas mencionadas acima para trabalhar com os protocolos FTP, SMTP, POP e IMAP.

Leituras adicionais

Este foi um início rápido com a Programação de Soquete. É um assunto vasto. Recomenda-se acessar o seguinte link para obter mais detalhes -

  • Programação de soquetes Unix .

  • Módulos e biblioteca de soquetes Python .

O protocolo SMTP (Simple Mail Transfer Protocol) é um protocolo que lida com o envio de e-mail e o roteamento de e-mail entre servidores de e-mail.

Python fornece smtplib módulo, que define um objeto de sessão de cliente SMTP que pode ser usado para enviar e-mails a qualquer máquina da Internet com um daemon listener SMTP ou ESMTP.

Esta é uma sintaxe simples para criar um objeto SMTP, que pode ser usado posteriormente para enviar um e-mail -

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

Aqui está o detalhe dos parâmetros -

  • host- Este é o host que executa seu servidor SMTP. Você pode especificar o endereço IP do host ou um nome de domínio como tutorialspoint.com. Este é um argumento opcional.

  • port- Se você estiver fornecendo um argumento de host , será necessário especificar uma porta, onde o servidor SMTP está escutando. Normalmente, essa porta seria 25.

  • local_hostname- Se o seu servidor SMTP estiver sendo executado em sua máquina local, você pode especificar apenas a opção localhost .

Um objeto SMTP tem um método de instância chamado sendmail, que normalmente é usado para fazer o trabalho de enviar uma mensagem. Leva três parâmetros -

  • O remetente - uma string com o endereço do remetente.

  • Os destinatários - uma lista de strings, uma para cada destinatário.

  • A mensagem - uma mensagem como uma string formatada conforme especificado nas várias RFCs.

Exemplo

Esta é uma maneira simples de enviar um e-mail usando o script Python. Experimente uma vez -

#!/usr/bin/python3

import smtplib

sender = '[email protected]'
receivers = ['[email protected]']

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Aqui, você colocou um e-mail básico na mensagem, usando aspas triplas, cuidando para formatar os cabeçalhos corretamente. Um e-mail requer umFrom, To, e um Subject cabeçalho, separado do corpo do e-mail por uma linha em branco.

Para enviar o e-mail, use smtpObj para se conectar ao servidor SMTP na máquina local. Em seguida, use o método sendmail junto com a mensagem, o endereço de e o endereço de destino como parâmetros (embora os endereços de e para estejam dentro do próprio e-mail, eles nem sempre são usados ​​para encaminhar o e-mail).

Se você não estiver executando um servidor SMTP em sua máquina local, poderá usar o cliente smtplib para se comunicar com um servidor SMTP remoto. A menos que você esteja usando um serviço de webmail (como gmail ou Yahoo! Mail), seu provedor de e-mail deve ter fornecido a você os detalhes do servidor de correio de saída que você pode fornecer, da seguinte maneira -

mail = smtplib.SMTP('smtp.gmail.com', 587)

Envio de um e-mail HTML usando Python

Quando você envia uma mensagem de texto usando Python, todo o conteúdo é tratado como texto simples. Mesmo se você incluir tags HTML em uma mensagem de texto, ela será exibida como texto simples e as tags HTML não serão formatadas de acordo com a sintaxe HTML. No entanto, o Python oferece uma opção para enviar uma mensagem HTML como uma mensagem HTML real.

Ao enviar uma mensagem de e-mail, você pode especificar uma versão Mime, tipo de conteúdo e o conjunto de caracteres para enviar um e-mail em HTML.

Exemplo

A seguir está um exemplo para enviar o conteúdo HTML como um e-mail. Experimente uma vez -

#!/usr/bin/python3

import smtplib

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test

This is an e-mail message to be sent in HTML format

<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Envio de anexos por e-mail

Para enviar um e-mail com conteúdo misto, é necessário definir o Content-type cabeçalho para multipart/mixed. Então, o texto e as seções de anexo podem ser especificados dentroboundaries.

Um limite é iniciado com dois hifens seguidos por um número exclusivo, que não pode aparecer na parte da mensagem do e-mail. Um limite final denotando a seção final do e-mail também deve terminar com dois hifens.

Os arquivos anexados devem ser codificados com o pack("m") função para ter codificação de base 64 antes da transmissão.

Exemplo

A seguir está um exemplo, que envia um arquivo /tmp/test.txtcomo um anexo. Experimente uma vez -

#!/usr/bin/python3

import smtplib
import base64

filename = "/tmp/test.txt"

# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)  # base64

sender = '[email protected]'
reciever = '[email protected]'

marker = "AUNIQUEMARKER"

body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)

# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit

%s
--%s
""" % (body,marker)

# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s

%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, reciever, message)
   print "Successfully sent email"
except Exception:
   print ("Error: unable to send email")

Executar vários threads é semelhante a executar vários programas diferentes simultaneamente, mas com os seguintes benefícios -

  • Vários threads em um processo compartilham o mesmo espaço de dados com o thread principal e podem, portanto, compartilhar informações ou se comunicar uns com os outros mais facilmente do que se fossem processos separados.

  • Os threads às vezes são chamados de processos leves e não requerem muita sobrecarga de memória; eles são mais baratos do que processos.

Um thread tem um início, uma sequência de execução e uma conclusão. Ele tem um ponteiro de instrução que mantém o controle de onde dentro do contexto ele está sendo executado.

  • Pode ser antecipado (interrompido).

  • Ele pode ser temporariamente colocado em espera (também conhecido como suspensão) enquanto outros threads estão em execução - isso é chamado de rendição.

Existem dois tipos diferentes de tópicos -

  • fio do kernel
  • discussão do usuário

Os threads do kernel fazem parte do sistema operacional, enquanto os threads do espaço do usuário não são implementados no kernel.

Existem dois módulos que suportam o uso de threads em Python3 -

  • _thread
  • threading

O módulo thread está "obsoleto" há muito tempo. Os usuários são incentivados a usar o módulo de threading. Conseqüentemente, no Python 3, o módulo "thread" não está mais disponível. No entanto, ele foi renomeado para "_thread" para compatibilidade com versões anteriores em Python3.

Iniciando um Novo Tópico

Para gerar outro thread, você precisa chamar o seguinte método disponível no módulo de thread -

_thread.start_new_thread ( function, args[, kwargs] )

Essa chamada de método permite uma maneira rápida e eficiente de criar novos threads no Linux e no Windows.

A chamada do método retorna imediatamente e o thread filho inicia e chama a função com a lista de argumentos passada . Quando a função retorna, o thread termina.

Aqui, args é uma tupla de argumentos; use uma tupla vazia para chamar a função sem passar nenhum argumento. kwargs é um dicionário opcional de argumentos de palavras-chave.

Exemplo

#!/usr/bin/python3

import _thread
import time

# Define a function for the thread
def print_time( threadName, delay):
   count = 0
   while count < 5:
      time.sleep(delay)
      count += 1
      print ("%s: %s" % ( threadName, time.ctime(time.time()) ))

# Create two threads as follows
try:
   _thread.start_new_thread( print_time, ("Thread-1", 2, ) )
   _thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
   print ("Error: unable to start thread")

while 1:
   pass

Resultado

Quando o código acima é executado, ele produz o seguinte resultado -

Thread-1: Fri Feb 19 09:41:39 2016
Thread-2: Fri Feb 19 09:41:41 2016
Thread-1: Fri Feb 19 09:41:41 2016
Thread-1: Fri Feb 19 09:41:43 2016
Thread-2: Fri Feb 19 09:41:45 2016
Thread-1: Fri Feb 19 09:41:45 2016
Thread-1: Fri Feb 19 09:41:47 2016
Thread-2: Fri Feb 19 09:41:49 2016
Thread-2: Fri Feb 19 09:41:53 2016

O programa segue em um loop infinito. Você terá que pressionar ctrl-c para parar

Embora seja muito eficaz para threading de baixo nível, o módulo de thread é muito limitado em comparação com o módulo de threading mais recente.

O Módulo de Threading

O módulo de threading mais recente incluído no Python 2.4 oferece suporte de alto nível muito mais poderoso para threads do que o módulo de thread discutido na seção anterior.

O módulo de threading expõe todos os métodos do módulo de thread e fornece alguns métodos adicionais -

  • threading.activeCount() - Retorna o número de objetos de thread que estão ativos.

  • threading.currentThread() - Retorna o número de objetos de thread no controle de thread do chamador.

  • threading.enumerate() - Retorna uma lista de todos os objetos de thread que estão atualmente ativos.

Além dos métodos, o módulo de threading possui a classe Thread que implementa o threading. Os métodos fornecidos pela classe Thread são os seguintes -

  • run() - O método run () é o ponto de entrada para um thread.

  • start() - O método start () inicia um thread chamando o método run.

  • join([time]) - O join () espera que os encadeamentos sejam encerrados.

  • isAlive() - O método isAlive () verifica se uma thread ainda está em execução.

  • getName() - O método getName () retorna o nome de um thread.

  • setName() - O método setName () define o nome de um thread.

Criação de rosca usando módulo de rosqueamento

Para implementar um novo thread usando o módulo de threading, você deve fazer o seguinte -

  • Defina uma nova subclasse da classe Thread .

  • Substitua o método __init __ (self [, args]) para adicionar argumentos adicionais.

  • Em seguida, substitua o método run (self [, args]) para implementar o que o thread deve fazer quando iniciado.

Depois de criar a nova subclasse Thread , você pode criar uma instância dela e então iniciar uma nova thread invocando start () , que por sua vez chama o método run () .

Exemplo

#!/usr/bin/python3

import threading
import time

exitFlag = 0

class myThread (threading.Thread):
   def __init__(self, threadID, name, counter):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.counter = counter
   def run(self):
      print ("Starting " + self.name)
      print_time(self.name, self.counter, 5)
      print ("Exiting " + self.name)

def print_time(threadName, delay, counter):
   while counter:
      if exitFlag:
         threadName.exit()
      time.sleep(delay)
      print ("%s: %s" % (threadName, time.ctime(time.time())))
      counter -= 1

# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# Start new Threads
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print ("Exiting Main Thread")

Resultado

Quando executamos o programa acima, ele produz o seguinte resultado -

Starting Thread-1
Starting Thread-2
Thread-1: Fri Feb 19 10:00:21 2016
Thread-2: Fri Feb 19 10:00:22 2016
Thread-1: Fri Feb 19 10:00:22 2016
Thread-1: Fri Feb 19 10:00:23 2016
Thread-2: Fri Feb 19 10:00:24 2016
Thread-1: Fri Feb 19 10:00:24 2016
Thread-1: Fri Feb 19 10:00:25 2016
Exiting Thread-1
Thread-2: Fri Feb 19 10:00:26 2016
Thread-2: Fri Feb 19 10:00:28 2016
Thread-2: Fri Feb 19 10:00:30 2016
Exiting Thread-2
Exiting Main Thread

Sincronizando Threads

O módulo de threading fornecido com Python inclui um mecanismo de bloqueio simples de implementar que permite sincronizar threads. Um novo bloqueio é criado chamando o método Lock () , que retorna o novo bloqueio.

O método de aquisição (bloqueio) do novo objeto de bloqueio é usado para forçar a execução dos threads de forma síncrona. O parâmetro opcional de bloqueio permite controlar se o encadeamento espera para adquirir o bloqueio.

Se o bloqueio for definido como 0, a thread retorna imediatamente com um valor 0 se o bloqueio não pode ser adquirido e com 1 se o bloqueio foi adquirido. Se o bloqueio for definido como 1, o thread é bloqueado e espera que o bloqueio seja liberado.

O método release () do novo objeto de bloqueio é usado para liberar o bloqueio quando não for mais necessário.

Exemplo

#!/usr/bin/python3

import threading
import time

class myThread (threading.Thread):
   def __init__(self, threadID, name, counter):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.counter = counter
   def run(self):
      print ("Starting " + self.name)
      # Get lock to synchronize threads
      threadLock.acquire()
      print_time(self.name, self.counter, 3)
      # Free lock to release next thread
      threadLock.release()

def print_time(threadName, delay, counter):
   while counter:
      time.sleep(delay)
      print ("%s: %s" % (threadName, time.ctime(time.time())))
      counter -= 1

threadLock = threading.Lock()
threads = []

# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# Start new Threads
thread1.start()
thread2.start()

# Add threads to thread list
threads.append(thread1)
threads.append(thread2)

# Wait for all threads to complete
for t in threads:
   t.join()
print ("Exiting Main Thread")

Resultado

Quando o código acima é executado, ele produz o seguinte resultado -

Starting Thread-1
Starting Thread-2
Thread-1: Fri Feb 19 10:04:14 2016
Thread-1: Fri Feb 19 10:04:15 2016
Thread-1: Fri Feb 19 10:04:16 2016
Thread-2: Fri Feb 19 10:04:18 2016
Thread-2: Fri Feb 19 10:04:20 2016
Thread-2: Fri Feb 19 10:04:22 2016
Exiting Main Thread

Fila de prioridade multithread

O módulo Queue permite criar um novo objeto de fila que pode conter um número específico de itens. Existem métodos a seguir para controlar a fila -

  • get() - O get () remove e retorna um item da fila.

  • put() - A colocação adiciona o item a uma fila.

  • qsize() - O qsize () retorna o número de itens que estão atualmente na fila.

  • empty()- O empty () retorna True se a fila estiver vazia; caso contrário, False.

  • full()- o full () retorna True se a fila estiver cheia; caso contrário, False.

Exemplo

#!/usr/bin/python3

import queue
import threading
import time

exitFlag = 0

class myThread (threading.Thread):
   def __init__(self, threadID, name, q):
      threading.Thread.__init__(self)
      self.threadID = threadID
      self.name = name
      self.q = q
   def run(self):
      print ("Starting " + self.name)
      process_data(self.name, self.q)
      print ("Exiting " + self.name)

def process_data(threadName, q):
   while not exitFlag:
      queueLock.acquire()
      if not workQueue.empty():
         data = q.get()
         queueLock.release()
         print ("%s processing %s" % (threadName, data))
      else:
         queueLock.release()
         time.sleep(1)

threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = queue.Queue(10)
threads = []
threadID = 1

# Create new threads
for tName in threadList:
   thread = myThread(threadID, tName, workQueue)
   thread.start()
   threads.append(thread)
   threadID += 1

# Fill the queue
queueLock.acquire()
for word in nameList:
   workQueue.put(word)
queueLock.release()

# Wait for queue to empty
while not workQueue.empty():
   pass

# Notify threads it's time to exit
exitFlag = 1

# Wait for all threads to complete
for t in threads:
   t.join()
print ("Exiting Main Thread")

Resultado

Quando o código acima é executado, ele produz o seguinte resultado -

Starting Thread-1
Starting Thread-2
Starting Thread-3
Thread-1 processing One
Thread-2 processing Two
Thread-3 processing Three
Thread-1 processing Four
Thread-2 processing Five
Exiting Thread-3
Exiting Thread-1
Exiting Thread-2
Exiting Main Thread

XML é uma linguagem de código aberto portátil que permite aos programadores desenvolver aplicativos que podem ser lidos por outros aplicativos, independentemente do sistema operacional e / ou linguagem de desenvolvimento.

O que é XML?

A Extensible Markup Language (XML) é uma linguagem de marcação muito parecida com HTML ou SGML. Isso é recomendado pelo World Wide Web Consortium e está disponível como um padrão aberto.

XML é extremamente útil para manter o controle de pequenas e médias quantidades de dados sem exigir um backbone baseado em SQL.

Arquiteturas XML Parser e APIs

A biblioteca padrão do Python fornece um conjunto mínimo, mas útil de interfaces para trabalhar com XML.

As duas APIs mais básicas e amplamente usadas para dados XML são as interfaces SAX e DOM.

  • Simple API for XML (SAX)- Aqui, você registra callbacks para eventos de interesse e, em seguida, permite que o analisador prossiga pelo documento. Isso é útil quando seus documentos são grandes ou você tem limitações de memória, ele analisa o arquivo à medida que o lê do disco e o arquivo inteiro nunca é armazenado na memória.

  • Document Object Model (DOM) API - Esta é uma recomendação do World Wide Web Consortium em que todo o arquivo é lido na memória e armazenado em uma forma hierárquica (baseada em árvore) para representar todos os recursos de um documento XML.

SAX obviamente não pode processar informações tão rápido quanto DOM, ao trabalhar com arquivos grandes. Por outro lado, usar o DOM exclusivamente pode realmente matar seus recursos, especialmente se usado em muitos arquivos pequenos.

SAX é somente leitura, enquanto DOM permite alterações no arquivo XML. Visto que essas duas APIs diferentes se complementam literalmente, não há razão para que você não possa usá-las para grandes projetos.

Para todos os nossos exemplos de código XML, vamos usar um arquivo XML simples movies.xml como entrada -

<collection shelf = "New Arrivals">
<movie title = "Enemy Behind">
   <type>War, Thriller</type>
   <format>DVD</format>
   <year>2003</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Talk about a US-Japan war</description>
</movie>
<movie title = "Transformers">
   <type>Anime, Science Fiction</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>A schientific fiction</description>
</movie>
   <movie title = "Trigun">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash the Stampede!</description>
</movie>
<movie title = "Ishtar">
   <type>Comedy</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>Viewable boredom</description>
</movie>
</collection>

Análise de XML com APIs SAX

SAX é uma interface padrão para análise XML baseada em eventos. A análise de XML com SAX geralmente requer que você crie seu próprio ContentHandler criando uma subclasse de xml.sax.ContentHandler.

Seu ContentHandler lida com as tags e atributos específicos de seu (s) tipo (s) de XML. Um objeto ContentHandler fornece métodos para lidar com vários eventos de análise. Seu próprio analisador chama métodos ContentHandler à medida que analisa o arquivo XML.

Os métodos startDocument e endDocument são chamados no início e no final do arquivo XML. Os caracteres do método (texto) são transmitidos aos dados dos caracteres do arquivo XML por meio do texto do parâmetro.

O ContentHandler é chamado no início e no final de cada elemento. Se o analisador não estiver no modo de namespace, os métodos startElement (tag, atributos) e endElement (tag) são chamados; caso contrário, os métodos correspondentes startElementNS e endElementNS são chamados. Aqui, tag é a tag do elemento, e attribute é um objeto Attributes.

Aqui estão outros métodos importantes para entender antes de prosseguir -

O método make_parser

O método a seguir cria um novo objeto analisador e o retorna. O objeto analisador criado será do primeiro tipo de analisador que o sistema encontrar.

xml.sax.make_parser( [parser_list] )

Aqui estão os detalhes dos parâmetros -

  • parser_list - O argumento opcional que consiste em uma lista de analisadores a serem usados, os quais devem implementar o método make_parser.

O método de análise

O método a seguir cria um analisador SAX e o usa para analisar um documento.

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

Aqui estão os detalhes dos parâmetros -

  • xmlfile - Este é o nome do arquivo XML a partir do qual ler.

  • contenthandler - Deve ser um objeto ContentHandler.

  • errorhandler - Se especificado, errorhandler deve ser um objeto SAX ErrorHandler.

O método parseString

Há mais um método para criar um analisador SAX e analisar o especificado XML string.

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

Aqui estão os detalhes dos parâmetros -

  • xmlstring - Este é o nome da string XML a partir da qual ler.

  • contenthandler - Deve ser um objeto ContentHandler.

  • errorhandler - Se especificado, errorhandler deve ser um objeto SAX ErrorHandler.

Exemplo

#!/usr/bin/python3

import xml.sax

class MovieHandler( xml.sax.ContentHandler ):
   def __init__(self):
      self.CurrentData = ""
      self.type = ""
      self.format = ""
      self.year = ""
      self.rating = ""
      self.stars = ""
      self.description = ""

   # Call when an element starts
   def startElement(self, tag, attributes):
      self.CurrentData = tag
      if tag == "movie":
         print ("*****Movie*****")
         title = attributes["title"]
         print ("Title:", title)

   # Call when an elements ends
   def endElement(self, tag):
      if self.CurrentData == "type":
         print ("Type:", self.type)
      elif self.CurrentData == "format":
         print ("Format:", self.format)
      elif self.CurrentData == "year":
         print ("Year:", self.year)
      elif self.CurrentData == "rating":
         print ("Rating:", self.rating)
      elif self.CurrentData == "stars":
         print ("Stars:", self.stars)
      elif self.CurrentData == "description":
         print ("Description:", self.description)
      self.CurrentData = ""

   # Call when a character is read
   def characters(self, content):
      if self.CurrentData == "type":
         self.type = content
      elif self.CurrentData == "format":
         self.format = content
      elif self.CurrentData == "year":
         self.year = content
      elif self.CurrentData == "rating":
         self.rating = content
      elif self.CurrentData == "stars":
         self.stars = content
      elif self.CurrentData == "description":
         self.description = content
  
if ( __name__ == "__main__"):
   
   # create an XMLReader
   parser = xml.sax.make_parser()
   # turn off namepsaces
   parser.setFeature(xml.sax.handler.feature_namespaces, 0)

   # override the default ContextHandler
   Handler = MovieHandler()
   parser.setContentHandler( Handler )
   
   parser.parse("movies.xml")

Resultado

Isso produziria o seguinte resultado -

*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A scientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom

Para obter detalhes completos sobre a documentação da API SAX, consulte as APIs SAX Python padrão .

Analisando XML com APIs DOM

O Document Object Model ("DOM") é uma API de linguagem cruzada do World Wide Web Consortium (W3C) para acessar e modificar os documentos XML.

O DOM é extremamente útil para aplicativos de acesso aleatório. O SAX permite apenas a visualização de um bit do documento por vez. Se você estiver olhando para um elemento SAX, não terá acesso a outro.

Esta é a maneira mais fácil de carregar um documento XML rapidamente e criar um objeto minidom usando o módulo xml.dom. O objeto minidom fornece um método analisador simples que cria rapidamente uma árvore DOM a partir do arquivo XML.

A frase de amostra chama a função parse (file [, parser]) do objeto minidom para analisar o arquivo XML, designado por arquivo em um objeto de árvore DOM.

Exemplo

#!/usr/bin/python3

from xml.dom.minidom import parse
import xml.dom.minidom

# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
   print ("Root element : %s" % collection.getAttribute("shelf"))

# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")

# Print detail of each movie.
for movie in movies:
   print ("*****Movie*****")
   if movie.hasAttribute("title"):
      print ("Title: %s" % movie.getAttribute("title"))

   type = movie.getElementsByTagName('type')[0]
   print ("Type: %s" % type.childNodes[0].data)
   format = movie.getElementsByTagName('format')[0]
   print ("Format: %s" % format.childNodes[0].data)
   rating = movie.getElementsByTagName('rating')[0]
   print ("Rating: %s" % rating.childNodes[0].data)
   description = movie.getElementsByTagName('description')[0]
   print ("Description: %s" % description.childNodes[0].data)

Resultado

Isso produziria o seguinte resultado -

Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A scientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom

Para obter detalhes completos sobre a documentação da API DOM, consulte as APIs DOM padrão do Python .

Python oferece várias opções para o desenvolvimento de interfaces gráficas com o usuário (GUIs). Os recursos mais importantes estão listados abaixo.

  • Tkinter- Tkinter é a interface Python para o kit de ferramentas Tk GUI fornecido com Python. Nós veríamos essa opção neste capítulo.

  • wxPython- Esta é uma interface Python de código aberto para wxWidgets GUI toolkit. Você pode encontrar um tutorial completo sobre WxPython aqui .

  • PyQt−Esta é também uma interface Python para uma popular biblioteca Qt de plataforma cruzada GUI. O TutorialsPoint tem um tutorial muito bom sobre PyQt aqui .

  • JPython - JPython é uma porta Python para Java que dá aos scripts Python acesso contínuo às bibliotecas de classes Java na máquina local http://www.jython.org.

Existem muitas outras interfaces disponíveis, que você pode encontrar na rede.

Programação Tkinter

Tkinter é a biblioteca GUI padrão para Python. O Python, quando combinado com o Tkinter, fornece uma maneira rápida e fácil de criar aplicativos GUI. O Tkinter fornece uma interface orientada a objetos poderosa para o kit de ferramentas Tk GUI.

Criar um aplicativo GUI usando o Tkinter é uma tarefa fácil. Tudo que você precisa fazer é executar as seguintes etapas -

  • Importe o módulo Tkinter .

  • Crie a janela principal do aplicativo GUI.

  • Adicione um ou mais dos widgets mencionados acima ao aplicativo GUI.

  • Entre no loop de evento principal para agir em relação a cada evento disparado pelo usuário.

Exemplo

#!/usr/bin/python3

import tkinter # note that module name has changed from Tkinter in Python 2 to tkinter in Python 3
top = tkinter.Tk()
# Code to add widgets will go here...
top.mainloop()

Isso criaria a seguinte janela -

Widgets Tkinter

O Tkinter oferece vários controles, como botões, rótulos e caixas de texto usados ​​em um aplicativo GUI. Esses controles são comumente chamados de widgets.

Existem atualmente 15 tipos de widgets no Tkinter. Apresentamos esses widgets, bem como uma breve descrição na tabela a seguir -

Sr. Não. Operador e descrição
1 Botão

O widget de botão é usado para exibir botões em seu aplicativo.

2 Tela de pintura

O widget Canvas é usado para desenhar formas, como linhas, ovais, polígonos e retângulos, em seu aplicativo.

3 Botão de verificação

O widget Checkbutton é usado para exibir várias opções como caixas de seleção. O usuário pode selecionar várias opções ao mesmo tempo.

4 Entrada

O widget de entrada é usado para exibir um campo de texto de linha única para aceitar valores de um usuário.

5 Quadro, Armação

O widget Frame é usado como um widget de contêiner para organizar outros widgets.

6 Rótulo

O widget Label é usado para fornecer uma legenda de linha única para outros widgets. Também pode conter imagens.

7 Listbox

O widget Listbox é usado para fornecer uma lista de opções para um usuário.

8 Botão de menu

O widget Menubutton é usado para exibir menus em seu aplicativo.

9 Cardápio

O widget Menu é usado para fornecer vários comandos a um usuário. Esses comandos estão contidos no Menubutton.

10 mensagem

O widget Mensagem é usado para exibir campos de texto de várias linhas para aceitar valores de um usuário.

11 Botao de radio

O widget Radiobutton é usado para exibir várias opções como botões de rádio. O usuário pode selecionar apenas uma opção por vez.

12 Escala

O widget Escala é usado para fornecer um widget de controle deslizante.

13 Barra de rolagem

The Scrollbar widget is used to add scrolling capability to various widgets, such as list boxes.

14 Text

The Text widget is used to display text in multiple lines.

15 Toplevel

The Toplevel widget is used to provide a separate window container.

16 Spinbox

The Spinbox widget is a variant of the standard Tkinter Entry widget, which can be used to select from a fixed number of values.

17 PanedWindow

A PanedWindow is a container widget that may contain any number of panes, arranged horizontally or vertically.

18 LabelFrame

A labelframe is a simple container widget. Its primary purpose is to act as a spacer or container for complex window layouts.

19 tkMessageBox

This module is used to display message boxes in your applications.

Standard attributes

Let us look at how some of their common attributes, such as sizes, colors and fonts are specified.

  • Dimensions

  • Colors

  • Fonts

  • Anchors

  • Relief styles

  • Bitmaps

  • Cursors

Geometry Management

All Tkinter widgets have access to the specific geometry management methods, which have the purpose of organizing widgets throughout the parent widget area. Tkinter exposes the following geometry manager classes: pack, grid, and place.

  • The pack() Method − This geometry manager organizes widgets in blocks before placing them in the parent widget.

  • The grid() Method − This geometry manager organizes widgets in a table-like structure in the parent widget.

  • The place() Method − This geometry manager organizes widgets by placing them in a specific position in the parent widget.

Any code that you write using any compiled language like C, C++, or Java can be integrated or imported into another Python script. This code is considered as an "extension."

A Python extension module is nothing more than a normal C library. On Unix machines, these libraries usually end in .so (for shared object). On Windows machines, you typically see .dll (for dynamically linked library).

Pre-Requisites for Writing Extensions

To start writing your extension, you are going to need the Python header files.

  • On Unix machines, this usually requires installing a developer-specific package such as .

  • Windows users get these headers as part of the package when they use the binary Python installer.

Additionally, it is assumed that you have a good knowledge of C or C++ to write any Python Extension using C programming.

First look at a Python Extension

For your first look at a Python extension module, you need to group your code into four part −

  • The header file Python.h.

  • The C functions you want to expose as the interface from your module.

  • A table mapping the names of your functions as Python developers see them as C functions inside the extension module.

  • An initialization function.

The Header File Python.h

You need to include Python.h header file in your C source file, which gives you the access to the internal Python API used to hook your module into the interpreter.

Make sure to include Python.h before any other headers you might need. You need to follow the includes with the functions you want to call from Python.

The C Functions

The signatures of the C implementation of your functions always takes one of the following three forms −

static PyObject *MyFunction( PyObject *self, PyObject *args );

static PyObject *MyFunctionWithKeywords(PyObject *self,
                                 PyObject *args,
                                 PyObject *kw);

static PyObject *MyFunctionWithNoArgs( PyObject *self );

Each one of the preceding declarations returns a Python object. There is no such thing as a void function in Python as there is in C. If you do not want your functions to return a value, return the C equivalent of Python's None value. The Python headers define a macro, Py_RETURN_NONE, that does this for us.

The names of your C functions can be whatever you like as they are never seen outside of the extension module. They are defined as static function.

Your C functions usually are named by combining the Python module and function names together, as shown here −

static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Do your stuff here. */
   Py_RETURN_NONE;
}

This is a Python function called func inside the module module. You will be putting pointers to your C functions into the method table for the module that usually comes next in your source code.

The Method Mapping Table

This method table is a simple array of PyMethodDef structures. That structure looks something like this −

struct PyMethodDef {
   char *ml_name;
   PyCFunction ml_meth;
   int ml_flags;
   char *ml_doc;
};

Here is the description of the members of this structure −

  • ml_name − This is the name of the function as the Python interpreter presents when it is used in Python programs.

  • ml_meth − This is the address of a function that has any one of the signatures described in the previous section.

  • ml_flags − This tells the interpreter which of the three signatures ml_meth is using.

    • This flag usually has a value of METH_VARARGS.

    • This flag can be bitwise OR'ed with METH_KEYWORDS if you want to allow keyword arguments into your function.

    • This can also have a value of METH_NOARGS that indicates you do not want to accept any arguments.

  • ml_doc − This is the docstring for the function, which could be NULL if you do not feel like writing one.

This table needs to be terminated with a sentinel that consists of NULL and 0 values for the appropriate members.

Example

For the above-defined function, we have the following method mapping table −

static PyMethodDef module_methods[] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { NULL, NULL, 0, NULL }
};

The Initialization Function

The last part of your extension module is the initialization function. This function is called by the Python interpreter when the module is loaded. It is required that the function be named initModule, where Module is the name of the module.

The initialization function needs to be exported from the library you will be building. The Python headers define PyMODINIT_FUNC to include the appropriate incantations for that to happen for the particular environment in which we are compiling. All you have to do is use it when defining the function.

Your C initialization function generally has the following overall structure −

PyMODINIT_FUNC initModule() {
   Py_InitModule3(func, module_methods, "docstring...");
}

Here is the description of Py_InitModule3 function −

  • func − This is the function to be exported.

  • module_methods − This is the mapping table name defined above.

  • docstring − This is the comment you want to give in your extension.

Putting all this together, it looks like the following −

#include <Python.h>

static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Do your stuff here. */
   Py_RETURN_NONE;
}

static PyMethodDef module_methods[] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { NULL, NULL, 0, NULL }
};

PyMODINIT_FUNC initModule() {
   Py_InitModule3(func, module_methods, "docstring...");
}

Example

A simple example that makes use of all the above concepts −

#include <Python.h>

static PyObject* helloworld(PyObject* self)
{
   return Py_BuildValue("s", "Hello, Python extensions!!");
}

static char helloworld_docs[] =
   "helloworld( ): Any message you want to put here!!\n";

static PyMethodDef helloworld_funcs[] = {
   {"helloworld", (PyCFunction)helloworld, 
   METH_NOARGS, helloworld_docs},
   {NULL}
};

void inithelloworld(void)
{
   Py_InitModule3("helloworld", helloworld_funcs,
                   "Extension module example!");
}

Here the Py_BuildValue function is used to build a Python value. Save above code in hello.c file. We would see how to compile and install this module to be called from Python script.

Building and Installing Extensions

The distutils package makes it very easy to distribute Python modules, both pure Python and extension modules, in a standard way. Modules are distributed in the source form, built and installed via a setup script usually called setup.py as.

For the above module, you need to prepare the following setup.py script −

from distutils.core import setup, Extension
setup(name = 'helloworld', version = '1.0',  \
   ext_modules = [Extension('helloworld', ['hello.c'])])

Now, use the following command, which would perform all needed compilation and linking steps, with the right compiler and linker commands and flags, and copies the resulting dynamic library into an appropriate directory −

$ python setup.py install

On Unix-based systems, you will most likely need to run this command as root in order to have permissions to write to the site-packages directory. This usually is not a problem on Windows.

Importing Extensions

Once you install your extensions, you would be able to import and call that extension in your Python script as follows −

Example

#!/usr/bin/python3
import helloworld

print helloworld.helloworld()

Output

This would produce the following result −

Hello, Python extensions!!

Passing Function Parameters

As you will most likely want to define functions that accept arguments, you can use one of the other signatures for your C functions. For example, the following function, that accepts some number of parameters, would be defined like this −

static PyObject *module_func(PyObject *self, PyObject *args) {
   /* Parse args and do something interesting here. */
   Py_RETURN_NONE;
}

A tabela de métodos contendo uma entrada para a nova função seria semelhante a esta -

static PyMethodDef module_methods[] = {
   { "func", (PyCFunction)module_func, METH_NOARGS, NULL },
   { "func", module_func, METH_VARARGS, NULL },
   { NULL, NULL, 0, NULL }
};

Você pode usar a função API PyArg_ParseTuple para extrair os argumentos de um ponteiro PyObject passado para sua função C.

O primeiro argumento para PyArg_ParseTuple é o argumento args. Este é o objeto que você analisará . O segundo argumento é uma string de formato que descreve os argumentos conforme você espera que apareçam. Cada argumento é representado por um ou mais caracteres na string de formato conforme a seguir.

static PyObject *module_func(PyObject *self, PyObject *args) {
   int i;
   double d;
   char *s;

   if (!PyArg_ParseTuple(args, "ids", &i, &d, &s)) {
      return NULL;
   }
   
   /* Do something interesting here. */
   Py_RETURN_NONE;
}

Resultado

Compilar a nova versão do seu módulo e importá-la permite que você invoque a nova função com qualquer número de argumentos de qualquer tipo -

module.func(1, s = "three", d = 2.0)
module.func(i = 1, d = 2.0, s = "three")
module.func(s = "three", d = 2.0, i = 1)

Você provavelmente pode criar ainda mais variações.

A função PyArg_ParseTuple

Aqui está a assinatura padrão para o PyArg_ParseTuple função -

int PyArg_ParseTuple(PyObject* tuple,char* format,...)

Esta função retorna 0 para erros e um valor diferente de 0 para sucesso. Tupla é o PyObject * que foi o segundo argumento da função C. Aqui, o formato é uma string C que descreve os argumentos obrigatórios e opcionais.

Aqui está uma lista de códigos de formato para o PyArg_ParseTuple função -

Código Tipo C Significado
c Caracteres Uma string Python de comprimento 1 torna-se um C char.
d em dobro Um float Python se torna um duplo C.
f flutuador Um float Python se torna um float C.
Eu int Um int Python torna-se um int C.
eu grandes Um int Python torna-se um C longo.
eu longo longo Um Python int torna-se um C longo
O PyObject * Obtém referência não NULL emprestada ao argumento Python.
s Caracteres* Cadeia de caracteres Python sem nulos incorporados em C char *.
s # char * + int Qualquer string Python para endereço C e comprimento.
t # char * + int Buffer de segmento único somente leitura para endereço C e comprimento.
você Py_UNICODE * Python Unicode sem nulos incorporados a C.
você# Py_UNICODE * + int Qualquer endereço e comprimento Python Unicode C.
W# char * + int Leitura / gravação de buffer de segmento único no endereço C e comprimento.
z Caracteres* Como s, também aceita Nenhum (define C char * como NULL).
z # char * + int Como s #, também aceita Nenhum (define C char * como NULL).
(...) conforme ... Uma sequência Python é tratada como um argumento por item.
| Os seguintes argumentos são opcionais.
: Fim do formato, seguido pelo nome da função para mensagens de erro.
; Fim do formato, seguido por todo o texto da mensagem de erro.

Valores de Retorno

Py_BuildValue recebe uma string de formato muito parecido com PyArg_ParseTuple . Em vez de passar os endereços dos valores que você está construindo, você passa os valores reais. Aqui está um exemplo que mostra como implementar uma função add -

static PyObject *foo_add(PyObject *self, PyObject *args) {
   int a;
   int b;

   if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
      return NULL;
   }
   return Py_BuildValue("i", a + b);
}

Isso é o que pareceria se implementado em Python -

def add(a, b):
   return (a + b)

Você pode retornar dois valores de sua função da seguinte maneira. Isso seria capturado usando uma lista em Python.

static PyObject *foo_add_subtract(PyObject *self, PyObject *args) {
   int a;
   int b;

   if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
      return NULL;
   }
   return Py_BuildValue("ii", a + b, a - b);
}

Isso é o que pareceria se implementado em Python -

def add_subtract(a, b):
   return (a + b, a - b)

A função Py_BuildValue

Aqui está a assinatura padrão para Py_BuildValue função -

PyObject* Py_BuildValue(char* format,...)

Aqui, format é uma string C que descreve o objeto Python a ser construído. Os seguintes argumentos de Py_BuildValue são valores C a partir dos quais o resultado é construído. O resultado PyObject * é uma nova referência.

A tabela a seguir lista as strings de código comumente usadas, das quais zero ou mais são unidas em um formato de string.

Código Tipo C Significado
c Caracteres AC char torna-se uma string Python de comprimento 1.
d em dobro AC double se torna um float Python.
f flutuador Float AC torna-se um float Python.
Eu int AC int se torna um Python int.
eu grandes AC long torna-se um Python int.
N PyObject * Passa um objeto Python e rouba uma referência.
O PyObject * Passa um objeto Python e o INCREFA normalmente.
O & converter + anular * Conversão arbitrária
s Caracteres* C 0-terminado char * para Python string, ou NULL para Nenhum.
s # char * + int C char * e comprimento para a string Python ou NULL para Nenhum.
você Py_UNICODE * Cadeia de caracteres terminada em nulo em todo o C para Python Unicode ou NULL para Nenhum.
você# Py_UNICODE * + int Cadeia de caracteres ampla de C e comprimento para Python Unicode ou NULL para Nenhum.
W# char * + int Leitura / gravação de buffer de segmento único no endereço C e comprimento.
z Caracteres* Como s, também aceita Nenhum (define C char * como NULL).
z # char * + int Como s #, também aceita Nenhum (define C char * como NULL).
(...) conforme ... Constrói tupla Python a partir de valores C.
[...] conforme ... Constrói uma lista Python a partir de valores C.
{...} conforme ... Constrói dicionário Python a partir de valores C, alternando chaves e valores.

Code {...} constrói dicionários a partir de um número par de valores C, chaves e valores alternados. Por exemplo, Py_BuildValue ("{issi}", 23, "zig", "zag", 42) retorna um dicionário como o {23: 'zig', 'zag': 42} do Python.