Classes

Depois de dois dias a nadar em seco, ou seja, a ler a documentação teórica e abstrata, no manual de referência, sobre o modelo de dados e o modelo de execução do Python, decidi intercalar esse estudo com exemplos práticos sacados ao acaso do stackoverflow.

Eis uma classe simples, que de classe pouco tem, tem apenas a sintaxe. Serve principalmente, para mostrar o funcionamento do método __init__(), que funciona como um construtor: é invocado no momento da criação e antes do objeto ser devolvido. O primeiro parâmetro é o self, ou seja o próprio objeto (object) – pelo que, na minha opinião, deveria ser omitido da sintaxe – e os parâmetros seguintes, são os argumentos que são passados na criação do objeto.

class Soma(object):
  def __init__(self, x, y):
    self.z = x + y

q = Soma(7, 8)
print q.z
15

Objetos

Exemplo de uma sessão em Python que mostra algumas funções de manipulação de objetos

Python 2.7.12 (default, Sep  6 2016, 18:21:48)
[GCC 5.4.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> type(4)
<type 'int'>
>>> type("""a""")
<type 'str'>
>>> type(type("""a"""))
<type 'type'>
>>> id(45)
15021312
>>> id(34)
15019584
>>> exit()

De notar que o tipo de um objeto também é um objeto, de tipo type.
A função id() devolve o id do objeto, que pode ser pensado como o seu endereço em memória.

Os inteiros com mais de 32 bits – para além de do intervalo [-2147483648, 2147483647] – são ineiros longos e não têm limite de tamanho, não estão limitados a 64 bits como no Java ou no C.

Segue-se um exemplo de utilização de números complexos em Python, em modo interativo

>>> x=3
>>> type(x)
<type 'int'>
>>> print(x)
3
>>> x+=2j
>>> type(x)
<type 'complex'>
>>> print(x.real)
3.0
>>> type(x.real)
<type 'float'>
>>> print(x.imag)
2.0
>>> print(x)
(3+2j)

De notar que as componentes de um complexo são sempre float, que é um real de 64 bits.

O Python permite cortar sequências (tuplos, strings, listas, etc.) dinamicamente. Por exemplo, a[i:j] seleciona todos os índices k tais que i <= k < j.

Nalguns casos, é possível um corte estendido, com um terceiro parâmetro k tal que a[i:j:k] seleciona todos os elementos de a com índice x onde x = i + n*k, n >= 0 e i <= x < j.

A sequência resultado é reindexada a partir do 0.

Linhas lógicas e físicas

À partida, no Python cada instrução ocupa uma linha.

O Python distingue linhas físicas de linha lógicas. Uma linha lógica é uma linha de código, que pode, em casos especiais, prolongar-se por várias linhas físicas.

Prolongamento explícito: utiliza a barra invertida

if 1900 < year < 2100 and 1 <= month <= 12 \
   and 1 <= day <= 31 and 0 <= hour < 24 \
   and 0 <= minute < 60 and 0 <= second < 60:   # A valid date
        return 1

Prolongamento implícito: expressões entre parêntesis curvos, retos, ou chavetas.

month_names = ['Januari', 'Februari', 'Maart',      # This is 
               'April',   'Mei',      'Juni',       # Dutch for
               'Juli',    'Augustus', 'September',  # months of
               'Oktober', 'November', 'December']   # the year

Olá Mundo

Para fazer um programa que imprima um caráter com acento, é preciso usar uma codificação excecional. O Unicode devia ser a regra e não a exceção, mas no Python é assim.

Versão sem acentos, num ficheiro batch em Linux

#!/usr/bin/python

print("Ola Mundo")
print('Mais uma frase\n')

Versão Unicode

#!/usr/bin/python
# -*- coding: utf-8 -*-

print("Olá Mundo")
print('Mais uma frase: a fataça e o sururú\n')

Início

Comecei a olhar para o Python, a meio deste ano. É uma linguagem diferente daquelas a que estou habituado. A indentação (alinhamento) é obrigatória, e tem problemas (de fundo, de atitude política) com a codificação em Unicode.

Vou usar este sítio para colocar alguns programas que vá desenvolvendo, assim como algumas questões iniciais da sintaxe da linguagem que vá descobrindo, para servir de registo para o futuro.