17 de jan. de 2018

Python para Engenheiros de Redes - Parte VI



Olá Pessoal Bom Dia, continuando com nosso curso de python hoje vamos aprender sobre laços de repetição, sentenças “for” e “while”.

Laço de Repetição “for”:
A sentença “for” é utilizada para iterar sobre uma sequência de elementos. Frequentemente utilizada quando precisamos repetir um bloco de instruções “n” vezes.

Exemplo:

jose@rejane:~$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> MyRouters=['R1','R2','R3','R4']
>>> MyRouters
['R1', 'R2', 'R3', 'R4']
>>> for myrouter in MyRouters:
...  print myrouter
..
R1
R2
R3
R4
>>>

No exemplo acima temos criado uma lista com o nome de 4 routers, e temos utilizado um laço “for” para iterar sobre cada elemento da lista. A variável “myrouter” é uma variável que é criada dentro da sintaxe do laço “for” e representa um elemento da lista, ela pode ter qualquer nome.

Também posso iterar sobre uma sequência de números:

>>> for i in range(5):
...  print i
...
0
1
2
3
4
>>>

A função range(n), utilizando um único argunmento, me devolve uma sequência de números de 0,1..n-1. Vocês podem ver a doc da função range() em https://docs.python.org/3/library/stdtypes.html#range

Utilizando a função range e len, podemos iterar sobre uma lista utilizando os índices da lista por exemplo:

>>> for i in range(len(MyRouters)):
...  print MyRouters[i]
...
R1
R2
R3
R4
>>>


Vejamos agora como fazer um loop em um dicionário.

Definindo o dicionário MyRoutersDict:

>>> MyRoutersDict={'R1': '192.168.100.1','R2':'192.168.100.2','R3':'192.168.100.3','R4':'192.168.100.4'}
>>> MyRoutersDict
{'R4': '192.168.100.4', 'R1': '192.168.100.1', 'R2': '192.168.100.2', 'R3': '192.168.100.3'}
>>>

Para iterar sobre as chaves:

>>> for key in MyRoutersDict:
...  print key
...
R4
R1
R2
R3
>>>

Para iterar sobre os pares chave, valor:

>>> for key,value in MyRoutersDict.items():
...  print "Chave %s,Valor %s" % (key,value)
...
Chave R4,Valor 192.168.100.4
Chave R1,Valor 192.168.100.1
Chave R2,Valor 192.168.100.2
Chave R3,Valor 192.168.100.3
>>>

Se queremos iterar sobre os valores somente:

>>> for value in MyRoutersDict.values():
...  print value
...
192.168.100.4
192.168.100.1
192.168.100.2
192.168.100.3
>>>



Break:
Em alguns casos se faz necessário quebrar um laço quando alguma condição é alcançada:

>>> for i in range(1,20):
...  if i==4:
...   break
...  print i
...
1
2
3
>>>
No exemplo acima, é feita uma iteração de 1,2..20, porém existe uma condição dentro do laço for que diz que quando cheguemos ao valor i==4 o laço deve ser quebrado, caso contrário imprime o valor da variavél “i”.

Continue:
Existem ocasiões que vamos precisar executar um laço de repetição, pulando alguns valores da sequência de iteração.

>>> for value in MyRoutersDict.values():
...  if value=='192.168.100.2':
...   continue
...  print "Valor: %s" % value
...
Valor: 192.168.100.4
Valor: 192.168.100.1
Valor: 192.168.100.3
>>>
Do exemplo acima, quando a iteração chega no valor da chave R2 (192.168.100.2), a sentença “continue” ordena ao laço pular o código do bloco “for”, no caso o “print” para o valor da chave R2.

Pass: 
Pass em python é uma sentença nula, ela não faz nada, a única diferença entre um comentário e o pass, é que o interpretador ignora os comentários enquanto que o pass não, porém nada acontece quando um “pass” é executado.

Geralmente é utilizado quando queremos implementar um laço ou uma função no futuro, porém não temos uma idéia clara do código que deverá ser executado. Como o corpo do laço ou a função não pode ficar vazio, utilizamos uma sentença “pass”.

>>> for router in MyRouters:
...  pass
...
>>> 



Laço de Repetição While:

O laço while, serve para executar um bloco de código sempre e quando uma condição seja verdadeira. Em outra palavras “Enquanto isso seja verdadeiro, executa”.

>>> j=0
>>> while j<=10:
...  print j
...  j=j+1
...
0
1
2
3
4
5
6
7
8
9
10
Do exemplo acima temos a variável “j” setada inicialmente no valor zero, o laço While nos diz, enquanto “j” seja menor ou igual a 10, imprime o resultado e incrementa “j”. Quando “j” chega no valor de 11 a condição j<=10 não é mais satisfeita e o laço termina.

Laços de repetição aninhados (nested loops):
Muitas vezes é preciso executar um laço de repetição, que à sua vez executa um outro laço de repetição vejamos um exemplo:

Seja a lista MyRouters:

>>> MyRouters
['R1', 'R2', 'R3', 'R4']
>>>

E a lista MyCommands:


>>> MyCommands=['show ip int bri','show run','show ip ospf']
>>> MyCommands
['show ip int bri', 'show run', 'show ip ospf']
>>>


Gostaria de executar todos os comandos da lista MyCommands, para cada um dos roteadores da lista MyRouters.


>>> for router in MyRouters:
...  for command in MyCommands:
...   print "Executando comando %s em roteador %s" % (command,router)
...
Executando comando show ip int bri em roteador R1
Executando comando show run em roteador R1
Executando comando show ip ospf em roteador R1
Executando comando show ip int bri em roteador R2
Executando comando show run em roteador R2
Executando comando show ip ospf em roteador R2
Executando comando show ip int bri em roteador R3
Executando comando show run em roteador R3
Executando comando show ip ospf em roteador R3
Executando comando show ip int bri em roteador R4
Executando comando show run em roteador R4
Executando comando show ip ospf em roteador R4
>>>

Podemos ver que todos os comandos foram executados para cada um dos roteadores.

Por hoje é isso ai, no próximo post vamos tratar sobre funções.. espero que tenham gostado e estejam praticando nem que seja um pouco os conceitos aqui apresentados.

Abçs e uma ótima semana.
Jose CCIE#35681

Nenhum comentário:

LinkWithin

Related Posts with Thumbnails