[Python-de] Funktionale Denksportaufgabe

Rainer Fischbach fischbach at ecs-gmbh.de
Thu Sep 26 12:28:40 EDT 2002


At 10:13 26.09.2002 +0200, you wrote:
>Hier eine kleine Denksportaufgabe fuer die funktionale Fraktion:
>ich habe folgende rein imperative filter-Funktion:
>
>def filter1(func, seq):
>     if func == None:
>         return seq
>     lst = []
>     for elem in seq:
>         felem = func(elem)
>         if felem:
>             lst.append(elem)
>     return lst
>
>was man auch umformen kann zu:
>
>def filter1(func, seq):
>     if func == None:
>         return seq
>     lst = []
>     map1(lambda elem:func(elem) and lst.append(elem), seq)
>     return lst
>
>Jetzt bin ich auf der Suche nach einem weitere Schritt, um die
>"temporaere" Liste lst, die hier gewissermassen einen gewollten
>"Seiten"-effekt darstellt, voellig loszuwerden.
>
>Wer bietet eine "rein funktionale" Loesung fuer die letzten drei
>Zeilen (ohne externe imperative Hilfsfunktionen) an?

dafür gibt es die eingebaute Funktion filter

>>> filter (lambda x: x < 10, [12, 2, 12, 13, 16, 8, 3, 19, 3, 6, 22, 7])
[2, 8, 3, 3, 6, 7]

falls es Deine Absicht war, die nachzubilden, dann geht das so (ohne
Nobe-Test):

def mein_filter (p, sq):
    if sq:
        if p (sq[0]):
            return [sq[0]] + fil (p, sq[1:])
        else:
            return fil (p, sq[1:])
    else:
        return []

das ist sicher nicht besonders effizient, da die Python-Listen (die vor
allem als dynamische Arrays funktionieren) im Vergleich zu den
cons-car-cdr-Listen hier zuviel Overhead produzieren.

Z. B. das Entsprechende in Scheme dürfte effizienter sein:

(define filter
  (lambda (p sq)
    (if (null? sq) '()
        (if (p (car sq)) (cons (car sq) (fil p (cdr sq)))
               (fil p (cdr sq))))))
        
sl, Rainer
    Mit freundlichen Gruessen

    i.V.
    Rainer Fischbach
______________________________________________________

    ECS
    Engineering Consulting & Solutions GmbH
    Muehlstrasse 3
    D-92318  Neumarkt

    Phone:               +49 (0)9181 - 4764-84
    Fax:                 +49 (0)9181 - 4764-50
    Mobil:               +49 (0)171  - 41 41 570
    e-mail:              fischbach at ecs-gmbh.de
    WWW:                 http://www.ecs-gmbh.de
______________________________________________________






More information about the Python-de mailing list