Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.python > #6257 > unrolled thread

[Python-de] Verstaendnis-Frage zu yield und Liste dahinter

Started byChristian Winther <cwsolani2020@nurfuerspam.de>
First post2025-03-19 19:45 +0100
Last post2025-03-21 16:23 +0100
Articles 7 — 5 participants

Back to article view | Back to de.comp.lang.python


Contents

  [Python-de] Verstaendnis-Frage zu yield und Liste dahinter Christian Winther <cwsolani2020@nurfuerspam.de> - 2025-03-19 19:45 +0100
    Re: [Python-de] Verstaendnis-Frage zu yield und Liste dahinter Tim Landscheidt <tim@tim-landscheidt.de> - 2025-03-19 20:51 +0000
      Re: [Python-de] Verstaendnis-Frage zu yield und Liste dahinter Christian Winther <cwsolani2020@nurfuerspam.de> - 2025-03-20 18:33 +0100
        Re: [Python-de] Verstaendnis-Frage zu yield und Liste dahinter "Peter J. Holzer" <hjp-usenet4@hjp.at> - 2025-03-20 19:15 +0100
          Re: [Python-de] Verstaendnis-Frage zu yield und Liste dahinter Christian Winther <cwsolani2020@nurfuerspam.de> - 2025-03-20 19:34 +0100
        Re: [Python-de] Verstaendnis-Frage zu yield und Liste dahinter Hermann Riemann <nospam.ng@hermann-riemann.de> - 2025-03-20 19:38 +0100
          [Python-de] Re: Verstaendnis-Frage zu yield und Liste dahinter Hartmut Goebel <h.goebel@goebel-consult.de> - 2025-03-21 16:23 +0100

#6257 — [Python-de] Verstaendnis-Frage zu yield und Liste dahinter

FromChristian Winther <cwsolani2020@nurfuerspam.de>
Date2025-03-19 19:45 +0100
Subject[Python-de] Verstaendnis-Frage zu yield und Liste dahinter
Message-ID<vrf3bc$4mvg$1@solani.org>
Hallo Miteinander,

ich arbeite mich gerade ein bisschen in Python ein.

Ich habe hier Funktionen vorliegen ähnlich diesen hier:

def parse_was(info):

    parsed = {}

    info1, info2 = info

    for idx, info1 in enumerate(info1):

        name, status, cpu = info1
...
        parsed[name] = {
            "status": map.get(status, status_unknown).value,
            "cpu_percent": float(cpu),
...
        }
    return parsed


def mach_was(parsed):

    for name, value in parsed.items():
        if value["cpu_percent"] is not None:
            yield name, {}

----------------
Frage:

Was gibt
        yield name, {}

zurück?

Speziell: Was macht/beinhaltet der Ausdruck: {}


MfG Christian

[toc] | [next] | [standalone]


#6258

FromTim Landscheidt <tim@tim-landscheidt.de>
Date2025-03-19 20:51 +0000
Message-ID<87v7s4eocl.fsf@vagabond.tim-landscheidt.de>
In reply to#6257
Christian Winther <cwsolani2020@nurfuerspam.de> wrote:

> ich arbeite mich gerade ein bisschen in Python ein.

> Ich habe hier Funktionen vorliegen ähnlich diesen hier:

> def parse_was(info):

>     parsed = {}

>     info1, info2 = info

>     for idx, info1 in enumerate(info1):

>         name, status, cpu = info1
> ...
>         parsed[name] = {
>             "status": map.get(status, status_unknown).value,
>             "cpu_percent": float(cpu),
> ...
>         }
>     return parsed


> def mach_was(parsed):

>     for name, value in parsed.items():
>         if value["cpu_percent"] is not None:
>             yield name, {}

> ----------------
> Frage:

> Was gibt
>         yield name, {}

> zurück?

> Speziell: Was macht/beinhaltet der Ausdruck: {}

„{}“ ist ein leeres „dictionary“
(https://docs.python.org/3/tutorial/datastructures.html#dictionaries).
Die yield-Anweisung gibt jeweils ein Tupel mit zwei Werten
zurück, von denen der erste der Wert von name ist und der
zweite ein leeres dictionary. Einfacheres Beispiel:

| >>> def test_yield():
| ...     yield 'a', {}
| ...     yield 'b', {}
| ...     yield 'c', {}
| ...
| >>> for r in test_yield():
| ...     print(repr(r))
| ...
| ('a', {})
| ('b', {})
| ('c', {})
| >>> for r1, r2 in test_yield():
| ...     print(repr(r1), repr(r2))
| ...
| 'a' {}
| 'b' {}
| 'c' {}
| >>>

Tim

[toc] | [prev] | [next] | [standalone]


#6259

FromChristian Winther <cwsolani2020@nurfuerspam.de>
Date2025-03-20 18:33 +0100
Message-ID<vrhjhs$5o94$1@solani.org>
In reply to#6258
Am 19.03.2025 um 21:51 schrieb Tim Landscheidt:
[...]
>> Frage:
> 
>> Was gibt
>>         yield name, {}
> 
>> zurück?
> 
>> Speziell: Was macht/beinhaltet der Ausdruck: {}
> 
> „{}“ ist ein leeres „dictionary“
> (https://docs.python.org/3/tutorial/datastructures.html#dictionaries).
> Die yield-Anweisung gibt jeweils ein Tupel mit zwei Werten
> zurück, von denen der erste der Wert von name ist und der
> zweite ein leeres dictionary. Einfacheres Beispiel:
[...]
Hallo Tim,

danke für Deine Erklärung.

So richtig bringt mich das auch nicht weiter.
Ich muss das wahrscheinlich testen.
Das Ganze stammt aus check_mk-Checks (für Huawei Access-Points), welche
ich für APs einer anderen Firma adaptieren will.
Wahrscheinlich ist da irgendwelche check_mk-Magic im Hintergrund, wo
eine derartige Ausgabe erwartet und weiterverarbeitet wird.
Ist im vorliegenden Code aber nicht zu sehen.
Test und Debug ist halt schwierig, weil man da eine passende Umgebung
braucht.

MfG Christian

[toc] | [prev] | [next] | [standalone]


#6260

From"Peter J. Holzer" <hjp-usenet4@hjp.at>
Date2025-03-20 19:15 +0100
Message-ID<slrnvtomq6.jo0i.hjp-usenet4@trintignant.hjp.at>
In reply to#6259
On 2025-03-20 17:33, Christian Winther <cwsolani2020@nurfuerspam.de> wrote:
> Am 19.03.2025 um 21:51 schrieb Tim Landscheidt:
> [...]
>>> Frage:
>> 
>>> Was gibt
>>>         yield name, {}
>> 
>>> zurück?
>> 
>>> Speziell: Was macht/beinhaltet der Ausdruck: {}
>> 
>> „{}“ ist ein leeres „dictionary“
>> (https://docs.python.org/3/tutorial/datastructures.html#dictionaries).
>> Die yield-Anweisung gibt jeweils ein Tupel mit zwei Werten
>> zurück, von denen der erste der Wert von name ist und der
>> zweite ein leeres dictionary. Einfacheres Beispiel:
>
> danke für Deine Erklärung.
>
> So richtig bringt mich das auch nicht weiter.

Bezieht sich Dein Verständnisproblem vielleicht eher darauf, was »yield«
macht? Das scheint mir jedenfalls konzeptionell schwieriger zu sein als
ein leeres Dictionary.

»yield« dient der Implementation von Generatoren bzw. Coroutinen. Es
unterbricht die Ausführung und liefert die Werte an den Aufrufer zurück,
aber im Gegensatz zu »return« ist die Funktion damit noch nicht beendet,
sondern setzt an der Stelle fort, wenn man den nächsten Wert anfprdert.

Hier ist z.B. ein (ziemlich sinnloses) Programm, an dem man das sieht:

#!/usr/bin/python3
def g():
    print("g1")
    yield 1
    print("g2")
    yield 2
    print("g3")
    yield 3
    print("g4")
    yield 4

for i in g():
    print("<<")
    print(i)
    print(">>")

gg = g()
print("=1")
print(next(gg))
print("=2")
print(next(gg))
print("=3")

        hjp

[toc] | [prev] | [next] | [standalone]


#6261

FromChristian Winther <cwsolani2020@nurfuerspam.de>
Date2025-03-20 19:34 +0100
Message-ID<vrhn2s$5o93$1@solani.org>
In reply to#6260
Am 20.03.2025 um 19:15 schrieb Peter J. Holzer:
[...]
> Bezieht sich Dein Verständnisproblem vielleicht eher darauf, was »yield«
> macht? Das scheint mir jedenfalls konzeptionell schwieriger zu sein als
> ein leeres Dictionary.
> 
> »yield« dient der Implementation von Generatoren bzw. Coroutinen. Es
> unterbricht die Ausführung und liefert die Werte an den Aufrufer zurück,
> aber im Gegensatz zu »return« ist die Funktion damit noch nicht beendet,
> sondern setzt an der Stelle fort, wenn man den nächsten Wert anfprdert.
> [...]
Hallo Peter,

das yield-Konzept (Generator, der immer ein Element zurück liefert und
dann auf nächsten Aufruf wartet) habe ich schon verstanden.
Im konkreten Fall konnte in nur mit dem zusätzlichen leeren Dictionary
({}) im yield-Aufruf nichts anfangen.

Vermutlich erwartet aber die dahinter liegende "check_mk-Magic" da zwei
entsprechende Parameter. Ist aber aus dem vorliegenden Code nicht
ersichtlich, wie das weiter verwendet wird.

MfG Christian

[toc] | [prev] | [next] | [standalone]


#6262

FromHermann Riemann <nospam.ng@hermann-riemann.de>
Date2025-03-20 19:38 +0100
Message-ID<m435ksFsaqcU1@mid.individual.net>
In reply to#6259
Am 20.03.25 um 18:33 schrieb Christian Winther:

> Test und Debug ist halt schwierig, weil man da eine passende Umgebung
> braucht.

Für kleinere Test verwende ich print(..)

Bei größeren Tests verwende ich in etwa folgendes:

te=open("/tmp/testausgabe.txt","w")

def wr_te(name,wert):
    global te
    fprint(f"{name}:{wert}\n")

Wobei name die Stellenmarkierung enthalten kann,
und wert oft ein f-string ist.
( Oder verwende entsprechend def wr_te(stelle,name,wert))

Eventuell kommt statt .txt .html in Frage,
insbesondere wenn es um Tabellen geht.

Eventuell ist global etwa use_te noch zweckmäßig
um Ausgaben in wr_te für Bedingungen Bereiche einzugrenzen.

Funktionen vom typ wr_te lassen sich einfach einfügen,
finden und löschen.
Und liefern mit hoher Wahrscheinlichkeit relevante Daten.

-- 
<http://www.hermann-riemann.de>

[toc] | [prev] | [next] | [standalone]


#6267 — [Python-de] Re: Verstaendnis-Frage zu yield und Liste dahinter

FromHartmut Goebel <h.goebel@goebel-consult.de>
Date2025-03-21 16:23 +0100
Subject[Python-de] Re: Verstaendnis-Frage zu yield und Liste dahinter
Message-ID<0e3353e4-2c06-43f2-b13a-14d0a780c5f6@goebel-consult.de>
In reply to#6262
Am 20.03.25 um 19:38 schrieb Hermann Riemann:
> fprint(f"{name}:{wert}\n") 

Was ist dieses fprint? Das habe ich in Python noch nie gesehen und so 
eine Funktion scheint mir unnötig wie ein Kropf. Dann das geht eleganter 
und vermutlich effizienter mit print:

print(f"{name}:{wert)")

oder

print(name, wert, sep=":")

-- 
Schönen Gruß
Hartmut Goebel
Dipl.-Informatiker (univ), CISSP, CSSLP, ISO 27001 Lead Implementer
Information Security Management, Security Governance, Secure Software 
Development

Goebel Consult, Landshut
http://www.goebel-consult.de

Blog: 
https://www.goebel-consult.de/blog/2019/openstreetmaps-hat-google-maps-weit-ueberholt/ 

Kolumne: 
https://www.goebel-consult.de/blog/cissp-gefluester/2011-11-in-troja-nichts-neues/ 

[toc] | [prev] | [standalone]


Back to top | Article view | de.comp.lang.python


csiph-web