22
Programação I / Introdução à Programação Python standard library João Pedro Pedroso 2019/2020

Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Programação I / Introdução à ProgramaçãoPython standard library

João Pedro Pedroso

2019/2020

Page 2: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Última aula:I conjuntos (set)I módulo collections

Hoje:I módulos úteis da biblioteca standard

Page 3: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

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 shell0>>> 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:

Page 4: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Copiar ficheiros: shutil

>>> import shutil>>> shutil.copyfile('data.db', 'archive.db')'archive.db'>>> shutil.move('/build/executables', 'installdir')'installdir'

Page 5: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Wildcards

I Para listar ficheiros com wildcards: módulo glob

>>>>>> import glob>>> glob.glob('*.py')['primes.py', 'random.py', 'quote.py']

Page 6: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Argumentos da linha de comandoI Quando executamos um programa em Python podemos dar

argumentos na linha de comando:

$ python3 argtest.pyProgram executed with arguments: ['argtest.py']'usage: argtest.py n', where 'n' is is an integer$ python3 argtest.py prog-IProgram executed with arguments: ['argtest.py', 'prog-I']cannot convert prog-I to an integer$ python3 argtest.py 10Program executed with arguments: ['argtest.py', '10']here are 10 random values:0.103493354305001170.92451081959885440.10006820924044390.65318242666824320.206767482192390830.457620780635549230.81532465155195480.46292354594055010.120771659439558810.35357462055128464$

Page 7: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Programa argtest.py

import sysimport 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())

Page 8: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Módulo argparseMecanismo mais sofisticado para processar argumentosI Exemplo: imprimir um valor ao quadrado

import argparseparser = 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.pyusage: ex_argparse.py [-h] squareex_argparse.py: error: the following arguments are required: square$ python3 ex_argparse.py -husage: ex_argparse.py [-h] squarepositional arguments:

square display square of given numberoptional arguments:

-h, --help show this help message and exit$ python3 ex_argparse.py 525

Page 9: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Outro exemploI Obter um ou mais nomes de ficheiros na linha de comandos,

mostrar as primeiras linhasI número de linhas a mostrar pode ser dadoI valor por omissão: 10

import argparse

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

parser.add_argument('filenames', nargs='+')parser.add_argument('-l', '--lines', type=int, default=10)args = parser.parse_args()print(args.filenames)print(args.lines)

I Execução:

$ python3 top.pyusage: 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

Page 10: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Output de erros, término do programaI Módulo sys:

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

ser mostrados os avisos e erros de execuçãoI 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 SystemExitI 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 andshould not be used in programs.

Page 11: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

String Pattern Matching

I Módulo re → regular expressionsI 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 completaI [a-z] → qualquer carater entre a e zI * → zero ou mais repetições do padrão à esquerdaI + → uma ou mais repetiçõesI \1 → primeiro padrão encontrado

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

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

Page 12: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Matemática

I Já falamos de:

>>> import math>>> import random

I Há também um módulo para tratamento estatístico de dadosnumé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

Page 13: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

InternetI 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('[email protected]', '[email protected]',... """To: [email protected]... From: [email protected]...... Beware the Ides of March.... """)>>> server.quit()

(este exemplo precisa de um servidor de email na máquinaonde está a ser executado)

Page 14: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Datas e horas

I Módulo datetime:I aritmética entre datas/horasI input/output com formatos convenientesI suporte de timezones

>>> # dates are easily constructed and formatted>>> from datetime import date>>> now = date.today()>>> nowdatetime.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.days14368

Page 15: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Compressão de dados

Diversos módulos: zlib, gzip, bz2, lzma, zipfile, tarfileI 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 gzipwith gzip.open('file.txt.gz', 'rb') as f:

file_content = f.read()

Page 16: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Medida de desempenho/tempo computacional

I Permite medir diferenças entre diversas implementações demé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 e pstats → identificar partes críticas emprogramas

Page 17: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Profile

import cProfileimport recProfile.run('re.compile("foo|bar")')

I output:197 function calls (192 primitive calls) in 0.002 seconds

Ordered by: standard name

ncalls tottime percall cumtime percall filename:lineno(function)1 0.000 0.000 0.001 0.001 <string>:1(<module>)1 0.000 0.000 0.001 0.001 re.py:212(compile)1 0.000 0.000 0.001 0.001 re.py:268(_compile)1 0.000 0.000 0.000 0.000 sre_compile.py:172(_compile_charset)1 0.000 0.000 0.000 0.000 sre_compile.py:201(_optimize_charset)4 0.000 0.000 0.000 0.000 sre_compile.py:25(_identityfunction)

3/1 0.000 0.000 0.000 0.000 sre_compile.py:33(_compile)

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

Page 18: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

$ python -m cProfile -s cumtime lwn2pocket.py72270 function calls (70640 primitive calls) in 4.481 seconds

Ordered by: cumulative time

ncalls tottime percall cumtime percall filename:lineno(function)1 0.004 0.004 4.481 4.481 lwn2pocket.py:2(<module>)1 0.001 0.001 4.296 4.296 lwn2pocket.py:51(main)3 0.000 0.000 4.286 1.429 api.py:17(request)3 0.000 0.000 4.268 1.423 sessions.py:386(request)

4/3 0.000 0.000 3.816 1.272 sessions.py:539(send)4 0.000 0.000 2.965 0.741 adapters.py:323(send)4 0.000 0.000 2.962 0.740 connectionpool.py:421(urlopen)4 0.000 0.000 2.961 0.740 connectionpool.py:317(_make_request)2 0.000 0.000 2.675 1.338 api.py:98(post)

30 0.000 0.000 1.621 0.054 ssl.py:727(recv)30 0.000 0.000 1.621 0.054 ssl.py:610(read)30 1.621 0.054 1.621 0.054 {method 'read' of '_ssl._SSLSocket' objects}1 0.000 0.000 1.611 1.611 api.py:58(get)4 0.000 0.000 1.572 0.393 httplib.py:1095(getresponse)4 0.000 0.000 1.572 0.393 httplib.py:446(begin)

60 0.000 0.000 1.571 0.026 socket.py:410(readline)4 0.000 0.000 1.571 0.393 httplib.py:407(_read_status)1 0.000 0.000 1.462 1.462 pocket.py:44(wrapped)1 0.000 0.000 1.462 1.462 pocket.py:152(make_request)1 0.000 0.000 1.462 1.462 pocket.py:139(_make_request)1 0.000 0.000 1.459 1.459 pocket.py:134(_post_request)[...]

Page 19: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Quality ControlI Para desenvolver software de qualidade:

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

desenvolvimentoI Módulo doctest:

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

I testes:I construidos com ¢ut-and-paste de chamadas típicas a essa

funçãoI 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 doctestdoctest.testmod() # automatically validate the embedded tests

Page 20: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Outro módulo para controlo de qualidade: unittest

I permite um conjunto mais completo de testes, guardado numficheiro 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

Page 21: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Batteries Included

I módulos que não pertencemà biblioteca standard sãoinstalados separadamente;eg:$ pip3 install scikit-learn

I há milhares de módulosdisponíveis!

Page 22: Programação I / Introdução à Programação - Python standard ...jpp/Prog1920/teorica-26_stdlib.pdf · Argumentosdalinhadecomando I QuandoexecutamosumprogramaemPythonpodemosdar

Aula de hoje:I Brief Tour of the Standard Library

https://docs.python.org/3/tutorial/stdlib.html

Próxima aulaI sympy