En büyük tek sayı
Kullanıcıdan 10 tam sayı girmesini ve ardından girilen en büyük tek sayıyı yazdırmasını isteyin. Tek sayı girilmemişse, bunun için bir mesaj yazdırın.
Bu problemi python ile çözmeye çalışıyordum ve sanırım tek bir sayının matematiksel tanımı göz önüne alındığında olası tüm durumları kapsayan bir yol buldum. Emin olmak için, kendi kriterlerinize göre kodumun doğru olup olmadığını kontrol etmek istiyorum.
counter = 0
odd = []
while counter < 10:
x = int(input("Enter a number: "))
if abs(x)%2 != 0:
odd.append(x)
counter += 1
if len(odd) == 0:
print("No odd number was entered")
else:
print("The largest odd number is:", max(odd))
Yanıtlar
Mevcut programınız için birkaç şeyi iyileştirebiliriz:
- Rename
odd
içinodds
(bir yanalist
). not odds
Bunun yerine kullanınlen(odds) == 0
( neden bunun tercih edildiğine ilişkin bir nedenle Listenin boş olup olmadığını nasıl kontrol ederim? ).- Sil
counter
. Sadece koşulda kullandığımızcounter
içinwhile
, aslında bütünüwhile
ile değiştirebilirizfor _ in range(10)
. - PEP 8'i takip edin . Örneğin, her girinti düzeyi için 4 boşluk kullanmak.
Tüm bu değişiklikleri hesaba katarak şunu elde ederiz:
odds = []
for _ in range(10):
x = int(input("Enter a number: "))
if abs(x) % 2 != 0:
odds.append(x)
if not odds:
print("No odd number was entered")
else:
print("The largest odd number is:", max(odds))
Ancak bu programın verimliliğini de artırabiliriz. Şu anda, maksimum değeri seçmeden önce tüm tek sayıları takip ediyoruz. Bu, uzay karmaşıklığının O (N) olduğu anlamına gelir. En büyük tek sayıyı şu şekilde takip ederek bunu O (1) olarak değiştirebiliriz:
max_odd = None
for _ in range(10):
x = int(input("Enter a number: "))
if abs(x) % 2 != 0:
max_odd = x if max_odd is None else max(max_odd, x)
if max_odd is None:
print("No odd number was entered")
else:
print("The largest odd number is: ", max_odd)
Not kullandığımız o None
hiçbir tek sayı, şimdiye kadar girildiğini tek dizi üzerine bu durumda biz set girilmesine olduğunu belirtmek için max_odd
için x
doğrudan. Aksi takdirde, set max_odd
etmek max(max_odd, x)
.
Bu tür bir program için, alan karmaşıklığını azalttığı için verimlilikteki artışı fark etmeyeceksiniz. Ancak bu azaltmaların nerede mümkün olduğunu anlamayı öğrenmek, önemli olduğu programlarda aynı kalıpları görmenizi sağlayacaktır.
Sonunda yapabileceğiniz bir şey daha var. str
Bir sayı olarak (örneğin ""
) çözümlenemeyen bir yanlışlıkla yazılması durumunda programın sayıları biriktirmesine izin vermek istiyorsanız, aşağıdaki gibi bir try
/ except
sarmalı kullanabiliriz while
:
while True:
try:
x = int(input("Enter a number: "))
break
except ValueError:
continue
Bu, aşağıdakilerin yerini alacaktır:
x = int(input("Enter a number: "))
orijinal kodda. Bu, kullanıcının, yapana kadar str
ayrıştırılabilir bir a yazmasını istemeye int
devam eder. Bunların hepsi aynı yinelemede gerçekleştiğinden, yazacakları for
sayıların sayısı (bizim durumumuzda 10) azaltılmayacaktır.
Önceki incelemeye ekleniyor:
- Ne zaman
x
bir tamsayıdır, Python'dakiabs(x) % 2
ile eşdeğerdirx % 2
. Modulo operatörünün çıktısı%
, ikinci işlenen ile aynı işarete sahiptir. - Bir yöntem / sınıf dışında kod çalıştırırken, kodu bir ana korumanın içine koymak iyi bir uygulamadır . Daha fazla açıklama için buraya bakın .
Python 3.8'de kod, işlevle :=
birlikte atama operatörü kullanılarak kısaltılabilir max
.
if __name__ == "__main__":
# Number generator
num_gen = (o for _ in range(10) if (o := int(input("Enter a number: "))) % 2 != 0)
max_odd = max(num_gen, default=None)
if max_odd is None:
print("No odd number was entered")
else:
print(f"The largest odd number is: {max_odd}")
int(input("Enter a number: "))
Bir işleve sarmak daha iyi okunabilirlik sağlar:
def read_input() -> int:
return int(input("Enter a number: "))
if __name__ == "__main__":
num_gen = (o for _ in range(10) if (o := read_input()) % 2 != 0)
max_odd = max(num_gen, default=None)
if max_odd is None:
print("No odd number was entered")
else:
print(f"The largest odd number is: {max_odd}")
Geçersiz kullanıcı girişlerini işleyen başka bir varyant ise aşağıdaki gibidir:
def read_input() -> int:
while True:
try:
return int(input("Enter a number: "))
except ValueError:
continue
if __name__ == "__main__":
try:
max_odd = max(o for _ in range(10) if (o := read_input()) % 2 != 0)
print(f"The largest odd number is: {max_odd}")
except ValueError:
# Since read_input() no longer raises ValueError, the except
# statement here only handles the cases where max() gets no inputs
print("No odd number was entered")
Python'dan önce hangi programlama dilini çalıştığınızı sorabilir miyim?
Bunun için tek satırlık bir şeyden bahsetmek istiyorum:
max(l,key=lambda x:(x%2,x))
Zaten bir l
şekilde girdiğinizi varsayarsak ,
s='Enter a number: '
l=[int(input(s)) for i in range(10)]
Kod nasıl çalışır? Bu maksimum arar key(x)
için x
de l
ve bu tür döndürür x
. Anahtar burada döner tanımlama grubu olduğu lambda fonksiyonu olan (1,x)
tek için x
ve (0,x)
hatta için x
. Tuple'lar soldan sağa karşılaştırılır, örneğin (1,x)>(0,y)
her x
ve y
. Yani biz sadece " l
tek bir sayının her zaman çift sayıdan daha büyük olduğunu varsayarak bana maksimum ver" diyoruz .
Böylece tüm program şöyle görünecek
s='Enter a number: '
l=[int(input(s)) for i in range(10)]
m=max(l,key=lambda x:(x%2,x))
if m%2:
print('The largest odd number is: %d'%m)
else: #the greatest is even, therefore no odd numbers
print('No odd number was entered')
Python kadar kısa, güzel ve kolay.
Ancak int(input())
, kabul edilen cevabın etrafında bir deneme hariç bloğunun yararlı olduğunu ve tek değerlerin tüm listesinin önceden depolanmadığını kabul ediyorum .
Ben sadece python'da işlevsel programlama paradigmasını göstermek istedim, sadece python'a 'Bunun yapılmasını istiyorum (örneğin bir maksimum değer)' dediğinizde ve bunu sizin için yaptığında, nasıl yapması gerektiğini açıklamanıza gerek yok.
Okuduğunuz için teşekkürler.
Kabul edilen cevabın son önerisi üzerine inşa etmeye çalışacağım.
while True:
try:
x = int(input("Enter a number: "))
break
except ValueError:
continue
Bu öneriyi kesinlikle destekliyorum, programınızın sadece çökmek yerine geçersiz girişi incelikle işlemesine izin veriyor.
Ancak kullanılabilirlik sorunu yaratır. Bir harfi bir sayıya yazan kullanıcı muhtemelen bunu fark etmemiştir. İstenen sayıyı aldıklarını düşünecekler, bir sonrakine geçecekler ve sonunda tüm sayıları aldıklarını düşündüklerinde kafaları karışacak , ancak bilgisayar hala bir sonrakini istiyor.
Onlara geri bildirim vermek daha iyidir:
while True:
try:
x = int(input("Enter a number: "))
break
except ValueError:
print("Invalid number will be ignored.")
continue
... veya daha da iyisi, yazım hatası yapılmış numaralarını onlara geri yazdırın:
while True:
try:
inputString = input("Enter a number: ")
x = int(inputString)
break
except ValueError:
print("Invalid number will be ignored: {}".format(inputString))
continue
Ayrıca, yazım hatalarını tespit etmeleri için onlara son bir şans vermek için, yalnızca tek sayıları değil, girilen geçerli numaraların tam listesini tutmayı ve hepsini sonuçtan önce kullanıcıya geri yazdırmayı düşünürdüm. Sonuçta, geçerli ancak istenmeyen bir sayıyı yanlış yazmış olabilirler. Bunun bellek kullanımını artıracağını ve bazılarının aşırı iletişim olduğunu düşüneceğini unutmayın.
print("Numbers provided are: {}".format(all_valid_numbers_inputted))
if not odds:
print("No odd number was entered")
else:
print("The largest odd number is:", max(odds))
Bunu yaparsanız, bir sonraki adım "oranlar" değişkeninden kurtulmak ve en büyük oranı doğrudan tam listeden bulmak olacaktır.
Buradaki kilit nokta: Süreçteki her adım sadece tek bir basit şey yapar. Programları bu şekilde oluşturursunuz - her seferinde artımlı, sıkı tanımlanmış bir adım. Her şeyi karmakarışık bir şekilde karıştırmayın - örneğin, bir kullanıcıyla etkileşim kurarken aynı zamanda daha sonra ihtiyaç duyulan dönüşümleri ve hesaplamaları da yaptığımız bir döngü.
def as_int(s):
try:
return int(s)
except Exception:
return 0
N = 3
MSG = 'Enter number: '
replies = [input(MSG) for _ in range(N)] # Interact.
nums = [as_int(r) for r in replies] # Convert.
odds = [n for n in nums if n % 2] # Compute.
if odds: # Report.
print(max(odds))