• Nenhum resultado encontrado

Programação I / Introdução à Programação

N/A
N/A
Protected

Academic year: 2022

Share "Programação I / Introdução à Programação"

Copied!
22
0
0

Texto

(1)

Programação I / Introdução à Programação

Python standard library

João Pedro Pedroso

2021/2022

Informo que partes desta aula serão gravadas. Se intervierem durante a gravação assumo que autorizam a que a vossa

participação aí apareça.

Caso discordem, por favor deixem as vossas questões para o

período de dúvidas, que não será gravado.

(2)

Última aula:

I módulo numpy Hoje:

I módulos úteis da biblioteca standard

(3)

Interface com o sistema operativo

I Módulo os

>>> import os

>>> os.getcwd() # current working directory

'/home/jpp/FCUP/DCC/2019-2020/P1'

>>> os.chdir('CODEX') # change current working directory

>>> os.system('mkdir today') # run the command 'mkdir' in the system shell

0>>> dir(os)

[...'chdir', ..., 'getcwd', ..., 'mkdir', ..., 'remove', ..., 'rename', ..., 'rmdir', ...]

>>> help(os)

<returns an extensive manual page created from the module's docstrings>

For daily file and directory management tasks, the shutil module provides a higher level interface that is easier to use:

(4)

Copiar ficheiros: shutil

>>> import shutil

>>> shutil.copyfile('data.db', 'archive.db') 'archive.db'

>>> shutil.move('/build/executables', 'installdir') 'installdir'

(5)

Wildcards

I Para listar ficheiros com wildcards: módulo glob

>>>

>>> import glob

>>> glob.glob('*.py')

['primes.py', 'random.py', 'quote.py']

(6)

Argumentos da linha de comando

I Quando executamos um programa em Python podemos dar argumentos na linha de comando:

$ python3 argtest.py

Program executed with arguments: ['argtest.py']

'usage: argtest.py n', where 'n' is is an integer

$ python3 argtest.py prog-I

Program executed with arguments: ['argtest.py', 'prog-I']

cannot convert prog-I to an integer

$ python3 argtest.py 10

Program executed with arguments: ['argtest.py', '10']

here are 10 random values:

0.10349335430500117 0.9245108195988544 0.1000682092404439 0.6531824266682432 0.20676748219239083 0.45762078063554923 0.8153246515519548 0.4629235459405501 0.12077165943955881 0.35357462055128464

$

(7)

Programa argtest.py

import sys import random

print("Program executed with arguments:", sys.argv) if len(sys.argv) != 2:

progname = sys.argv[0]

print("'usage:", progname, "n', where 'n' is is an integer") raise SystemExit

else:

try:n = int(sys.argv[1]) except ValueError:

print("cannot convert", sys.argv[1], "to an integer") raise SystemExit

print("here are", n, "random values:") for i in range(n):

print(random.random())

(8)

Módulo argparse

Mecanismo mais sofisticado para processar argumentos I Exemplo: imprimir um valor ao quadrado

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("square", help="display square of given number", type=int)

args = parser.parse_args() print(args.square**2)

I Execução:

$ python3 ex_argparse.py

usage: ex_argparse.py [-h] square

ex_argparse.py: error: the following arguments are required: square

$ python3 ex_argparse.py -h usage: ex_argparse.py [-h] square positional arguments:

square display square of given number optional arguments:

-h, --help show this help message and exit

$ python3 ex_argparse.py 5 25

(9)

Outro exemplo

I Obter um ou mais nomes de ficheiros na linha de comandos, mostrar as primeiras linhas

I número de linhas a mostrar pode ser dado I valor por omissão: 10

import argparse

parser = argparse.ArgumentParser(prog = 'top', description = 'Show top lines from each file')

parser.add_argument('filenames', nargs='+') # '+' -> at least one filename parser.add_argument('-l', '--lines', type=int, default=10)

args = parser.parse_args() print(args.filenames) print(args.lines)

I Execução:

$ python3 top.py

usage: top [-h] [-l LINES] filenames [filenames ...]

top: error: the following arguments are required: filenames

$ python3 top.py --lines=5 alpha.txt beta.txt

['alpha.txt', 'beta.txt']

5

(10)

Output de erros, término do programa

I Módulo sys:

I sys.stdin → "ficheiro" do standard input (input()) I sys.stdout → "ficheiro" do standard output (print()) I sys.stderr → "ficheiro" do standard error → onde devem

ser mostrados os avisos e erros de execução

I

permite visualizar erros quando o stardard output é redirigido

>>> sys.stderr.write('Warning, log file not found starting a new one\n')

Warning, log file not found starting a new one

I Forma mais direta de terminar um programa:

I sys.exit() I raise SystemExit

I exit() funciona na maior parte dos casos, mas:

The site module (which is imported automatically dur- ing startup, except if the -S command-line option is given) adds several constants to the built-in namespace (eg, exit).

They are useful for the interactive interpreter shell and

should not be used in programs.

(11)

String Pattern Matching

I Módulo re → regular expressions

I pesquisa de padrões complexos em strings

>>> import re

>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')

['foot', 'fell', 'fastest']

>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')

'cat in the hat'

I \b→

palavra completa

I [a-z]→

qualquer carater entre

a

e

z

I *→

zero ou mais repetições do padrão à esquerda

I +→

uma ou mais repetições

I \1→

primeiro padrão encontrado

I quando o que se pretende pode ser feito com métodos de strings, esses são preferíveis; eg:

>>>

>>> 'tea for too'.replace('too', 'two') 'tea for two'

(12)

Matemática

I Já falamos de:

>>> import math

>>> import random

I Há também um módulo para tratamento estatístico de dados numéricos:

>>> import statistics

>>> data = [2.75, 1.75, 1.25, 0.25, 0.5, 1.25, 3.5]

>>> statistics.mean(data) 1.6071428571428572

>>> statistics.median(data) 1.25>>> statistics.variance(data) 1.3720238095238095

(13)

Internet

I Leitura de dados de URL:

>>> from urllib.request import urlopen

>>> url = "http://www.gutenberg.org/cache/epub/3333/pg3333.txt"

>>> with urlopen(url) as response:

... for line in response:

... line = line.decode('utf-8') # Decoding the binary data to text.

... if 'EST' in line or 'EDT' in line: # look for Eastern Time

... print(line)

I Enviar e-mail:

>>> import smtplib

>>> server = smtplib.SMTP('localhost')

>>> server.sendmail('soothsayer@example.org', 'jcaesar@example.org',

... """To: jcaesar@example.org ... From: soothsayer@example.org ... Beware the Ides of March.

... """)

>>> server.quit()

(este exemplo precisa de um servidor de email na máquina

onde está a ser executado)

(14)

Datas e horas

I Módulo datetime:

I aritmética entre datas/horas

I input/output com formatos convenientes I suporte de timezones

>>> # dates are easily constructed and formatted

>>> from datetime import date

>>> now = date.today()

>>> now

datetime.date(2003, 12, 2)

>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.") '12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

>>> # dates support calendar arithmetic

>>> birthday = date(1964, 7, 31)

>>> age = now - birthday

>>> age.days 14368

(15)

Compressão de dados

Diversos módulos: zlib, gzip, bz2, lzma, zipfile, tarfile I compressão de strings

>>> import zlib

>>> s = b'witch which has which witches wrist watch'

>>> len(s)

41>>> t = zlib.compress(s)

>>> len(t)

37>>> zlib.decompress(t)

b'witch which has which witches wrist watch'

>>> zlib.crc32(s) # checksum associated to 's'

226805979

I leitura/escrita de ficheiros comprimidos

import gzip

with gzip.open('file.txt.gz', 'rb') as f:

file_content = f.read()

(16)

Medida de desempenho/tempo computacional

I Permite medir diferenças entre diversas implementações de métodos

I módulo timeit:

>>> from timeit import Timer

>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit() 0.57535828626024577

>>> Timer('a,b = b,a', 'a=1; b=2').timeit() 0.54962537085770791

I módulos profile/cProfile e pstats → identificar partes

críticas em programas

(17)

Profiling

Exemplo: série de fibonacci

def fib(n):

if n==0 or n==1:

else:r=1

r= fib(n-1) + fib(n-2) return r

if __name__ == "__main__":

print(fib(25))

(18)

$ python -m cProfile -s cumtime fibonacci.py 121393

242787 function calls (3 primitive calls) in 0.062 seconds

Ordered by: cumulative time

ncalls tottime percall cumtime percall filename:lineno(function)

1 0.000 0.000 0.062 0.062 fibonacci.py:1(<module>)

242785/1 0.062 0.000 0.062 0.062 fibonacci.py:1(fib)

1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}

I módulos profile e cProfile têm a mesma funcionalidade I na prática, cProfile é mais usado

I pstats → permite fazer estatísticas com o output de

profile/cProfile

(19)

Quality Control

I Para desenvolver software de qualidade:

I cada função deve ser testada quando está a ser desenvolvida I esse testes devem ser repetidos frequentemente no processo de

desenvolvimento I Módulo doctest:

I ferramenta para percorrer os ficheiros de um módulo e validar testes embebidos em docstrings

I testes:

I

construidos com ¢ut-and-paste de chamadas típicas a essa função

I

ao mesmo tempo fornecem um exemplo de utilização

def average(values):

"""Computes the arithmetic mean of a list of numbers.

>>> print(average([20, 30, 70])) 40.0"""

return sum(values) / len(values) import doctest

doctest.testmod() # automatically validate the embedded tests

(20)

Outro módulo para controlo de qualidade: unittest

I permite um conjunto mais completo de testes, guardado num ficheiro separado:

import unittest

class TestStatisticalFunctions(unittest.TestCase):

def test_average(self):

self.assertEqual(average([20, 30, 70]), 40.0) self.assertEqual(round(average([1, 5, 7]), 1), 4.3) with self.assertRaises(ZeroDivisionError):

average([])

with self.assertRaises(TypeError):

average(20, 30, 70)

unittest.main() # Calling from the command line invokes all tests

(21)

Batteries Included

I módulos que não pertencem à biblioteca standard são instalados separadamente;

eg:

$ pip3 install scikit-learn I há milhares de módulos

disponíveis!

(22)

Aula de hoje:

I Brief Tour of the Standard Library

https://docs.python.org/3/tutorial/stdlib.html Próxima aula

I sympy

Referências

Documentos relacionados

Por  sua  vez,  a  decisão  nos  embargos  asseverou  também  que  o 

Quando tal camada de dessolidarização não for aplicada, pode haver o risco de se estabelecer a ligação das membranas ao suporte, quer ao longo das juntas de sobreposição,

• Após configurar a rede com êxito, você pode tocar em Rock n' Roll, na tela do aplicativo acima, e se preparar para a reprodução direta de música.. Para obter mais detalhes,

· Outras informações Não existe mais nenhuma informação relevante disponível. 10 Estabilidade

sendo, a corrente anódica levará mais tempo para alcançar o valor de latching (corrente de engate), necessitando-se neste caso de um pulso de disparo com

A Informação aqui apresentada foi criada para dar ao piloto um melhor conhecimento sobre os procedimentos previstos, em uso para o CARETO AIRSHOW 2017.. Bragança e

Com o passar do tempo, as pessoas que senti- ram medo tiveram mais pressão evolutiva favo- rável, pois, assim como acontece com os ani- mais, o medo promove a sobrevivência huma- na..

O desafio do gerenciamento de estoques não consiste em diminuir os estoques de forma excessiva para reduzir custos ou ter muito estoque disponível a fim de