Dalam Python, seseorang dapat menyimpan byte dengan aliasing fungsi yang digunakan berulang kali. Sebagai contoh:
r=range
a=r(100)
b=r(200)
c=r(300)
Namun, ketika fungsi-fungsi tersebut adalah fungsi anggota bersama-sama, saya tidak tahu cara mengatasinya dengan cara yang memungkinkan perangkaian. Sebagai contoh:
s='Hello'
// Plain code
s=s.replace('H','J').replace('e','i').replace('l','m').replace('o','y')
// What I am trying to do
q=replace
s=s.q('H','J').q('e','i').q('l','m').q('o','y')
Jelas, apa yang saya coba lakukan tidak valid. Dan ini juga tidak:
q=s.replace
s=q('H','J') // Replaces the 'H' in 'Hello'
s=q('e','i') // Replaces the 'e' in 'Hello'... and the J is gone.
s=q('l','m')
s=q('o','y')
Apakah ada cara lain untuk fungsi alias anggota dan fungsi dirantai yang menyimpan karakter?
q
berarti apareplace
artinya di kelas yang Anda gunakan.q
terikat pada metode gantistr
contoh khusus itu . Juga, ingat Anda dapat melakukan penggantian char tunggal dengan"Hello".replace(*"HJ")
Jawaban:
Tidak masalah! Anda dapat menggunakan alias metode, tetapi Anda harus tahu cara menggunakannya:
Kuncinya adalah Anda harus lulus
self
secara eksplisit, karena alias adalah jenis fungsi yang membutuhkan argumen tambahan yang membutuhkanself
:sumber
Tentukan kelas Anda sendiri, dengan nama metode yang lebih pendek.
Misalnya, jika Anda menggunakan metode
replace()
milikString
kelas, Anda bisa membuat kelas Anda sendiriS
memiliki metode yang disebutq
yang melakukan hal yang sama.Berikut ini satu implementasinya:
Berikut ini adalah implementasi yang jauh lebih baik:
Gunakan seperti ini:
sumber
Ini beberapa karakter lebih pendek
bahkan lebih pendek untuk sejumlah kecil penggantian
tentu saja ini hanya mencakup satu kasus tertentu. Namun golf kode adalah semua tentang menemukan kasus-kasus khusus yang dapat menghemat byte.
Dimungkinkan untuk menulis fungsi pembungkus yang menangani kasus umum, tetapi kode akan terlalu besar untuk mendapat tempat di sebagian besar tantangan kode golf.
Anda malah perlu berpikir, "Saya bisa melakukan transformasi ini secara efisien (dengan strok) dengan str.replace. Dapatkah saya menggeser representasi internal dari solusi saya untuk mengambil keuntungan dari itu? (Tanpa membuang begitu banyak stroke untuk meniadakan keuntungan)"
sumber
Anda dapat menggunakan
reduce
fungsi ini.sumber
Jika Anda melakukan banyak penggantian, Anda bisa melakukan ini:
sumber
[a]
)[a]
harus diganti dengan.get(a,a)
(jika tidak, kita mendapatkan beberapa Key Error)? Dan mengapalist(s)
bukannyas
?Bagaimana dengan mendefinisikan fungsi lambda?
sumber
str.replace
/ itu / lambda itu! Lihat jawaban saya.Jika penggantian Anda tidak perlu dirantai, Anda dapat menggunakan `str.translate '. Angka-angkanya adalah tata cara ASCII. Menggunakannya dengan cara ini membutuhkan Python 3:
Cobalah online
sumber