post

Python pt-br:Mais

Contents

Introdução

Até agora nós cobrimos a maior parte dos diversos aspectos que nós usaremos. Neste capítulo, nós abordaremos algumas funcionalidades adicionais que tornarão o nosso conhecimento de Python mais completo.

Passando Tuplas Adiante

Algumas vezes você gostaria de poder retornar com dois valores diferentes de uma função? Você pode. Tudo que precisa fazer é usar uma tupla.

>>> def obtenha_detalhes_erro():
… return (2, ‘detalhes do segundo erro’)

>>> errnum, errstr = obtenha_detalhes_erro()
>>> errnum
2
>>> errstr
‘detalhes do segundo erro’

Note que o uso de a,b = <alguma expressao> interpreta o resulatado da expressão como uma tupla com dois valores.

Se quiser interpretar o resultado como (a, <todo o resto>), então você precisa acrescentar um asterisco, como se fossem parâmetros de uma função:

>>> a, *b = [1, 2, 3, 4]
>>> a
1
>>> b
[2, 3, 4]

Isso também significa que o modo mais rápido de trocar duas varíaveis entre si em Python é:

>>> a = 5; b = 8
>>> a, b = b, a
>>> a, b
(8, 5)

Métodos Especiais

Existem certos métodos tais como __init__ e __del__ que possuem significado especial em classes.

Os métodos especiais são empregados para emular certos comportamentos dos tipos ‘built-in’. Por exemplo, se você quiser usar a operação de indexação x[indice] para a sua classe (exatamente como você faria para listas e tuplas), então tudo o que voc deve fazer é implementar o método __getitem__() e está feito. Se você refletir a respeito, isto é o que Python faz no caso da própria classe das listas!

Alguns métodos especiais úteis estão listados na tabela que segue. Se você quiser conhecer mais a respeito de todos os métodos especiais, veja o manual.

Alguns Métodos Especiais

Nome

Explicação

__init__(self, …)

Este método é chamado imediatamente antes que o novo objeto criado esteja pronto para utilização.

__del__(self)

Chamado imediatamente antes que o objeto seja destruído.

__str__(self)

Chamado quando nós usamos a função print ou quando str() é usado.

__lt__(self, other)

Chamado quando o operador ‘menor do que’ (<) é usado. Similarmente, existem métodos especiais para todos os operadores (+, >, etc.)

__getitem__(self, key)

Chamado quando a operação de indexação x[key] é usada.

__len__(self)

Chamado quando a função ‘built-in’ len() é utilizada para um objeto sequência.

Blocos de Um Único Comando

Nós já vimos que cada bloco de comandos é posto separadamente do resto pelo seu próprio nível de indentação. Bem, existem algumas exceções. Se o seu bloco de comandos contém apenas um único comando, então você poderá especificá-lo na mesma linha de, digamos, um comando condicional ou em laço. O seguinte exemplo deverá tornar isso mais claro:

>>> flag = True
>>> if flag: print ‘Sim’

Sim

Observe que o comando único é empregado no local e na mesma linha e não como um bloco separado. Embora você possa fazer uso disso para tornar menor o seu programa, eu aconselho a evitar este procedimento em curto-circuito, exceto no caso de verficação de erro, uma vez que ficará muito mais fácil acrescentar um comando a mais se você estiver usando a indentação apropriada.

Formas Lambda

Uma forma lambda é empregada para criar novos objetos funções e retorná-los em tempo de execução (‘runtime’).

  1. !/usr/bin/python
  2. Nome do arquivo: lambda.py

def cria_repetidor(n):

   return lambda s: s * n

dobro = cria_repetidor(2)

print(dobro(‘palavra’))
print(dobro(5))

Saída:

  $ python lambda.py
  palavrapalavra
  10

Como Funciona:

Aqui nós desenvolvemos uma função cria_repetidor para fabricar novos objetos funções em tempo de execução e retorná-los. Um comando lambda é utilizado para criar o objeto função. Essencialmente lambda recebe um parâmetro seguido de apenas uma única expressão, a qual se torna o corpo da função e o valor dessa expressão é retornado pela nova função. Note que mesmo um comando print (Python 2.x) não pode ser usado no interior de uma forma lambda, apenas expressões.

A SER FEITO

   Podemos realizar uma list.sort() fornecendo uma função de comparação criada usando lambda?

pontos = [ { ‘x’: 2, ‘y’: 3 }, { ‘x’: 4, ‘y’: 1 } ]

  1. pontos.sort(lambda a, b: cmp(a[‘x’], b[‘x’]))

List Comprehension

‘List comprehensions’ são empregadas para obter-se uma nova lista de uma lista existente. Suponha que você tenha uma lista de números e deseje obter uma nova lista com todos os números multiplicados por dois apenas quando o número por sua vez for maior do que 2. ‘List comprehensions’ são ideais para tais situações.

  1. !/usr/bin/python
  2. Nome do arquivo: list_comprehension.py

listaum = [2, 3, 4]
listadois = [2*i for i in listaum if i > 2]
print(listadois)

Saída:

[2, 6, 8]

Como Funciona:

Aqui nós obtemos uma nova lista através da especificação da manipulação a ser efetuada quando alguma condição for satisfeita (if i > 2). Note que a lista original permanece inalterada.

A vantagem de usar ‘list comprehensions’ é que reduz a quantidade de código padrão (‘boilerplate’) requerido quando nós usamos laços para processar cada elemento de uma lista e adicioná-lo em uma nova lista.

Recebendo Tuplas e Dicionários em Funções

Existe um modo especial de atribuir parâmetros a uma função como uma tupla ou dicionário, usando os prefixos * e ** respectivamente. Isso é muito útil quando se considera um número variável de argumentos na função.

>>> def powersum(power, *args):
Retorna a soma de cada argumento elevada à potência especificada.
… total = 0
… for i in args:
… total += pow(i, power)
… return total

>>> powersum(2, 3, 4)
25
>>> powersum(2, 10)
100

Uma vez que temos um prefixo * na variável args, todos os argumentos extra passados à função são atribuídos a args como uma tupla. Se ao invés disso, tivesse sido usado um prefixo **, os parâmetros extra seriam considerados como pares chave/valor de um dicionário.

Os Comandos Exec E Eval

A função exec é empregada para executar comandos em Python que estão armazenados em uma string ou arquivo, ao contrário do que se estivessem no próprio programa. Por exemplo, nós podemos gerar uma string contendo comandos em Python em tempo de execução e então executá-los utilizando a função exec:

>>> exec(‘print(“Hello World”‘))
Hello World

De modo análogo, a função eval é utilizada para avaliar expressões válidas em Python que estão armazenadas em uma string. Um exemplo simples é mostrado a seguir.

>>> eval(‘2*3’)
6

O Comando Assert

O comando assert é empregado para assegurar-se de que alguma coisa é verdadeira. Por exemplo, se você está bem certo que terá pelo menos um elemento em uma lista que você está usando e quer verificar esse fato e levantar (‘raise’) um erro se isso não for verdade, então o comando assert é ideal para essa situação. Quando um comando assert falha, um AssertionError é levantado.

>>> mylist = [‘item’]
>>> assert len(mylist) >= 1
>>> mylist.pop()
‘item’
>>> mylist
[]
>>> assert len(mylist) >= 1
Traceback (most recent call last):

 File "<stdin>", line 1, in <module>

AssertionError

O comando assert deve ser usado com cautela. Na maior parte dos casos, é melhor capturar exceções, seja manipulando o problema, ou emitindo uma mensagem de erro para o usuário e saindo do programa.

A Função Repr

A função repr é utilizada para obter-se uma representação por meio de uma string canônica do objeto. A parte interessante é que você terá eval(repr(objeto)) == objeto em quase todos os casos.

>>> i = []
>>> i.append(‘item’)
>>> repr(i)
“[‘item’]”
>>> eval(repr(i))
[‘item’]
>>> eval(repr(i)) == i
True

Basicamente, a função repr é empregada para obter-se uma representação imprimível do objeto. Você pode controlar o que a sua classe retorna sob a função repr, definindo o método __repr__ em sua classe.

Resumo

Nós abordamos algumas funcionalidades adicionais de Python neste capítulo e mesmo assim não cobrimos todas elas. Porém, a essa etapa, nós apresentamos a maior parte do que você irá empregar na prática. Isso é suficiente para que você possa iniciar com quaisquer programas que for produzir.

A seguir, nós discutiremos como explorar Python ainda mais.


Advertisements