2
# currently I have this code

def some_func():
    for match in re.finditer(regex, string):
        yield other_func(match)

I was wondering if there was a way to squash it into one line

# looking for something like

def some_func():
    yield from other_func(re.finditer(regex, string))
AlanSTACK
  • 5,525
  • 3
  • 40
  • 99

2 Answers2

4

You can use map. The map accepts two parameters: a function and an iterable. It iterates the iterable and apply the function and returns an iterator (which yields mapped values - function(first item), function(seoncd item), ...)

def some_func():
    yield from map(other_func, re.finditer(regex, string))

yield from here is not necessary, because the map returns an iterator (in Python 3.x):

def some_func():
    return map(other_func, re.finditer(regex, string))

Example:

>>> import re
>>>
>>> def other_func(match):
...     return match.group()
...
>>> def some_func():
...     return map(other_func, re.finditer(regex, string))
...
>>> regex = '.'
>>> string = 'abc'
>>> list(some_func())
['a', 'b', 'c']
falsetru
  • 357,413
  • 63
  • 732
  • 636
3

For something simple and short you can return a generator expression which basically is the same as yield,

def some_func():
    return (other_func(match) for match in re.finditer(regex, string))
Hossain Muctadir
  • 3,546
  • 1
  • 19
  • 33