Poglavlje7.7i8

2. Maksimalne performanse. U prethodnom primeru će se čitati kroz fajlove i funkcije pravljenja dinamički svaki put kada ste želeli da pluralizujete reč. Ova verzija će keširati funkcije čim se pojave napravljeno, a u najgorem slučaju pročitaće samo datoteku sa uzorcima samo jednom, bez obzira koliko reči pluralizirati.

3. Odvajanje koda i podataka. Svi obrasci se čuvaju u posebnoj datoteci. Kod je kod, a podaci su podaci, i nikad se dva neće sresti.

Je li ovo stvarno nirvana? Pa, da i ne. Evo nečega što ćete uzeti u obzir .

Primer LaziRules: datoteka sa obrascima se otvara (tokom \_\_init \_\_ ()) i ostaje otvoreno dok se ne postigne konačno pravilo. Python će na kraju zatvoriti datoteku kada izađe, ili nakon što se uništi poslednja instancija klase LaziRules, ali to bi ipak moglo biti dugo vremena. Ako je ova klasa deo dugotrajnog Python procesa, Python interpreter nikada ne može izaći, a LaziRules objekt nikada neće biti uništen.

Postoji više načina. Umesto da otvorite datoteku za vreme \_\_init \_\_ () i izađete otvara se dok čitate pravila jednu po jednu liniju, možete otvoriti datoteku, pročitati sve pravila i odmah zatvorite datoteku. Ili možete otvoriti datoteku, pročitati jedno pravilo, sačuvati položaj datoteke metodom Tell (), zatvorite datoteku, a zatim je ponovo otvorite i koristite metoda traženja () za nastavak čitanja tamo gde ste stali. Ili nisi morao da brineš o tome nego si mogao ostaviti datoteku otvorenom, kao što to radi ovaj primer. Programiranje je dizajn i dizajniranje se odnosi na kompromise i ograničenja. Datoteka koja je otvorena predugo može biti problem; komplikovanje koda može biti problem. Koji je veći problem zavisi od vašeg razvojnog tima, vaše aplikacije i vašeg runtime okruženja.

7.7. Iduća literatura

• Tipovi iteratora

• PEP 234: Iteratori

• PEP 255: Jednostavni Generatori

• Generator Trikovi za Sistemske Programere

POGLAVLJE 8. NAPREDNI ITERATORI

8.1. DIVING IN

HAVAII + IDAHO + IOVA + OHIO == DRŽAVE. Ili, drugačije rečeno, 510199 + 98153 + 9301 + 3593 == 621246. Govorim li ?marsovski? Ne, to je samo zagonetka.

HAWAII + IDAHO + IOWA + OHIO == STATES

510199 + 98153 + 9301 + 3593 == 621246

H = 5

A = 1

W = 0

I = 9

D = 8

O = 3

S = 6

T = 2

E = 4

Zagonetke poput ove nazivaju se kriptaritmi ili alfametika. Slova pišu stvarne reči, ali ako zamenite svako slovo sa brojem od 0–9, takođe „piše“ aritmetičku jednačinu. Trik je otkriti koje pismo se preslikava na svaku cifru. Sve pojave svakog slova moraju se preslikati na istu cifru, a cifra ne može biti ponovljena, i nijedna "reč" ne može početi sa cifrom 0.

U ovom poglavlju ćemo zaroniti u neverovatni Python program koji je originalno napisao Raimond Hettinger. Ovoaj program rešava abecedne zagonetke u samo 14 linija koda.

import re

import itertools

def solve(puzzle):

words = re.findall('[A-Z]+', puzzle.upper())

unique\_characters = set(*.join(words))*

assert len(unique\_characters) <= 10, 'Too many letters'

first\_letters = {word[0] for word in words}

n = len(first\_letters)

sorted\_characters = *.join(first\_letters) + \*

*.join(unique\_characters - first\_letters)*

characters = tuple(ord(c) for c in sorted\_characters)

digits = tuple(ord(c) for c in '0123456789')

zero = digits[0]

for guess in itertools.permutations(digits, len(characters)):

if zero not in guess[:n]:

equation = puzzle.translate(dict(zip(characters, guess)))

if eval(equation):

return equation

if \_\_name\_\_ == '\_\_main\_\_':

import sys

for puzzle in sys.argv[1:]:

print(puzzle)

solution = solve(puzzle)

if solution:

print(solution)

Program možete pokrenuti iz komandne linije. Na Linuxu bi izgledalo ovako. (Ovo može potrajati , zavisno od brzine računara i nema trake napretka. Samo budite strpljivi!)