Ich habe versucht, Pythonect, eine Programmiersprache für den Datenfluss, zu verwenden.

Überblick

Kürzlich habe ich eine Sprache namens Pythonect eingeführt, die ich zufällig gefunden habe, also werde ich darüber schreiben. Da es sich immer noch um eine Beta-Version der Sprache (Umgebung?) Handelt, gibt es meiner Meinung nach einige Fehler.

Was ist Pythonect?

Pythonect http://docs.pythonect.org/en/latest/index.html

Pythonect is a new, experimental, general-purpose dataflow programming language based on Python. It provides both a visual programming language and a text-based scripting language. The text-based scripting language aims to combine the quick and intuitive feel of shell scripting, with the power of Python. The visual programming language is based on the idea of a diagram with “boxes and arrows”.

The Pythonect interpreter (and reference implementation) is a free and open source software written completely in Python, and is available under the BSD 3-Clause license.

Pythonect ist eine neue experimentelle, universelle Datenfluss-Programmiersprache, die auf Python basiert. Pythonect bietet sowohl eine visuelle Programmiersprache als auch eine textbasierte Skriptsprache. Die textbasierte Skriptsprache soll dank der Leistungsfähigkeit von Python so intuitiv und einfach zu kombinieren sein wie ein Shell-Skript. Die visuelle Programmiersprache basiert auf der Idee von "Box" - und "Pfeil" -Diagrammen. Die Pythonect-Interpreter (und Referenzimplementierungen) sind alle in Python geschrieben, kostenlos und Open Source und stehen unter der BSD 3-Klausel-Lizenz zur Verfügung.

Sie können sich das als grobe Erweiterung der Python-Syntax und als Modifikation der Datenflusssprache vorstellen. Visuelle Programmierung ist mit der Software Dia möglich, aber ich werde sie hier weglassen.

Wie installiert man

Für easy_install

$ easy_install pythonect

Für pip

$ pip install pythonect

Sehr leicht.

HelloWorld!

$ pythonect
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[Pythonect 0.6.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> "HelloWorld!" -> print
<MainProcess:MainThread> : HelloWorld!
'HelloWorld!'

Grundlegende Syntax

Es sieht aus wie Python, aber es gibt mehr Elemente, die nicht Python sind. Zum Beispiel für und wenn nicht verwendet werden kann. Wahrscheinlich sind diejenigen, aus denen zusammengesetzte Sätze bestehen, fast unbrauchbar. Es gibt auch einige Pythononect-spezifische Syntaxen.

Synchrone Weiterleitung

>>> a=[1,2,3,4,5,6,7,8,9,10]
>>> a | print 
<MainProcess:MainThread> : 1
<MainProcess:Thread-4576> : 2
<MainProcess:Thread-4577> : 3
<MainProcess:Thread-4576> : 4
<MainProcess:Thread-4577> : 5
<MainProcess:Thread-4576> : 6
<MainProcess:Thread-4577> : 7
<MainProcess:Thread-4576> : 8
<MainProcess:Thread-4577> : 9
<MainProcess:Thread-4576> : 10
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Der Inhalt der Daten wird synchron mit dem Operator | abgerufen. Achten Sie darauf, in der Reihenfolge 1,2,3,4,5,6,7,8,9,10 herauszunehmen.

Asynchrone Weiterleitung

>>> a -> print 
<MainProcess:MainThread> : 1
<MainProcess:Thread-4797> : 3
<MainProcess:Thread-4796> : 2
<MainProcess:Thread-4797> : 4
<MainProcess:Thread-4796> : 5
<MainProcess:Thread-4796> : 7
<MainProcess:Thread-4797> : 6
<MainProcess:Thread-4796> : 8
<MainProcess:Thread-4797> : 9
<MainProcess:Thread-4796> : 10
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Der Inhalt der Daten wird asynchron mit dem Operator -> abgerufen. Im obigen Beispiel für die synchrone Übertragung

<MainProcess:MainThread> : 1
<MainProcess:Thread-4576> : 2
<MainProcess:Thread-4577> : 3
<MainProcess:Thread-4576> : 4
...

Es hat so funktioniert, aber als es mit -> ausgeführt wurde,

<MainProcess:MainThread> : 1
<MainProcess:Thread-4797> : 3
<MainProcess:Thread-4796> : 2
<MainProcess:Thread-4797> : 4
...

Sie können sehen, dass sie in keiner bestimmten Reihenfolge sind.

Aufgabenverwalter

>>> [x=10] -> x -> print 
<MainProcess:MainThread> : 10
10

Sie können Werte in Variablen einfügen, während der Pythononect-Übertragungsoperator aktiviert ist. Es ist jedoch ziemlich schwierig zu bedienen.

Vordefinierte Variablen

Current Value ( _ )

>>> range(3) -> print _
<MainProcess:MainThread> : 0
<MainProcess:Thread-1166> : 1
<MainProcess:Thread-1167> : 2
[0, 1, 2]

_ ruft nur ein Datenelement aus dem Datenfluss ab.

All Current Values ( _! )

>>> xrange(3) | sum(_!) | print
<MainProcess:Thread-521> : 3
3

_! Extrahiert alle Werte aus dem Fluss.

Daher als Operation

>>> sum(xrange(3))
3

Es wird das gleiche sein wie.

Ablaufsteuerung

pyconnect hat während der Flusssteuerung einen Bool-Unterscheidungsausdruck, und die nächste Verarbeitung wird nur ausgeführt, wenn der Wert True wird.

Daher werden im Fall von "True" alle ausgegeben.

>>> range(3) | True | print
<MainProcess:MainThread> : 0
<MainProcess:Thread-1311> : 1
<MainProcess:Thread-1312> : 2
[0, 1, 2]

Im Gegenteil, im Fall von "Falsch" wird nichts ausgegeben.

>>> range(3) | False | print
[False, False, False]

Als Beispiel für eine einfache Anwendung sieht es so aus. Ausgabe nur, wenn der Durchflusswert 1 ist.

>>> range(3) | _ == 1 | print
<MainProcess:Thread-1491> : 1
[False, 1, False]

Sie können einen Fluss auch in zwei Flüsse aufteilen.

>>> range(3) | [[[_ == 0] -> print 'Zero' ],[ print _ ]]
<MainProcess:Thread-7596> : 0
<MainProcess:MainThread> : Zero
<MainProcess:Thread-7621> : 1
<MainProcess:Thread-7641> : 2
[0, 0, False, 1, False, 2]

In einem Fluss wird beurteilt, ob es 0 ist, und wenn es wahr ist, wird Null ausgegeben. Danach wird die aus dem Durchfluss erhaltene Zahl bedingungslos ausgegeben.

Danach gibt es so etwas wie eine switch-Anweisung, was selten vorkommt. Es ist einfach sehr klassisch und scheint die Übereinstimmung der Diktatschlüssel auf dem Schalter zu sehen.

>>> range(10) | _ % 3 | {0: 'Zero' , 1 : 'One' , 2 : 'Two'} | print
<MainProcess:MainThread> : Zero
<MainProcess:Thread-4146> : One
<MainProcess:Thread-4147> : Two
<MainProcess:Thread-4146> : Zero
<MainProcess:Thread-4147> : One
<MainProcess:Thread-4146> : Two
<MainProcess:Thread-4147> : Zero
<MainProcess:Thread-4146> : One
<MainProcess:Thread-4147> : Two
<MainProcess:Thread-4146> : Zero

Prozess

Siehe den Code unten.

>>> range(3) -> print
<MainProcess:MainThread> : 0
<MainProcess:Thread-437> : 2
<MainProcess:Thread-436> : 1
[0, 1, 2]

Es gibt eine Anzeige wie "<MainProcess: MainThread>". Sie können sehen, dass es in einem Thread im Python-Prozess ausgeführt wird. Sie können einen Prozess starten, indem Sie einem Skript, das in einem Thread wie diesem ausgeführt wird, "&" hinzufügen.

>>> range(3) -> print &
<PID #29242> : 0
<PID #29266> : 2
<PID #29268> : 1
[0, 1, 2]

Versuchen Sie, FizzBuzz zu schreiben

FizzBuzz.p2y


range(1,20)
    -> [ x = _ ]
    -> [ flag3 = _ % 3 == 0 ]
    -> [ flag5 = _ % 5 == 0 ]
    -> [
            [     flag3 and     flag5 -> print "{0} FizzBuzz".format(x)],
            [     flag3 and not flag5 -> print "{0} Fizz".format(x)    ],
            [ not flag3 and     flag5 -> print "{0} Buzz".format(x)    ],
            [ not flag3 and not flag5 -> print "{0}".format(x)         ]
       ]

Ich denke, es ist ein sehr ähnlicher Code, aber ** es funktioniert nicht **. Der Code, der tatsächlich funktioniert, sieht folgendermaßen aus

$ cat ~/FizzBuzz.p2y | tr -d "\n"
range(1,20)    -> [ x = _ ]    -> [ flag3 = _ % 3 == 0 ]    -> [ flag5 = _ % 5 == 0 ]    -> [            [     flag3 and     flag5 -> print "{0} FizzBuzz".format(x)],            [     flag3 and not flag5 -> print "{0} Fizz".format(x)    ],            [ not flag3 and     flag5 -> print "{0} Buzz".format(x)    ],            [ not flag3 and not flag5 -> print "{0}".format(x)         ]       ]

Dies ist ein Punkt, den ich für ein bisschen halte. Vielleicht ist Perth immer noch süß. Wenn Sie es tatsächlich bewegen, sieht es so aus.

$ cat ~/FizzBuzz.p2y | tr -d "\n" | pythonect
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[Pythonect 0.6.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> <MainProcess:Thread-41> : 1
<MainProcess:Thread-171> : 3 Fizz
<MainProcess:Thread-172> : 2
<MainProcess:Thread-374> : 5 Buzz
<MainProcess:Thread-371> : 4
<MainProcess:Thread-571> : 6 Fizz
<MainProcess:Thread-572> : 7
<MainProcess:Thread-773> : 9 Fizz
<MainProcess:Thread-770> : 8
<MainProcess:Thread-975> : 10 Buzz
<MainProcess:Thread-971> : 11
<MainProcess:Thread-1171> : 12 Fizz
<MainProcess:Thread-1172> : 13
<MainProcess:Thread-6> : 15 FizzBuzz
<MainProcess:Thread-1371> : 14
<MainProcess:Thread-1570> : 16
<MainProcess:Thread-1573> : 17
<MainProcess:Thread-1770> : 18 Fizz
<MainProcess:Thread-1773> : 19
[False, False, False, 1, False, False, False, 2, False, 3, False, False, False, False, False, 4, False, False, 5, False, False, 6, False, False, False, False, False, 7, False, False, False, 8, False, 9, False, False, False, False, 10, False, False, False, False, 11, False, 12, False, False, False, False, False, 13, False, False, False, 14, 15, False, False, False, False, False, False, 16, False, False, False, 17, False, 18, False, False, False, False, False, 19]

Es ist ein Code mit einer ganz anderen Atmosphäre. Pure FizzBuzz wird in der Größenordnung von 1,2, Fizz, 4, Buzz ... ausgegeben, es ist also keine exakte Übereinstimmung, aber gut. .. .. Es ist eine Datenfluss-Sprachversion.

guter Punkt

――Es funktioniert als Datenflusssprache (es gibt keine Datenflusssprache, die auf der Welt sehr gut funktioniert). ――Es ist schön, die Python-Bibliothek verwenden zu können. ――Es war auch sehr leicht zu lesen, sauber und leicht zu schreiben.

Schlechte Punkte

Impressionen

Ich finde es ziemlich interessant, aber ich möchte immer noch eine Funktion. Oder besser gesagt, ich wünschte, ich könnte eine andere Python-Syntax verwenden. Wenn es normalerweise als integrierte Funktion verwendet werden kann, warum nicht regelmäßig verwenden? Ich denke. Ich denke, es ist die Sprache, die Shell-Skripten am nächsten kommt, aber es liegt auch in der Nähe von Street, über die ich vor einiger Zeit gesprochen habe. In letzter Zeit ist mein persönliches Interesse eine Sprache mit einem starken Typensystem, daher hoffe ich, dass eine Sprache wie diese auch in diesem Bereich herauskommt.

Recommended Posts

Ich habe versucht, Pythonect, eine Programmiersprache für den Datenfluss, zu verwenden.
Ich habe versucht, ○ ✕ mit TensorFlow zu spielen
Ich habe versucht, mit einer Schildkröte eine Linie zu ziehen
Ich habe eine funktionale Sprache mit Python ausprobiert
Versuchen Sie es mit einer probabilistischen Programmiersprache (Pyro).
Ich habe versucht, pipenv zu verwenden, machen Sie sich also eine Notiz
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, PyCaret zu verwenden
Ich habe versucht, eine CSV-Datei mit Python zu lesen
Ich habe versucht, Cron zu verwenden
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, Shell zu programmieren
Ich habe versucht, doctest zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe versucht, die funktionale Programmierbibliothek toolz zu verwenden
Ich habe versucht, die Datenbank (sqlite3) mit kivy zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht, ein Beispielmodell von Pytorch mit TorchServe zu hosten
[Python] Ich habe versucht, einen lokalen Server mit flask auszuführen
Ich habe versucht, mit Python eine Pseudofraktalfigur zu zeichnen
Ich habe versucht, Daten aus einer Datei mit Node.js zu lesen.
Ich habe versucht, Python (3) anstelle eines Funktionsrechners zu verwenden
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
Ich habe versucht, ein Konfigurationsdiagramm mit Diagrammen zu zeichnen
[Ich habe versucht, Pythonista 3 zu verwenden] Einführung
Ich habe versucht, easydict (Memo) zu verwenden.
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Ich habe versucht, RandomForest zu verwenden
Ich habe versucht, BigQuery ML zu verwenden
Ich habe versucht, Amazon Glacier zu verwenden
Ich habe versucht, Git Inspector zu verwenden
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020
Ich habe versucht, Magenta / TensorFlow zu verwenden
Ich habe versucht, AWS Chalice zu verwenden
Ich habe versucht, Slack Emojinator zu verwenden
Ich habe versucht, ein Deep-Learning-Modell von TensorFlow mit TensorFlow Serving zu hosten
Ich habe versucht, Tensorboard zu verwenden, ein Visualisierungstool für maschinelles Lernen
Ich habe versucht, [eine bestimmte Aufgabe] mit einem Raspeltorte zu automatisieren
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Ich habe mit PyQt einen einfachen Texteditor erstellt
Ich habe versucht, Rotrics Dex Arm zu verwenden