Lesen Sie Effective Python Memo Item 12 Vermeiden Sie die Verwendung von else-Blöcken nach for- und while-Schleifen und fragen Sie sich, wie Sie es als Ruby schreiben sollen. Wurde.
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')
Die else
-Klausel wird ausgeführt, wenn die Schleife ununterbrochen endet. Sicher ist es keine intuitive Bedienung.
Ich werde mein Bestes mit Ruby geben.
Ignorieren der "else" -Klausel im Fall von 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
Es wird sein. each
gibt self
zurück. Wenn also die Iteration ohne break
endet,
2 .. [a, b]` i. Ein falscher Wert wird zurückgegeben.
Wenn Sie sich also mit und
verbinden, scheint es zu funktionieren.
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"
Vorerst lief es gut. Aber es ist nicht schön.
Um "&&" zu verwenden, müssen Sie "Puts (" Coprime ")" oder "(Puts" Coprime ")" verwenden, um die Verbindung zwischen "Puts" und "Coprime" zu stärken.
Ich habe auch darüber nachgedacht, wie man Ruby Poku rausholt.
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
}
Alle sind schwer zu verstehen.
Wie Sie in "Effective Python" sehen können, scheint es am besten, in eine Methode zu schneiden, ohne etwas wie "for-else" zu tun.
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