segunda-feira, 12 de setembro de 2016

Conversões para todos os gostos

Na semana passada vimos uma função curiosa que quase passou despercebida: int(). O que vimos é que esta função converte o seu argumento num número inteiro. Nada de especial até aqui. No entanto, o pormenor interessante é que o seu argumento pode ser de vários tipos: inteiro, decimal ou cadeia de caracteres. Se tentarmos:
>>> int(4)
4
>>> int(4.7)
4
>>> int('4')
4
O resultado vai ser sempre 4, sem nenhum tipo de problema. Com um argumento do tipo decimal, o resultado é o inteiro truncado. Quando o argumento é uma cadeia de caracteres, deve poder traduzir-se diretamente num número inteiro, caso contrário resulta em erro. Por exemplo, '4 a', '4.0' ou '4,0' não vão funcionar. No entanto, há uma exceção: quando o argumento é uma cadeia de caracteres válida para representar um número noutra base, podemos usar esta função para o converter em inteiro de base 10. Por exemplo, 25 em binário (base 2) é 11001, portanto podemos usar int() para converter binário em decimal:
>>> int('11001', 2)
25
Isto funciona para qualquer base entre 2 e 36. Por exemplo:
>>> int('11001', 24)
345601
>>> int('1abc', 16)
6844
>>> int('ABC', 16)
2748
>>> int('Zx', 36)
1293
Porquê até 36? Porque apenas podemos representar números com os 10 dígitos e 26 caracteres (maiúsculas ou minúsculas), o que dá um total de 36.
Mas já que estamos com a mão na massa, vamos ver que outras funções de conversão existem. Para começar, temos str(), que converte o argumento em cadeia de caracteres:
>>> str(8)
'8'
>>> str(5.2)
'5.2'
>>> str('90')
'90'
Mais uma vez, o argumento pode ser um número inteiro, um decimal ou uma cadeia de caracteres.
Se quisermos converter o argumento em número decimal, usamos float():
>>> float(4)
4.0
>>> float('5.2')
5.2
>>> float(8.9)
8.9
E para compor o ramalhete de funções de conversão, falta mencionar complex(). Esta converte uma cadeia de caracteres ou dois números inteiros ou decimais num número complexo:
>>> complex(2,3)
(2+3j)
>>> complex(2.5,7)
(2.5+7j)
>>> complex('2.4-1.5j')
(2.4-1.5j)
De notar que a cadeia de caracteres não pode conter espaços entre o sinal e as partes real e complexa do número, senão resulta num erro.
Em qualquer uma das funções acima, o argumento pode ser uma variável, como seria de esperar, e o resultado pode ser atribuído a uma variável. Isto é geralmente possível com todas as funções, e as exceções serão sempre referidas.
Muito bem, agora vamos ver duas funções em que uma é o inverso da outra: chr() e ord():
>>> chr(65)
'A'
>>> ord('A')
65
>>> chr(10084)
'❤'
O resultado de chr() é o caracter Unicode correspondente ao número inserido (que vai de 0 a 65535), e ord() resulta no código Unicode do caracter (o argumento só pode ser uma cadeia de 1 caracter).
E para finalizar, três funções que nos permitem obter números noutra base diferente da decimal:
>>> hex(255)
'0xff'
>>> oct(255)
'0o377'
>>> bin(255)
'0b11111111'
De notar que o resultado é uma cadeia de caracteres. No entanto, os números inteiros também podem ser diretamente representados pelos seus equivalentes em hexadecimal (base 16), octal (base 8) e binário (base 2):
>>> 0xff
255
>>> 0o377
255
>>> 0b11111111
255
Finalmente, para esclarecer quaisquer dúvidas: o primeiro símbolo é um zero e não um O, e o 'x', o 'o' e o 'b' podem ser em maiúsculas ou minúsculas.

Sem comentários:

Enviar um comentário