8 Python-Tricks von erfahrenen Programmierern

Bild



Hier sind acht raffinierte Python-Tricks, die Sie sicher noch nicht gesehen haben. Wenden Sie diese Tricks auf Ihren Python-Code an, um ihn prägnanter und performanter zu gestalten!



1. Objekte nach mehreren Schlüsseln sortieren



Angenommen, wir möchten die folgende Liste von Wörterbüchern sortieren:



people = [
{ 'name': 'John', "age": 64 },
{ 'name': 'Janet', "age": 34 },
{ 'name': 'Ed', "age": 24 },
{ 'name': 'Sara', "age": 64 },
{ 'name': 'John', "age": 32 },
{ 'name': 'Jane', "age": 34 },
{ 'name': 'John', "age": 99 },
]


Wir wollen sie aber nicht nur nach Name oder Alter sortieren, sondern nach beiden Feldern. In SQL wäre dies eine Abfrage wie folgt:



SELECT * FROM people ORDER by name, age


Eigentlich ist es eine sehr einfache Lösung für dieses Problem, dank Pythons Garantie , dass die Sortierfunktionen sorgen für Stabilität Sortierung . Dies bedeutet, dass die verglichenen Elemente ihre ursprüngliche Reihenfolge beibehalten.



Um eine Sortierung nach Name und Alter zu erreichen, können wir Folgendes tun:



import operator
people.sort(key=operator.itemgetter('age'))
people.sort(key=operator.itemgetter('name'))


Beachten Sie, wie ich die Reihenfolge geändert habe. Sortieren Sie zuerst nach Alter und dann nach Namen. Mit erhalten operator.itemgetter()wir die Alters- und Namensfelder aus jedem Wörterbuch in der Liste.



Dies gibt uns das gewünschte Ergebnis:



[
 {'name': 'Ed',   'age': 24},
 {'name': 'Jane', 'age': 34},
 {'name': 'Janet','age': 34},
 {'name': 'John', 'age': 32},
 {'name': 'John', 'age': 64},
 {'name': 'John', 'age': 99},
 {'name': 'Sara', 'age': 64}
]


Namen werden zuerst sortiert, Alter wird sortiert, wenn der Name übereinstimmt. Somit sind alle Jones nach Alter gruppiert.



Die Inspirationsquelle ist eine Frage von StackOverflow .



2. Listeneinschlüsse (Listengenerator)



Listeneinschlüsse können die hässlichen Schleifen ersetzen, die zum Auffüllen der Liste verwendet werden. Grundlegende Syntax für Listeneinschlüsse:



[ expression for item in list if conditional ]


Ein sehr einfaches Beispiel zum Füllen einer Liste mit einer Folge von Zahlen:



mylist = [i for i in range(10)]
print(mylist)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


Und da Sie einen Ausdruck verwenden können, können Sie auch etwas rechnen:



squares = [x**2 for x in range(10)]
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


Oder rufen Sie sogar eine externe Funktion auf:



def some_function(a):
    return (a + 5) / 2
    
my_formula = [some_function(i) for i in range(10)]
print(my_formula)
# [2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0]


Schließlich können Sie "if" verwenden, um die Liste zu filtern. In diesem Fall speichern wir nur die Werte, die durch 2 teilbar sind:



filtered = [i for i in range(20) if i%2==0]
print(filtered)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]


3. Überprüfen Sie die Speichernutzung Ihrer Objekte



Mit sys.getsizeof () können Sie die Speichernutzung eines Objekts überprüfen:



import sys

mylist = range(0, 10000)
print(sys.getsizeof(mylist))
# 48


Wow ... warte ... warum ist diese riesige Liste nur 48 Bytes?

Dies liegt daran, dass die Bereichsfunktion eine Klasse zurückgibt, die sich nur wie eine Liste verhält. Ein Bereich ist viel weniger speicherintensiv als eine tatsächliche Liste von Zahlen.

Sie können sich selbst davon überzeugen, indem Sie Listeneinschlüsse verwenden, um eine tatsächliche Liste von Zahlen aus demselben Bereich zu erstellen:



import sys

myreallist = [x for x in range(0, 10000)]
print(sys.getsizeof(myreallist))
# 87632


Wenn sys.getsizeof()Sie also herumspielen, können Sie mehr über Python und Ihre Speichernutzung erfahren.



4. Datenklassen



Seit Version 3.7 bietet Python Datenklassen an. Es gibt mehrere Vorteile gegenüber regulären Klassen oder anderen Alternativen, z. B. die Rückgabe mehrerer Werte oder Wörterbücher:



  • Die Datenklasse erfordert nur eine minimale Menge an Code
  • Sie können Datenklassen vergleichen, weil es gibt __eq__
  • Sie können leicht eine Datenklasse zum Debuggen ableiten, da es eine gibt __repr__
  • Datenklassen erfordern Bandhinweise, wodurch die Wahrscheinlichkeit von Fehlern verringert wird


Hier ist ein Beispiel für eine Datenklasse in Aktion:



from dataclasses import dataclass

@dataclass
class Card:
    rank: str
    suit: str
    
card = Card("Q", "hearts")

print(card == card)
# True

print(card.rank)
# 'Q'

print(card)
Card(rank='Q', suit='hearts')


Eine ausführliche Anleitung finden Sie hier .



5. Paketattrs



Sie können attrs anstelle von Datenklassen verwenden . Es gibt zwei Gründe zu wählen attrs:



  • Sie verwenden eine Python-Version älter als 3.7
  • Sie möchten mehr Optionen


Das Paket attrsunterstützt alle Hauptversionen von Python, einschließlich CPython 2.7 und PyPy. Einige der im attrsVergleich zu regulären Datenklassen angebotenen zusätzlichen Attribute sind Validatoren und Konverter. Schauen wir uns einen Beispielcode an:



@attrs
class Person(object):
    name = attrib(default='John')
    surname = attrib(default='Doe')
    age = attrib(init=False)
    
p = Person()
print(p)
p = Person('Bill', 'Gates')
p.age = 60
print(p)

# Output: 
#   Person(name='John', surname='Doe', age=NOTHING)
#   Person(name='Bill', surname='Gates', age=60)


Die Autoren attrsarbeiteten tatsächlich in dem PEP, das die Datenklassen einführte. Datenklassen werden bewusst einfacher gehalten (leichter zu verstehen), während attrs eine Reihe von Funktionen bietet, die Sie möglicherweise benötigen!



Weitere Beispiele finden Sie auf der Seite attrs-Beispiele .



6. Wörterbücher kombinieren (Python 3.5+)



Seit Python 3.5 ist es einfacher, Wörterbücher zu kombinieren:



dict1 = { 'a': 1, 'b': 2 }
dict2 = { 'b': 3, 'c': 4 }
merged = { **dict1, **dict2 }
print (merged)
# {'a': 1, 'b': 3, 'c': 4}


Bei überlappenden Schlüsseln werden die Schlüssel aus dem ersten Wörterbuch überschrieben.



In Python 3.9 wird das Kombinieren von Wörterbüchern noch sauberer. Die obige Zusammenführung in Python 3.9 kann wie folgt umgeschrieben werden:



merged = dict1 | dict2


7. Suchen Sie nach der häufigsten Bedeutung



So finden Sie den häufigsten Wert in einer Liste oder Zeichenfolge:



test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4]
print(max(set(test), key = test.count))
# 4


Verstehst du warum das funktioniert? Versuchen Sie es selbst herauszufinden, bevor Sie weiterlesen.



Du hast es sogar versucht, oder? Ich werde es dir trotzdem sagen:



  • max()gibt den größten Wert in der Liste zurück. Das Argument verwendet keyeine einzelne Argumentfunktion, um die Sortierreihenfolge festzulegen, in diesem Fall test.count. Die Funktion wird auf jedes Element der Iterable angewendet.
  • test.count- eingebaute Listenfunktion. Es nimmt ein Argument an und zählt die Anzahl der Vorkommen für dieses Argument. Es test.count(1)wird also 2 und test.count(4)4 zurückgegeben.
  • set(test) Gibt alle eindeutigen Werte aus dem Test zurück, also {1, 2, 3, 4}


In dieser einzelnen Codezeile akzeptieren wir also alle eindeutigen Werte für einen Test {1, 2, 3, 4}. Als nächstes wird maxeine Funktion auf sie angewendet list.countund der Maximalwert zurückgegeben.



Und nein - ich habe diesen Einzeiler nicht erfunden.



Update: Eine Reihe von Kommentatoren hat zu Recht festgestellt, dass es einen viel effizienteren Weg gibt, dies zu tun:



from collections import Counter
Counter(test).most_common(1)
# [4: 4]


8. Mehrere Werte zurückgeben



Funktionen in Python können mehr als eine Variable ohne Wörterbuch, Liste oder Klasse zurückgeben. Es funktioniert so:



def get_user(id):
    # fetch user from database
    # ....
    return name, birthdate

name, birthdate = get_user(4)


Dies ist normal für eine begrenzte Anzahl von Rückgabewerten. Aber alles, was 3 Werte überschreitet, sollte in die (Daten-) Klasse eingeordnet werden.



Bild



In den kostenpflichtigen Online-Kursen von SkillFactory erfahren Sie, wie Sie einen hochkarätigen Beruf von Grund auf neu aufbauen oder Ihre Fähigkeiten und Ihr Gehalt verbessern können:











All Articles