Python Kurs

Gute Links und Tutorials könnt ihr hier posten.
Antworten
kimmie46
User
Beiträge: 11
Registriert: Dienstag 19. November 2019, 22:41
Wohnort: Hamburg

Moin,

Dieses Forum ist für Links und Tutorials.
Genau das macht dieser Link. Er ist ein link auf einen kostenlosen Pythonkurs.
Damit wird kein Geld verdient .
ich verstehe nicht, dass in diesem Forum mit dem Titel "Links und Tutorials", links auf kostenlose Python Tutorials verboten sind ???
Bitte um Hilfestellung und Erklärung.

gruss
matthias


https://lernen.cloud/courses/python_advanced2021
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Woher hast du den Eindruck, das wäre verboten?
kimmie46
User
Beiträge: 11
Registriert: Dienstag 19. November 2019, 22:41
Wohnort: Hamburg

>>> Woher hast du den Eindruck, das wäre verboten?

Vor einer Woche wurde die Themenfreigabe verweigert:
"
NEW: Themenfreigabe verweigert:
„Kostenloser Python Kurs“
Forum: Links und Tutorials
Grund: Die gemeldete Nachricht hat nur zum Ziel, für eine Website oder ein anderes Produkt zu werben..
"
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ah. Ja. Zu 99.99% sind Erstposter mit einem Link eben Spammer. Und manchmal schätzt man einen Post falsch ein. Das ist keine böse Absicht.

Und nicht alles, was kostenlos ist, ist unproblematisch. Denn so mancher versucht dann, Geld via Werbung zu machen. Und auch da muss man dann eben abwägen, ob der Gewinn für die User das Wert ist, und auch da kann man daneben liegen. Man hat ja nun auch nur soviel Zeit & Lust, sowas zu bewerten.

Durch deinen zweiten Post habe ich das aber nochmal genauer angeschaut, und jetzt ist es ja freigeschaltet. H
kimmie46
User
Beiträge: 11
Registriert: Dienstag 19. November 2019, 22:41
Wohnort: Hamburg

Ja, kein Problem.
Ich hatte mich nur gewundert. Ich monatelang diesen Kurs erstellt ohne etwas dafür zu bekommen und alles ist kostenlos und ohne eine Verpflichtung.
Und mit e-mail addressen oder Daten wird dem Kurs auch nicht bezahlt . -)
gruss aus Hamburch,
matthias
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nachdem ich da etwas tiefer eingestiegen bin, sehe ich das jetzt auch. Gute Arbeit!
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Beschreibung läßt wieder schlimmes erahnen: ›Range und Schleifen sind wichtig um Listen durchzugehen‹. ›Aber auch wie man eine Liste mit einem hochzählen des Index durchgehen kann.‹

Warum immer nur dieser Index. Das ist doch völlig realitätsfern.
Ich möchte wissen, wie viele rote T-Shirts in meinem Schrank hängen. Das erst was ich mache, ist, jedem T-Shirt ein Nummer zu geben, dann nehme ich das T-Shirt mit der Nummer 0 und schaue, ob es rot ist, danach nehme ich das T-Shirt mit der Nummer 1 und schaue ob es rot ist.
Ernsthaft?
NEIN!
Ich fange ganz links an, und schaue das T-Shirt ganz Links an, ob es rot ist, dann schaue ich mir das nächste an, usw. Kein Index nötig, ich muß nicht wissen, wie viele T-Shirts insgesamt im Schrank hängen. Ich muß nicht zählen, beim wievielten T-Shirt ich bin.
kimmie46
User
Beiträge: 11
Registriert: Dienstag 19. November 2019, 22:41
Wohnort: Hamburg

>> Warum immer nur dieser Index. Das ist doch völlig realitätsfern.
Bei einer Bwinf Aufgabe (Bücherregal) kommt man der for schleife nicht weit. Auch wenn es man mit der for schleifen durchs halbe leben kommt, gibt es doch situationen, in denen man einen index braucht.
Im übrigen trägt es zum verständnis bei, wenn man sowohl mit for-each als auch mit dem durchgehen des index irgendeine aufzählung durchiteriert.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

@kimmie46: Hm, dann habe ich wohl ein Verständnisproblem, weil ich es bis heute nicht geschafft habe, eine „zählende“ `for`-Schleife in Python zu schreiben.

Mit der Bücherregalaufgabe ist die erste von hier gemeint? Die würde ich so lösen:

Code: Alles auswählen

from itertools import tee

def pairwise(xs):
    xs, ys = tee(xs)
    next(ys, None)
    return zip(xs, ys)

def has_possible_arrangement(heights, figure_count):
    return sum(rhs - lhs > 3 for lhs, rhs in pairwise(sorted(heights))) < figure_count
Den zweiten Teil würde ich mit `more_itertools.split_when` lösen, aber das ist mit `pairwise` auch relativ einfach mit einer normalen `for`-Schleife ohne Indexgefummel zu schreiben:

Code: Alles auswählen

def arrange(heights):
    heights = sorted(heights)
    result = []
    for lhs, rhs in pairwise(heights):
        result.append(lhs)
        if rhs - lhs > 3:
            yield result
            result = []
    if heights:
        result.append(heights[-1])
    if result:
        yield result
IMHO trägt es zum Verständnis bei, wenn man lernt, mit Abstraktionen (in diesem Beispiel `zip`, um mehrere Iterables gleichzeitig zu iterieren, und `pairwise` zum Erzeugen von Paaren) umzugehen.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Diese Denkweise ist schwer aus den Köpfen wieder rauszubekommen. Aber abgesehen von ein paar sehr konstruierten Aufgaben, wo man mit der Prämisse herangeht, dass die Lösung mit Index besonders einfach ist, braucht man in real auftretenden Problemen sehr selten einen Index.

Man nehme z.B. eine Aufgabe, wo es darum geht, Bücher mit n Dekofiguren in n+1 Gruppen aufzuteilen, wo innerhalb einer Gruppe der Unterschied vom niedrigsten zum höchsten Buch <= 30mm sein soll.
Vorgegeben ist eine Datei

Code: Alles auswählen

4
11
168
170
202
211
229
233
254
260
272
306
307
In der ersten Zeile steht die Anzahl an Dekofiguren, dann kommt eine Zeile, die man ignorieren kann und dann die Höhe der Bücher in mm.

Als erstes braucht man eine Funktion zum Lesen der Datei.
Dann sortiert man die Buchhöhen, und geht die Bücher durch. Immer wenn die Differenz der Höhe des aktuellen Buchs zum erste Buch des aktuellen Abschnitts zu groß wird, fängt man einen neuen Abschnitt an. Zum Schluß schaut man, wieviele Abschnitte man braucht, und ob man genug Dekofiguren hat:

Code: Alles auswählen

MAXIMAL_UNTERSCHIED = 30

def read_input():
    with open("buecher.txt") as lines:
        anzahl_deko_figuren = int(next(lines))
        _ = next(lines)
        buecherhoehen = list(map(int, lines))
    return anzahl_deko_figuren, buecherhoehen

def main():
    anzahl_deko_figuren, buecherhoehen = read_input()
    abschnitte = []
    for hoehe in sorted(buecherhoehen):
        if not abschnitte or hoehe - hoehe_erstes_buch > MAXIMAL_UNTERSCHIED:
            # fange einen neuen Abschnitt an
            hoehe_erstes_buch = hoehe
            abschnitt = []
            abschnitte.append(abschnitt)
        abschnitt.append(hoehe)
    if len(abschnitte) <= anzahl_deko_figuren + 1:
        print("Lösung gefunden")
    print(abschnitte)

if __name__ == "__main__":
    main()
Ich wüßte jetzt gar nicht, wie ich da noch einen Index einbauen sollte.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Sirius3 hat geschrieben: Donnerstag 29. Juli 2021, 00:03

Code: Alles auswählen

        if not abschnitte or hoehe - hoehe_erstes_buch > MAXIMAL_UNTERSCHIED:
:oops: Ich schieb’s mal auf die späte Stunde. Naja, mein Beispiel ist immer noch ein gutes Beispiel dafür, dass man auch „komische“ Probleme gut ohne Index lösen kann.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Sirius3,
Ich wüßte jetzt gar nicht, wie ich da noch einen Index einbauen sollte.
Ich sehe bei der Bücherregalaufgabe eigentlich keinen Grund es nicht über Indices laufen zu lassen.
Die Performance ist identisch und der Code ist sogar noch etwas kompakter:

Code: Alles auswählen

def place_books_iter(books):
    shelve = list()
    section = list()
    start_book_size = books[0]
    for book in books:
        if book - start_book_size > 3:
            shelve.append(section)
            section = list()
            start_book_size = book
        section.append(book)
    return shelve.append(section)


def place_books_indexed(books):
    shelve = list()
    section_start = 0
    for current_book in range(1, len(books)):
        if books[current_book] - books[section_start] > 3:
            shelve.append(books[section_start:current_book])
            section_start = current_book
    return shelve.append(books[section_start:])
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@rogerb: Deine erste Funktion funktioniert nicht, wenn man gar keine Bücher zum Verteilen hat.
Zudem existiert der Code innerhalb des if-Blocks nochmal identisch außerhalb.
append liefert None zurück, der Rückgabewert Deiner Funktionen ist also Quatsch.

das Problem ist, dass Dein Code mit Index deutlich schwieriger zu verstehen ist. Das sieht man allein schon daran, dass es zwar weniger Zeilen sind, diese aber deutlich länger sind, so dass sich die beiden Funktionen in der Anzahl der Zeichen kaum unterscheiden.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Deine erste Funktion funktioniert nicht, wenn man gar keine Bücher zum Verteilen hat.
Genau, dann würde man die Funktionen auch gar nicht erst aufrufen.
Zudem existiert der Code innerhalb des if-Blocks nochmal identisch außerhalb.
Nicht wirklich, da wird nur der restliche Teil der Bücher angehängt. Das ist auch in beiden Funktionen gleich, hat also nichts mit dem eigentlichen Verfahren zu tun
append liefert None zurück, der Rückgabewert Deiner Funktionen ist also Quatsch.
Das stimmt, da hatte ich wohl einen unfertigen Zwischenstand gepostet. Und das war auch bei beiden Funktionen das gleiche Problem.

Code: Alles auswählen

def place_books_iter(books):
    shelve = list()
    section = list()
    start_book_size = books[0]
    for book in books:
        if book - start_book_size > 3:
            shelve.append(section)
            section = list()
            start_book_size = book
        section.append(book)
    shelve.append(section)
    return shelve


def place_books_indexed(books):
    shelve = list()
    section_start = 0
    for current_book in range(1, len(books)):
        if books[current_book] - books[section_start] > 3:
            shelve.append(books[section_start:current_book])
            section_start = current_book
    shelve.append(books[section_start:])
    return shelve
das Problem ist, dass Dein Code mit Index deutlich schwieriger zu verstehen ist
Das kann ich nicht nachvollziehen. Bei beiden Methoden muss mit dem ersten Buch eines Abschnitts verglichen werden.
Es stimmt, zwar dass es durch den Index eine Stufe abstrakter wird, aber mit aussagekräftigen Indexbezeichnern sollte es genauso verständlich sein.
Das sieht man allein schon daran, dass es zwar weniger Zeilen sind, diese aber deutlich länger sind, so dass sich die beiden Funktionen in der Anzahl der Zeichen kaum unterscheiden.
Naja, ich stimme zu das indexbasierter Code oft schwerer zu lesen ist, weil man nicht nur die Bedeutung des Listennamens, sondern auch die des Indexnamens im Kopf haben muss. Das kann auch bei komplexeren Algorithmen sehr unübersichtliche werden.

Da man hier einen gleitenden, flexiblen Bereich der Bücher betrachten muss, kann man sich mit einem Index gut den Start und das Ende des Bereichs merken und flexibel manipulieren.
Gäbe es so etwas bei itertools oder more_itertools, würde ich das sicher vorziehen.

Alles in allem sehe ich immer noch kein starkes Argument gegen den index-basierten Ansatz.
Antworten