Apakah ada cara yang lebih pythonic untuk melakukan pernyataan bersarang jika selain dari ini:
def convert_what(numeral_sys_1, numeral_sys_2):
if numeral_sys_1 == numeral_sys_2:
return 0
elif numeral_sys_1 == "Hexadecimal":
if numeral_sys_2 == "Decimal":
return 1
elif numeral_sys_2 == "Binary":
return 2
elif numeral_sys_1 == "Decimal":
if numeral_sys_2 == "Hexadecimal":
return 4
elif numeral_sys_2 == "Binary":
return 6
elif numeral_sys_1 == "Binary":
if numeral_sys_2 == "Hexadecimal":
return 5
elif numeral_sys_2 == "Decimal":
return 3
else:
return 0
Skrip ini adalah bagian dari konverter sederhana.
python
if-statement
Module_art
sumber
sumber
and
kondisi untuk pernyataan if-else tingkat atas. Setidaknya akan lebih mudah dibaca seperti itu. Sayangnya, python tidak memiliki pernyataan switch.Jawaban:
Sementara jawaban @Aryerez dan @ SencerH. bekerja, setiap nilai yang mungkin
numeral_sys_1
harus ditulis berulang kali untuk setiap nilai yang mungkin terjadinumeral_sys_2
ketika mendaftarkan pasangan nilai, membuat struktur data lebih sulit untuk dipertahankan ketika jumlah nilai yang mungkin meningkat. Sebagai gantinya, Anda dapat menggunakan dict bersarang sebagai ganti pernyataan bersarang jika:Sebagai alternatif, Anda dapat menghasilkan pasangan nilai untuk pemetaan dengan
itertools.permutations
metode, yang urutannya mengikuti urutan input:sumber
Masukkan semua kombinasi yang valid untuk
dictionary
darituple
s, dan jika kombinasi tersebut tidak ada, kembali 0:Jika Anda berencana untuk menggunakan fungsi dalam satu lingkaran, mungkin merupakan ide yang lebih baik untuk mendefinisikan kamus di luar fungsi, jadi itu tidak akan dibuat kembali pada setiap panggilan ke fungsi.
sumber
except KeyError:
.get()
metode dict dengan0
default alih-alihtry
pernyataan.try:... except:...
strukturnya.Jika Anda yakin tidak ada nilai lain yang dapat diatur ke variabel numeral_sys_1 dan numeral_sys_2 ini adalah solusi paling sederhana dan paling bersih.
Di sisi lain, Anda harus memperluas kamus dengan kombinasinya dengan nilai yang tersedia, jika Anda memiliki nilai selain "Heksadesimal", "Desimal" dan "Biner"
Logikanya di sini adalah; jika tupel variabel dalam kunci kamus tidak sama dengan tupel variabel yang diberikan, metode .get () mengembalikan "0". Jika diberi tuple variabel cocok dengan sembarang tombol dalam kamus maka kembalikan nilai kunci yang cocok.
Ada juga yang menggunakan generator bisa jadi solusinya. Terlihat jauh lebih pintar, tapi saya pikir kamus kode keras akan lebih cepat daripada menggunakan generator untuk kebutuhan sederhana ini.
sumber
Cara alternatif menggunakan daftar bersarang. Semoga ini bisa membantu !!
sumber
Menurut pendapat saya,
convert_what
fungsi ini sendiri tidak terlalu pythonic. Saya kira kode yang memanggil kode ini memiliki banyak pernyataan if juga dan melakukan konversi tergantung pada nilai balikconvert_what()
. Saya menyarankan sesuatu seperti ini:Langkah pertama, buat satu fungsi untuk setiap kombinasi:
Langkah kedua, letakkan objek fungsi dalam dict. Perhatikan bahwa tidak ada () setelah nama fungsi, karena kami ingin menyimpan objek fungsi dan belum memanggilnya:
Langkah ketiga dan terakhir, terapkan fungsi konversi. Pernyataan if memeriksa apakah kedua sistem itu sama. Kemudian, kita mendapatkan fungsi yang tepat dari dict kita dan menyebutnya:
sumber
Hal ini dilakukan oleh pernyataan peralihan kasus dalam sebagian besar bahasa lain. Dalam python, saya menggunakan fungsi sederhana dengan kamus ekspresi.
Kode:
Keluaran:
sumber
Secara umum saya akan menjalankan dengan solusi kamus untuk tugas bersarang jika. Beberapa kasus tertentu mungkin mengarah pada pendekatan lain. Seperti yang ini:
sumber
Bagaimana dengan sesuatu seperti:
sumber
Suatu Ide menggunakan daftar dan mendapatkan indeks hasil, yaitu.
sumber
Seperti yang dikatakan @Sadap,
Jika Anda menerapkan konversi dasar untuk bilangan bulat, Anda mungkin akan melalui representasi umum pula:
int
. Fungsi terpisah untuk masing-masing pasangan pangkalan tidak diperlukan, dan kedua pangkalan yang terlibat bahkan tidak perlu saling mengenal.Memasukkan
Buat pemetaan dari nama sistem angka ke dasarnya:
memungkinkan Anda membaca input dengan
int(text, BASES[numeral_sys_1])
.Keluaran
Buat pemetaan dari nama sistem angka ke penentu format :
memungkinkan Anda untuk menulis output dengan
format(n, FORMATTERS[numeral_sys_2])
.Contoh penggunaan
Entah dikt juga dapat dibuat lebih umum dengan membuat fungsi nilai sebagai gantinya, jika Anda perlu mendukung serangkaian format yang berbeda dari
int(x, base)
, atau lebih banyak basis output daripada dukungan format integer bawaan.sumber
Saya suka menjaga kode tetap kering:
sumber
Menggunakan beberapa teknik yang disediakan oleh jawaban lain dan menggabungkannya:
sumber
Meski tidak yakin apakah pendekatan ini lebih cepat, tetapi bisa dilakukan dengan menggunakan numpy juga:
dan dapat digunakan sebagai:
sumber