Beachten Sie, dass das Schreiben mit Ruby so ist wie das Schreiben mit Python

Ich bin an Rubin und nicht an Python gewöhnt, aber ich habe mehr Möglichkeiten, Python zu schreiben, also fühlt es sich wie ein Memorandum an.

Python ist für mich völlig neu. Python 3. Ich habe beschlossen, mich nicht für Python 2.x zu interessieren.

Verarbeitungssystem zur Hand

Bestätigt in

Länge

ruby


ary_len = [1,2,3].size # [1,2,3].Länge ist in Ordnung
hash_len = {a:1}.size # {a:1}.Länge ist in Ordnung
string_len = "hoge".size # "hoge".Länge ist in Ordnung

range_len = (1..9).size # Range#Es gibt keine Länge.

python3


ary_len = len([1,2,3])
dic_len = len({"a":1})
string_len = len("hoge")
range_len = len(range(1,10)) # 1〜9

Nun, dieser Bereich ist einfach.

Um Objekt

Schimmel

ruby


[].class #=> Array
1.class #=> Integer
[].is_a?(Enumerable) #=> true
Enumerable===[] #=> true
Enumerable==="" #=> false
[1,1.0,1r,1i].map{ |x| x.is_a?( Numeric ) } #=> [true, true, true, true]

python3


type([]) #=> <class 'list'>
type(1) #=> <class 'int'>

Die Verarbeitung, die zu entsprechen scheint, ob es sich um "Aufzählbar" von Rubin handelt, ist wie folgt:

python3


from collections import Iterable
isinstance([], Iterable) #=> True
isinstance("", Iterable) #=> True

Beachten Sie, dass die Ruby-Zeichenfolge nicht Enumerable ist, die Python-Zeichenfolge jedoch Iterable.

Unten finden Sie ein Beispiel für die Verwendung einer Klasse wie "Numerisch" in Ruby in Python:

python3


from numbers import Number
[isinstance(x,Number) for x in [1.0, 1, ""]] #=> [True,True,False]

Anzahl und Iterable. Gibt Ihnen der Import Zugriff auf den Namen der Basisklasse?

Duplikat

ruby


copied = [1,2,3].dup

python3


import copy
copied = copy.copy([1,2,3])

Das Duplizieren allgemeiner Objekte erfordert den Import in Python. Sie können jedoch die folgenden Redewendungen, Methoden und Konstruktoren verwenden, um die Liste zu kopieren:

python3


copied1 = [1,2,3][:] #Vielleicht ist das normal.
copied2 = [1,2,3].copy()
copied3 = list([1,2,3]) #Vielleicht Konstruktor

dict hat auch eine Kopiermethode:

python3


copied = {1:2}.copy()
copied = dict({1:2}) #Vielleicht Konstruktor

Jedoch. Das Array von numpy ist [:] und kann nicht kopiert werden.

import numpy as np
a=np.array([1,2,3])
b=a[:]
b[2]=100
print(a) #=> [  1   2 100]

Es ist eine Falle. Wenn Sie kopieren möchten, verwenden Sie die Kopiermethode wie "b = a.copy ()" oder den Konstruktor.

Vergleich

ruby


[]==[] #=>wahrer gewöhnlicher Vergleich
[].equal?([]) #=>false Gibt an, ob auf dasselbe Objekt verwiesen wird

python3


[]==[] #=>wahrer gewöhnlicher Vergleich
[] is [] #=>false Gibt an, ob auf dasselbe Objekt verwiesen wird

Stringifizierung

ruby


"hoge".to_s #=> 「hoge」
"hoge".inspect #=> 「"hoge"」
65.chr #=> "A"

python3


str("hoge") #=>「hoge」
repr("hoge") #=> 「'hoge'」
chr(65) #=> "A"

Um Array

Konvertierung von Bereich zu Liste / Array

ruby


(1..10).to_a #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[*1..10] #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

python3


list(range(1,11)) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Nehmen Sie das Teil heraus

ruby


[*10..100][10,3] #=> [20, 21, 22]
[*10..100][10..12] #=> [20, 21, 22]

python3


list(range(10,101))[10:13] #=> [20, 21, 22]

Ich frage mich, ob es einen anderen Weg gibt, es zu schreiben.

Teilewechsel

ruby


a=[*1..5]
a[2,2]=9 # a[2,2]=[9]Aber das gleiche.
a # => [1, 2, 9, 5]

python3


a=list(range(1,6))
a[2:4]=[9] # a[2:4]=Kann nicht schreiben 9
a #=> [1, 2, 9, 5]

Es gibt verschiedene Möglichkeiten, Ruby zu schreiben, z. B. "a [2,2] = 9" oder "a [2..3] = [9]", aber Python ist nur eine der oben genannten.

letzte

ruby


[1,2,3][-1] #=> 3
[1,2,3].last #=> 3
[1,3,5,7,9].last(2) #=> [7, 9]

python3


[1,2,3][-1] #=> 3
[1,3,5,7,9][-2:] #=> [7,9]

Es scheint keine letzte Methode in Python zu geben.

push / unshift

ruby


a=[1,2,3]
a.push 9
a.unshift 8
a #=> [8,1,2,3,9]

python3


a=[1,2,3]
a.append(9)
a.insert(0,8)
a #=> [8,1,2,3,9]

Es scheint, dass Python keine dedizierte Methode hat, um sie am Anfang hinzuzufügen.

pop / shift

ruby


a=[1,2,3,4]
b = a.pop
c = a.shift
[ a, b, c ] #=> [[2, 3], 4, 1]

d=[1,2,3,4]
e=d.pop(2) #Bewegen Sie die ersten beiden nach e
[d,e] #=> [[1,2],[3,4]]

python3


a=[1,2,3,4]
b = a.pop()
c = a.pop(0)
[ a, b, c ] #=> [[2, 3], 4, 1]

d=[1,2,3,4]
e=d[-2:]
d[-2:]=[]
[d,e] #=> [[1,2],[3,4]]

In Python hat Pop ein Argument, woher es kommt, und wenn 0 angegeben wird, verhält es sich wie "Shift". Pythons d [-2:] = [] kann del d [-2:] sein.

Es scheint, dass Python keine Methode hat, die Rubys "d.pop (2)" entspricht.

map

ruby


[1,2,3].map{ |x| x*2 } #=> [2,4,6]
%w( 1 2 3 ).map(&:to_i) #=> [1,2,3]

python3


[x*2 for x in [1,2,3]] #=> [2,4,6]
list(map(int,["1","2","3"])) #=>[1,2,3]

inject / reduce

ruby


[1,2,3].inject(0){ |acc,x| acc+x } #=> 6
[1,2,3].inject(0, &:+) #=> 6

python3


import functools
functools.reduce(lambda x,y:x+y, [1,2,3], 0) #=> 6
functools.reduce(int.__add__, [1,2,3], 0) #=> 6

Im obigen Beispiel ist es besser, "operator.add" anstelle von "int .__ add__" zu verwenden.

Besonderer Dank geht an antimon2: siehe http://qiita.com/Nabetani/items/50b0f6533a15d8fb2ae5#comment-bb3beb6fe012b4ebefe6

select

ruby


[1,2,3,4].select{ |x| x.even? } #=> [2, 4]

python3


[x for x in [1,2,3,4] if x%2==0 ] #=>[2, 4]

Maximalwert

ruby


[1,5,13,21].max #=> 21
[1,5,13,21].max_by{ |x| x % 10 } #=> 5

python3


max([1,5,13,21]) #=> 21
max([1,5,13,21],key=lambda x:x%10 ) #=> 5

flatten

ruby


[1,[[2,3],4],5].flatten #=> [1,2,3,4,5]

In Python scheint es keine Abflachung zu geben. see http://d.hatena.ne.jp/xef/20121027/p2

uniq

ruby


%w( f o o b a r b a z ).uniq #=>  ["f", "o", "b", "a", "r", "z"]

python3


list(set("foobarbaz")) #=> ['z', 'f', 'b', 'a', 'o', 'r']Die Bestellung wird nicht gespeichert

Wenn Sie die Bestellung speichern möchten, verwenden Sie Python-Tipps: Ich möchte doppelte Elemente aus der Liste entfernen.

Zerstörungsfreie Sorte

ruby


[1,5,13,20].sort_by{ |x| x%10 } #=> [20,1,13,5]

python3


sorted([1,5,13,20], key=lambda x:x % 10 ) #=> [20, 1, 13, 5]

Python-Sortierung ist stabil. Rubinsorte ist nicht stabil.

Umgekehrte Reihenfolge

ruby


a=[1,3,5,7]
a.reverse #=> [7,5,3,1]Zerstörungsfrei
a.reverse! #Zerstörerisch umgekehrte Reihenfolge
a #=> [7,5,3,1]

python3


a=[1,3,5,7]
list(reversed(a)) #=>[7, 5, 3, 1]Zerstörungsfrei
a[::-1] #=> [7, 5, 3, 1]Zerstörungsfrei
a.reverse() #Zerstörerisch umgekehrte Reihenfolge
a #=> [7,5,3,1]

Ein Amateur kann nicht an " :: -1 "denken. Beachten Sie, dass der Rückgabewert von "umgekehrt" "list_reverseiterator" und nicht "list" ist.

zip

ruby


[1,2,3].zip(%w(a b c)) #=> [[1, "a"], [2, "b"], [3, "c"]]
[1,2,3].zip(%w(a b)) #=> [[1, "a"], [2, "b"], [3, nil]]

python3


list(zip([1,2,3],["a","b","c"])) #=> [(1, 'a'), (2, 'b'), (3, 'c')]
list(zip([1,2,3],["a","b"])) #=> [(1, 'a'), (2, 'b')]

Ruby ist auf den Empfänger abgestimmt. Python ist an die kürzere angepasst.

Python wird nicht nur durch "zip" zur "Liste". Wenn Sie es an den Konstruktor von list übergeben, wird es zu einer Liste von Taples.

Zufallszahl

Probenahme

ruby


[1,2,3].sample #=> 1 or 2 or 3
[1,3,5].sample(2) #=> [5,3], [1,5]Eine solche. Nicht duplizieren.

python3


import random
random.choice( [1,2,3] ) #=> 1 or 2 or 3
random.sample( [1,3,5], k=2 ) #=> [5,3], [1,5]Eine solche. Nicht duplizieren.

Gleitkommazahl größer oder gleich 0 und kleiner als 1

ruby


rand

python3


import random
random.random()

Eine Ganzzahl größer oder gleich 0 und kleiner als 10.

ruby


rand(10)

Oder

ruby


rng=Random.new
rng.rand(10)
rng.rand(0..9)
rng.rand(0...10)

python3


import random
random.randint(0,9)

Die Python-Bereichsspezifikation umfasst beide Enden.

Kontrollstruktur

if-Anweisung

ruby


a=if 1.even?
  "foo"
elsif 1.odd?
  "bar"
else
  "baz"
end

python3


if 1%2==0:
    a="foo"
elif 1%2==1:
    a="bar"
else:
    a="baz"

In Python hat die if-Anweisung im Gegensatz zu ruby keinen Wert. Rubys "Elsif" ist Pythons "Elif". Es gibt auch kein Postfix, wenn.

case〜when

In Python gibt es keine Kontrollstruktur, die case ~ when und switch ~ case entspricht.

Wiederholung

ruby


10.times do |num|
  do_something
end

loop do #Endlosschleife
  break if some_condition
end

python3


for num in range(10):
  do_something()

while True: #Endlosschleife
  if some_condition():
    break

wörtlich

Im Allgemeinen hat Ruby viele Literale, Python jedoch nicht (im Vergleich zu Ruby).

Angemessene Anzahl

ruby


a=1.3r #=> (13/10)

python3


import fractions
fractions.Fraction(13,10) #=> 13/Wert entspricht 10

Rationale Zahlenliterale sind nicht in Python.

Reguläre Ausdrücke

ruby


/.\s./.match("hello, world")[0] #=> ", w"

python3


import re
re.search( r".\s.", "hello, world" ).group(0) #=> ', w'

Literale mit regulären Ausdrücken sind nicht in Python. r "" ist r, was rohe Zeichenfolge bedeutet.

Ausdruckserweiterung in einem String-Literal

ruby


"3**10=#{3**10}" #=>  "3**10=59049"

python3


"3**10=%d" % 3**10 #=>  "3**10=59049"

Es gibt keine Ausdruckserweiterung in Python (es scheint in 3.6 zu sein. Besonderer Dank geht an norioc). Sie müssen so etwas wie printf tun.

Input-Output

Pufferspülung

ruby


print("hoge")
$stdout.flush()
print("hoge", end="", flush=True)

Es kann "sys.stdout.flush ()" als "import sys" sein.

drucken und setzt

ruby


print("hoge") #=>Ausgabe ohne nachlaufende Pausen
puts("hoge") #=>Ausgabe mit einer nachlaufenden Pause

python3


print("hoge", end="") #=>Ausgabe ohne nachlaufende Pausen
print("hoge") #=>Ausgabe mit einer nachlaufenden Pause

Existenz von Dateien und Verzeichnissen

File.exist?("foo") #=>true, wenn foo eine Datei oder ein Verzeichnis ist
File.file?("foo") #=>true, wenn foo eine Datei ist
File.directory?("foo") #=>true, wenn foo ein Verzeichnis ist

python3


import os
os.path.exists("foo") #=>true, wenn foo eine Datei oder ein Verzeichnis ist
os.path.isfile("foo") #=>true, wenn foo eine Datei ist
os.path.isdir("foo") #=>true, wenn foo ein Verzeichnis ist

~~ Python scheint keine Methode zu haben, die Rubys "File.exist?" entspricht. ~~ Mir war nicht bewusst, dass es os.path.exists gab. Vielen Dank, @tokyo_gs.

Datei öffnen / schließen

ruby


a=File.open("hoge.txt"){ |f| f.read(10) }

python3


with open("hoge.txt") as f:
    a=f.read(10)

Python schließt die Datei automatisch, wenn Sie mit verwenden.

In eine Datei schreiben.

Angenommen, f ist eine Datei, die mit open aufgenommen werden kann:

ruby


f.puts("hoge") #Am Ende steht ein Zeilenumbruch
f.print("fuga") #Kein Zeilenumbruch am Ende
f.write("piyo") #Kein Zeilenumbruch am Ende

python3


print("piyo", file=f) #Am Ende steht ein Zeilenumbruch
f.write("hoge") #Kein Zeilenumbruch am Ende
f.write("piyo\n") #Eine andere Möglichkeit, am Ende eine Pause hinzuzufügen

Python kann nicht als "f.print (Abkürzung)" geschrieben werden. print (Abkürzung, file = f) war sehr überraschend.

Nicht kategorisiert

Bedingte Berechnung

ruby


cond=true
val = cond ? "iftrue" : "iffalse"

python3


cond=True
val = "iftrue" if cond else "iffalse"

Bedingte Operationen in Python sind bisher wahrscheinlich überhaupt nicht gewöhnungsbedürftig.

combination

ruby


[1,2,3].combination(2).to_a #=> [[1, 2], [1, 3], [2, 3]]

python3


import itertools
list(itertools.combinations([1,2,3],2)) #=> [(1, 2), (1, 3), (2, 3)]

Python ist eine Pluralform. Der Punkt ist, dass es ein Taple wird. Es gibt auch "Permutationen".

Thread

ruby


Array.new(4){ |ix| Thread.new{ print ix } }.each(&:join) #=>2103

python3


import threading
ts=[threading.Thread(target=(lambda x=x:print(x))) for x in range(4)]
for t in ts:
   t.start()
for t in ts:
   t.join()

Der Ruby-Block ~~ verwendet beim Erfassen einer Variablen eine Wertreferenz, sodass das normale (individuelle) Schreiben einwandfrei funktioniert. ~~


2018/3/17 Korrektur
Ich denke, der Grund, warum Ruby funktioniert, ist, dass die Variable ix in ihrem Umfang beschränkt ist und jedes Mal generiert wird.
/ 2018/3/17 Korrektur

Das Standardargument für Python ist verdächtig, aber wenn Sie Lambda verwenden, funktioniert es nur, wenn Sie dies tun oder es verdoppeln. Der Grund ist, dass Pythons Lambda variable Referenzen erfasst. (Ist es nicht richtig?) Wenn dies unangenehm ist, können Sie eine Methode für das Ziel angeben, ohne Lambda zu verwenden.

uuid

ruby


require 'securerandom'
SecureRandom.uuid #=> => "72568c47-e6e0-4f21-a8b5-dad3d72831b2"

python3


import uuid
str(uuid.uuid4()) #=> '9414a2d6-b954-4519-bf88-47828d6d2577'

Sie können sichere Zufallszahlen mit einem Modul namens Secrets erstellen, jedoch seit Python 3.6. Darüber hinaus scheint es kein I / F zu geben, das UUID erzeugt.

uuid of python hat "uuid1 ()", "uuid3 ()", "uuid4 ()", "uuid5 ()". Es scheint, dass "uuid4 ()" Rubys "SecureRandom.uuid" entspricht.

String Join

Es ist kein Thread-Join, sondern ein Typ, der die Elemente eines Arrays mit Kommas verbindet.

ruby


[1,"hoge",2.34].join(",") #=> "1,hoge,2.34"

python3


",".join([str(x) for x in [ 1, "hoge", 2.34 ] ] ) #=> '1,hoge,2.34'

Wenn Ruby beitritt, wird es ohne Erlaubnis zu einer Zeichenfolge, aber Python kann nur eine Zeichenfolge verbinden. Ich wusste, dass der Empfänger umgekehrt war, aber ich wusste nicht, dass er ihn nicht in einen String umwandeln würde.

String split

ruby


"a,b,c".split(",") # => ["a", "b", "c"]
"a-b+c".split(/\W/) # => ["a", "b", "c"]

python3


import re
"a,b,c".split(",") #=> ["a", "b", "c"]
re.split(r"\W", "a+b-c") #=> ["a", "b", "c"]
re.compile( r"\W" ).split( "a+b-c" ) #=> ["a", "b", "c"]

Der Name muss geändert werden, je nachdem, ob es sich um einen regulären Ausdruck handelt oder nicht.

Schade, dass Sie nicht "a, b, c" .split (re.compile (r "\ W")) schreiben können.

Schließlich

Wird hinzugefügt werden. Es gibt einen besseren Weg, es zu schreiben! Aufruf zur Stellungnahme.

Recommended Posts

Beachten Sie, dass das Schreiben mit Ruby so ist wie das Schreiben mit Python
[Hinweis] Betreiben Sie MongoDB mit Python
Zundokokiyoshi mit Python / Rubin / Lua
Beachten Sie, dass es Python 3 unterstützt
[Python] Was ist eine with-Anweisung?
Python Hinweis: Über den Vergleich mit is
Scraping mit Node, Ruby und Python
Dynamischer Proxy mit Python, Ruby, PHP
(Hinweis) Seien Sie vorsichtig mit Python Argparse
[Hinweis] Hallo Weltausgabe mit Python
Dies und das von Python-Eigenschaften
Lesen und Schreiben von NetCDF mit Python
Lesen und Schreiben von CSV mit Python
Mit PEP8 und PEP257 ist es nicht peinlich, Python-Codierung zu zeigen!
Beachten Sie, dass admin.py nicht sofort angezeigt wird, wenn Django mit WSGIDaemonProcess ausgeführt wird
Python Hinweis: Wenn easy_install nicht verwendet werden kann
[Python] Ein Programm, das Treppen mit # erstellt
[Hinweis] Mit Python Daten von PostgreSQL abrufen
Verwirklichen Sie den PHP / Python-Generator mit Golang / Ruby
Hinweise beim Erstellen einer Umgebung mit Python
[Persönlicher Hinweis] Scraping von Webseiten in Python3
Lesen und Schreiben von JSON-Dateien mit Python
Versuch, SQLite3 mit Python zu handhaben [Hinweis]
Beachten Sie, dass Python-Dekoratoren Wraps haben sollten
Visualisieren Sie Punkt P, der mit Python funktioniert
Versuchen Sie, Python von Ruby aus mit Sparsamkeit aufzurufen
Mit Ruby (Rails) verschlüsseln und mit Python entschlüsseln
Eine typisierte Welt, die mit Python beginnt
Einfaches Web-Scraping mit Python und Ruby
Versuchen Sie etwas wie Python für-else in Ruby
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Über den 02. Februar 2020 * Dies ist ein Python-Artikel.
Verwenden Sie beim Schreiben von Tests mit Python unittest doCleanups für SetUps, die fehlschlagen können
Sind Php / Ruby / Python, die nur ausgeführt werden, wenn die Datei direkt aufgerufen wird
Hinweis: Python
Boto3-API (AWS-Ressourcen mit Python-Bibliothek bearbeiten), die häufig privat verwendet wird
Python-Notiz
Zusammenfassung der Grammatik, die bei matplotlib oft vergessen wird
Wie man Spaß am Programmieren mit Minecraft hat (Ruby, Python)
Erstellen Sie eine App, die Schüler mit Python errät
[Hinweis] Exportieren Sie das HTML der Site mit Python.
Python-Protokoll wird nicht mit Docker-Compose ausgegeben
Die Abfrage [Webentwicklung mit Python] wird ebenfalls umgeleitet
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
[Hinweis] Erstellen Sie mit Python eine einzeilige Zeitzonenklasse
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
Hinweis zum Formatieren von Zahlen mit der Python-Formatierungsfunktion
Dies ist die einzige grundlegende Überprüfung von Python ~ 1 ~
Dies ist die einzige grundlegende Überprüfung von Python ~ 2 ~
Beachten Sie, dass die Listeneinschlussnotation von Python immer verwirrend ist
Was vergleichst du mit Python und ==?
Dies ist die einzige grundlegende Überprüfung von Python ~ 3 ~
Lesen und Schreiben passt Dateien mit Python (Memo)
Dies und das ist nützlich, wenn es mit nohup verwendet wird
Ein Liner, der mit Python ein Umfangsverhältnis von 10000 Stellen ausgibt
Beispielprogramm, das Syslog mit Python-Protokollierung ausgibt
Beachten Sie, dass von Homebrew installiertes Vim nicht mit dem Python 3.8-Fehler startet