Notez qu'écrire comme ça avec ruby c'est écrire comme ça avec python

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

longueur

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.

Autour de l'objet

Moule

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?

Dupliquer

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.

Comparaison

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

Stringification

ruby


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

python3


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

Autour de la baie

Conversion de plage en liste / tableau

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]

Sortez la pièce

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.

Changement de pièce

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.

dernier

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]

Valeur maximum

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.

Tri non destructif

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.

Ordre inverse

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.

nombre aléatoire

échantillonnage

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.

Nombre à virgule flottante supérieur ou égal à 0 et inférieur à 1

ruby


rand

python3


import random
random.random()

Un entier supérieur ou égal à 0 et inférieur à 10.

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.

Structure de contrôle

if déclaration

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.

répétition

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

littéral

En général, ruby a beaucoup de littéraux, mais pas python (comparé à ruby).

Nombre raisonnable

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.

Expressions régulières

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.

Expression d'expression dans un littéral de chaîne

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.

Entrée sortie

Rinçage du tampon

ruby


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

ʻImport sys peut être sys.stdout.flush () `.

imprimer et met

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

Existence de fichiers et de répertoires

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.

Fichier ouvert / fermé

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.

Ecrire dans un fichier.

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.

Non classé

Calcul conditionnel

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.

Jointure de chaîne

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.

Division de 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 ")).

finalement

Sera ajouté. Il existe une meilleure façon de l'écrire! Appel à avis.

Recommended Posts

Notez qu'écrire comme ça avec ruby c'est écrire comme ça avec python
[Note] Faites fonctionner MongoDB avec Python
Zundokokiyoshi avec python / rubis / Lua
Notez qu'il prend en charge Python 3
[Python] Qu'est-ce qu'une instruction with?
Remarque Python: à propos de la comparaison en utilisant is
Scraping avec Node, Ruby et Python
Proxy dynamique avec python, ruby, PHP
(Note) Soyez prudent avec python argparse
[Note] Sortie Hello world avec python
Ceci et cela des propriétés python
Lire et écrire NetCDF avec Python
Lire et écrire du CSV avec Python
Avec PEP8 et PEP257, un codage Python qui n'est pas gênant à montrer aux gens!
Notez que admin.py n'est pas reflété immédiatement lors de l'exécution de Django avec WSGIDaemonProcess
python Remarque: lorsque easy_install ne peut pas être utilisé
[Python] Un programme qui crée des escaliers avec #
[Note] Obtenir des données de PostgreSQL avec Python
Réaliser un générateur PHP / Python avec Golang / Ruby
Remarques lors de la création d'un environnement avec python
[Note personnelle] Scraping de pages Web en python3
Lire et écrire des fichiers JSON avec Python
Essayer de gérer SQLite3 avec Python [Note]
Notez que les décorateurs Python doivent avoir des wraps
Visualisez le point P qui fonctionne avec Python
Essayez d'appeler Python depuis Ruby avec une économie
Crypter avec Ruby (Rails) et décrypter avec Python
Un monde typé qui commence par Python
Scraping Web facile avec Python et Ruby
Essayez quelque chose comme Python for-else dans Ruby
# J'ai essayé quelque chose comme Vlookup avec Python # 2
À propos du 02 février 2020 * Ceci est un article Python.
Lors de l'écriture de tests avec python unittest, utilisez doCleanups pour les setUps qui peuvent échouer
Sont Php / Ruby / Python qui ne s'exécute que lorsque le fichier est appelé directement
Remarque: Python
API Boto3 (manipuler les ressources AWS avec la bibliothèque Python) qui est souvent utilisée en privé
Note de Python
Résumé de la grammaire souvent oubliée avec matplotlib
Comment profiter de la programmation avec Minecraft (Ruby, Python)
Créez une application qui devine les étudiants avec Python
[Note] Exportez le html du site avec python.
Le journal Python n'est pas sorti avec docker-compose up
La requête [Développement Web avec Python] est également redirigée
Créer une page qui se charge indéfiniment avec python
[Note] Créez une classe de fuseau horaire sur une ligne avec python
J'ai essayé d'utiliser mecab avec python2.7, ruby2.3, php7
Remarque pour le formatage des nombres avec la fonction de format python
Ceci est le seul examen de base de Python ~ 1 ~
Ceci est le seul examen de base de Python ~ 2 ~
Notez que la notation d'inclusion de liste de Python est toujours déroutante
Que comparez-vous avec Python et ==?
Ceci est le seul examen de base de Python ~ 3 ~
La lecture et l'écriture s'adaptent aux fichiers avec Python (mémo)
Ceci et cela utile lorsqu'il est utilisé avec nohup
Une doublure qui produit 10000 chiffres de rapport de circonférence avec Python
Exemple de programme qui génère un syslog avec la journalisation Python
Notez que Vim installé par Homebrew ne démarre pas avec l'erreur Python 3.8