Upload
hakhuong
View
214
Download
0
Embed Size (px)
Citation preview
01/24/11
Instituto de ComputaçãoUNICAMP
Inf 514 � Programação Básica em Redes de Computadores
Prof. Célio Guimarã[email protected]
Curso de Especialização em Redes de Computadores � Inf 514
� Objetivos� Cobrir técnicas para programação de
serviços de redes de computadores usando a linguagem Python.
� Aplicação dos conceitos através de trabalhos práticos.
� Uma aplicação simples Cliente-Servidor será desenvolvida pelos alunos usando a biblioteca de sockets de Python
Curso de Especialização em Redes de Computadores � Inf 514
Plano do Curso: Python� Por que Python?� Conceitos básicos� Cadeias (strings): indexação, fatias (slices)� Listas: operações, slices� Tuplas e sequencias� Comandos input e print� Controle de fluxo: if, while, for� Funções� Dicionários: operações
Curso de Especialização em Redes de Computadores � Inf 514
Plano do Curso: Python
� Entrada/Saída: operações com arquivos� Redirecionamento de Entrada/Saída � Exceções� Módulos� Espaços de nomes � escopo de acesso a objetos� Orientação a Objetos em Python: Classes� Introdução de �10 minutos� a TCP e sockets� O módulo socket de Python - Exemplos� A aplicação Cliente-Servidor serviço de eco� Detalhamento das atividades práticas
Curso de Especialização em Redes de Computadores � Inf 514
Por que Python?� simples e de uso fácil� modo interativo ou 'programado'� disponível em praticamente todas as plataformas
� alto 'poder de expressão'� extensível� farta disponibilidade de bibliotecas de apoio� fácil integração com outros sistemas� uso disseminado
Curso de Especialização em Redes de Computadores � Inf 514
� Modo linha de comando (interativo)Para testes simples como este:
>>> print �Boa tarde!� Boa tarde! >>� Modo edição/execução (preferível)
- num terminal do linux dispare o idle - idle abre janela no modo interativo (Python Shell)- clique em File New Window�- na janela aberta digite e salve seu programa- clique em Run Run Module � para executá-lo
Python: usos do interpretador
Curso de Especialização em Redes de Computadores � Inf 514
Python: conceitos básicos� Expressões simples formadas por:
� variáveis� números� Operadores + - * / �
� Exemplos: #isto é um comentário >>> 45+3*2
51 >>> a = 10.0 # valor 10.0 (tipo float) >>> b = 3 # valor 3 (tipo int) >>> a/b # o resultado é do tipo float
3.3333333333333335
Curso de Especialização em Redes de Computadores � Inf 514
Python: variáveis e atribuições� Atribuição múltipla:
a = b = c = 10 é equivalente a:
a = 10b = 10c = 10
� Variáveis devem ser definidas antes do uso: >>> a = n # n é indefinida
Traceback (most recent call last): File "<pyshell#96>", line 1, in <module> a = n # n é indefinida NameError: name 'n' is not defined >>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: conceitos básicos� A variável '_' mantém o último valor
calculado pelo interpretador. >>> taxa = 12.5 / 100 # 12.5%
>>> valor = 100.50 >>> valor * taxa # juros 12.5625 >>> valor + _ # valor + juros 113.0625 >>> round(_, 2) # arredonda p/ 2 casas 113.06
Curso de Especialização em Redes de Computadores � Inf 514
Python: cadeias (strings)� String: cadeia de caracteres, delimitada
por aspas simples, duplas ou triplas (!) >>> nome = "José"
>>> sobrenome = "Fernandes" >>> print nome,sobrenome José Fernandes >>> nomecompleto = nome +" " +sobrenome >>> print nomecompleto José Fernandes >>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: strings>>> str = "um string \pode ser escrito em \várias linhas">>> print strum string pode ser escrito em várias linhas>>>
Obs: nesse caso, cada linha deve ser terminada pelo caracter �\�
Curso de Especialização em Redes de Computadores � Inf 514
Python: strings
� O caracter �\n�:
>>> str = "uma linha\noutra linha" >>> print str uma linha outra linha >>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: strings� Aspas triplas:
>>> str = """ um string delimitado por aspas triplas pode ocupar várias linhas """ >>> print str um string delimitado por aspas triplas pode ocupar várias linhas >>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: strings� Indexação: cada caracter de um string pode
ser acessado através do seu índice, entre '[ ]'. � Índices de strings sempre começam em zero.� Strings são concatenados via operador '+'� Não podem ser alterados (em C podem)>>> nome = "José"
>>> sobrenome = "Fernandes" >>> iniciais=nome[0]+"."+sobrenome[0]+"." >>> print iniciais J.F. >>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: strings� fatia ou trecho (slice) de um string:
>>> nomeinteiro = "José Fernandes" >>> nome = nomeinteiro[0:4] >>> sobrenome = nomeinteiro[5:14] >>> print nome,"-",sobrenome José - Fernandes >>> � Função len(): obtem tamanho de um string: >>> print len(sobrenome)
9 >>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: Listas
Uma lista é uma sequência de valores delimitada por colchetes '[ ]'.� Exemplo:
>>> primos = [2,3,5,7,11,13,17,19,23,29] >>> primos[7] 19 >>> primos[0:5] [2, 3, 5, 7, 11] >>> len(primos) 10 >>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: Listas
� Outro exemplo: >>> dias = [ 'seg','ter','qua','qui','sex']
>>> dias[0:1]=['sab', 'dom'] >>> dias ['sab','dom', 'seg', 'ter', 'qua', 'qui', 'sex'] Notação alternativa: >>> dias[0:]=['sab', 'dom']
Curso de Especialização em Redes de Computadores � Inf 514
Python: operações com listas >>> p1 = [3,4,5]>>> p1.append(6) # insere 6 ao final da lista
>>> p1[3, 4, 5, 6]>>> p1.insert(0,2) # insere 2 na posição 0>>> p1[2, 3, 4, 5, 6]>>> p1.remove(3) # remove o valor 3>>> p1[2, 4, 5, 6]>>> p1.pop() # remove o último elemento6>>> p1.reverse() # inverte a lista>>> p1[5, 4, 2]
Curso de Especialização em Redes de Computadores � Inf 514
Python: operações com listas Os valores de uma lista:
� podem ser de qualquer tipo� Podem ser de tipos diferentes
Um valor de uma lista pode ser uma lista. Ex.:
>>> pares = [2,4,6,8] >>> impares = [1,3,5,7,9] >>> lista = ['um','dois',pares,'tres',impares] >>> lista ['um', 'dois', [2, 4, 6, 8], 'tres', [1, 3, 5, 7, 9]] >>> Uma tabela pode ser representada como uma lista de listas
Curso de Especialização em Redes de Computadores � Inf 514
Python: Tuplas e sequenciasTupla: uma sequência imutável de valores separados por ',' - pode ser indexada e fatiada como as listas
- em geral definida entre parênteses - pode ser desempacotada numa sequência de variáveis, tendo o efeito de atribuições múltiplas
>>> t = 12345, 54321, �hello!�>>> t[0]12345>>> t(12345, 54321, �hello!�)>>> # Tuplas podem ser aninhadas:... u = t, (1, 2, 3, 4, 5)>>> u((12345, 54321, �hello!�), (1, 2, 3, 4, 5))
Curso de Especialização em Redes de Computadores � Inf 514
Python: Tuplas e sequênciasTuplas vazias ou com um só elemento requerem notação especial:>>> empty = () # declara uma tupla vazia>>> singleton = �hello�, # <-- observe a vírgula extra>>> len(empty)0>>> len(singleton)1>>> singleton(�hello�,)>>>t = (12345, 54321, �hello!�) # empacotamento >>> x, y, z = t #desempacotamnto
Curso de Especialização em Redes de Computadores � Inf 514
Python: um 'programa' simples>>> # Série de Fibonacci>>> a,b = 0,1>>> while b < 100: print b, #observe a vírgula! a,b = b, a+b
1 1 2 3 5 8 13 21 34 55 89>>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: comandos 'input' e 'if'>>> x = input('entre com um valor inteiro:')>>> if x < 0:... print 'x é menor que zero'... elif x == 0:... print 'x é igual a zero'... else:... print 'x é maior que zero'... >>> entre com um valor inteiro: 33x é maior que zero>>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: outro 'programa'- mdc(modo edição/execução)
x = input('entre com o primeiro valor:')y = input('entre com o segundo valor:')while x != y: if x > y: x = x - y else: y = y - xprint 'mdc:',xentre com o primeiro valor:10entre com o segundo valor:35mdc: 5
Curso de Especialização em Redes de Computadores � Inf 514
Python: o comando 'for'O comando for opera sobre qualquer sequência de valores. Um exemplo:
>>> dias = ['seg','ter','qua','qui','sex','sab','dom']>>> for d in dias: print d,dias.index(d),
seg 0 ter 1 qua 2 qui 3 sex 4 sab 5 dom 6>>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: comando 'for': mesmo exemplo, de outra forma
>>> dias = ['seg','ter','qua','qui','sex','sab','dom']>>> for i in range(len(dias)): print i,dias[i],
0 seg 1 ter 2 qua 3 qui 4 sex 5 sab 6 dom>>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: comando 'for': mais exemplos
>>> nome = 'Vasco da Gama'>>> for c in nome: print c,
V a s c o d a G a m a>>> for x in range(10,20): print x,
10 11 12 13 14 15 16 17 18 19>>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: o comando 'break' for n in range(2, 9): for x in range(2, n): if n % x == 0: print n, 'é igual a', x, '*', n/x break else: # (faz parte do 'for') # não achou um fator => o número é primo print n, 'é um número primo'2 é um número primo3 é um número primo4 é igual a 2 * 25 é um número primo6 é igual a 2 * 37 é um número primo8 é igual a 2 * 4
Curso de Especialização em Redes de Computadores � Inf 514
Python: funções>>> # definição de função>>> def fib(n): """ Mostra a série de Fibonacci de 0 a n. """ a, b = 0, 1 while a < n: print a, a, b = b, a+b
>>> # chamada da função>>> fib(1000)0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987>>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: funções : valor de retorno
>>> def fib2(n): """ retorna uma lista contendo a série de Fibonacci de 0 a n. """ res = [] # variável c/ o resultado da função a, b = 0,1 while a < n: res.append(a) # insere no final da lista a, b = b, a+b return res # retorna o resultado>>> # chamada da função>>> fib2(400)[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377 ]>>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: funções: outro exemplodef mdc(x,y): while x != y: if x > y: x = x - y else: y = y - x return xdef testamdc(): a = input('entre com o primeiro valor:'); b = input('entre com o segundo valor:'); print 'mdc(',a,',',b,')=',mdc(a,b)>>> testamdc()entre com o primeiro valor: 3443entre com o segundo valor:1234mdc( 3443 , 1234 )= 1
Curso de Especialização em Redes de Computadores � Inf 514
Python: funções: outro exemplodef troca(s, i,j): # troca dois elementos de uma lista s[i], s[j] = s[j], s[i]
def sort(lista): # ordena uma lista for i in range(0,len(lista)-1): for j in range(i,len(lista)): if(lista[i] > lista[j]): troca(lista,i,j)>>> # exemplo de uso>>> lista = ['seg','ter','qua','qui','sex','sab','dom']>>> sort(lista)>>> print lista['dom', 'qua', 'qui', 'sab', 'seg', 'sex', 'ter']
Curso de Especialização em Redes de Computadores � Inf 514
Python: Dicionários� Conjunto não ordenado de pares chave,valor
� Chaves (keys) funcionam como índices
� Chaves são imutáveis (qualquer tipo) e unívocas
� Um dicionário é delimitado pelo par: '{ }'
� Principais operações: Recuperar valor a partir de uma chave Armazenar um valor dada uma chave Alterar um valor dada uma chave existente Recuperar chaves via função keys()
Curso de Especialização em Redes de Computadores � Inf 514
Python: Dicionários: exemplo>>> tel = {�jack�: 4098, �sape�: 4139}>>> tel[�guido�] = 4127>>> tel{�sape�: 4139, �guido�: 4127, �jack�: 4098}>>> tel[�jack�]4098>>> del tel[�sape�]>>> tel[�irv�] = 4127>>> tel{�guido�: 4127, �irv�: 4127, �jack�: 4098}>>> tel.keys()[�guido�, �irv�, �jack�]>>> tel.has_key(�guido�)1>>>tel.values()[4098, 4127, 4127]
Curso de Especialização em Redes de Computadores � Inf 514
Python: Entrada/SaidaOperador de formatação '%':� Permite formatar strings via comando print� Semelhante ao operador '%' da linguagem C: >>> import math # torna acessíveis os objetos do módulo math>>> print ’The value of PI is approximately %5.3f.’ % math.piThe value of PI is approximately 3.142.
Outro exemplo: >>> table = {’Sjoerd’: 4127, ’Jack’: 4098, ’Dcab’: 7678} >>> for name, phone in table.items(): ... print ’%-10s ==> %10d’ % (name, phone) ... Jack ==> 4098 Dcab ==> 7678 Sjoerd 7678 4127
Curso de Especialização em Redes de Computadores � Inf 514
Python: Arquivos - Leitura/Escrita � Sintaxe como na linguagem C� Arquivos no formato Unicode por �default�
>>> f=open('/tmp/workfile', 'w') # vamos criar um arquivo>>> f.write('Essa é a primeira linha do arquivo.\n')>>> f.write('Essa é a segunda linha do arquivo.\n')>>> f.close() # fecha o arquivo para escrita>>> f=open('/tmp/workfile', 'r') # agora abre para leitura>>> f.read() # le e exibe todo o conteúdo do arquivo'Essa \xc3\xa9 a primeira linha do arquivo.\nEssa \xc3\xa9 a segunda linha do arquivo.\n'#não muda de linha nem mostra os caracteres acentuados>>> f.seek(0,0) # volta ao começo do arquivo>>> print(f.read())#print exibe cada linha e caracts acentuadosEssa é a primeira linha do arquivo.Essa é a segunda linha do arquivo.
Curso de Especialização em Redes de Computadores � Inf 514
Python: Arquivos - Leitura/Escrita Outro exemplo
� em vez de ler todo o arquivo, � pode ser conveniente ler uma linha de cada vez� através da função readline():
>>> f=open('/tmp/workfile', 'r') # abre para leitura>>> f.readline() # le e exibe primeira linha 'Essa \xc3\xa9 a primeira linha do arquivo.\n'#Ops: letras acentuadas são armazenadas no formato Unicode>>> print(f.readline())# print converte para Latin-1'Essa é a segunda linha do arquivo.\n'>>> f.readline() # retorna vazio: não há mais linhas''>>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: Arquivos - Leitura/Escrita No exemplo anterior:
� usaremos um laço infinito para ler múltiplas linhas� e a função readline() para ler uma linha de cada vez,� saindo do laço no fim do arquivo via função break():
>>> f=open('/tmp/workfile', 'r') # abre para leitura>>> while(1): # laço infinito
line=f.readline() # lê uma linhaif (not line): # se fim do arquivo,
print('Chegamos ao fim do arquivo')# exibe mensagem break # e sai do laço
print(line) # senão exibe a linha
Essa é a primeira linhaEssa é a segunda linhaChegamos ao fim do arquivo>>>
Curso de Especialização em Redes de Computadores � Inf 514
Python: Arquivos - Leitura/Escrita No exemplo anterior é melhor usar modo edição/execução:
� para isto edite e salve o código a seguir:� (observe a primeira linha para aceitar acentuação)
# -*- coding: utf-8 -*-f=open('/tmp/workfile', 'w') # vamos criar um arquivo em /tmpf.write('Essa é a primeira linha do arquivo.\n')f.write('Essa é a segunda linha do arquivo.\n')f.close() # fecha o arquivo para escritaf=open('/tmp/workfile', 'r') # abre para leiturawhile(1): line=f.readline() if (not line): print('Chegamos ao fim o arquivo') break # sai do laço print(line)
Curso de Especialização em Redes de Computadores � Inf 514
Python: Erros e exceções Erros de sintaxe: são mais simples de visualizar:Exemplo:
>>> while 1 print ’Hello world’File "<stdin>", line 1while 1 print ’Hello world’ ˆSyntaxError: invalid syntax
Obs: faltou ':' após while 1
Curso de Especialização em Redes de Computadores � Inf 514
Exceções:
� erros detetados durante a execução,� não necessariamente fatais,� por isso Python provê um mecanismo para tratá-los.
Exemplo:
>>> 10 * (1/0)Traceback (most recent call last):File "<stdin>", line 1ZeroDivisionError: integer division or modulo
Python: Erros e exceções
Curso de Especialização em Redes de Computadores � Inf 514
Python: Tratamento de exceções Via cláusulas try e except:>>> while 1:...try:...x = int(raw_input("Entre com um número: "))...break...except ValueError:...print "Opa! Esse número não é válido. Tente de novo..."…
Semântica:� A cláusula try (comandos entre try e except ) é executada,� Se não gerar exceção, a cláusula except é ignorada e termina a execução da cláusula try
� Se uma exceção ocorre durante a execução da cláusula try, os comandos remanescentes na cláusula try são ignorados
� Se não houver um tratador except então a exceção passa para um tratador except mais externo, se houver,
� senão a execução termina com uma mensgem de erro
Curso de Especialização em Redes de Computadores � Inf 514
Python: Tratamento de exceções Pode haver várias cláusulas except para tratar tipos distintos de exceções. Exemplo:
import string, systry: f = open(’myfile.txt’) s = f.readline() i = int(string.strip(s))except IOError, (errno, strerror): print "I/O error(%s): %s" % (errno, strerror)except ValueError: print "Could not convert data to an integer."except: print "Unexpected error:", sys.exc_info()[0] raise
Curso de Especialização em Redes de Computadores � Inf 514
Python: Módulos� Arquivo contendo definições e comandos Python� Usualmente contém funções específicas de uma biblioteca: math, os, sys, time
� Incluído num programa através do comando import� Define um espaço de nomes independente do que o importou� Objetos do módulo (por ex. funções) são acessados através da notação '.' : nome_do_módulo.nome_do_objeto Exemplo: sys.stdin.read()
� Onde buscar um módulo no sistema de arquivos? - no diretório corrente
- na lista de diretórios da variável de ambiente PYTHONPATH � Módulos podem ser compilados (para arquivos .pyc, .pyo ) (útil para distribuir código proprietário)
� Função dir(nome_do_módulo) lista os nomes do módulo
Curso de Especialização em Redes de Computadores � Inf 514
Python: Espaço de nomes� Conjunto de nomes visível num determinado escopo� Escopo é uma região textual de um programa onde um espaço de nomes é diretamente acessível (parece definição circular mas não é!)
� Exemplo: os nomes definidos num módulo� Nomes definidos em espaços distintos são independentes, (o que evita conflitos) e são acessados via notação '.'
� 3 escopos diretamente acessíveis na execução do programa: - escopo interno (nomes definidos no corpo de uma função) - escopo global : são os nomes do módulo (programa) - escopo externo: são os nomes pre-definidos pelo interpretador a busca de nomes durante a execução segue a ordem acima
� Para acessar uma variável global dentro de uma função use no corpo da função a cláusula: global nome_variável
Curso de Especialização em Redes de Computadores � Inf 514
Python: Orientação a Objetos: ClassesDefinição de classe:
class nome_classe(): <comando-1> (usualmente definição de uma função) . . . <comando-n>
A definição cria um novo espaço de nomes:
class MyClass:"""Um exemplo simples de classe"""i = 12345def f(self): return �hello world�
Curso de Especialização em Redes de Computadores � Inf 514
Python: Orientação a Objetos: ClassesAtributos de uma classe são de dois tipos:� Dados (no exemplo anterior: i )�Métodos (funções) (no exemplo anterior: f()Instanciação de uma classe: x = Myclass()� Cria uma instancia e atribui o objeto classe criado à variável x
Dados de uma classe podem ser dinamicamente criados: Exemplo: x.counter = 1
Invocando um metodo (função) de uma classe:
x.f() exibirá a cadeia hello world
Curso de Especialização em Redes de Computadores � Inf 514
Python: Orientação a Objetos: Classes
O método __init__( ) permite inicializar objetos da classe:Exemplo:
>>> class Complex: � def __init__(self, realpart, imagpart): � self.r = realpart � self.i = imagpart ... >>> x = Complex(3.0, -4.5) # instancia com valores iniciais >>> x.r, x.i (3.0, -4.5
Curso de Especialização em Redes de Computadores � Inf 514
Python: Classes - HerançaPython suporta herança simples e múltipla
Class DerivedClassName(BaseClassName): <comando-1> . . . <comando-n>
O nome BaseClassName deve ser acessivel (estar no escopo) do código onde aparece a definição da classe derivada, podendo também estar definido num módulo:
Class DerivedClassName(MouleName.BaseClassName): <comando-1> . . . <comando-n>