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
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.
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?
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.
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
ruby
"hoge".to_s #=> 「hoge」
"hoge".inspect #=> 「"hoge"」
65.chr #=> "A"
python3
str("hoge") #=>「hoge」
repr("hoge") #=> 「'hoge'」
chr(65) #=> "A"
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]
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.
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.
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]
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.
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.
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.
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.
ruby
rand
python3
import random
random.random()
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.
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.
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
Im Allgemeinen hat Ruby viele Literale, Python jedoch nicht (im Vergleich zu Ruby).
ruby
a=1.3r #=> (13/10)
python3
import fractions
fractions.Fraction(13,10) #=> 13/Wert entspricht 10
Rationale Zahlenliterale sind nicht in Python.
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.
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.
ruby
print("hoge")
$stdout.flush()
print("hoge", end="", flush=True)
Es kann "sys.stdout.flush ()" als "import sys" sein.
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
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.
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.
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.
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.
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.
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.
Wird hinzugefügt werden. Es gibt einen besseren Weg, es zu schreiben! Aufruf zur Stellungnahme.
Recommended Posts