avoid for loop calling Generator function

Peter Otten __peter__ at web.de
Mon Feb 22 08:34:08 EST 2016

Arshpreet Singh wrote:

> Hi, I am converting PDF into text file, I am using following code.
> from pypdf2 import PdfFileReader
> def read_pdf(pdfFileName):
>     pdf = PdfFileReader(pdfFileName)
>     yield from (pg.extractText() for pg in pdf.pages)
> for i in read_pdf('book.pdf'):
>      print(i)
> I want to avoid for loop , I also tried to create another function and
> call read_pdf() inside that new function using yield from but I think I am
> missing real picture here

While it is possible to replace the loop with

next(filter(print, read_pdf("book.pdf")), None)

or the slightly less convoluted

sys.stdout.writelines(map("{}\n".format, read_pdf("book.pdf")))

the for loop is the obvious and therefore recommended solution. Personally, 
I would also replace

>     yield from (pg.extractText() for pg in pdf.pages)

with the good old

for pg in pdf.pages:
    yield pg.extractText()

and reserve the generator expression for occasions where it has a 
demonstrable advantage in readability.

More information about the Python-list mailing list