Lisez Effective Python Memo Item 12 Evitez d'utiliser des blocs else après les boucles for et while et demandez-vous comment l'écrire en Ruby. Devenu.
a = 4
b = 9
for i in range(2, min(a, b) + 1):
print('Testing', i)
if a % i == 0 and b % i == 0:
print('Not coprime')
break
else:
print('Coprime')
La clause ʻelse` est exécutée lorsque la boucle se termine sans interruption. Ce n'est certainement pas une opération intuitive. Je ferai de mon mieux avec Ruby.
Ignorer la clause ʻelse`, dans le cas de Ruby,
a = 4
b = 9
(2..[a, b].min).each do |i|
puts "Testing: #{i}"
if (a % i).zero? && (b % i).zero?
puts "Not coprime"
break
end
end
Ce sera. ʻEach renvoie
self, donc si l'itération se termine sans
break,
2 .. [a, b] c'est-à-dire, la vraie valeur est retournée, et
break,
nil`, c'est-à-dire Une fausse valeur est renvoyée.
Donc, si vous vous connectez avec ʻet`, cela semble fonctionner.
a = 4
b = 9
(2..[a, b].min).each do |i|
puts "Testing: #{i}"
if (a % i).zero? && (b % i).zero?
puts "Not coprime"
break
end
end and puts "Coprime"
Pour le moment, ça s'est bien passé. Mais ce n'est pas beau.
Pour utiliser &&
, vous devez utiliser met (" Coprime ")
ou (met" Coprime ")
pour renforcer la connexion entre met
et" Coprime "
.
J'ai aussi réfléchi à la façon de faire sortir Ruby Poku.
a = 4
b = 9
puts (2..[a, b].min).each_with_object("Coprime") { |i|
puts "Testing: #{i}"
if (a % i).zero? && (b % i).zero?
break "Not coprime"
end
}
a = 4
b = 9
puts "Coprime".tap {
(2..[a, b].min).each do |i|
puts "Testing: #{i}"
if (a % i).zero? && (b % i).zero?
break "Not coprime"
end
end
}
Tous sont difficiles à comprendre.
Comme vous pouvez le voir dans "Python efficace", il semble préférable de découper dans une méthode sans faire quelque chose comme for-else
.
def coprime?(a, b)
(2..[a, b].min).each do |i|
return false if (a % i).zero? && (b % i).zero?
end
true
end
puts coprime?(4, 9) ? "Coprime" : "Not coprime"
Recommended Posts