-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathppd_3.py
130 lines (104 loc) · 3.15 KB
/
ppd_3.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
#-*- coding: utf-8 -*-
import sys
from math import ceil, sqrt
from itertools import ifilterfalse, count
def prime_generator():
"""
An infinite prime numbers generator
>>> g = prime_generator()
>>> for i in range(25):
... print g.next(),
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
it does not have a limit, so if you don't want
an infinite loop, you have to explicitly break
out of your loop:
>>> for i in prime_generator():
... if i > 100:
... break
... print i,
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
"""
n = 1
while True:
if n == 1:
is_prime = False
elif n == 2:
is_prime = True
else:
is_prime = True
limit = int(ceil(sqrt(n))) + 1
for x in range(2, limit):
if n % x == 0:
is_prime = False
if is_prime:
yield n
n += 1
def one_line_prime_generator():
"""
An infinite prime numbers generator implemented in one line
>>> g = one_line_prime_generator()
>>> for i in range(25):
... print g.next(),
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
it does not have a limit, so if you don't want
an infinite loop, you have to explicitly break
out of your loop:
>>> for i in one_line_prime_generator():
... if i > 100:
... break
... print i,
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
O 100o primo deve ser 541
>>> g = one_line_prime_generator()
>>> for i in range(100):
... a = g.next()
>>> print a
541
"""
# Esse filterfalse tira do generator os numeros que tem divisores
# maiores que 1
return ifilterfalse(
# Esse lambda retorna uma lista com os divisores maiores que 1
# do numero em questao (com caso especial para o 2)
lambda n:
False if n == 2 else [
x for x in range(2, int(ceil(sqrt(n)))+1) if n % x == 0
]
,
count(2)
)
def rgb_range():
for r in range(256):
for g in range(256):
for b in range(256):
yield (r, g, b)
def rgb_xrange():
for r in xrange(256):
for g in xrange(256):
for b in xrange(256):
yield (r, g, b)
def read_csv(file):
"""
Lê um csv e retorna uma lista de tuplas, onde cada elemento é um campo do csv
>>> for l in read_csv('arquivo.csv'):
... print l
('1', '2', '3', '4')
('favorite color', 'yellow')
Imprime na tela alguma coisa e sai em caso de erro:
>>> for i in read_csv('arquivo_que_nao_existe.csv'):
... pass
Traceback (most recent call last):
...
SystemExit: 1
"""
try:
with open(file, 'r') as f:
lines = [l.strip() for l in f.readlines() if l.strip()]
for l in lines:
yield tuple(l.split(','))
except:
sys.stderr.write("Ops\n")
sys.exit(1)
if __name__ == '__main__':
import doctest
doctest.testmod()