sexta-feira, 17 de agosto de 2012

Os filhos querem colo

Na sexta feira, dia 12 de maio 2006, uma amiga do meu filho, a Isa, pulou do 8º andar do prédio onde morava em Joinville -SC. Tinha acabado de almoçar, estava com o uniforme do colégio Bom Jesus, e a mochila nas costas, o que indicava que iria retornar ao colégio, pois nas quartas e sextas eles têm aula o dia todo. Foi um choque para todos os colegas! Aí vem a pergunta: Por quê? Ela tinha apenas 15 anos. Que problemas uma menina de 15 anos pode ter? Fiz esta pergunta ao meu filho, e a resposta me deixou chocada... Ele me disse: Mãe, eu acho que era falta de colo! Questionei: Como assim? E ele me disse: Hoje em dia, os pais trabalham praticamente o dia todo, sempre com a mesma desculpa de que querem dar aos filhos tudo aquilo que nunca tiveram e, na maioria das vezes, eles estão conseguindo. Eles estão dando um estudo no melhor colégio, cursos de idiomas, dinheiro pra gastar no shopping, um computador de última geração pro filho ficar enfiado em casa durante o pouco tempo livre que sobra, roupas, tênis, celular, tudo muito caro, etc... E sempre cobrando da gente boas notas, pois estão investindo muito... Não era melhor então ter comprado ações, depositado na poupança, ou sei lá onde? Na maioria das vezes, os pais não têm mais tempo para os filhos, não conversam mais, não fazem um carinho... Quando a gente chega em casa, o que mais quer é o colo da mãe quando vai mal nas provas, ou quando acontece alguma coisa ruim. Por que você acha que hoje os adolescentes são quase todos revoltados? Na maioria das vezes, eles estão querendo chamar a atenção, ser notados, só que no lugar errado e de forma errada: na rua e com violência. Espero que a morte da Isa não tenha sido em vão, pois quem sabe desta forma muitos pais vão repensar suas atitudes para com seus filhos! Não somos máquinas, não somos todos iguais. Não é porque o filho da vizinha tira só dez que todos nós vamos tirar 10... Talvez, nem todos nós queiramos falar inglês! Depois de me falar tudo isso em prantos, ele me abraçou e disse, olhando nos meus olhos: Mãe, obrigado por você estar tão presente em minha vida, por eu poder contar sempre com você nos bons e nos maus momentos... Obrigado, também, pelas broncas, pois sei que mereço. O tempo e o amor são os melhores investimentos que vocês fazem pelos seus filhos, o resto é conseqüência. (Texto anônimo, circulando na Internet)

quinta-feira, 3 de novembro de 2011

Funções em Python

Funções em Python são definidas com a palavra def, seguidas pelo seu nome, além de parênteses. Dentro dos parênteses, existe a possibilidade de se incluir uma lista de parâmetros. No início do corpo da função, é uma boa prática fazer um comentário, chamado de docstrings. Usando docstrings, ferramentas podem utilizar o comentário para a documentação do sistema. Funções em Python podem ter a opção de retornar algum valor, uma lista, um objeto, etc ou podem não retornar nada, se portando como um procedimento.
>>> def fib(n): 
...     """Imprime uma série de Fibonacci para o parâmetro n."""
...     a, b = 0, 1
...     while a < n:
...         print a,
...         a, b = b, a+b
...
>>> # Chamando a função
... fib(2000)

>>> def fib2(n): 
...     """Returnondo uma lista contendo uma série de Fibonacci para n."""
...     result = []
...     a, b = 0, 1
...     while a < n:
...         result.append(a)   
...         a, b = b, a+b
...     return result
...
>>> f100 = fib2(100) 
Podemos ter um variável número de argumentos na lista, com valores default ou não. Para valores default, não existe a necessidade de se passar esse valor para a função. Além disso, não é necessário passar os argumentos para a função na ordem dos parâmetros, desde que utilizemos um par nome=valor.
>>> def funcaoComArgumento(arg1, arg2="valor_default", arg3="valor_default")
       ...

      #chamadas a função
      funcaoComArgumento(100)
      funcaoComArgumento(arg2="qualquercoisa", arg1=100)
      # ocorrerá um erro para a chamada a seguir pois não existe um valor default para arg1 
      funcaoComArgumento(arg2="qualquercoisa")  
Finalizando, parâmetros com a forma **name recebem um dicionário e com a forma *name recebem tuplas. Os parâmetros que recebem dicionários devem, obrigatoriamente serem os últimos parâmetros da função.
def cheeseshop(kind, *arguments, **keywords):
    print "-- Do you have any", kind, "?"
    print "-- I'm sorry, we're all out of", kind
    for arg in arguments:
        print arg
    print "-" * 40
    keys = sorted(keywords.keys())
    for kw in keys:
        print kw, ":", keywords[kw]

cheeseshop("Limburger", "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           shopkeeper='Michael Palin',
           client="John Cleese",
           sketch="Cheese Shop Sketch")

-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch

sábado, 22 de outubro de 2011

Mais Estruturas de Controle através de exemplos

Como estruturas de controle são praticamente parecidas nas linguagens, abaixo encontram-se exemplos e pequenas observações sobre o assunto:

1 - If:
>>> x = int(raw_input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
...      x = 0
...      print 'Negative changed to zero'
... elif x == 0:
...      print 'Zero'
... elif x == 1:
...      print 'Single'
... else:
...      print 'More'
...
More
2 - For:
>>> a = ['cat', 'window', 'defenestrate']
>>> for x in a:
...     print x, len(x)
Abaixo, um exemplo que altera a lista enquanto ocorre o loop:
>>> a = ['cat', 'window', 'defenestrate'] 
...for x in a[:]: # utilizando uma cópia da lista
...    if len(x) > 6: a.insert(0, x)
...
>>> a
['defenestrate', 'cat', 'window', 'defenestrate']
3 - Função Range:

Itera sobre uma sequência de números.
>>> range(5, 10)
[5, 6, 7, 8, 9]
>>> range(0, 10, 3) # entre 0 e 10, de 3 em 3
[0, 3, 6, 9]
>>> range(-10, -100, -30) # entre -10 e -100, de -30 em -30
[-10, -40, -70]
Utilizando a função em um for:
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
...     print i, a[i]
4 - Break e Else:
>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print n, 'equals', x, '*', n/x
...             break
...     else:
...         print n, 'is a prime number'
.
5 - Continue:
>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             continue'
.
6 - Pass:
>>> while True:
...     pass  # aguarda por interrupção  (Ctrl+C)
...
>>> class MyEmptyClass:
...     pass
No próximo post, falaremos sobre funções em Python.

Até lá.

quinta-feira, 20 de outubro de 2011

Listas e Estruturas de Controle em Python

Python possui algumas estruturas usadas para agrupar tipos e List é o mais versátil deles, não sendo necessário que uma lista possua tipos iguais.

>>> a = ['spam', 'eggs', 100, 1234]
>>> a
['spam', 'eggs', 100, 1234]

Como strings, listas também utilizam índices, porém, são mutáveis:

>>> a[0]
'spam'
>>> a[3]
1234
>>> a[-2]
100
>>> a[1:-1]
['eggs', 100]
>>> a[:2] + ['bacon', 2*2]
['spam', 'eggs', 'bacon', 4]
>>> 3*a[:3] + ['Boo!']
['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boo!']
>>> a[:]
['spam', 'eggs', 100, 1234]
>>> a[2] = a[2] + 23
>>> a
['spam', 'eggs', 123, 1234]
>>> # Substituir alguns itens:
... a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # Remover alguns:
... a[0:2] = []
>>> a
[123, 1234]
>>> # Inserir alguns:
... a[1:1] = ['bletch', 'xyzzy']
>>> a
[123, 'bletch', 'xyzzy', 1234]
>>> # Inserir a própria lista:
>>> a[:0] = a
>>> a
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
>>> # Limpar a lista:
>>> a[:] = []
>>> a
[]

Também temos a funão len():

>>> a = ['a', 'b', 'c', 'd']
>>> len(a)
4

Para mostrar como listas em Python é versátil, também podemos criar listas contendo outras listas:

>>> q = [2, 3]
>>> p = [1, q, 4]
>>> len(p)
3
>>> p[1]
[2, 3]
>>> p[1][0]
2
>>> p[1].append('xtra')     # See section 5.1
>>> p
[1, [2, 3, 'xtra'], 4]
>>> q
[2, 3, 'xtra']

Fluxo de Controle

>>> # Fibonacci series:
... # the sum of two elements defines the next
... a, b = 0, 1
>>> while a < 10:
...     print a
...     a, b = b, a+b
A primeira estrutura que veremos é o While.
Em Python, zero é considerado como falso e outros números é considerado verdadeiro. A condição a ser testada pelo loop pode ser também uma string ou uma lista, qualquer sequência. Podemos utilizar <, >, ==, <=, >=, != para realizar o teste da condição.
A primeira linha do loop, que é a linha de teste, é finalizado com dois pontos(:). O corpo do loop é identado e pode-se utilizar tab ou espaços para identar a linha. Identação em Python é a forma que o ele possui para agrupar comandos. As linhas dentro do bloco precisam ficar identadas com o mesmo número de espaços ou tabs e o Python é rígico com esta questão. Quando utilizamos o ambiente interativo, é necessário uma linha em branco para indicar o fim do corpo do loop. O comando print imprime o valor na saída padrão. Strings são impressas sem aspas e espaço é inserido entre items:
>>> i = 256*256
>>> print 'The value of i is', i
The value of i is 65536
A vírgula no final do comando print evita imprimir em uma nova linha:
>>> a, b = 0, 1
>>> while a < 1000:
...     print a,
...     a, b = b, a+b
...
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

No próximo post, continuaremos falando sobre outras estruturas de controle.