Ein Java-Programmierer studierte Python. (Über Funktionen (Methoden))

Ich bin ein Java-Programmierer, der angefangen hat, Python mit Schwung zu studieren, weil mir die Beiträge in Java ausgegangen sind. Klicken Sie hier, um den Studienartikel über "wenn, für, während Sätze" zweimal zuvor zu lesen. Klicken Sie hier, um zum vorherigen Studienartikel über "Über Schimmelpilze" zu gelangen.

Heutzutage frage ich mich, ob ich Python studieren soll, anstatt AWS-Qualifikationen zu studieren. Codierung macht doch Spaß, oder? (Ausrede Ich meine es diese Woche ernst. (Vielleicht nicht

Dieses Mal werde ich über Funktionen (Methoden) lernen.

Referenzseite

Betriebsüberprüfungsumgebung

Funktionen und Methoden

Lassen Sie uns zunächst die Form der Grundfunktion (Methode) überprüfen. Mit Java

HelloMethodDemo1.java


static void hello() {
    System.out.println("Hello World!");
}
public static void main(String[] args) {
    hello();
}

Mit Python

HelloMethodDemo1.py


def hello():
    print('Hello World!')
hello()

Das Ausführungsergebnis ist das übliche

Hello World!

Übrigens, wenn Sie mit einem Muster schreiben, das zurückkehrt,

HelloMethodDemo2.java


static String hello() {
    return "Hello World!";
}
public static void main(String[] args) {
    System.out.println(hello());
}

HelloMethodDemo2.py


def hello():
    return 'Hello World!'
print(hello())

Python ist so stilvoll, dass Java wie eine redundante schlechte Sprache aussieht. Python ist schneller zu schreiben als Java, das seit über drei Jahren verschuldet ist. Ich bin dabei, die Bedeutung des Studiums von Java zu verlieren. (Übertreibung

Unterschied zwischen Funktion und Methode

Was im Modul definiert ist, ist eine Funktion, und was in der Klasse definiert ist, ist eine Methode. Was wir oben schreiben, ist also eine Funktion. Die Methode ist

HelloMethodDemo3.py


class TestClass:
    #Methode
    def hello(self):
        print('Hello World!')

Ich sage so etwas.

Streit

In vielen Fällen möchten Sie ein Argument zur Verarbeitung an eine Funktion (Methode) übergeben. Mit Java

AddDemo.java


static int add(int a, int b) {
    return a + b;
}
public static void main(String[] args) {
    System.out.println(add(1, 2));
}

Mit Python

AddDemo.py


def add(a, b):
    return a + b
print(add(1, 2))

Der einzige Unterschied zu Java ist das Vorhandensein oder Fehlen einer Typdeklaration, sodass ich das Muster mit Argumenten problemlos verstehen konnte.

Anfangswert des Arguments

In der Site (Python-izm), auf die ich mich diesmal bezog, Es gab eine Beschreibung, dass der Anfangswert im Argument festgelegt werden kann. Das Folgende ist ein Auszug aus der Referenzstelle.

Wenn Sie einen Anfangswert für das Argument angeben, können Sie diesen beim Aufrufen der Funktion weglassen.

Das war's. Deshalb habe ich es tatsächlich geschrieben.

AddDemo2.py


def add(a, b=2):
    return a + b
print(add(1)) #Ausführungsergebnis: 3
print(add(1, 3)) #Ausführungsergebnis: 4

Übrigens, als ich es als erstes Argument festlegte, schlug es mit einem Fehler fehl. Der Anfangswert konnte nur für das letzte Argument festgelegt werden.

AddDemo3.py


#Beispiel eines Fehlers
def add(a=1, b):
    return a + b
print(add(2))
def add(a=1, b=2):
    return a + b

Diese Funktion ist in Java nicht verfügbar. (Es war eine ziemliche Funktion in PHP, C ++, C # und anderen Sprachen. Ich habe PHP und C # verwendet, aber noch nie gesehen ...) Dies ... wann ist der beste Zeitpunkt, um es zu verwenden ...? ?? ?? Es gibt wirklich keine Szene, in der das Java-Gehirn nützlich ist ...

Wenn Sie eine variable Länge (Taple) für das Argument festlegen möchten

Sie können im Argument auch tapple usw. setzen. Verwenden Sie insbesondere * (Sternchen).

ArgsDemo.py


def variable(*args):
    print(args)
variable('a', 'b', 'c')

Das Ausführungsergebnis ist

('a', 'b', 'c')

Globale und lokale Variablen

In Python Außerhalb der Funktion definierte Variablen sind ** globale Variablen **, Innerhalb einer Funktion definierte Variablen werden als ** lokale Variablen ** bezeichnet. ~~ * Wie Java ~~

Wenn Sie einer globalen Variablen in einer Funktion zuweisen, deklarieren Sie sie als global, bevor Sie sie ausführen. Nur als Referenz ist keine globale Deklaration erforderlich.

Also habe ich versucht, es in Code zu schreiben, indem ich es nachahmte. Wenn es sich um ein Bild in Java handelt,

IncrementsDemo.java


public class Main {
    public static int count = 1;
    
    void increments() {
        System.out.println(count);
        count++;
        System.out.println(count);
    }
    public static void main(String[] args) throws Exception {
        Main main = new Main();
        main.increments();
    }
}

Das Ausführungsergebnis ist

1
2

Ich habe das in Python geschrieben.

IncrementsDemo.py


count = 1

def increments():
    print(count)
    global count
    count += 1
    print(count)

increments()

Lass es uns laufen.

Main.py:5: SyntaxWarning: name 'count' is used prior to global declaration
  global count

Es ist eine Warnung, kein Fehler, sondern \ (^ o ^) / Wenn Sie so etwas googeln, können Sie neue Dinge lernen. (Zweite Entschuldigung

Aus diesem Grund habe ich Google durchsucht und einen Auszug aus der ersten Website, die angezeigt wurde erstellt. (Soweit der Beispielcode zu sehen ist, handelt es sich um die Python 2-Serie, aber ...)

Beachten Sie, dass der Name, der eine globale Variable in der globalen Anweisung angibt, nicht zuerst im selben Codeblock als lokale Variable verwendet werden darf. Sie können keine lokalen und globalen Variablen mit demselben Namen in einer Funktion haben.

Hey ~ _〆 (・ ∀ ・ *) Diesmal scheint es also sinnlos zu sein, global zu deklarieren, nachdem unmittelbar nach der Funktion auf count mit print verwiesen wurde.

Also habe ich versucht, es wie folgt zu beheben.

IncrementsDemo.py


count = 1

def increments():
    global count
    count += 1
    print(count)
    
print(count)
increments()

Führe es nochmals aus

1
2

Hmm, es ist geschafft. Wenn Sie eine globale Variable in einer Funktion verwenden, deklarieren Sie sie beim Zuweisen als global. Nicht erforderlich, wenn auf globale Variablen verwiesen wird. Es scheint besser, sich daran zu erinnern.

class Main:
    def __init__(self):
        self.count = 1

    def increments(self):
        print(self.count)
        self.count += 1
        print(self.count)

    @staticmethod
    def main():
        main = Main()
        main.increments()

Main.main()

Es ist eine große Sache, notieren Sie sich also, was Sie aus dem obigen Code gelernt haben.

Was bedeutet der für eine Funktion verwendete Unterstrich?

Der im Funktionsnamen verwendete Unterstrich hat eine anständige Bedeutung. Die Referenzseite ist hier.

Wenn mit zwei Unterstrichen definiert, diejenigen, die keine externen Referenzen erhalten. (Privat in Java?) Wenn es mit einem Unterstrich definiert ist, ist es üblich, nicht von außen darauf zu verweisen, aber es ist tatsächlich zugänglich.

Auf der Referenzseite wird auch die ordnungsgemäße Verwendung beschrieben. Ich habe den Eindruck, dass Sie es möglicherweise erst richtig verwenden können, wenn Sie sich persönlich daran gewöhnt haben ...

Was ist @staticmethod?

Dies nennt man einen Dekorateur. Ich habe es in dem Eindruck geschrieben, der später herauskommt, aber selbst wenn ich verschiedene Seiten lese, verstehe ich es nicht gut, deshalb werde ich hier aufhören zu schreiben ...

Lambda-Stil

Als nächstes über den Lambda-Ausdruck. Es wurde seit 8 für Java übernommen.

Java hat übrigens eine solche Form.

LambdaDemo.java


Hoge hoge = (name) -> {
  return "Hello " + name + "!";
};

Ich bin ein verdammt kleiner Fisch, Namekuji, der den Lambda-Stil nicht so gut beherrscht, also möchte ich den Lambda-Stil beherrschen ...

Zurück zur Geschichte: Lambda-Ausdrücke gibt es auch in Python. Hier ist das Ergebnis der Verwendung durch Nachahmung.

LambdaDemo.py


output = lambda name: 'Hello' + name + '!'
print(output('lambda'))

Das Ausführungsergebnis ist

Hello lambda!

Ist es leichter zu lesen als Java? Ich fühle mich wie. Ich habe jedoch einige Beispielcodes gesehen, die ich anwenden wollte, aber ich konnte sie überhaupt nicht verstehen. Später denke ich, es ist besser, härter zu lernen ...

Iterator

In Java ist es eine Schnittstelle, die Elemente in der Reihenfolge mit Map, List usw. verarbeitet. Es ist derjenige, der next (), hasNext (), remove () usw. verwendet.

Im Fall von Python scheint es verwendet zu werden, wenn Elemente wie Listen, Tabellen und Wörterbücher der Reihe nach verarbeitet werden.

Die Idee scheint die gleiche zu sein wie bei Java. Es ist jedoch fast keine Zeit, "Iterator" explizit in Java zu schreiben. (Ist es nur ich ...) Darüber hinaus hat Java 8 die Stream-API hinzugefügt. Warum also nicht immer mehr verwenden? Ich denke.

In Java habe ich das Gefühl, dass ich oft in der folgenden Form schreibe.

java::IteratorDemo.java


List<String> list = new ArrayList<>();
Collections.addAll(list, "Sun.", "Mon.", "Tues.", "Wed.", "Thurs.", "Fri.", "Sat.");

Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
  System.out.println(iterator.next());
}

java::IteratorDemo.java


List<String> list = new ArrayList<>();
Collections.addAll(list, "Sun.", "Mon.", "Tues.", "Wed.", "Thurs.", "Fri.", "Sat.");

for(Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {			 
    System.out.println(iterator.next());
}

(Es fühlt sich an, als könnten Sie Sätze als Liste erweitern!)

Ausführungsergebnis

Sun.
Mon.
Tues.
Wed.
Thurs.
Fri.
Sat.

Was passiert mit Python?

IteratorDemo.py


week = ['Sun.', 'Mon.', 'Tues.', 'Wed.', 'Thurs.', 'Fri.', 'Sat.']
iter_week = iter(week)

for i in iter_week:
    print(i)

Diese überwältigend kleine Anzahl von Eingabezeichen! Ich finde es sehr praktisch, die for-Anweisung zu verwenden, um zum nächsten Iterator überzugehen.

week = ['Sun.', 'Mon.', 'Tues.', 'Wed.', 'Thurs.', 'Fri.', 'Sat.']
for i in week:
    print(i)

Übrigens können Sie wie Java auch die nächste Funktion verwenden.

IteratorDemo.py


week = ['Sun.', 'Mon.', 'Tues.', 'Wed.', 'Thurs.', 'Fri.', 'Sat.']
iter_week = iter(week)

print(next(iter_week))
print(next(iter_week))
print(next(iter_week))
print(next(iter_week))
print(next(iter_week))
print(next(iter_week))
print(next(iter_week))

Dies verhält sich immer noch genauso wie das obige Ausführungsergebnis. Übrigens, im letzten Element, als ich die nächste Funktion wieder verwendete, bekam ich eine Ausnahme ** StopIteration **.

Ich habe es noch nicht gelernt, aber es scheint, dass es auch einen Versuch gibt ~ außer Syntax.

Generator

Es ist nicht in Java. Es scheint ein Verwandter des Iterators und ein wiederholbares Objekt zu sein. Es gibt Generatorfunktionen und Generatorausdrücke, und die Generatorfunktion wird als Generator bezeichnet. Die Generatorfunktion kann mithilfe des Schlüsselworts yield erreicht werden. Um ehrlich zu sein, ich verstehe es nicht wirklich, also habe ich es tatsächlich geschrieben.

Es ahmt das Beispiel [Python-izm] nach (https://www.python-izm.com).

YieldDemo.py


def func():
    yield('Guten Morgen')
    yield('Hallo')
    yield('Guten Abend')

f = func()
print(next(f))
print(next(f))
print(next(f))

Das Ausführungsergebnis ist

Guten Morgen
Hallo
Guten Abend

Übrigens, als ich die nächste Funktion wieder benutzte, bekam ich die Ausnahme ** StopIteration **.

Der Eindruck ist, dass es der Liste ähnlich ist.

Das Folgende ist ein Auszug aus der Erklärung von Python-izm.

Sie können die Schleifenverarbeitung mit> für usw. ausführen. Der Unterschied zur iterativen Verarbeitung mit einer Liste usw. besteht jedoch darin, dass der Wert jedes Mal so oft wie nötig generiert und zurückgegeben wird.

Dies scheint den Vorteil zu haben, dass der Generator weniger Speicher als die Liste verbraucht. Wenn Sie eine große Datenmenge verwenden, ist es außerdem besser, einen Generator als eine Liste zu verwenden. (Ich bin ein verdammt kleiner Fischprogrammierer, also glaube ich nicht, dass ich vorerst verschuldet sein werde ...)

Impressionen

Diesmal habe ich mich mit Funktionen (Methoden) befasst. Iteratoren und Generatoren scheinen ziemlich tief zu sein. Vielleicht hatte ich, als ich es tatsächlich versuchte, den Eindruck, dass es ziemlich schwierig sein würde.

Außerdem gab es eine Einführung des Dekorateurs (@), also las ich die Erklärung + Ich googelte die Punkte, die ich nicht verstehe. Infolgedessen konnte ich überhaupt nicht verstehen, was ich sagte, und hörte diesmal auf, über Dekorateure zu schreiben. (Hallo Wenn ich es verstehen kann, werde ich es diesem Artikel hinzufügen oder als neuen Artikel veröffentlichen.

Außerdem wäre es schön, einen Vergleich zwischen Pythons Einschlussnotation und Javas Stream forEach Processing + Lambda zu haben.

Ich habe einen Kommentar erhalten. Einschlussnotation? ?? ?? Ich habe darüber nachgedacht, war aber verwirrt mit "Was ist das ... Aufnahme? Erweiterung? Ich weiß nicht, wie es funktioniert ...". Es scheint, dass derjenige, der die Einschlussnotation nicht mit Python schreiben kann, nutzlos ist. Ich weiß nicht, ob es wahr ist (hey Ich denke darüber nach, dies zu diesem Artikel hinzuzufügen oder es zusammen mit dem Dekorateur als neuen Artikel zu veröffentlichen.

Recommended Posts

Ein Java-Programmierer studierte Python. (Über Funktionen (Methoden))
Ein Java-Programmierer studierte Python. (Über Typ)
Ein Java-Programmierer studierte Python. (Über Dekorateure)
Ein Java-Programmierer studierte Python. (für, if, while-Anweisung)
[Python] Memo über Funktionen
Eine Geschichte über das Ändern von Python und das Hinzufügen von Funktionen
Memorandum über Korrelation [Python]
Ein Memorandum über den Python-Mock
Ein Hinweis zu [Python] __debug__
[Python] Verwalten Sie Funktionen in einer Liste
Python: Ein Hinweis zu Klasse 1 "Abstract"
Über Python-Diktat und sortierte Funktionen
Definieren Sie Funktionen (Methoden) in Python dynamisch
Ein Hinweis zu Mock (Python-Mock-Bibliothek)
Ein bisschen mehr über Referenzen ~ Verwenden von Python und Java als Beispiele ~
Python-Funktionen
Eine Geschichte über Python Pop und Append
Über den 02. Februar 2020 * Dies ist ein Python-Artikel.
Ich habe eine Klasse in Python3 und Java geschrieben
Warum ich ein Java-Shop bin und Python starte
Ein Memo, das ich in Python zusammengeführt habe
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Datenanalyse in Python: Ein Hinweis zu line_profiler
Eine Geschichte über das Ausführen von Python auf PHP auf Heroku
Denken Sie daran, eine Python 3-Umgebung in einer Mac-Umgebung zu erstellen
Ein Memorandum über die Python-Tesseract-Wrapper-Bibliothek
Über Python-Slices
Über die Einschlussnotation von Python
Über Python tqdm.
Über die Python-Ausbeute
Über Python, Klasse
Über Go-Funktionen
Informationen zur Python-Vererbung
Über Python, range ()
Über Python Decorator
# Python-Grundlagen (Funktionen)
[Anfänger] Python-Funktionen
Informationen zur Python-Referenz
Über Python-Dekorateure
Python Einfach zu bedienende Funktionen
[Python] Über Multi-Prozess
Python-Grundlagen: Funktionen
Schreiben Sie über das Erstellen einer Python-Umgebung zum Schreiben von Qiita Qiita
Python zeigt aus der Perspektive eines C-Sprachprogrammierers
Die Geschichte, mit Python eine Hanon-ähnliche Partitur zu machen
Eine Geschichte über das Ausprobieren eines (Golang +) Python-Monorepo mit Bazel
Python: Ruft eine Liste der Methoden für ein Objekt ab
Ein Memo zum Erstellen einer Django (Python) -Anwendung mit Docker
Ein Memorandum über die Umsetzung von Empfehlungen in Python