En büyük tek sayı

Aug 19 2020

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

19 MarioIshac Aug 19 2020 at 07:14

Mevcut programınız için birkaç şeyi iyileştirebiliriz:

  1. Rename oddiçin odds(bir yana list).
  2. not oddsBunun yerine kullanın len(odds) == 0( neden bunun tercih edildiğine ilişkin bir nedenle Listenin boş olup olmadığını nasıl kontrol ederim? ).
  3. Sil counter. Sadece koşulda kullandığımız counteriçin while, aslında bütünü whileile değiştirebiliriz for _ in range(10).
  4. 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 Nonehiçbir tek sayı, şimdiye kadar girildiğini tek dizi üzerine bu durumda biz set girilmesine olduğunu belirtmek için max_oddiçin xdoğrudan. Aksi takdirde, set max_oddetmek 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. strBir 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/ exceptsarmalı 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 strayrıştırılabilir bir a yazmasını istemeye intdevam eder. Bunların hepsi aynı yinelemede gerçekleştiğinden, yazacakları forsayıların sayısı (bizim durumumuzda 10) azaltılmayacaktır.

6 GZ0 Aug 19 2020 at 08:58

Önceki incelemeye ekleniyor:

  • Ne zaman xbir tamsayıdır, Python'daki abs(x) % 2ile eşdeğerdir x % 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")
3 AlexeyBurdin Aug 19 2020 at 12:56

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 xde lve 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 xve (0,x)hatta için x. Tuple'lar soldan sağa karşılaştırılır, örneğin (1,x)>(0,y)her xve y. Yani biz sadece " ltek 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.

3 EmilioMBumachar Aug 19 2020 at 21:36

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.

1 FMc Aug 25 2020 at 12:23

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))