Angka ganjil terbesar

Aug 19 2020

Minta pengguna untuk memasukkan 10 bilangan bulat dan kemudian mencetak angka ganjil terbesar yang dimasukkan. Jika tidak ada nomor ganjil yang dimasukkan, cetak pesan untuk itu.

Saya telah mencoba untuk memecahkan masalah ini dengan python dan saya pikir saya telah menemukan cara yang mencakup semua kasus yang mungkin diberikan definisi matematika dari bilangan ganjil. Untuk memastikannya, saya ingin memeriksa apakah kode saya benar berdasarkan kriteria Anda sendiri.

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

Jawaban

19 MarioIshac Aug 19 2020 at 07:14

Untuk program Anda saat ini, kami dapat meningkatkan beberapa hal:

  1. Ubah nama oddmenjadi odds(karena ini a list).
  2. Gunakan not oddsalih-alih len(odds) == 0(lihat Bagaimana cara memeriksa apakah daftar kosong? Untuk alasan mengapa ini lebih disukai).
  3. Hapus counter. Karena kami hanya menggunakan counterdalam whilekondisi tersebut, kami sebenarnya dapat mengganti seluruhnya whiledengan for _ in range(10).
  4. Ikuti PEP 8 . Misalnya, menggunakan 4 spasi untuk setiap tingkat indentasi.

Mempertimbangkan semua perubahan ini, kami mendapatkan:

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

Tetapi kami juga dapat meningkatkan efisiensi program ini. Sekarang kami melacak semua angka ganjil, sebelum memilih maks. Artinya kompleksitas ruang adalah O (N). Kita dapat mengubahnya menjadi O (1) dengan melacak bilangan ganjil terbesar seperti:

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)

Perhatikan bahwa kita menggunakan Noneuntuk menandakan bahwa tidak ada ganjil telah dimasukkan sejauh ini, dalam hal ini pada jumlah ganjil yang masuk kami mengatur max_odduntuk xlangsung. Jika tidak, kami menetapkan max_odduntuk max(max_odd, x).

Untuk jenis program ini Anda tidak akan melihat peningkatan efisiensi karena mengurangi kompleksitas ruang. Tetapi belajar untuk mengenali di mana pengurangan ini dimungkinkan akan memungkinkan Anda untuk melihat pola yang sama dalam program yang penting.

Akhirnya ada satu hal lagi yang dapat Anda lakukan. Jika Anda ingin mengizinkan program untuk terus mengumpulkan angka jika a strtidak sengaja diketik yang tidak dapat diuraikan sebagai angka (seperti ""), kita dapat menggunakan try/ exceptdibungkus whileseperti ini:

while True:
    try:
        x = int(input("Enter a number: "))
        break
    except ValueError:
        continue

Ini akan menggantikan:

x = int(input("Enter a number: "))

dalam kode aslinya. Ini akan terus mendorong pengguna untuk mengetik stryang dapat diuraikan intsampai mereka melakukannya. Karena ini semua terjadi dalam iterasi yang sama dari for, jumlah angka yang mereka ketik (10 dalam kasus kami) tidak akan berkurang.

6 GZ0 Aug 19 2020 at 08:58

Menambahkan ke tinjauan sebelumnya:

  • When xadalah integer, abs(x) % 2setara dengan x % 2di Python. Output dari operator modulo %memiliki tanda yang sama dengan operan kedua.
  • Saat menjalankan kode di luar metode / kelas, itu adalah praktik yang baik untuk meletakkan kode di dalam penjaga utama . Lihat di sini untuk penjelasan lebih lanjut.

Di Python 3.8, kode dapat dipersingkat menggunakan operator penugasan :=bersama dengan maxfungsi.

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

Membungkus int(input("Enter a number: "))ke dalam suatu fungsi memberikan keterbacaan yang lebih baik:

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

Varian lain yang menangani masukan pengguna yang tidak valid adalah sebagai berikut:

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

Bolehkah saya bertanya bahasa pemrograman apa yang Anda praktikkan sebelum python?
Saya ingin menyebutkan satu baris untuk ini:

max(l,key=lambda x:(x%2,x))

dengan asumsi Anda sudah lmemasukkan, seperti

s='Enter a number: '
l=[int(input(s)) for i in range(10)]

Bagaimana cara kerja kode tersebut? Ini mencari maksimum key(x)untuk xmasuk ldan mengembalikan seperti itu x. Kuncinya di sini adalah fungsi lambda yang mengembalikan tupel (1,x)untuk ganjil xdan (0,x)genap x. Tupel dibandingkan dari kiri ke kanan, misalnya (1,x)>(0,y)untuk setiap xdan y. Jadi kita hanya mengatakan "beri saya maksimum l, dengan asumsi bahwa bilangan ganjil selalu lebih besar dari bilangan genap".

Jadi semua program akan terlihat seperti

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

Pendek, bagus dan mudah, seperti python.

Tapi saya setuju bahwa blok coba-kecuali di sekitar int(input())bentuk jawaban yang diterima berguna, bersama dengan tidak menyimpan seluruh daftar nilai ganjil.

Saya hanya ingin mendemonstrasikan paradigma pemrograman fungsional dengan python, ketika Anda hanya memberi tahu python 'Saya ingin itu selesai (misalnya nilai maksimum)' dan itu melakukannya untuk Anda, Anda tidak perlu menjelaskan bagaimana cara melakukannya.

Terima kasih sudah membaca.

3 EmilioMBumachar Aug 19 2020 at 21:36

Saya akan mencoba membangun saran terakhir dari jawaban yang diterima.

while True:
    try:
        x = int(input("Enter a number: "))
        break
    except ValueError:
        continue

Saya benar-benar mendukung saran ini, ini memungkinkan program Anda untuk menangani masukan yang tidak valid dengan baik alih-alih hanya mogok.

Namun, ini menciptakan masalah kegunaan. Pengguna yang baru saja mengetik huruf menjadi angka mungkin tidak menyadarinya. Mereka akan mengira mereka telah memasukkan nomor yang diinginkan, melanjutkan dengan yang berikutnya, dan kemudian menjadi bingung di akhir, ketika mereka mengira mereka telah memasukkan semua nomor, tetapi komputer masih meminta nomor berikutnya.

Lebih baik memberi mereka umpan balik:

while True:
    try:
        x = int(input("Enter a number: "))
        break
    except ValueError:
        print("Invalid number will be ignored.")
        continue

... atau bahkan lebih baik, cetak kembali nomor yang mereka ketik:

while True:
    try:
        inputString = input("Enter a number: ")
        x = int(inputString)
        break
    except ValueError:
        print("Invalid number will be ignored: {}".format(inputString))
        continue

Saya juga akan mempertimbangkan untuk menyimpan daftar lengkap nomor valid yang dimasukkan, bukan hanya nomor ganjil, dan mencetak semuanya kembali ke pengguna sebelum hasilnya, untuk memberi mereka kesempatan terakhir untuk melihat kesalahan ketik. Mereka bisa, bagaimanapun, salah mengetik angka yang valid tetapi tidak diinginkan. Perhatikan bahwa ini akan meningkatkan penggunaan memori, dan beberapa akan menganggapnya sebagai komunikasi berlebihan.

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

Jika Anda melakukan ini, langkah selanjutnya adalah menyingkirkan variabel "peluang", dan mencari ganjil terbesar langsung dari daftar lengkap.

1 FMc Aug 25 2020 at 12:23

Poin utamanya di sini: setiap langkah dalam proses hanya melakukan satu hal sederhana. Anda membangun program dengan cara itu - satu langkah inkremental yang ditentukan secara ketat pada satu waktu. Jangan mencampur semuanya secara campur aduk - mis. Loop tempat kita berinteraksi dengan pengguna sementara juga membuat konversi dan kalkulasi yang diperlukan nanti.

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