J'ai l'habitude de ruby et non de python, mais j'ai plus d'occasions d'écrire du python, donc cela ressemble à un mémorandum.
python est complètement nouveau pour moi. python 3. J'ai décidé de ne pas me soucier de python 2.x.
Système de traitement à portée de main
Confirmé dans
ruby
ary_len = [1,2,3].size # [1,2,3].la longueur est bonne
hash_len = {a:1}.size # {a:1}.la longueur est bonne
string_len = "hoge".size # "hoge".la longueur est bonne
range_len = (1..9).size # Range#Il n'y a pas de longueur.
python3
ary_len = len([1,2,3])
dic_len = len({"a":1})
string_len = len("hoge")
range_len = len(range(1,10)) # 1〜9
Eh bien, ce domaine est facile.
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'>
Le traitement qui semble être équivalent à ʻEnumerable` de ruby est le suivant:
python3
from collections import Iterable
isinstance([], Iterable) #=> True
isinstance("", Iterable) #=> True
Notez que la chaîne ruby n'est pas Enumerable, mais la chaîne python est Iterable.
Voici un exemple d'utilisation d'une classe comme Numeric
en ruby en python:
python3
from numbers import Number
[isinstance(x,Number) for x in [1.0, 1, ""]] #=> [True,True,False]
Nombre et itérable. L'importation vous donne-t-elle accès au nom de la classe de base?
ruby
copied = [1,2,3].dup
python3
import copy
copied = copy.copy([1,2,3])
La duplication d'objets courants nécessite une importation en python. Cependant, vous pouvez utiliser les idiomes, méthodes et constructeurs suivants pour copier la liste:
python3
copied1 = [1,2,3][:] #C'est peut-être normal.
copied2 = [1,2,3].copy()
copied3 = list([1,2,3]) #Peut-être constructeur
dict a également une méthode de copie:
python3
copied = {1:2}.copy()
copied = dict({1:2}) #Peut-être constructeur
Pourtant. Le tableau de numpy est «[:]» et ne peut pas être copié.
import numpy as np
a=np.array([1,2,3])
b=a[:]
b[2]=100
print(a) #=> [ 1 2 100]
C'est un piège. Si vous voulez copier, utilisez la méthode de copie comme b = a.copy ()
ou utilisez le constructeur.
ruby
[]==[] #=>vraie comparaison ordinaire
[].equal?([]) #=>false S'il pointe vers le même objet
python3
[]==[] #=>vraie comparaison ordinaire
[] is [] #=>false S'il pointe vers le même objet
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]
Je me demande s'il existe une autre façon de l'écrire.
ruby
a=[*1..5]
a[2,2]=9 # a[2,2]=[9]Mais pareil.
a # => [1, 2, 9, 5]
python3
a=list(range(1,6))
a[2:4]=[9] # a[2:4]=Impossible d'écrire 9
a #=> [1, 2, 9, 5]
Il existe différentes manières d'écrire ruby, comme ʻa [2,2] = 9ou ʻa [2..3] = [9]
, mais python n'est que l'un des éléments ci-dessus.
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]
Il ne semble pas y avoir de dernière méthode en python.
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]
Il semble que python n'ait pas de méthode dédiée à ajouter au début.
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) #Déplacez les deux premiers vers 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]]
En python, pop a un argument indiquant où l'obtenir, et si 0 est spécifié, il se comportera comme shift
.
d [-2:] = []
de python peut être del d [-2:]
.
Il semble que python n'ait pas de méthode équivalente à «d.pop (2)» de ruby.
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
Dans l'exemple ci-dessus, il est préférable d'utiliser ʻoperator.add au lieu de ʻint .__ add__
.
remerciements particuliers à antimon2: voir 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]
Il ne semble pas y avoir d'aplatissement en python. 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']La commande n'est pas enregistrée
Si vous souhaitez enregistrer la commande, utilisez Astuces Python: Je veux supprimer les éléments en double de la liste.
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]
Le tri python est stable. le tri rubis n'est pas stable.
ruby
a=[1,3,5,7]
a.reverse #=> [7,5,3,1]Non destructif
a.reverse! #Ordre inversé de manière destructrice
a #=> [7,5,3,1]
python3
a=[1,3,5,7]
list(reversed(a)) #=>[7, 5, 3, 1]Non destructif
a[::-1] #=> [7, 5, 3, 1]Non destructif
a.reverse() #Ordre inversé de manière destructrice
a #=> [7,5,3,1]
Un amateur ne peut pas penser à " :: -1
".
Notez que la valeur de retour de reverse
est list_reverseiterator
, pas list
.
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 correspond au récepteur. python est adapté au plus court.
python ne devient pas «list» juste par «zip». Si vous le passez au constructeur de list
, il devient une liste de taples.
ruby
[1,2,3].sample #=> 1 or 2 or 3
[1,3,5].sample(2) #=> [5,3], [1,5]Tel. Pas de duplication.
python3
import random
random.choice( [1,2,3] ) #=> 1 or 2 or 3
random.sample( [1,3,5], k=2 ) #=> [5,3], [1,5]Tel. Pas de duplication.
ruby
rand
python3
import random
random.random()
ruby
rand(10)
Ou
ruby
rng=Random.new
rng.rand(10)
rng.rand(0..9)
rng.rand(0...10)
python3
import random
random.randint(0,9)
La spécification de la plage python comprend les deux extrémités.
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"
En python, contrairement à ruby, l'instruction if n'a aucune valeur. ruby ʻelsif est ʻelif
de python. De plus, il n'y a pas de suffixe si.
case〜when
Il n'y a pas de structure de contrôle en python qui correspond à case ~ when et switch ~ case.
ruby
10.times do |num|
do_something
end
loop do #boucle infinie
break if some_condition
end
python3
for num in range(10):
do_something()
while True: #boucle infinie
if some_condition():
break
En général, ruby a beaucoup de littéraux, mais pas python (comparé à ruby).
ruby
a=1.3r #=> (13/10)
python3
import fractions
fractions.Fraction(13,10) #=> 13/Valeur équivalente à 10
Les littéraux de nombres rationnels ne sont pas en python.
ruby
/.\s./.match("hello, world")[0] #=> ", w"
python3
import re
re.search( r".\s.", "hello, world" ).group(0) #=> ', w'
Les littéraux d'expressions régulières ne sont pas en python. r "" est r, ce qui signifie une chaîne brute.
ruby
"3**10=#{3**10}" #=> "3**10=59049"
python3
"3**10=%d" % 3**10 #=> "3**10=59049"
Il n'y a pas d'expansion d'expression en python (il semble que ce soit en 3.6. Remerciements particuliers à norioc). Vous devez faire quelque chose comme printf.
ruby
print("hoge")
$stdout.flush()
print("hoge", end="", flush=True)
ʻImport sys peut être
sys.stdout.flush () `.
ruby
print("hoge") #=>Sortie sans interruption de fin
puts("hoge") #=>Sortie avec une pause de fin
python3
print("hoge", end="") #=>Sortie sans interruption de fin
print("hoge") #=>Sortie avec une pause de fin
File.exist?("foo") #=>true si toto est un fichier ou un répertoire
File.file?("foo") #=>true si toto est un fichier
File.directory?("foo") #=>true si foo est un répertoire
python3
import os
os.path.exists("foo") #=>true si toto est un fichier ou un répertoire
os.path.isfile("foo") #=>true si toto est un fichier
os.path.isdir("foo") #=>true si foo est un répertoire
~~ python ne semble pas avoir de méthode équivalente à File.exist?
de ruby. ~~
J'ignorais qu'il y avait os.path.exists.
Merci, @tokyo_gs.
ruby
a=File.open("hoge.txt"){ |f| f.read(10) }
python3
with open("hoge.txt") as f:
a=f.read(10)
python fermera automatiquement le fichier lorsque vous l'utiliserez avec.
En supposant que f
est un fichier qui peut être pris avec ʻopen`:
ruby
f.puts("hoge") #Il y a un saut de ligne à la fin
f.print("fuga") #Pas de saut de ligne à la fin
f.write("piyo") #Pas de saut de ligne à la fin
python3
print("piyo", file=f) #Il y a un saut de ligne à la fin
f.write("hoge") #Pas de saut de ligne à la fin
f.write("piyo\n") #Une autre façon d'ajouter une pause à la fin
python ne peut pas être écrit comme f.print (abréviation)
.
print (abréviation, file = f)
était très surprenant.
ruby
cond=true
val = cond ? "iftrue" : "iffalse"
python3
cond=True
val = "iftrue" if cond else "iffalse"
Les opérations conditionnelles en python ne sont pas susceptibles de s'habituer du tout jusqu'à présent.
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 est une forme plurielle. Le fait est que cela devient un taple. Il y a aussi des «permutations».
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()
Le bloc ~~ ruby utilise une référence de valeur lors de la capture d'une variable, donc l'écrire normalement (individuellement) fonctionne correctement. ~~
Correction
2018/3/17
Je pense que ruby fonctionne parce qu'une variable appelée ix est confinée dans sa portée et générée à chaque fois.
Correction
/ 2018/3/17
L'argument par défaut pour python est suspect, mais si vous utilisez lambda, cela ne fonctionnera que si vous le faites ou le doublez. La raison en est que le lambda de python capture les références de variables. (N'est-ce pas vrai?) Si cela n'est pas agréable, vous pouvez spécifier une méthode pour la cible sans utiliser lambda.
uuid
ruby
require 'securerandom'
SecureRandom.uuid #=> => "72568c47-e6e0-4f21-a8b5-dad3d72831b2"
python3
import uuid
str(uuid.uuid4()) #=> '9414a2d6-b954-4519-bf88-47828d6d2577'
Vous pouvez créer des nombres aléatoires sécurisés avec un module appelé secrets, mais depuis python 3.6. De plus, il semble qu'il n'y ait pas d'I / F qui crée uuid.
python uuid inclut ʻuuid1 () , ʻuuid3 ()
, ʻuuid4 () , ʻuuid5 ()
.
ʻUuid4 () semble correspondre au
SecureRandom.uuid` de ruby.
Ce n'est pas une jointure de thread, mais un gars qui connecte les éléments d'un tableau avec des virgules.
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'
Lorsque ruby se joint, il devient une chaîne de caractères sans autorisation, mais python ne peut joindre qu'une chaîne de caractères. Je savais que le récepteur était l'inverse, mais je ne savais pas qu'il ne le convertirait pas en chaîne.
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"]
Il est nécessaire de changer le nom selon qu'il s'agit d'une expression régulière ou non.
C'est dommage que vous ne puissiez pas écrire " a, b, c ".split (re.compile (r" \ W "))
.
Sera ajouté. Il existe une meilleure façon de l'écrire! Appel à avis.
Recommended Posts