Krautkanal.com

Veröffentlicht am 2016-05-24 13:59:01 in /prog/

/prog/ 8856: allgemeiner Pythonfaden

Shriiiiimp Avatar
Shriiiiimp:#8856

Wieder mal kein Pythonfaden? Hier kommt einer.

otozk Avatar
otozk:#8859

>>8856
>Wieder mal kein Pythonfaden? Hier kommt einer.

Und wie wäre es, wenn du mal liefern würdest?



a = 0
b = 42
c = a or b
print(c)

jajodia_saket Avatar
jajodia_saket:#8861

>>8859
42
"0 or 42" evaluiert zu 42.


import sys
class Bar:
  def __init__(self, foo):
      self._foo = foo
  def write(self, text):
      self._foo.write(text.title())
sys.stdout = Bar(sys.stdout)

print 'Was ist die Anwort auf die Frage nach dem Leben, dem Universum und dem ganzen Rest?'

sokaniwaal Avatar
sokaniwaal:#8863

>>8861
title. Ja. Eine merkwürdige und ziemlich nutzlose Methode.

ademilter Avatar
ademilter:#8865

Python 2 oder 3 auf nem Raspberry Pi?

joshkennedy Avatar
joshkennedy:#8867

Wie kann ich elegant, schön und kurz, so dass ich nicht das auch nach einen Monat nur beim Überfliegen verstehen würde, diese "logische" Tabelle umgesetzt werden?

Ich habe mir irgendwelche if-else-Kette gebaut. Nicht wirklich schön. Wie noch mal da ein logisches XOR sich zusammensetzt, das wusste ich nicht mehr und musste nachschauen.

https://ideone.com/tJS5TN

newbrushes Avatar
newbrushes:#8868

Bernd, wie kann ich explizit den Object-Typ der Funktionargumente festlegen?

https://ideone.com/0TCHJr
Warum geht hier beides durch?

otozk Avatar
otozk:#8869

>>8867

def tabloprawdy(A, B):
    tab = {
            "TrueTrue" : "'...'",
            "TrueFalse" : "B",
            "FalseTrue" : "A",
            "FalseFalse" : "A - B"
    }
    k = '{}{}'.format(A is None, B is None)
    return eval(tab[k])

if __name__ == '__main__':
    print(tabloprawdy(None, None))
    print(tabloprawdy(10, None))
    print(tabloprawdy(None, 8))
    print(tabloprawdy(10, 8))

kurafire Avatar
kurafire:#8870

>>8869
Nice, wie könnte man das so umstellen, dass es für A und B als Strings auch funktioniert?

"{A} - {B}" ist eigentlich eine Formatierung für Strings, keine Subtraktion.

chaabane_wail Avatar
chaabane_wail:#8871

>>8870

"FalseFalse" : "'{} - {}'.format(A, B)"


Sollte funktionieren, aber habe ich jetzt nicht getestet.

giuliusa Avatar
giuliusa:#8872

>>8868
>Bernd, wie kann ich explizit den Object-Typ der Funktionargumente festlegen?
Indem du es explizit überprüfst.

>https://ideone.com/0TCHJr
>Warum geht hier beides durch?
Wenn es wie eine Ente quakt, ist es eine Ente.

vladyn Avatar
vladyn:#8873

>>8872
Dies.

isinstance kennste?

sketi_ndlela Avatar
sketi_ndlela:#8878

>>8872
>>8873
Viel Sinn macht dieses book: Book dann wohl nicht, wenn hier die Ententechnick greift?

murrayswift Avatar
murrayswift:#8879

>>8878
>Viel Sinn macht dieses book: Book dann wohl nicht, wenn hier die Ententechnick greift?

Ich denke schon, dass man das irgendwie zum Greifen bringen kann, indem man die Typen von Basistypdeklarationen in types ableitet. Aber ja, viel Sinn ergibt dieses ganze Feature nicht.
Du musst halt mal ins PEP gucken. Dann siehst du auch wie komplex und zugleich nutzlos diese Typkacke ist.

garand Avatar
garand:#8880

Was sind die Hauptunterschiede zwischen static und class Funktionen? In welchen Fällen sollten welche verwendet werden?

bassamology Avatar
bassamology:#8882

>Was sind die Hauptunterschiede zwischen static und class Funktionen?

Klassenmethoden haben das Klassenobjekt als Parameter.

>In welchen Fällen sollten welche verwendet werden?

Wenn man das Klassenobjekt braucht, nimmt man Klassenmethoden. So ein Fach.

andrewgurylev Avatar
andrewgurylev:#8883

>>8882
Angenommen, ich habe was gebaut, das eher wie ein "Werkzeug" fungieren sollte, z.B. eine Wrapper um mutagen, das unabhängig vom verwendeten Codec bzw. Tagformat mir die Metadaten in einen unifizierten Format liefert.

Und ich dann etwa Folgendes mache:

import MySuperDuperMetaExtractor as Metas

track_1 = "/tmp/Helge Schneider - Reis.flac"
track_2 = "/tmp/Scooter - Hyper, Hyper.mp3"

meta_1 = Metas.get_meta_from_file(track_1)
meta_1 = Metas.get_meta_from_file(track_2)


Da ist doch der Einsatz der static Funktionen im MySuperDuperMetaExtractor besser geeignet, oder?

zackeeler Avatar
zackeeler:#8884

>>8883
>Da ist doch der Einsatz der static Funktionen im MySuperDuperMetaExtractor besser geeignet, oder?

static "Funktionen" in einem Modul? Was soll das sein?

oskamaya Avatar
oskamaya:#8886

>>8884
Eine Datei, die eine Klasse mit Namen Bla hat.

okay, dann wäre der Aufruf ja:

Metas.Bla.funktion()

itskawsar Avatar
itskawsar:#8889

>>8886
Ich denke der Vorteil von Klassenmethoden gegenüber statischen Methoden wird klar, wenn es um Vererbung geht und innerhalb der Methode nicht mehr bekannt ist, um welche Klasse es sich handelt. Genau dann nutzt man das übergebene Klassenobjekt.

posterjob Avatar
posterjob:#8892

>>8867

(define (match-ist-schon-gut a b)
  (match (list a b)
    [(list "" "") "..."]
    [(list "" _) b]
    [(list _ "") a]
    [(list _ _) (printf "~a - ~a" a b)]))


Warum hat Python eigentlich kein Pattern Matching?

mefahad Avatar
mefahad:#8893

Hallo Bernd, ich lerne im Rahmen meiner Ausbildung ein bisschen Java, und finde gerade gefallen an Python.
Kann Bernd mir weiterführende Ebooks empfehlen? Und noch sind mir die Anwendungsgebiete von Python nicht so ganz klar.

dmackerman Avatar
dmackerman:#8894

>>8893
A Byte of Python

https://www.gitbook.com/download/pdf/book/swaroopch/byte-of-python
https://www.gitbook.com/download/epub/book/swaroopch/byte-of-python
https://www.gitbook.com/download/mobi/book/swaroopch/byte-of-python

thehacker Avatar
thehacker:#8895

>>8892
Es hat doch Reguläre Ausdrücke im Perl-Stil.

Import re, wenn mich meine Erinnerung nicht täuscht.

n_tassone Avatar
n_tassone:#8896

>>8893
>Und noch sind mir die Anwendungsgebiete von Python nicht so ganz klar.
Eigentlich sind die Anwendungsgebiete ziemlich Deckungsgleich mit denen von Java. Wobei es sich etwas besser für GUIs eignet, viel besser für Skripte und etwas schlechter für Leistungskritische Sachen.

ma_tiax Avatar
ma_tiax:#8897

>>8895
Ich meinte - und benutzte in meiner Lösung - dies hier, Bernd:
>http://c2.com/cgi/wiki?PatternMatching

sreejithexp Avatar
sreejithexp:#8898

>>8893
>Und noch sind mir die Anwendungsgebiete von Python nicht so ganz klar.
Eigentlich alles außer geschwindigkeitskritische Sachen und ENTERPRISE-Software. Größte Stärken (weil sehr gute Module verfügbar) liegen aber im wissenschaftlichen Bereich Datenanalyse, Visualisierung, AI / Machine Learning usw.

jqueryalmeida Avatar
jqueryalmeida:#8899

>>8898
>Eigentlich alles außer geschwindigkeitskritische Sachen und ENTERPRISE-Software.

Beides wird in Python geschrieben.
Bei Geschwindigkeitskritischer SW wird der winzige wirklich kritische Teil dann in C geschrieben.

doooon Avatar
doooon:#8900

>>8899
Mit Geschwindigkeitskritisch kann auch Software mit (sanften) Echtzeitanforderungen gemeint sein. Das will man wirklich nicht mit Python erledigen.

mugukamil Avatar
mugukamil:#8902

>>8900
>Mit Geschwindigkeitskritisch kann auch Software mit (sanften) Echtzeitanforderungen gemeint sein. Das will man wirklich nicht mit Python erledigen.

Mit welcher Begründung?
Bei PyPy würde ich dir wegen der Laufzeit des asynchronen GC zustimmen. Aber warum soll weiche Echtzeit nicht mit CPython möglich sein?

ryandownie Avatar
ryandownie:#8903

>>8900
Man kann in solchen Fällen den GC einfach ausschalten.
Dann wird Python schon berechenbarer.
Dann gibt es noch PyPy und Micropython. Letzteres macht im Endeffekt genau das.

woodydotmx Avatar
woodydotmx:#8904

>>8899
Das hilft dann auch nicht weiter, wenn du dann zillionen Aufrufe über die C-API hast. Denn so ein Aufruf kostet. Und es ist eine Grenze, über die ein vernünftiger Compiler nichts optimieren kann.
Deshalb ist z.B. der Großteil der JVM und .Net Standardbibliotheken in der jeweiligen Sprache geschrieben und nicht einfach ein Haufen von Bindings.
D.h., für irgendwelche Kack-Parser und Cryptosachen reichen C-Bindidngs, für Spiele, wo man dann hunderte von C-Funktionsaufrufen pro Frame hätte aber bestenfalls für PyGame-Sachen und Co.

>inzu4 Pandora Engine
Deren Benutzer beschweren sich dauernd über Performanzprobleme und tendieren dazu, den Großteil der Logik nach C++ auszulagern, so dass man auch gleich hätte alles darin machen können.

>inzu4 Micropython
Krebs, JS gibt es auch auf Microcontrollern, aber das Geld ist besser in C/Cython investiert, dann gehen auch kleinere = günstigere, stromsparendere MCs.

>inzu4 PyPy
Sicher ein guter Versuch, aber im Durchschnitt sind die Ergebnisse gar nicht so beeindruckend. (7,5x so schnell wie CPython im Durchschnitt)

Eigentlich der einzige ernsthafte Ansatzpunkt, Python schnell und echtzeitfähig zu machen ist Cython, wo man auf einen Großteil der normalen Semantik verzichten muss.

shesgared Avatar
shesgared:#8905

>>8904
>PyPy
>sind die Ergebnisse gar nicht so beeindruckend
Bei den kleinen Scheißprogrammen die ich probiert habe, fand ich die Ergebnisse schon ziemlich beeindruckend. Freier Leistungsgewinn 3-4 fach.

artheft_ua Avatar
artheft_ua:#8907

>>8905
>Freier Leistungsgewinn 3-4 fach.
Sicherlich sinnvoll, wenn man seine Webserver dadurch reduzieren kann. Tripple Ay fähige Gay m engines kann man damit aber nicht bauen.

Zumal PyPy scheinbar gerade etwas stagniert, was die Entwicklung der Performance angeht.
Ich bin mir nie so sicher, ob das Projekt nicht einfach gut genug mit Mitteln ausgestattet ist oder ob die krebsige, an CPython gebundene Semantik weiteren Fortschritt verhindert.

herrhaase Avatar
herrhaase:#8908

>>8904
>für Spiele, wo man dann hunderte von C-Funktionsaufrufen pro Frame hätte

Ach bitte. Schon in den 90ern waren die 3D-Spiele in Skriptsprachen programmiert. Nur die Engine war in C.

Der Geschwindigkeitskritische Teil von Software ist immer viel kleiner als man annimmt.

dpg Avatar
dpg:#8909

>>8908
Spiellogik in einer Skriptsprache zu realisieren, berührt jetzt auch nicht gerade den Performanzkritischen Teil.

herrhaase Avatar
herrhaase:#8910

>>8908

Was >>8909 sagt. Zumal heutzutage eigentlich alle größeren, vernünftigen Engines architekturmäßig ermutigen, den Hauptteil des Spiels in C++ zu implementieren und nur spezielle Events per Skript zu lösen. Und auch Entwickler wie Carmack sagen, dass Skripte schnell der Flaschenhals werden.

anaami Avatar
anaami:#8911

>>8909
>Spiellogik in einer Skriptsprache zu realisieren, berührt jetzt auch nicht gerade den Performanzkritischen Teil.

Das hat auch niemals jemand behauptet.

mefahad Avatar
mefahad:#8915

>>8907
> an CPython gebundene Semantik weiteren Fortschritt verhindert.

A Bernd, a erklär mal, wie as aussieht? A welchen Einfluss, ha Tse do uf Schlangesemantik?

1markiz Avatar
1markiz:#8916

>>8904
>zillionen Aufrufe über die C-API hast
CFFI in PyPy versucht genau das zu umgehen mit dem JIT Compiler. Der produziert dann einen API freien Assembler.
Das ist noch lange nicht ausgereizt

BrianPurkiss Avatar
BrianPurkiss:#8920

>>8916
>>zillionen Aufrufe über die C-API hast
>CFFI in PyPy versucht genau das zu umgehen mit dem JIT Compiler. Der produziert dann einen API freien Assembler.

Mit C-API ist im Allgemeinen nicht ein Aufruf von C-Bibliotheken (.so/.dll) gemeint, sondern ein Aufruf des Interpreters von in C implementierten Teilen der Python-Infrastruktur wie z.B. builtins oder Module.
Also unter anderem das, was PyPy's CPyExt macht.

xspirits Avatar
xspirits:#8926

Hallo, ich versuchte mich gerade an einem Programm mit GUI mit spyder 2 zu erstellen.
Da muss ich wohl die Datei vom QT Designer umwandeln und die dann bearbeiten.

Gibt es da nicht sowas wie den WindowBuilder in Eclipse?
Wo ich praktisch in der Entwicklungsumgebung Änderungen vornehmen kann?

crhysdave Avatar
crhysdave:#8929

>>8915
Z.B.: http://lucumr.pocoo.org/2014/8/16/the-python-i-would-like-to-see/

sawalazar Avatar
sawalazar:#8931

Bernd, welche Module sollte ich vorziehen, wenn ich flac/mp3 Dateien (sehr geil wäre zusätzlich ogg, wma, m4a) bis auf die Sampleebene lesen will (z.B für einen Stilledetektor). Bitte möglichst ohne vorheriges Transcoding zu wav.

curiousonaut Avatar
curiousonaut:#9238

Bernd, wie ist es mit Objekten in einen Array?

ich möchte etwas in folgender Art machen können:

>>> A = "Anna"
>>> array = ["Peter", A, "Dieter", A]
>>> A = "Fotze"
>>> print(array)
["Peter", "Fotze", "Dieter", "Fotze"]


Also sollte Container die Referenz beinhalten und diese nur beim Aufrufen auflösen.

thomweerd Avatar
thomweerd:#9240

>>9238
Das geht mit dem Zuweisungsoperator prinzipbedingt nicht.

Du müsstest irgendein mutable Objekt in die Liste einfügen und dieses verändern (aber nicht mit dem Zuweisungsoperator)

edobene Avatar
edobene:#9241

Bernd verwendet Python schon seit Jahren sehr erfolgreich für Scripte und Kleinprogramme, möchte jetzt aber gerne ein großes Produkt damit Basteln. Kennt Bernd passende Bücher für Großprojekt Best-Practices? Klar könnte Bernd das irgendwie zusammenhacken, aber gibt es da Normen/Styles was z.B. den Codeaufbau betrifft wie bei Java der ganze /src/main/java Krebs?

layerssss Avatar
layerssss:#9242

>>9238

Vielleicht sowas?

>>> name = "anna"

>>> list = ["peter", name, "dieter", name]

>>> change = {name: "fotze"}

>>> map(lambda name: change[name] if name in change else name, list)
['peter', 'fotze', 'dieter', 'fotze']

slaterjohn Avatar
slaterjohn:#9243

>>9241
>aber gibt es da Normen/Styles was z.B. den Codeaufbau betrifft

https://www.python.org/dev/peps/pep-0008/

joemdesign Avatar
joemdesign:#9244

>>9242
das sieht gut aus! kannst du mir ein wenig erklären, was da gerade passiert ist?

list wird komplett durchgegangen, geschaut ob das element name ist, und falls name im dict ist, wird inhalt von dict anstelle des elementes geschrieben?

souuf Avatar
souuf:#9245

>>9238
class A:
s = ''
def __init__(self, a):
self.s = a
def __repr__(self):
return(self.s)

a = A("Anna")
list = ["Peter", a, "Dieter", a]
A.s = "Fotze"
print(list)

# die Ausgabe
["Peter", Fotze, "Dieter", Fotze]

iamglimy Avatar
iamglimy:#9246

>>9244
>kannst du mir ein wenig erklären, was da gerade passiert ist?

Das hast du schon richtig beschrieben.

Ich beschreibe die Veränderung als dict/{} und durchlaufe mit map() dann die list. map() gibt eine neue Liste zurück.

Wahrscheinlich sollte man das heute dann noch mit immutablen funktionalen Datenstrukturen wie Pyrsistent [1] machen. Mit solchem Kram kann man zum Beispiel Listen komplett neu erstellen, ohne viel Speichern rumzukopieren.

Python hat den Ruf langsam zu sein, teilweise dadurch, weil man den Speicher bei Listen immer rumkopiert. Ob das heute mit CPython oder PyPy noch so ist, keine Ahnung. Aber Bernd bevorzugt heute immutable Datenstrukturen und mag Listen ungern verändern. >>9245 zeigt auch eine typische Lösung, aber halt mit mutable State.

[1] https://github.com/tobgu/pyrsistent

Neuste Fäden in diesem Brett: