Zusammenfassung der Unterschiede zwischen PHP und Python

Ein Memorandum über den Unterschied zwischen PHP und Python3

Der Unterschied zwischen PHP und Python wird aus Sicht von PHP als Memorandum zusammengefasst.

Kurz gesagt

Wie auch immer, Python ist kurz und einfach zu schreiben. Das gleiche Ergebnis wird ausgegeben, auch wenn es wie folgt konvertiert wird. Es bleibt nichts anderes übrig, als sich an diese Kultur zu gewöhnen, anstatt sie zu lernen.

Vor der Konvertierung


def test(v):
    r = []
    if v > 0:
        for i in range(v):
            r += [v - i]
    return r

Nach der Konvertierung


test = lambda v: [v - i for i in range(v)] if v > 0 else []

Es gibt auch Code Golf und es gibt einen Wettbewerb, um einen Kurzcode zu schreiben (siehe [hier] für Details (http://qiita.com/shibacho/items/37413a5d479d8bb57764)).

Interaktiver Modus

In Python3 können Sie eine Funktion namens Interaktiver Modus verwenden. Wenn Sie eine einzelne Codezeile eingeben, wird der Inhalt ausgewertet und ausgeführt. Getan werden. Wenn ein Fehler auftritt, wird vor Ort darauf hingewiesen, was für eine einfache Funktionsprüfung und -berechnung praktisch ist.

Array

Liste, Tupel, Diktat, Set

Ein Array, das in PHP selbstverständlich verwendet wurde. Python3 verfügt auch über ähnliche Funktionen wie list, tapple, dictionary und set, die jedoch je nach Verwendungszweck ordnungsgemäß verwendet werden müssen. Mit Ausnahme von Sets können Sie nicht nur Objekte, sondern auch Listen, Taples, Wörterbücher und Sets als Elemente wie PHP angeben.

Aufführen

Ein einfaches Array wie "$ a = [1, 2, 3];" in PHP kann in Python 3 mit "a = [1, 2, 3]" dargestellt werden. Mehrdimensional ist ebenfalls möglich. Jedes Element kann durch Setzen von "i, j, k = a" erhalten werden. Es ist jedoch erforderlich, ein Wörterbuch zu verwenden, um eine Funktion wie ein Referenzarray wie PHP zu realisieren.

Slice auflisten

PHP hat array_slice, aber Python 3 hat nützlichere Funktionen. Durch Setzen von "a = b [m: n]" kann das "n-1" -te Element aus dem "m" herausgeschnitten werden. Wenn m weggelassen wird, wird es von Anfang an sein, und wenn n weggelassen wird, wird es bis zum Ende sein. Wenn m und n negativ sind, können sie umgekehrt angegeben werden. Es gibt auch eine erweiterte Scheibe "a = b [:: m]", die jedes "m" erhalten werden kann.

a = [0, 1, 2, 3, 4, 5, 6, 7]
print(a[2:5])
print(a[4:])
print(a[:4])
print(a[-1:-4])
print(a[-1:])
print(a[:-4])
print(a[::3])
print(a[::-1])

Ausgabeergebnis


[2, 3, 4]
[4, 5, 6, 7]
[0, 1, 2, 3]
[4, 5, 6]
[4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6]
[0, 3, 6]
[7, 6, 5, 4, 3, 2, 1, 0]

Wenn Sie "a [1: 6: 3]" einstellen, können Sie vom 1. bis zum 5. ausschneiden und alle 3 weiteren herausnehmen.

Von der Zeichenfolge zur Liste

Wenn Sie sich an PHP gewöhnt haben, ist der Umgang mit Zeichenfolgen ein Problem. In Python3 kann es wie unten gezeigt in ein Array umgewandelt werden, sodass Zeichenfolgen einfach verarbeitet werden können.

a = "abcd"
b1 = list(a)
b2 = [a[i:i+2] for i in range(0, len(a), 2)]
print(b1, b2)

Ausgabeergebnis


['a', 'b', 'c', 'd'] ['ab', 'cd']

Tupel

Eine Liste, deren Werte grob gesagt nicht geändert werden können. Es kann definiert werden als "a = (1, 2, 3)", und Elemente können auf die gleiche Weise wie eine Liste erhalten werden, indem "i, j, k = a" gesetzt wird. Im Fall von PHP war es bei Rückgabewerten mehrerer Funktionen erforderlich, sich die Mühe zu machen, in einem Array zurückzukehren. Im Fall von Python3 geben Sie unter Verwendung dieser Eigenschaft mit einem Taple wie "return r1, r2, r3" an tun können.

Dikt

So etwas wie eine PHP-Referenzsequenz. Es kann beim Parsen von JSON verwendet werden. Nehmen Sie eine Python-Beschreibung wie "$ a = ['a' => 1, 'b' => 2];" als Beispiel in Python3: "a = {'a': 1, 'b': 2}" Kann ausgedrückt werden. Wenn Sie "i, j = a" setzen, können Sie auch den Schlüssel anstelle des Werts erhalten. Selbst wenn "b = Liste (a)" gesetzt ist, wird die Liste der Elemente, die aus den Schlüsseln von "a" bestehen, "b" zugewiesen.

einstellen

Beim Erstellen eines Arrays mit eindeutigen Elementen in PHP musste jedes Mal "array_unique" angewendet werden, wie "$ a = array_unique" ([1, 1, 2, 3, 3, 3]); `, Durch die Definition von "a = {1, 2, 3}" in Python3 wird keine Duplizierung garantiert, selbst wenn danach "a.add (1)" verwendet wird.

Beispiele für die Verwendung von Listen, Taples, Wörterbüchern und Sets in Python3

l1 = [1, 2, 3]
print(l1)
l2 = [4, 5, 6, l1]
print(l2)
print(11 + l2)
t1 = ("a", "b", "c")
print(t1)
t2 = ("d", l1, l2)
print(t2)
print(t1 + t2)
d1 = {'a':l1, 1:l2, "c":t1}
s1 = set(l1)
print(s1)
print({'d1':d1, 's1':s1})

Ausgabeergebnis


[1, 2, 3]
[4, 5, 6, [1, 2, 3]]
[1, 2, 3, [4, 5, 6, [...]]]
('a', 'b', 'c')
('d', [1, 2, 3, [4, 5, 6, [...]]], [4, 5, 6, [1, 2, 3, [...]]])
('a', 'b', 'c', 'd', [1, 2, 3, [4, 5, 6, [...]]], [4, 5, 6, [1, 2, 3, [...]]])
{1, 3, 5}
{1, 3, 5}
{'d1': {1: [4, 5, 6, [1, 2, 3, [...]]], 'c': ('a', 'b', 'c'), 'a': [1, 2, 3, [4, 5, 6, [...]]]}, 's1': {1, 3, 5}}

Da es im Ausgabeergebnis als "..." abgekürzt wird, ist die Methode zum Anzeigen, ohne es wegzulassen, hier Wird hilfreich sein.

Auswechslung

Unveränderlich veränderlich

Python3 hat das Konzept unveränderlich und veränderlich. Unveränderlich bedeutet, dass es nicht geändert werden kann, und veränderlich bedeutet, dass es geändert werden kann. Die oben genannten Tupel sind unveränderlich und Listen, Wörterbücher und Mengen sind veränderlich. Dies ist das Verhalten von "Zuweisung", das sich zwischen PHP und Python3 stark unterscheidet. Das Verhalten dieser Zuweisung in Python3 ähnelt dem in Ruby und ist in [hier] zusammengefasst (http://qiita.com/hiroykam/items/e11fbfaa6974ed9ffb08).

Python3-Zuweisung

In Python3 bedeutet Zuweisung "eine Einschränkung zwischen dem Ziel und dem Objekt vornehmen". Wenn Sie einer Variablen ein Objekt zuweisen, speichern Sie einen Verweis auf das Objekt in der Variablen. Das folgende Beispiel zeigt die Objekt-ID (Identifikationswert), wenn ein unveränderliches Objekt zugewiesen wird.

Für unveränderliche Objekte

Durch Manipulieren der Variablen "a" wird die "ID" von "a" geändert, die unveränderlich ist, da sie für das ganzzahlige Objekt "3" nicht geändert werden kann. Hier wird ein solches Objekt der Einfachheit halber als unveränderliches Objekt behandelt.

a = 3
print("id_3:%d, id_a:%d" % (id(3), id(a)))
b = a
print("id_b:%d" % id(b))
a += 1
print("id_3:%d, id_4:%d, id_a:%d, id_b:%d" % (id(3), id(4), id(a), id(b)))

Ausgabeergebnis


id_3:1623654960, id_a:1623654960
id_b:1623654960
id_3:1623654960, id_4:1623654992, id_a:1623654992, id_b:1623654960

Für veränderbare Objekte

Selbst wenn der Wert durch Manipulieren von "a" geändert wird, ist er dieselbe "ID" und kann in einen anderen Wert geändert werden. Das heißt, es ist veränderlich (veränderbar). Hier wird ein solches Objekt der Einfachheit halber als veränderliches Objekt behandelt. Wenn der Wert von "a" "b" zugewiesen wird, ist die "id" dieselbe. Wenn also der Wert durch Manipulieren von "a" geändert wird, ändert sich auch "b".

a = [1,2,3]
b = a
print("id_a:%d, id_b:%d" % (id(a), id(b)))
print(a, b)

a[1] = 4
print("id_a:%d, id_b:%d" % (id(a), id(b)))
print(a, b)

Ausgabeergebnis


id_a:4332032456, id_b:4332032456
[1, 2, 3] [1, 2, 3]
id_a:4332032456, id_b:4332032456
[1, 4, 3] [1, 4, 3]
Flache Kopie

Im Fall eines veränderlichen Objekts, wie im obigen Beispiel, ist, wenn der Wert von "a" "b" zugewiesen ist, die "id" dieselbe. Wenn also der Wert durch Manipulieren von "a" geändert wird, "b" `Ändert sich auch. Sie müssen eine Kopie erstellen, um den Wert von "b" unabhängig von "a" zu machen. Im Fall der Liste oder des Arrays in diesem Beispiel kann dies durch Erstellen einer flachen Kopie realisiert werden. Im folgenden Beispiel ändert sich durch Erstellen einer flachen Kopie der Wert von "b" nicht, selbst wenn der Wert durch die Operation "a" geändert wird. Eine flache Kopie kann durch Ersetzen der Funktion "copy.copy" oder "a [:]" erstellt werden.

import copy as cp

a = [1,2,3]
b = cp.copy(a)
print("id_a:%d, id_b:%d" % (id(a), id(b)))
print(a, b)

a[1] = 4
print("id_a:%d, id_b:%d" % (id(a), id(b)))
print(a, b)

b = a[:]
print("id_a:%d, id_b:%d" % (id(a), id(b)))
print(a, b)

a[1] = 3
print("id_a:%d, id_b:%d" % (id(a), id(b)))
print(a, b)

Ausgabeergebnis


id_a:4460690760, id_b:4460690888
[1, 2, 3] [1, 2, 3]
id_a:4460690760, id_b:4460690888
[1, 4, 3] [1, 2, 3]
id_a:4460690760, id_b:4460691272
[1, 4, 3] [1, 4, 3]
id_a:4460690760, id_b:4460691272
[1, 3, 3] [1, 4, 3]
Fälle, in denen flaches Kopieren nicht ausreicht

Im folgenden Beispiel, in dem das Element der Liste eine Liste und das Element des Arrays ein Array enthält, dh, es gibt ein anderes veränderbares Objekt aus dem veränderlichen Objekt, können Sie "a [0]" ausführen, selbst wenn Sie eine flache Kopie erstellen. Der Wert von "b [0]" wird geändert. Dies verhält sich für Python 3.6 und Ruby 2.4 gleich.

import copy as cp

a = [[1,2,3], "abc"]
b = cp.copy(a)
print("id_a:%d, id_b:%d" % (id(a), id(b)))
print("id_a[0]:%d, id_b[0]:%d" % (id(a[0]), id(b[0])))
print("id_a[1]:%d, id_b[1]:%d" % (id(a[1]), id(b[1])))
print(a, b)

a[0][1] = 4
a[1] = "def"
print("id_a:%d, id_b:%d" % (id(a), id(b)))
print("id_a[0]:%d, id_b[0]:%d" % (id(a[0]), id(b[0])))
print("id_a[1]:%d, id_b[1]:%d" % (id(a[1]), id(b[1])))
print(a, b)

b = a[:]
print("id_a:%d, id_b:%d" % (id(a), id(b)))
print("id_a[0]:%d, id_b[0]:%d" % (id(a[0]), id(b[0])))
print("id_a[1]:%d, id_b[1]:%d" % (id(a[1]), id(b[1])))
print(a, b)

a[0][1] = 3
a[1] = "abc"
print("id_a:%d, id_b:%d" % (id(a), id(b)))
print("id_a[0]:%d, id_b[0]:%d" % (id(a[0]), id(b[0])))
print("id_a[1]:%d, id_b[1]:%d" % (id(a[1]), id(b[1])))
print(a, b)

Ausgabeergebnis


id_a:4393106888, id_b:4393107272
id_a[0]:4393106760, id_b[0]:4393106760
id_a[1]:4391239728, id_b[1]:4391239728
[[1, 2, 3], 'abc'] [[1, 2, 3], 'abc']
id_a:4393106888, id_b:4393107272
id_a[0]:4393106760, id_b[0]:4393106760
id_a[1]:4392739984, id_b[1]:4391239728
[[1, 4, 3], 'def'] [[1, 4, 3], 'abc']
id_a:4393106888, id_b:4393112648
id_a[0]:4393106760, id_b[0]:4393106760
id_a[1]:4392739984, id_b[1]:4392739984
[[1, 4, 3], 'def'] [[1, 4, 3], 'def']
id_a:4393106888, id_b:4393112648
id_a[0]:4393106760, id_b[0]:4393106760
id_a[1]:4391239728, id_b[1]:4392739984
[[1, 3, 3], 'abc'] [[1, 3, 3], 'def']
Tiefe Kopie

Wenn ein veränderbares Objekt ein anderes veränderbares Objekt enthält, bei dem es sich um eine "flache Kopie ist nicht genug" handelt, müssen Sie eine tiefe Kopie anstelle einer flachen Kopie erstellen, um den Wert von "b" nach "a" vollständig zu kopieren. Es gibt. Eine tiefe Kopie kann mit copy.deepcopy erreicht werden.

import copy as cp

a = [[1,2,3], "abc"]
b = cp.deepcopy(a)
print("id_a:%d, id_b:%d" % (id(a), id(b)))
print("id_a[0]:%d, id_b[0]:%d" % (id(a[0]), id(b[0])))
print("id_a[1]:%d, id_b[1]:%d" % (id(a[1]), id(b[1])))
print(a, b)

a[0][1] = 4
a[1] = "def"
print("id_a:%d, id_b:%d" % (id(a), id(b)))
print("id_a[0]:%d, id_b[0]:%d" % (id(a[0]), id(b[0])))
print("id_a[1]:%d, id_b[1]:%d" % (id(a[1]), id(b[1])))
print(a, b)

Ausgabeergebnis


id_a:4306767304, id_b:4306767688
id_a[0]:4306767176, id_b[0]:4306773064
id_a[1]:4304900144, id_b[1]:4304900144
[[1, 2, 3], 'abc'] [[1, 2, 3], 'abc']
id_a:4306767304, id_b:4306767688
id_a[0]:4306767176, id_b[0]:4306773064
id_a[1]:4306400400, id_b[1]:4304900144
[[1, 4, 3], 'def'] [[1, 2, 3], 'abc']

PHP-Zuordnung

Bei PHP wird der Wert der Variablen auf der rechten Seite durch Zuweisen auf den Wert der Variablen auf der linken Seite kopiert. Es verhält sich wie eine tiefe Kopie von Python 3. Darüber hinaus kann eine Zuweisung durch Referenz wie "$ a = & $ b;" in PHP in Python3 nicht realisiert werden.

<?php

$a = [3];
$b = &$a;
$a = [5];
print_r($a);
print_r($b);

Ausgabeergebnis


Array
(
    [0] => 5
)
Array
(
    [0] => 5
)

Im obigen Beispiel ändern sich die Referenzwerte von $ b und $ a nicht, selbst wenn "$ a = [5];".

Syntaxbezogen

Doppelzitat, Einfachzitat

In PHP wurden bei doppelten Anführungszeichen Sonderzeichen und Variablen in der Zeichenfolge ersetzt, bei einfachen Anführungszeichen nicht. In Python3 wird das Escape-Zeichen ersetzt und in beiden Fällen ausgegeben. Um einen Austausch zu vermeiden, stellen Sie "r" oder "R" voran.

Für PHP

<?php
print("a\r\nb");
print('a\r\nb');

Ausgabeergebnis


a
ba\r\nb

Für Python 3

print("a\r\nb")
print('a\r\nb')
print(r"a\r\nb")
print(R"a\r\nb")

Ausgabeergebnis


a
b
a
b
a\r\nb
a\r\nb

Ungleichheit

Notation von $ a> 0 && $ a <10 im bedingten Ausdruck in PHP. In Python3 möchte ich auch "a> 0" und "a <10" setzen, aber es kann vereinfacht werden als "0 <a <10".

Binäroperator

Formate wie "$ a = $ f?" Hallo ":" Welt ", die in PHP bekannt sind. In Pyhon3 lautet das Format "a =" Hallo ", wenn" sonst "Welt". Die Funktion besteht darin, "if" und "else" mit dem ternären Operator zu verwenden.

Inkrementieren Dekrementieren

In Python3 führen Formate wie "i ++" und "i -" zu einem Fehler. Das Inkrement ist "i + = 1" oder "i- = 1".

foreach Foreach und Python3, die in PHP unverzichtbar sind, können mit for dasselbe oder besser machen, wie im folgenden Beispiel gezeigt.

Python3 zum Beispiel

print("Muster 1")
for v in range(1, 4):
    print(v)

print("Muster 2")
for v in [x for x in range(4, 1, -1)]:
    print(v)

print("Muster 3")
for v in (1, 2, 3):
    print(v)

print("Muster 4")
for k, v in enumerate([1, 2, 3]):
    print(k, v)

print("Muster 5")
for k, v in {"a":1, "b":2}.items():
    print(k, v)

print("Muster 6")
for k in {"a":1, "b":2}.keys():
    print(k)

print("Muster 7")
for v in {"a":1, "b":2}.values():
    print(v)

print("Muster 8")
for v in [1, 2]:
    print(v)
else:
    print("else", v)

print("Muster 9")
for v in [1, 2]:
    print(v)
    break
else:
    print("else", v)

print("Muster 10")
for v in [1, 2]:
    print(v)
    continue
else:
    print("else", v)

print("Muster 11")
for v1, v2, v3, v4 in zip([1, 2], (2, 1, 3), {1:"d", 2:"i", 3:"c"}, {"s", "e", "t"}):
    print(v1, v2, v3, v4)

print("Muster 12")
for v1, v2 in zip([1, 2], [3, 4, 5, 6]):
    print(v1, v2)

print("Muster 13")
import itertools as it
for v1, v2 in it.zip_longest([1, 2], [3, 4, 5, 6]):
    print(v1, v2)

Ausgabeergebnis


Muster 1
1
2
3
Muster 2
4
3
2
Muster 3
1
2
3
Muster 4
0 1
1 2
2 3
Muster 5
a 1
b 2
Muster 6
a
b
Muster 7
1
2
Muster 8
1
2
else 2
Muster 9
1
Muster 10
1
2
else 2
Muster 11
1 2 1 s
2 1 2 e
Muster 12
1 3
2 4
Muster 13
1 3
2 4
None 5
None 6

range Abgesehen davon hat range unterschiedliche Grenzwerte zwischen PHP und Python3.

Für PHP
<?php
print_r(range(0, 10, 2));

Ausgabeergebnis


Array
(
    [0] => 0
    [1] => 2
    [2] => 4
    [3] => 6
    [4] => 8
    [5] => 10
)
Für Python 3
print(list(range(0, 10, 2)))

Ausgabeergebnis


[0, 2, 4, 6, 8]

Schließung

Es gibt einen Unterschied zwischen PHP und Python3. Beschrieben unter dem Gesichtspunkt des Codevergleichs durch Unterteilung in Muster.

Funktionsdefinition innerhalb einer Funktion

Für PHP

Die Funktion "inner" hat eine Namensauflösung und kann von außen aufgerufen werden. Die Manipulation von extern definierten Variablen innerhalb der "inneren" Funktion hat keine Auswirkung auf die Außenseite, es sei denn, sie wird als Referenz übergeben. Außerdem werden außerhalb definierte Variablen als außerhalb des Gültigkeitsbereichs behandelt.

<?php

function outer($arg1)
{
    $out1 = 3;
    
    function inner($arg1, $arg2, &$arg3)
    {
        $arg1 += isset($out1) ? $out1 : -1;
        $arg2 += 5;
        $arg3 += 11;
        print($arg1. " : inner arg1\n");
        print($arg2. " : inner arg2\n");
        print($arg3. " : inner arg3\n");
    }

    inner($arg1, $arg1, $out1);
    print($arg1. " : outer arg1\n");
    print($out1. " : outer out1\n");
}

outer(10);
$a = 13;
inner(1, 7, $a);
print($a. " : a");

Ausgabeergebnis


9 : inner arg1
15 : inner arg2
14 : inner arg3
10 : outer arg1
14 : outer out1
0 : inner arg1
12 : inner arg2
24 : inner arg3
24 : a
Für Python 3

Da der Name der "inneren" Funktion nicht aufgelöst wird, muss der Rückgabewert von "äußere" abgerufen und aufgerufen werden, um die "innere" Funktion von außen aufzurufen. Sie können auch auf extern definierte Variablen zugreifen. Wie Sie aus dem Ergebnis von 15: inner arg1 sehen können, ist out1 [14] und der vorherige Status wird gespeichert.

def outer(arg1):
    out1 = [3]

    def inner(arg1, arg2, arg3):
        arg1 += -1 if out1 is None else out1[0]
        arg2 += 5
        arg3[0] += 11
        print(arg1, "inner arg1", sep=" : ")
        print(arg2, "inner arg2", sep=" : ")
        print(arg3[0], "inner arg3", sep=" : ")

    inner(arg1, arg1, out1)
    print(arg1, "outer arg1", sep=" : ")
    print(out1[0], "outer out1", sep=" : ")

    return inner

f = outer(10)
a = [13]
f(1, 7, a)
print(a[0], "a", sep=" : ")

Ausgabeergebnis


13 : inner arg1
15 : inner arg2
14 : inner arg3
10 : outer arg1
14 : outer out1
15 : inner arg1
12 : inner arg2
24 : inner arg3
24 : a

Anonyme Funktion

Für PHP

Der Einfachheit halber wird die anonyme Funktion zweimal definiert. Der Abschluss wird mit der Funktion "Outer" zurückgegeben, und der Abschluss wird mit "array_map" auch innerhalb des Verschlusses definiert. Auf extern definierte Variablen kann mit use zugegriffen werden.

<?php

function outer($arg1)
{
    $out = 2;
    return function ($arg2) use ($arg1, $out) {
        $a = [0 => $arg1, 1 => $arg1 * 2, 2 => $arg1 * 3];
        return array_map(function ($k, $v) use ($arg2, $out) {
            return ($v + $arg2) * $k + $out;
        }, array_keys($a), array_values($a));
    };
}

$f = outer(1);
print_r($f(3));

Ausgabeergebnis


Array
(
    [0] => 2
    [1] => 7
    [2] => 14
)
Für Python 3

Geben Sie den Verschluss mit der Funktion "Outer" wie in PHP zurück. Anonyme Funktionen können mit "Lambda" definiert werden, es gibt jedoch eine Einschränkung, dass Variablen nicht definiert werden können.

def outer(arg1):
    out = 2
    def inner(arg2):
        a = {0:arg1, 1:arg1 * 2, 2:arg1 * 3}
        return map(lambda v: (v[1] + arg2) * v[0] + out, a.items())
    return inner

f = outer(1)
print(list(f(3)))

Ausgabeergebnis


[2, 7, 14]

Variable Variable, variable Funktion

Variable Variablen und Funktionen, die manchmal in PHP verwendet wurden. Vergleichen wir den Code für PHP und Python3.

Für PHP

<?php

$a1 = "b1";
$b1 = "test1";

$a2 = "b2";

function b2 () {
    print("test2");
}

print($$a1. "\n");
print($a2());

Ausgabeergebnis


test1
test2

Für Python 3

Die Benutzerfreundlichkeit unterscheidet sich von PHP, aber das Gleiche kann erreicht werden.

a1 = "b1"
b1 = "test1"

a2 = "b2"

def b2():
    print("test2")

print(locals()[a1])
print(globals()[a1])
print(eval(a1))
locals()[a2]()
globals()[a2]()
eval(a2)()

Ausgabeergebnis


test1
test1
test1
test2
test2
test2

Dekorateur

Ich war verwirrt, als ich mir den Python 3-Code auf GitHub ansah, also eine kurze Anmerkung. Wie der Name schon sagt, schmückt es.

def deco1(func):
    def overwrite():
        print("overwrite is called")
        func()
    return overwrite

def deco2(func):
    import functools
    @functools.wraps(func)
    def overwrite(*args,**kwargs):
        print("overwrite2 is called")
        func(*args,**kwargs)
    return overwrite

@deco1
def test1():
    print('test1 is called')
test1()
print(test1.__name__)

@deco2
def test2():
    print('test2 is called')
test2()
print(test2.__name__)

Hier ist leicht verständlich organisiert.

Anmerkung

Anmerkungen, die Sie bei der Verwendung von PHPDoc hören. Es kann mit Python3 verwendet werden, aber es kann auch für verschiedene Dinge wie Generika verwendet werden. Wenn Sie mit diesen Funktionen nicht vertraut sind, werden Sie verwirrt, wenn Sie sich den Python-Code ansehen. Daher möchte ich die Funktionen selbst kennen. Klicken Sie hier für Details (http://qiita.com/icoxfog417/items/c17eb042f4735b7924a3)

Listenoperation mit Map, Filter, Reduce

Funktionen höherer Ordnung sind sowohl in PHP als auch in Python3 verfügbar. Es scheint kaum einen Unterschied zu geben.

map Zunächst für "map" ein Verarbeitungsbeispiel, das alle Elemente des Arrays quadriert.

Für PHP
<?php

$r1 = array_map(function($n) {
    return $n ** 2;
}, range(1, 9));
print_r($r1);

Ausgabeergebnis


Array
(
    [0] => 1
    [1] => 4
    [2] => 9
    [3] => 16
    [4] => 25
    [5] => 36
    [6] => 49
    [7] => 64
    [8] => 81
)
Für Python 3

Dies kann auch durch Einschlussnotation realisiert werden.

r11 = list(map(lambda n: n ** 2, range(1, 10)))
r12 = [n ** 2 for n in range(1, 10)]
print(r11)
print(r12)

Ausgabeergebnis


[1, 4, 9, 16, 25, 36, 49, 64, 81]
[1, 4, 9, 16, 25, 36, 49, 64, 81]

filter Ein Beispiel, das Elemente mit nur geraden Werten extrahiert.

Für PHP
<?php

$r2 = array_filter(range(1, 9), function($n) {
    return $n % 2 == 0;
});
print_r($r2);

Ausgabeergebnis


Array
(
    [1] => 2
    [3] => 4
    [5] => 6
    [7] => 8
)
Für Python 3

Dies kann sowohl durch die Einschlussnotation als auch durch "Karte" realisiert werden.

r21 = list(filter(lambda n: n % 2 == 0, range(1, 10)))
r22 = [n for n in range(1, 10) if n % 2 == 0]
print(r21)
print(r22)

Ausgabeergebnis


[2, 4, 6, 8]
[2, 4, 6, 8]

reduce Es gibt ein Gefühl der Inkongruenz, wenn es als Falten oder Verringern übersetzt wird, also interpretiere ich es so. Ist es in Rubin "injizieren"? Hier ist ein Beispiel, in dem die Elemente als Ganzzahlen aufgelistet sind.

Für PHP
<?php

$r3 = array_reduce(range(1, 9), function($a, $b) {
    return $a * 10 + $b;
}, 0);
print_r($r3);

Ausgabeergebnis


123456789
Für Python 3

Benötigt functools.

from functools import reduce

r3 = reduce(lambda a, b: a * 10 + b, range(1, 10))
print(r3)

Ausgabeergebnis


123456789

Andere

PHP hat mehr Funktionen vom Typ Array, aber ich frage mich oft, was ich verwenden soll und wo ich es verwenden soll. Verwendet oft array_walk als Haupt.

Reguläre Ausdrücke

Einführung

Um einen regulären Ausdruck im PCRE-Format zu verwenden, muss das Muster in PHP in einem Trennzeichen eingeschlossen sein. Am Beispiel einer 4-stelligen Zahl wird das Muster als "/ \ d {4} /" ausgedrückt. Fügen Sie andererseits in Python3 zuerst "r" zu der Zeichenfolge hinzu, die zum Muster wird. Auf diese Weise wird r" \ n " nicht als Zeilenvorschubcode behandelt, sondern kann als Zeichenfolge aus \ (Schrägstrich) und n interpretiert werden. Wenn r nicht hinzugefügt wird, muss es" \\\\ n " sein. Außerdem wird das Muster für reguläre Ausdrücke kompiliert und als Objekt für reguläre Ausdrücke mit "re.compile (" / \ d {4} / ")" verwendet ("import re" ist erforderlich).

Über Funktionsvergleich

Eine einfache Ähnlichkeitsvergleichstabelle zwischen PHP und Python 3 sieht folgendermaßen aus:

PHP Python Bemerkungen
preg_match re.findall re.Wenn im Muster eine Menge angegeben ist, tippt findall auf die Elemente des Arrays, und die Mengenelemente werden dort angezeigt.
re.match re.Übereinstimmung bestätigt Übereinstimmung nur am Anfang
re.search re.Die Suche kann an einer beliebigen Stelle in der Zeichenfolge erfolgen
preg_replace re.sub Das erste übereinstimmende Zeichen ist${1}(PHP)、\1Anders als (Python)
preg_replace_callback re.Das Argument repl von sub kann eine Zeichenfolge oder eine Funktion sein
preg_split re.split

Andere

Der Umgang mit regulären Ausdrücken in PHP und Python3 ist in [hier] zusammengefasst (http://qiita.com/hiroykam/items/e42a050c56a5fbf08247).

klassenbezogen

private、protected Python 3 ist weder privat noch geschützt. Fügen Sie daher für den üblichen Betrieb ein oder zwei Unterbalken (_) hinzu.

class Test(object):
    def __init__(self):
        self.value = "value"
        self._value = "_value"
        self.__value = "__value"

    def method(self): print("method")
    def _method(self): print("_method")
    def __method(self): print("__method")

t = Test()
print(t.value)
print(t._value)
print(t._Test__value)
t.method()
t._method()
t._Test__method()

Ausgabeergebnis


value
_value
__value
method
_method
__method

Klassen- und statische Methoden

Statische Methoden sind bei der Verwendung von PHP bekannt. Der Unterschied zur statischen Methode besteht darin, ob Class selbst als erstes Argument empfangen werden soll. Es ist leicht zu bestimmen, aus welcher Klasse es ausgeführt wird. Im Gegensatz zu PHP kann es von einer Instanz der Klasse aufgerufen werden. Für beide ist ein Dekorateur erforderlich.

class MyParent(object):
    var = "parent"

    @staticmethod
    def static_test(called):
        print(called, MyParent.var)

    @classmethod
    def class_test(cls, called):
        print(called, cls.var)


class MyChild(MyParent):
    var = "child"

    def test(self):
        print("child test")

MyParent.class_test("Parent")
MyParent.static_test("Parent")
MyParent.class_test("Child")
MyParent.static_test("Child")

p = MyParent()
c = MyChild()
p.static_test(p.__class__)
p.class_test(p.__class__)
c.static_test(c.__class__)
c.class_test(c.__class__)

Ausgabeergebnis


Parent parent
Parent parent
Child parent
Child parent
<class '__main__.MyParent'> parent
<class '__main__.MyParent'> parent
<class '__main__.MyChild'> parent
<class '__main__.MyChild'> child

Ergänzung

Wenn Sie eine Klassenmethode wie Python3 in PHP implementieren, sieht es folgendermaßen aus: In diesem Fall kann das gleiche Ergebnis erzielt werden, indem "new static ()" in "new self ()" geändert wird.

<?php

class MyParent
{
    public $var = "parent";

    public static function class_method($called) {
        $cls = new static();
        print($called. " ". $cls->var. "\n");
    }
}

class MyChild extends MyParent
{
    public $var = "child";
}

MyParent::class_method("Parent");
MyChild::class_method("Child");

Ausgabeergebnis


Parent parent
Child child

mit Syntax

Python 3 hat eine Syntax mit.

Legacy-Schreiben

Es ist ähnlich wie bei PHP.

file = open("filename")
try:
    print(file.read())
finally:
   file.close()

Wie schreibe ich mit der with-Syntax

Es wird sehr einfach sein.

with open("filename") as file:
  print(file.read())

Stellen Sie sicher, dass Klasseninstanzen der Syntax entsprechen

Sie können Klasseninstanzen mit Syntax behandeln, indem Sie in der Klasse "enter" und "exit" definieren.

class WithTest:
    def __init__(self, name):
        self._name = name

    def print(self):
        print(self._name)

    def __enter__(self):
        return self

    def __exit__(self, type, value, traceback):
        print("end of with statement!")

with WithTest("With Statement!") as t:
    t.print()

Ausgabeergebnis


With Statement!
end of with statement!

Iterator und Generator

Iterator, der relativ zum zeilenweisen Lesen und Verarbeiten von Dateien wie CSV verwendet wird, um Taples aus einer Tabelle zu extrahieren und einzeln zu verarbeiten. Sowohl PHP als auch Python haben Iteratoren und Generatoren, aber bereiten Sie den Code tatsächlich vor und versuchen Sie festzustellen, ob es einen Unterschied gibt.

Iterator

Python 3 kann auf die gleiche Weise wie PHP implementiert werden. Python 3 verfügt jedoch standardmäßig über eine integrierte Funktion.

Für PHP

Es ist etwas ärgerlich, weil es die Iterator-Schnittstelle implementiert, sodass Sie nur "next" und andere Methoden definieren müssen.

<?php

class MyIterator implements Iterator
{
    private $var = [];

    public function __construct($array)
    {
        if (is_array($array)) {
            $this->var = $array;
        }
    }

    public function rewind()
    {
        reset($this->var);
    }
  
    public function current()
    {
        return current($this->var);
    }
  
    public function key() 
    {
        return key($this->var);
    }
  
    public function next() 
    {
        return next($this->var);
    }
  
    public function valid()
    {
        $key = key($this->var);
        return ($key !== NULL && $key !== FALSE);
    }
}

$iter = new MyIterator([1, 2, 3, 4, 5]);
foreach ($iter as $k => $v) {
    print("$k: $v\n");
}

Ausgabeergebnis


0: 1
1: 2
2: 3
3: 4
4: 5
Für Python 3

Es kann einfacher als PHP implementiert werden, aber seien Sie vorsichtig, da Sie nach Abschluss des Vorgangs "StopIteration" auslösen müssen.

class MyIterator:
    def __init__(self, *numbers):
        self._numbers = numbers
        self._i = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self._i == len(self._numbers):
            raise StopIteration()
        v = self._numbers[self._i]
        self._i += 1
        return v

iter = MyIterator(1, 2, 3, 4, 5)
for i, num in enumerate(iter):
    print("{0}:{1}".format(i, num))

Ausgabeergebnis


0:1
1:2
2:3
3:4
4:5

Generator

Generatoren sind auch in Python 3 und PHP (5.5+) verfügbar. Im Beispiel hier werden die folgenden Dateien gelesen.

numbers.txt


zero
one
two
three
four
five
Grundlegende Implementierungsmethode

Die Implementierungsmethode ist für PHP und Python3 nahezu identisch.

Für PHP
<?php

function my_generator($name)
{
    $file = fopen($name, "r");

    if ($file) {
        while ($line = fgets($file)) {
            yield $line;
        }
    }
    fclose($file);
}

$g = my_generator("numbers.txt");
foreach ($g as $k => $v) {
    print($k. ":". $v);
}

Ausgabeergebnis


0:zero
1:one
2:two
3:three
4:four
5:five
Für Python 3
def my_generator(name):
    with open(name) as lines:
        for line in lines:
           yield line

g = my_generator("numbers.txt")
for k, v in enumerate(g):
    print("{0}:{1}".format(k, v), end="")

Ausgabeergebnis


0:zero
1:one
2:two
3:three
4:four
5:five
Senden Sie Daten bei jedem Anruf

Es ist dasselbe, da es von "send" gesendet wird, aber die Benutzerfreundlichkeit unterscheidet sich zwischen PHP und Python.

Für PHP

Ein Bild, das Daten an "Yield" sendet. Das Ausgabeergebnis ist das gleiche wie bei der "grundlegenden Implementierungsmethode".

<?php

function my_generator()
{
    $k = 0;
    while (true) {
        $v = yield;
        print($k++. ":". $v);
    }
}

$g = my_generator();
$file = fopen("numbers.txt", "r");
if ($file) {
    while ($line = fgets($file)) {
        $g->send($line);
    }
}
Für Python 3

Ein Bild, das Daten an die durch "Yield" angegebene Variable sendet. Es scheint sich von PHP darin zu unterscheiden, dass es notwendig ist, "next" einmal auszuführen, um an die Position "Ausbeute" zu gelangen. Das Ausgabeergebnis ist das gleiche wie bei der "grundlegenden Implementierungsmethode".

def my_generator():
    k, v = 0, ""
    while True:
        v = yield v
        print("{0}:{1}".format(k, v), end="")
        k += 1

g = my_generator()
g.__next__()
with open("numbers.txt") as lines:
    for line in lines:
        g.send(line)
Subgenerator

Sie können rekursive Logik mit "Ausbeute von" erreichen.

Für PHP

Implementiert von PHP7. Das Ausgabeergebnis ist das gleiche wie bei der "grundlegenden Implementierungsmethode". Es gibt nicht viel Verdienst beim Lesen von Dateien, aber bei Operationen wie Arrays scheint es, dass es Python 3 entsprechen kann.

<?php

function my_generator($name)
{
    $from = function () use ($name) {
        $file = fopen($name, "r");

        if ($file) {
            while ($line = fgets($file)) {
                yield $line;
            }
        }
        fclose($file);
    };

    yield from $from();
}

$g = my_generator("numbers.txt");
foreach ($g as $k => $v) {
    print($k. ":". $v);
}
Für Python 3

Das Ausgabeergebnis ist das gleiche wie bei der "grundlegenden Implementierungsmethode". Die "grundlegende Implementierungsmethode" macht Schleifen überflüssig und vereinfacht dies.

def my_generator(name):
    with open(name) as lines:
        yield from lines

g = my_generator("numbers.txt")
for k, v in enumerate(g):
    print("{0}:{1}".format(k, v), end="")

interface、abstract In Python3 gibt es keine Schnittstelle wie PHP. Da Python3 mehrfach vererbt werden kann, erscheint es zunächst unnötig. In Python3 können abstrakte Klassen mit dem Modul ABC (Abstract Base Class) implementiert werden. Darüber hinaus scheint Trait für Python 3 nicht erforderlich zu sein, da eine Mehrfachvererbung möglich ist.

Implementierungsbeispiel für eine abstrakte Methode in Python3

Um eine abstrakte Methode bereitzustellen, ist die Klassenmetaklasse (angegeben durch "metaclass") "ABCMeta" oder erbt sie. Aus dem folgenden Ausgabeergebnis können Sie auch eine abstrakte Methode in einer abstrakten Klasse implementieren. Selbst wenn sie in einer Unterklasse nicht definiert ist, tritt kein Fehler auf.

python


from abc import *


class MyAbstract(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def test1(self):
        print("method")

    @staticmethod
    @abstractmethod
    def static_test():
        print("static_method")

    @classmethod
    @abstractmethod
    def class_test(cls):
        print("class_method")


class Test(MyAbstract):
    pass

MyAbstract.static_test()
MyAbstract.class_test()
Test.static_test()
Test.class_test()

p = MyAbstract()
p.test1()
t = Test()
t.test1()

Ausgabeergebnis


static_method
class_method
static_method
class_method
method
method

Wenn Sie dasselbe Verhalten wie bei PHP erwarten, kann eine ähnliche Operation ausgeführt werden, indem in der Methode der übergeordneten Klasse Folgendes definiert wird.

def test1(self):
    raise NotImplementedError("error message")

Virtuelle Unterklasse

Eine andere Methode besteht darin, eine Klasse vorzubereiten, die die Klassenmethode "subclasshook" wie unten gezeigt überschreibt, und zu überprüfen, ob die Methode durch die integrierte Funktion "issubclacss" definiert ist. Der Scheck wird durch "Registrieren" bestanden.

from abc import ABCMeta

class MyAbstract(metaclass=ABCMeta):
    @classmethod
    def __subclasshook__(cls, C):
        if cls is MyAbstract:
            if any("test" in B.__dict__ for B in C.__mro__):
                return True
        return NotImplemented


class A(object):
    pass


class B(object):
    def test(self):
        print("test")

print(issubclass(A, MyAbstract))
print(issubclass(B, MyAbstract))

MyAbstract.register(A)
print(issubclass(A, MyAbstract))

Ausgabeergebnis


False
True
True

Magische Methode

PHPs Magic Method ist der sogenannte Python3 Data Model Special Method Name. /3.6/reference/datamodel.html#special-method-names). Es gibt viele ähnliche Elemente, wie z. B. "__toString" von PHP, das dem "str" von Python3 entspricht.

Zugriff auf undefinierte oder nicht zugängliche Eigenschaftsmethoden

Für PHP

Sie können die Eigenschaften eines Objekts mit get_object_vars abrufen.

<?php

class Magic
{
    public function __get($name)
    {
        return 0;
    }
    
    public function __call($name, $arguments)
    {
        print($arguments[0]. "\n");
    }
}

$m = new Magic();
print($m->x. "\n");
$m->x = 10;
print($m->x. "\n");
print($m->test(20));
print_r(get_object_vars($m));

Ausgabeergebnis


0
10
20
Array
(
    [x] => 10
)
Für Python 3

Da die Instanzvariable in __dict__ gespeichert ist, kann ihr Inhalt mit der eingebauten Funktion vars abgerufen werden.

class Magic(object):
    def __getattr__(self, name):
        class Callable(int):
            def __call__(self, *arguments):
                print(arguments[0])
        return Callable(0)

m = Magic()
print(m.x)
m.x = 10
print(m.x)
m.test(20)
print(vars(m))

Ausgabeergebnis


0
10
20
{'x': 10}

Setter/Getter Nebenbei können Sie in Python 3 Setter / Getter auch auf folgende Weise definieren.

class Magic(object):
    def __init__(self):
        self._x = 0
        self._y = 0

    def getx(self):
        return self._x

    def setx(self, value):
        self._x = value

    x = property(getx, setx)

    @property
    def y(self):
        return self._y

    @y.setter
    def y(self, value):
        self._y = value

m = magic()
print(m.x)
print(m.y)
m.x = 10
m.y = 20
print(m.x)
print(m.y)

Ausgabeergebnis


0
0
10
20

Recommended Posts

Zusammenfassung der Unterschiede zwischen PHP und Python
Zusammenfassung der Unterschiede zwischen Python und PHP (Vergleichstabelle der Hauptelemente)
Eine grobe Zusammenfassung der Unterschiede zwischen Windows und Linux
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
Python - Erläuterung und Zusammenfassung der Verwendung der 24 wichtigsten Pakete
Die Geschichte von Python und die Geschichte von NaN
Unterschied zwischen Python, Stftime und Strptime
Zusammenfassung der Python-Indizes und -Slices
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Zusammenfassung der Unterschiede zwischen Ruby on Rails und Django ~ Basics ~
Unterschied in der Authentizität zwischen Python und JavaScript
Unterschiede zwischen Ruby und Python im Umfang
Unterschiede zwischen Python- und Java-Syntax
Unterschiede in der Beziehung zwischen PHP und Python schließlich und beenden
[Grundlegende Grammatik] Unterschiede zwischen Ruby / Python / PHP
Unterschiede in der Multithread-Verarbeitung zwischen Python und Jython
Unterschied zwischen Ruby und Python (grundlegende Syntax)
Zusammenfassung der Korrespondenz zwischen Ruby- und Python-Array-Operationen
Angeben des Bereichs von Ruby- und Python-Arrays
der Zen von Python
Über den Unterschied zwischen "==" und "is" in Python
[Python] Zusammenfassung der Konvertierung zwischen Zeichenfolgen und numerischen Werten (ASCII-Code)
Installation von Python 3 und Flask [Zusammenfassung der Umgebungskonstruktion]
Vergleichen Sie die Geschwindigkeit von Python Append und Map
Zusammenfassung der Python-Argumente
E / A-bezogene Zusammenfassung von Python und Fortan
Berücksichtigung der Stärken und Schwächen von Python
Unterschiede in der Zeichenfolgenverarbeitung zwischen Python, Ruby, JS und PHP (Kombination und Variablenerweiterung)
Holen Sie sich das letzte Element des Arrays, indem Sie Zeichenfolgen in Python und PHP aufteilen
Die Geschichte von Python ohne Inkrement- und Dekrementoperatoren.
Der Prozess der Installation von Atom und der Ausführung von Python
[Python] Typfehler: Zusammenfassung der Ursachen und Abhilfemaßnahmen für 'Kein Typ'
Unterschied zwischen Ruby und Python in Bezug auf Variablen
Das Einrückungsverhalten von json.dumps unterscheidet sich zwischen python2 und python3
Visualisieren Sie den Bereich der internen und externen Einfügungen mit Python
Referenz und Änderung der rekursiven Python-Obergrenze
Ich habe mir die Versionen von Blender und Python angesehen
PHP- und Python-Beispiele, die die ChatWork-API treffen
EP 3 Kennen Sie die Unterschiede zwischen Bytes, Str und Unicode
Visualisierung der Verbindung zwischen Malware und dem Callback-Server
Zusammenfassung des grundlegenden Ablaufs des maschinellen Lernens mit Python
[Python] Zusammenfassung, wie die Farbe der Figur angegeben wird
Zusammenfassung der Datumsverarbeitung in Python (Datum / Uhrzeit und Datum)
Auf dem Weg zum Ruhestand von Python2
Zusammenfassung der Python-Dateivorgänge
Zusammenfassung der Python3-Listenoperationen
Über die Funktionen von Python
Quellinstallation und Installation von Python
Die Kraft der Pandas: Python
Der Zeitpunkt, zu dem der Wert des Standardarguments ausgewertet wird, unterscheidet sich zwischen Ruby und Python.
[Python] Herons Formelfunktionalisierung und Berechnung der maximalen Fläche
[Python] Zusammenfassung zum Abrufen von Listen und Wörterbuchelementen
[Python] Zusammenfassung der Verwendung von Split- und Join-Funktionen
Zusammenfassung der Unterstützung von Hash-Operationen (Dictionary) für Ruby und Python
Der Prozess, Python-Code objektorientiert zu machen und zu verbessern
Der Websocket von toio (nodejs) und python / websocket stellen keine Verbindung her.
Ich möchte die Natur von Python und Pip kennenlernen
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy