-
Notifications
You must be signed in to change notification settings - Fork 0
/
ppd_1.py
133 lines (99 loc) · 3.25 KB
/
ppd_1.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env python
#-*- coding: utf-8 -*-
"""
Exercícios da primeira parte do livro Python para desenvolvedores
"""
from math import ceil, sqrt
import operator
def celsius_para_fahrenheit(graus_celcius):
"""
Função que converte temperatura em graus celcius para fahrenheit
>>> celsius_para_fahrenheit(25)
77.0
"""
return 9/5.0 * graus_celcius + 32
def fahrenheit_para_celsius(graus_fahrenheit):
"""
Função que converte temperatura em graus fahrenheit para celsius
>>> fahrenheit_para_celsius(77)
25.0
"""
return 5.0/9 * (graus_fahrenheit - 32)
def is_prime(n):
"""
Retorna verdadeiro se n for primo
>>> is_prime(97)
True
e falso se n não for primo
>>> is_prime(93)
False
>>> is_prime(3)
True
>>> is_prime(49)
False
"""
if n == 1:
return False
elif n == 2:
return True
else:
limit = int(ceil(sqrt(n))) + 1
for x in range(2, limit):
if n % x == 0:
return False
return True
def concatena_listas(lista_de_listas):
"""
Recebe uma lista de listas e retorna uma única lista
>>> concatena_listas([[1, 2, 3], [4, 5, 6]])
[1, 2, 3, 4, 5, 6]
aceita listas de tamanhos arbitrários:
>>> concatena_listas([[1, 2], [3, 4, 5, 6]])
[1, 2, 3, 4, 5, 6]
"""
return reduce(operator.add, lista_de_listas)
def calculate_with_values(dicionario):
"""
Dado um dicionário, retorna a soma, média e variação dos valores
(entendi variação como a diferença entre o menor e o maior elemento)
>>> calculate_with_values({'a': 1, 'b': 2, 'c': 3})
(6, 2, 2)
>>> calculate_with_values({'a': 10, 'b': 32.5, 'c': 23, 'd': 41})
(106.5, 26.625, 31)
"""
lista_de_valores = dicionario.values()
soma = sum(lista_de_valores)
media = soma / len(lista_de_valores)
variacao = max(lista_de_valores) - min(lista_de_valores)
return soma, media, variacao
def inverte_palavras(frase):
"""
Dada uma frase, retorna outra com as letras das palavras invertidas
>>> inverte_palavras('python para desenvolvedores')
'nohtyp arap serodevlovnesed'
O funcionamento do slicing [::-1] está explicado em
http://docs.python.org/release/2.3/whatsnew/section-slices.html
Basicamente, a sintaxe de slice aceita três parâmetros:
início, fim, e passo.
início por padrão é None, o passo também, enquanto fim é o final
da string. Assim, temos um slice do início ao fim da string com
passo -1 (ou seja, de trás para frente)
"""
return ' '.join([palavra[::-1] for palavra in frase.split()])
def ordena(dados, chave=0, reverso=False):
"""
Ordena uma lista de tuplas dada uma chave
>>> ordena([(1, 2, 3), (2, 1, 3), (3, 2, 1)])
[(1, 2, 3), (2, 1, 3), (3, 2, 1)]
>>> ordena([(1, 2, 3), (2, 1, 3), (3, 2, 1)], 0, True)
[(3, 2, 1), (2, 1, 3), (1, 2, 3)]
>>> ordena([(1, 2, 3), (2, 1, 3), (2, 3, 1)], 1)
[(2, 1, 3), (1, 2, 3), (2, 3, 1)]
>>> ordena([(1, 2, 3), (2, 1, 3), (2, 3, 1)], 1, True)
[(2, 3, 1), (1, 2, 3), (2, 1, 3)]
"""
dados.sort(cmp=lambda x, y: cmp(x[chave], y[chave]), reverse=reverso)
return dados
if __name__ == '__main__':
import doctest
doctest.testmod()