Filtre sur une pile

On donne une mise en œuvre simple de la structure de Pile avec les listes Python.

🐍 Script Python
class Pile:
    "Classe à ne pas modifier"
    def __init__(self, valeurs=None):
        """Initialise une pile
        - vide, si `valeurs` n'est pas fourni ;
        - remplie avec `valeurs` sinon.
            - Le sommet de la pile est à la fin de la liste.
        """
        if valeurs is None:
            self.valeurs = []
        else:
            self.valeurs = valeurs

    def est_vide(self):
        "Renvoie un booléen : la pile est-elle vide ?"
        return self.valeurs == []

    def __str__(self):
        "Affiche la pile, en indiquant le sommet"
        return "| " + " | ".join(map(str, self.valeurs)) + ' <- sommet'

    def depile(self):
        """
        - Si la pile est vide, provoque une erreur.
        - Sinon, dépile un élément au sommet et le renvoie.
        """
        if self.est_vide():
            raise ValueError("Erreur, pile vide")
        else:
            return self.valeurs.pop()

    def empile(self, element):
        "Empile un élément au sommet de la pile"
        self.valeurs.append(element)

Pour cet exercice, on n'utilisera que les méthodes de la classe Pile et non les méthodes des listes Python. À savoir, uniquement :

  • Avec pile qui est un objet de la classe Pile,
    • pile.empile(element) ; empile un element au sommet de pile,
    • pile.depile() ; dépile et renvoie element au sommet de pile qui est non vide.

Écrire une fonction filtre_positif qui prend en paramètre donnees de type Pile d'entiers et qui renvoie une pile qui contient les éléments positifs de donnees. La pile donnees doit être globalement inchangée.

Exemples
>>> donnees = Pile([4, -11, 7, -3, -1, 0, 6])
>>> print(filtre_positifs(donnees))
| 4 | 7 | 0 | 6 <- sommet
>>> print(donnees)
| 4 | -11 | 7 | -3 | -1 | 0 | 6 <- sommet
>>> donnees = Pile([1, 2, 3, 4])
>>> print(filtre_positifs(donnees))
| 1 | 2 | 3 | 4 <- sommet
>>> print(donnees)
| 1 | 2 | 3 | 4 <- sommet
>>> donnees = Pile([-4, -3, -2, -1])
>>> print(filtre_positifs(donnees))
|  <- sommet
>>> print(donnees)
| -4 | -3 | -2 | -1 <- sommet
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013buS-[,3_4l.(wnx/8p)aPk|0;:VhoErs1v7c256mAqgyd]ji9eft =+050T0Y0!0u0W0k0G0#0K0k0u0G0G0$010!0W0s010406050G0c0O0O0u0F0S040d0D0k0c0{0D0o050q12141618100s041h1o051r0q1r1t1o100T0W0I0:0=0@0_0C0W0R0C0k1H0C0!0~050+0b0k0Y1C0?0^011G1I1K1I0!1Q1S1O0!0b0D0T181P0F1p0!0C0:1b0G0s0u0o0_0L011U1E010Z0-0Y0o0u0O0Y1O1_1{201W231S26280~0a0#0v0F0D0s0D0G0W1e0o0#0)1@0F0F0Y0K2t1h2b0o1p0q1=2G0!1:1/1;0T2d0_1K0o252q1O1z1B0;1V2Q0W2S0o1,1A1O0s2z1p2E2G2.111`2u2Y212%0F150k0~0#0H2D2=0 2;2c2@1W2_2{2}0L301{322E2P01370u2|040#0h3b2F103e350_3h3j0#0j3n3d2=3f3t2}0M3x3p3z3r3g0D2`3i2}0N3E332?1D363J383k0J3O3q3R3s3T3L3k0r3X3G3Z3I3K3u0X3)343+3B040H0y3:3Q2Z3,3U0H2 1i313F3;3|3?0H3a413c433{2^3#3j0H3m493o3P3A4e0~0H3w4i3y444d3-4n3D4q4b4l4u3@3N4x4k3H463W4D3Y454m3@3(4I3*4K4A0H3/4O4s3S4A0L3_4U4c4W3U0L402.4y4F4L0L484*4E3=4-4h4:4J4t4%4p4^4P4`3$0L4w4}4V3!4X4C534#554%4H584z4%4N5d4,4X4T5h4=4A0h4Z5l4Q3U0h4)424;5r3$0h4/5v4_4$5y4@5B4~5D3j0h4|5G543}5y52311q2,1h2W2J0T2N3f0K1,291p5V1s5T2:4q055!0)2-5H0_0w0~353x5w210n2}5_5C3s0K0~0v245~5;010}040A3E0#6c0#5`1W5?040)0Z655N5|3k6l59220O0~0i0i2#2s6u6p3f680m6z3H0b680G0Y0k6k5,5 670~0g3x6e6M0o0~0I3i0Y0c0F0G6D3+0D0~0$6#3|680f0U0t6a4x6d6=6R666F0~6H6J6*216%040l6}366U6W6Y6!4q6@5N6 6)786f3s0b0~1K0G0!720_6B7l3g741S767o680t3E066=7e016h6j7o6n6e6L660o0Z0~0Y7j0i0I0W0)7t0~6C7G5N6_046{6K2:6M7u6:4*6?6d7z6h2z0!6Y1g7d6M7W7Y7o6 717U6q6T046V7r6Z6Q7z7b7c2.797|7g047i7k7{6A7S7v4x7x7*6M7B0Y7Z5R6M7E7o0Z6s046u7j0F6y8d3H7n8z3+7?6I8n3c7z7$6b7)873f0G1~04010P0Z230K0C1T0=0#0s240g0#250#2#1z0Q0c1{0!0#1S0#0G0D140*018K7)7+0~7-7/826M8O0~010x0#8`7;666 0%9166938Q0#96987!9a0~7`9k5N7}0V0D2#7R047T9o880~150s9u9w8o7H898w9u6P997V6G8F7^9m7o7}7 6X818C6+0~0t8g86830~9c9K6q9f1 020k0!0z0e8=8@281N7w7y8k0~7C9V5{5}9}367J6i0Y8!1S9C7o8E6|a07m9X7%428L8M3H6h0W8G2Fah8D9Maa9x3f7_9Q7K7M7O7Qab6N9v6/8{agan3|7,0,6H9d9p5$0B3i0c0Y0E2y3Ja7az9*aR2z6Y8$a51Tax299u9Zaf8L8}046IaJaz68ae4aaE8j667,0*909(3fa9al5:7a9Paz9R759Uar3Hatb50~2p9Ba;8f9^a_5N8lb17z8qb5a20Y0Oa#aUb9ao6`9Nbg049J9!6S7K1S280o8cbv9W04aC6;a,7=apbm6MbbbJ2^7q9T77bU1WbT9E9p0~0u0s0s250Tbub$7|bEbr25bIb/8ebL7w4+3+bl7D9 bZ3sa22f2K0Y0i2p2r0{0ZbYb^8A7Sau6i1f2S7La)a?3o9_7Hb(0c0p0-0W0,2zaK6q7bcx3A6264bz0ma*a@bj6q6h0n1Ga6a~ba6n2%b@3caFbVch0ocjcc8HbSb4c17pa.aw7P0Y9CbM7(bOcpa.bFb?cAba6(c^3=9{ci0Yckazb#c!c;0)btcEcGcnc:b%040ucrctcvc,d1c$cdc|a.bscDc%8Bc%7}6Ib=bHa)bi6c7z7}2z129-0ucSam9#048531cU730463cNdpbhbNdy9`04cLdodK83cQ0DdF6obDdcde1Kdg9O70cg7L0!7Nc+c-cm0 agdzb;bGd$dL0_czcOdlddcsd+0Wcwdid.bca3d6dQaBaDcodb0Tc~d0c%d22Fd{dmeddkbK9Dd3dbdtd}dwdS6?a-akc{45d|c@e23|6 020R9.dJcT7z0O0W0~5pes21a=egdab:04dB0cdDd$dH9neVdMbrerev6qdqe,3seGdvbzd80 8idTa`8~a|0F7:bCc;e$e(3O0q5.0Y2G2+fb5U1A5W2J2L2H1+1-2J0u1Rfe0q5V10fr0*0,0.04.