10 de jan. de 2018

Python para Engenheiros de Redes - Parte V



Olá Pessoal Bom Dia, depois de uma breve pausa por festas de final de ano, vamos continuar com nosso curso de introdução à programação Python.

Hoje continuaremos falando dos tipos de dados que existem em python e sobre a condicional “if”, que é uma das sentenças utilizadas para controlar o fluxo do nosso programa.

No post anterior, conhecemos o que são as listas, as quais servem para agrupar uma série de valores em uma única variavél. Existe um tipo de dado que tem uma função similar chamado de dicionário, os dicionários são estruturas de dados que permitem armazenar um conjunto não organizado de pares do tipo Key-Value (Chave-Valor), sendo as chaves únicas dentro de um mesmo dicionário.

Vejamos um exemplo para esclarecimento, vamos armazenar os valores de ip, usuário e senha para dois roteadores R1 e R2:


>>> R1={'ip':"192.168.0.100",'user':"cisco",'senha':"cisco123"}
>>> R1
{'ip': '192.168.0.100', 'user': 'cisco', 'senha': 'cisco123'}
>>> R2={'ip':"192.168.0.101",'user':"cisco2",'senha':"cisco456"}
>>> R2
{'ip': '192.168.0.101', 'user': 'cisco2', 'senha': 'cisco456'}
>>>

Do exemplo acima podemos ver que um dicionário é definido entre chaves {}, e que cada elemento dentro do dicionário é separado por vírgula. Para a definição dos pares chave-valor é utilizado o símbolo “:”

Sendo assim temos o elemento dicionário R1, contém os seguintes pares chave:valor

'ip':"192.168.0.100"
'user':"cisco"
'senha':"cisco123"

A chave pode ser númerica também, no caso eu utilizei uma chave do tipo string.

Vejamos alguns métodos que é possível executar nos dicionários:

O número de elementos do dicionário:

>>> numElemR1 = len(R1)
>>> numElemR1
3
>>>

As chaves do dicionário:

>>> keys=R1.keys()
>>> keys
['ip', 'user', 'senha']


Os valores do dicionário:

>>> values=R1.values()
>>> values
['192.168.0.100', 'cisco', 'cisco123']
>>>

Acessando um elemento em particular do dicionário utilizando o valor da chave:

>>> R1_ipaddress=R1['ip']
>>> R1_ipaddress
'192.168.0.100'
>>>


Adicionando um par chave: valor no dicionário, no exemplo o par "command:show run" :

>>> R1.setdefault('command','show run')
'show run'
>>> R1
{'ip': '192.168.0.100', 'command': 'show run', 'user': 'cisco', 'senha': 'cisco123'}
>>>


Modificando o valor,

>>> R1['command']="show ip int bri"
>>> R1
{'ip': '192.168.0.100', 'command': 'show ip int bri', 'user': 'cisco', 'senha': 'cisco123'}
>>>


Eliminando um elemento do dicionário utilizando “pop”:

>>> R1.pop('command')
'show run'
>>> R1
{'ip': '192.168.0.100', 'user': 'cisco', 'senha': 'cisco123'}
>>>



Scripting:

Até agora temos trabalhado com o interpretador de python de forma interativa, porém existe uma outra forma que é a mais utilizada, e com a qual vamos trabalhar a grande maioria do tempo, é a chamada forma de “script”.

Basicamente vamos colocar o nosso código em um arquivo texto de extensão “*.py” e chamar o interpretador para que o código seja executado. Eu chamei o script de "meuprimeiroscript.py".


Do exemplo acima a primeira linha “#!/usr/bin/python” sinaliza qual é o interpretador que vamos utilizar no caso o python, a terceira linha que começa com o símbolo “#”, é um comentário. O interpretador irá descartar essa linhas, porém para nós eles ajudam bastante no momento de ler o código.

Executemos o nosso primeiro script, não esqueçam de dar permissão de execução ao seu arquivo via comando “chmod”.





Pronto!! Acabamos de executar o nosso primeiro script python!.


Indentação:
Em outras linguagens de programação, blocos de instrução como if, for, while, iniciam e finalizam com chaves {}. Em python existe o conceito de “indentação”, que não é outra coisa que um espaçamento do texto em referência à margem esquerda vejamos um exemplo:




Do exemplo acima a primeira linha vermelha começando pelo lado esquerdo, não tem espaços vazios, então ela tem indentação=0, e todas as linhas de código que tenham indentação =0 farão parte de um bloco de instruções, depois da linha “if x==1”, tem um primeiro espaço, é dizer indentação=1, fazem parte desse bloco as linhas “print(“X=1”) e “if y==2”; por último depois do “if y==2” vem mais um espaço vazio, o que da indentação=2 , a linha “print(“X=1 e Y=2”) faz parte desse bloco de instrução. Finalizado o bloco de indentação=2, voltamos à indentação=0 onde a linha “print(“Feliz Natal”) será executada.

A indentação em python é similar aos {} em outras linguagens, por exemplo um código similar em php:


$x=1;
$y=2;
if ($x==1) {
 echo "$x";
 if ($y==2) {
  echo "$x,$y";
 }
}

Em php, são as chaves que indicam os blocos de instruções.

Podemos ver que a profundidade da indentação ajuda a definir os blocos de instruções. A indentação é de vital importância em python, o mau uso dela, acarreta geralmente em errors de interpretação, vejamos alguns exemplos:



Quando rodamos o exemplo acima obtemos o seguinte erro:




O erro é devido ao fato que o interpretador espera depois da linha “print(“X=1”)”, uma linha de código na mesma profundidade de indentação do print, isso porque o print não é um comando que inicia um bloco de execução, como if, while, for, with etc.

Vejamos outro exemplo:



Ao executar o código acima temos:




O erro dessa vez acontece, porque depois do “if y==2”, o interpretador python espera mais um nível de indentação, porém em vez disso temos o “print(“X=1 e Y+2”)” no mesmo nível.

Como regra geral, toda vez que precisem utilizar algum bloco if, while, for with etc adicionem mais um nível de indentação, em outras palavras adicionem mais um espaço vazio.



Controle de Fluxo:

Condicional “if”:

if condição:
 linha1
 linha2
….

A sentença “if”, é utilizada caso queira se executar um bloco de instruções se uma certa condição/condições é/são verdadeiras.

Para avaliar se uma “condição” é verdadeira ou não, geralmente é utilizada uma série de operadores que podem ser de comparação , lógicos, booleanos etc. Nesse link https://www.tutorialspoint.com/python/python_basic_operators.htm podem encontrar todos os operadores que existem em python.

Exemplo utilizando “if” com operador de comparação igual “==”:

x=10

if x==10:
 print(“X=10”)


O código acima vai printar a mensagem “X=10” sempre e quando a condição de igualdade “x==10” seja verdadeira. Se trocarnos o valor de x, para qualquer outro valor diferente de 10, a condição vai ser falsa e o print não será executado:

Outro exemplo utilizando o operador booleano “and”


x=1
y=2

if x==1 and y==2 :
 print(“X=1 e Y=2”)

No exemplo acima, para que o print seja executado, é preciso que as duas condições sejam verdadeiras tanto “x==1” como “y==2”.

Utilizando o operador “or”


x=1
y=3

if x==1 or y==2 :
 print(“X=1 ou Y=2”)


Trocamos o valor de “y” para y=3. A condição “x==1” continua sendo verdadeira , porém a condição “y==2” agora é falsa. Como estamos utilizando o operador “or”, basta uma das condições ser verdadeira, no caso “x==1”, para o print ser executado, se rodar o código acima a mensagem do print será exibida na tela.


Condicional “if..else”:

if condição:
 linha1
 linha2
 …
else:
 linha3
 linha4


A condição “if..else”, serve para quando queremos executar código, caso a condição que estamos avaliando, de como resultado falso.


R1=['192.168.0.100','cisco','cisco123','show ip ospf']

if 'ospf' in R1[3]:
 print(“Vamos executar um comando ospf em R1”)
else:
 print(“O roteador R1, nao contem comandos ospf a serem executados”)


Do exemplo acima, se a palavra “ospf” existe no elemento da lista R1[3], é executado o print indicando que existe um comando ospf, caso contrário, um print indicando que não existem comandos ospfs em R1 é executado.

Condicional “if..elif..elif..else”


if condição:
 linha1
 linha2
elif condição:
 linha3
 linha4
elif condição:
 linha5
 linha6
else:
 linha7
 linha8


As vezes é preciso executar blocos de instruções, para um determinado número de condições:

Exemplo


x=10

if x<10:
 print(“X <10”)
elif x>10:
 print(“X >10”)
else:
 print(“X=10”)


No código acima, estamos avaliando duas condições, se “x>10” e se “x<10”, e caso nenhuma das condições acima seja cumprida, então quer dizer que “x=10”

Por hoje é isso, espero que tenham gostado do post, eu sei que para nós engenheiros de redes as vezes nos resulta um pouco tedioso aprender a programar, porém acreditem depois de aprenderem um novo mundo de possibilidades será aberto...










Nenhum comentário:

Postar um comentário