Angka ganjil terbesar
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
Untuk program Anda saat ini, kami dapat meningkatkan beberapa hal:
- Ubah nama
odd
menjadiodds
(karena ini alist
). - Gunakan
not odds
alih-alihlen(odds) == 0
(lihat Bagaimana cara memeriksa apakah daftar kosong? Untuk alasan mengapa ini lebih disukai). - Hapus
counter
. Karena kami hanya menggunakancounter
dalamwhile
kondisi tersebut, kami sebenarnya dapat mengganti seluruhnyawhile
denganfor _ in range(10)
. - 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 None
untuk menandakan bahwa tidak ada ganjil telah dimasukkan sejauh ini, dalam hal ini pada jumlah ganjil yang masuk kami mengatur max_odd
untuk x
langsung. Jika tidak, kami menetapkan max_odd
untuk 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 str
tidak sengaja diketik yang tidak dapat diuraikan sebagai angka (seperti ""
), kita dapat menggunakan try
/ except
dibungkus while
seperti 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 str
yang dapat diuraikan int
sampai mereka melakukannya. Karena ini semua terjadi dalam iterasi yang sama dari for
, jumlah angka yang mereka ketik (10 dalam kasus kami) tidak akan berkurang.
Menambahkan ke tinjauan sebelumnya:
- When
x
adalah integer,abs(x) % 2
setara denganx % 2
di 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 max
fungsi.
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")
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 l
memasukkan, 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 x
masuk l
dan mengembalikan seperti itu x
. Kuncinya di sini adalah fungsi lambda yang mengembalikan tupel (1,x)
untuk ganjil x
dan (0,x)
genap x
. Tupel dibandingkan dari kiri ke kanan, misalnya (1,x)>(0,y)
untuk setiap x
dan 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.
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.
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))