Loops de FOR

o loop de for é mais comum que o while

for é um loop que passa por elementos de uma lista ou array unidimensional

um bloco de instruções dentro de um for é identada na mesma forma de um if

as instruções break e continue podem ser usadas como nos loops e while


In [5]:
r = [ 1, 3, 5 ]
for n in r:         # Para n em r faça:
    print n
    print 2*n , '\n'
print "terminou"


1
2 

3
6 

5
10 

terminou

O uso mais comum do loop for é executar um conjunto de instruções um dado numero de vezes

Para isso Python tem uma função especial chamada range que cria um iterador de um determinado tamanho


In [7]:
print range(5)

a = range(5)

print a, type(a)


[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4] <type 'list'>

In [8]:
r = range(5)
for n in r:
    print("Olá de novo")


Olá de novo
Olá de novo
Olá de novo
Olá de novo
Olá de novo

In [10]:
for n in range(5):
    print n**2


0
1
4
9
16

a função range pode ser usada de algumas formas importantes:


In [12]:
print range(5)           # 5 elementos de 0 a 5-1
print range(2,8)         # elementos de 2 a 8-1
print range(2,20,3)      # elementos de 2 a 20-1 espaçados de 3 em 3
print range(20,2,-3)     # elementos de 20 a 2 espaçados de -3 em -3


[0, 1, 2, 3, 4]
[2, 3, 4, 5, 6, 7]
[2, 5, 8, 11, 14, 17]
[20, 17, 14, 11, 8, 5]

In [15]:
# a construção abaixo não funciona em Python 3 pois o resultado da divisão é sempre um float
p = 10
q = 2
for n in range(p/q):
    print n


0
1
2
3
4

numpy também tem uma funão semelhante chamada arange

ela é semlhante mas cria um array e não uma lista, e pode ser do tipo float ou inteiro


In [18]:
from numpy import arange
print arange(1,8,2)
print arange(1,8,2.)


[1 3 5 7]
[ 1.  3.  5.  7.]

numpy também permite dividir um intervalo em um dado numero de pedaços com a função linspace


In [20]:
from numpy import linspace

print linspace(2.0,2.8,10)


[ 2.          2.08888889  2.17777778  2.26666667  2.35555556  2.44444444
  2.53333333  2.62222222  2.71111111  2.8       ]

Funções

Python permite aos usuários definir suas funções

veja o exemplo de calcular um produtório:

$$ n! = \displaystyle\prod_{k=1}^{n} k $$

In [41]:
n = int(input('entre com n: '))
f = 1.0
for k in range(1,n+1):
    f *= k
print f


entre com n: 10
3628800.0

se quisermos reutilizar a rotina acima é interessante criar uma função

note atentamente a estrutura de identação

a sintaxe é:


In [27]:
def fatorial(n):           # define o nome da função e os parametros de entrada
                            
    f = 1.0                     # inicio do bloco de instruções
    for k in range(1,n+1):
        f *= k                  # fim do bloco de instruções
    
    return f                    # retorna um valor


# podemos chamar a função com:

a = fatorial(10)

print a


3628800.0

um ponto importante é que variáveis criadas dentro de uma função não funcionam fora dela

funções podem ter vários parametros:


In [29]:
from numpy import cos,sin,sqrt

def distance(r,theta,z):
    x = r*cos(theta)
    y = r*sin(theta)
    d = sqrt(x**2+y**2+z**2)
    return d

print distance(2.0,0.1,-1.5)


2.5

In [1]:
from numpy import array,cos,sin,sqrt

# funções podem retornar listas, arrays 

def cartesian(r,theta):
    x = r*cos(theta)
    y = r*sin(theta)
    position = array([x,y])
    return position

r = [0.,1., 3., 6.3]
theta = [0., 0.1, 0.3, 0.5]

res = cartesian(r,theta)

print res, type(res)
print res.shape
print type(range(5))


[[ 0.          0.99500417  2.86600947  5.52877014]
 [ 0.          0.09983342  0.88656062  3.02038089]] <type 'numpy.ndarray'>
(2, 4)
<type 'list'>

In [2]:
from numpy import array,cos,sin,sqrt

# funções podem retornar multiplos valores

def cartesian(r,theta):
    xc = r*cos(theta)
    yc = r*sin(theta)
    return xc,yc

r = [0.,1., 3., 6.3]
theta = [0., 0.1, 0.3, 0.5]

x, y = cartesian(r,theta)        # note a alocação múltipla!

print x, type(x)
print y.shape


[ 0.          0.99500417  2.86600947  5.52877014] <type 'numpy.ndarray'>
(4,)

funções não precisam retornar valores


In [40]:
def printa(s):
    print s
    
printa('hello world!')


hello world!

voce pode importar suas funções salvas em um arquivo a parte usando o import

Exercício

1 - Faça um programa que calcule a somatória:

$\displaystyle\sum_{n=1}^{100} \frac{1}{n}$

2 - Faça um programa que calcule as primeiras 5 linhas das 3 principais séries de linhas do Hidrogenio (m=1,2,3), Lyman, Balmer e Paschen de acordo com a fórmula de Rydberg(https://en.wikipedia.org/wiki/Rydberg_formula):

$$\frac{1}{\lambda} = R \left( \frac{1}{m^2} - \frac{1}{n^2} \right)$$

onde $R=1.097 \times 10^{-2} nm^{-1}$ e m, n são numeros inteiros positivos. Para um dado valor de $m$, os comprimentos de onda $\lambda$ de uma série são dados para valores n de modo que $n>m$


In [ ]: