Saya sedang menulis skrip sekali pakai untuk menghitung beberapa solusi analitis untuk beberapa simulasi yang saya jalankan.

Saya ingin mengimplementasikan fungsi dengan cara yang, berdasarkan inputnya, akan menghitung jawaban yang benar. Jadi misalnya, katakanlah saya memiliki persamaan matematika berikut:

tmax = (s1 - s2) / 2 = q * (a^2 / (a^2 - b^2))

Tampaknya sederhana bagi saya bahwa saya harus dapat melakukan sesuatu seperti:

def tmax(s1, s2):
    return (s1 - s2) / 2

def tmax(a, b, q):
    return q * (a**2 / (a**2 - b**2))

Saya mungkin sudah terbiasa menulis dalam julia, tetapi saya benar-benar tidak ingin memperumit skrip ini lebih dari yang saya perlukan.

2
dylanjm 16 Januari 2020, 03:40

2 jawaban

Jawaban Terbaik

Dalam bahasa yang diketik secara statis seperti C++, Anda dapat membebani fungsi berdasarkan jenis parameter input (dan kuantitas) tetapi itu tidak mungkin dilakukan dengan Python. Hanya ada satu fungsi dari nama yang diberikan.

Apa yang Anda dapat lakukan adalah menggunakan fitur argumen default untuk memilih salah satu dari dua jalur dalam fungsi tersebut, seperti:

def tmax(p1, p2, p3 = None):
    # Two-argument variant has p3 as None.

    if p3 is None:
        return (p1 - p2) / 2

    # Otherwise, we have three arguments.

    return (p1 * p1 / (p1 * p1 - p2 * p2)) * p3

Jika Anda bertanya-tanya mengapa saya mengubah operasi kuadrat dari n ** 2 ke n * n, itu karena yang terakhir lebih cepat (atau dulu, di beberapa titik di masa lalu , setidaknya untuk pangkat integral kecil seperti 2 - ini mungkin masih terjadi tetapi Anda mungkin ingin mengonfirmasi).

Kasus mungkin di mana mungkin lebih cepat untuk melakukan g1 ** 2 daripada g1 * g1 adalah di mana g1 adalah global daripada lokal (dibutuhkan lebih lama untuk Python VM ke LOAD_GLOBAL daripada LOAD_FAST). Ini tidak terjadi dengan kode yang diposting karena argumennya secara inheren non-global.

3
paxdiablo 16 Januari 2020, 01:24

Anda dapat melakukan ini menggunakan argumen opsional:

def tmax_2(s1, s2):
    return (s1 - s2) / 2

def tmax_3(a, b, q):
    return q * (a**2 / (a**2 - b**2))

def tmax(a, b, c=None):
    if c is None:
        return tmax_2(a, b)
    else:
        return tmax_3(a, b, c)
1
Fengyang Wang 16 Januari 2020, 00:44