EP 16 Envisager un générateur au lieu de renvoyer des listes

  • Using generators can be clearer than the alternative of returning lists of accumulated results

Effective Python

The simplest choice for functions that produce a sequence of results is to return a list of items.

def index_words(text):
    result = []
    if text:
        result.append(0)
    for index, letter in enumerate(text):
        if letter == ' ':
            result.append(index + 1)
    return result

address = 'Four score and seven years ago...'
result = index_words(address)
print(result[:3])

[0, 5, 11]

There are two problems with the index_word function.

  1. the code is a bit dense and noisy.
  1. It requires all results to be stored in the list before bneing returned. This is effective in the case where we read huge file
def index_words_iter(text):
    if text:
        yield 0
    for index, letter in enumerate(text):
        if letter == ' ':
            yield index + 1


def index_file(handle):
    offset = 0
    for line in handle:
        if line:
            yield offset
        for letter in line:
            offset += 1
            if letter == '':
                yield offset

from itertools import islice

with open('/tmpaddress.txt') as f:
    it = index_file(f)
    result = islice(it, 0, 3)
    print(list(result))

Recommended Posts

EP 16 Envisager un générateur au lieu de renvoyer des listes
EP 9 Considérer les expressions de générateur pour les grandes compréhensions
EP 4 Fonctions d'aide à l'écriture au lieu d'expressions complexes
EP 23 Accepter des fonctions pour des interfaces simples au lieu de classes
EP 7 Utiliser les compréhensions de liste au lieu de carte et de filtre
Élément de note Python efficace 16 Envisagez de renvoyer un générateur sans renvoyer une liste