5 Soalan: Tukar integer untuk terapung

soalan dicipta di Wed, May 8, 2019 12:00 AM

Saya cuba menulis fungsi yang menukarkan bilangan bulat kepada terapung, dan meninggalkan boolean dan rentetan seperti mereka.

Saya telah menentukan fungsi berikut:

def if_int_to_float(value):

    if isinstance(value, bool):

        return value

    elif isinstance(value, int):

        return float(value)

    else:

        return value

Apabila digunakan secara meluas, saya telah menemui fungsi ini agak perlahan. Sebarang idea untuk meningkatkan prestasinya /menjadikannya lebih pythonic?

    
0
  1. Apa yang anda maksud apabila anda mengatakan perlahan?
    2019-05-08 15: 52: 25Z
  2. Soalan: mengapa anda memerlukan fungsi ini di tempat pertama? Ini seolah-olah sesuatu di mana jika anda memerlukan apungan, anda hanya boleh menghantar ke float() apabila perlu.
    2019-05-08 15: 53: 20Z
  3. Anda periksa bool, namun anda tidak melakukan apa-apa yang istimewa jika ia, jadi anda boleh menghapusnya.
    2019-05-08 15: 55: 35Z
  4. Kod ini dijalankan sebagai sebahagian daripada program yang lebih besar dan selepas bermain-main dengan cProfile, saya melihat bahawa bahagian yang baik dari masa pelaksanaan dimakan oleh fungsi ini memanggil bahkan walaupun ia tidak dipanggil terlalu banyak.
    2019-05-08 18: 19: 46Z
5 Jawapan                              5                         

Anda boleh menggabungkan anda jika syarat. Ini akan membantu kerana kami litar pintas jika syarat berdasarkan input, supaya ia dapat membuat kod anda lebih cepat!

def if_int_to_float(value):

    #If not boolean and int or float, convert to float
    if not isinstance(value, bool) and isinstance(value, int) or isinstance(value,float):
        return float(value)

    #Else return value
    else:
        return value

print(if_int_to_float('a'))
print(if_int_to_float(1))
print(if_int_to_float(1.0))
print(if_int_to_float(True))

Output akan

a
1.0
1.0
True
    
1
2019-05-08 16: 38: 49Z
  1. Ia berfungsi, terima kasih tetapi penyelesaian Fuzzbury lebih pantas!
    2019-05-08 18: 24: 40Z
  2. Semoga perkara ini, bolehkah saya tahu bagaimana anda menilainya dengan lebih pantas? Juga menggunakan jenis yang buruk dan bahkan dokumen menyarankan untuk menggunakan isinstance
    2019-05-09 02: 19: 30Z
  3. Terima kasih Devesh, hanya menjalankan cProfile terhadap kod saya dengan fungsi baru. Walau bagaimanapun, selepas membaca lebih lanjut mengenai type, saya telah memilih penyelesaian anda.
    2019-05-09 06: 28: 01Z
  4. Pasti terima kasih, penyelesaian yang dipilih sebelumnya menggunakan pendaraban yang tidak perlu dalam kod tersebut, sedangkan hanya chaining ifinstance sudah cukup:)
    2019-05-09 06:29:29

Anda boleh mengalih keluar satu cek dan menulis pada satu baris untuk mendapatkan peningkatan kelajuan sedikit apabila melepaskan terapung atau rentetan. Kes bool sudah sangat cepat.

Isinstance () menyebabkan anda mengalami masalah di sini kerana bools juga sepadan dengan int maka pernyataan pertama jika anda boleh menggunakan jenis () bukan

def if_int_to_float(value):
    return value * 1.0 if type(value) == int else value
    
3
2019-05-08 16: 07: 00Z
  1. Ini berfungsi seperti pesona dan membuat kod saya lebih cepat. Terima kasih!
    2019-05-08 18: 21: 26Z
  2. Jika saya boleh bertanya, bagaimana anda tahu @NicolasBerthier bahawa ini lebih cepat? Juga menggunakan type adalah buruk, dan anda harus selalu menggunakan isinstance untuk menyemak jenis-jenis seperti dokumentasi python: docs.python.org/3/library/functions.html#type
    2019-05-09 05: 24: 14Z
  3. Hi Devesh, hanya dengan menjalankan kod saya melalui cProfile dan menggantikan fungsi.
    2019-05-09 06: 28: 42Z

cuba ini:

def if_int_to_float(value):

    if type(value) == int:

        return float(value)

    else:

        return value
    
2
2019-05-08 16: 01: 57Z
  1. Ia berfungsi, terima kasih tetapi penyelesaian Fuzzbury lebih pantas!
    2019-05-08 18: 23: 14Z

Mungkin anda boleh mencuba fungsi type() dan dapatkan hasilnya. Atau anda boleh menggunakan pengendalian pengecualian untuk menangani jenis masalah ini. Tetapi dalam hal itu, seperti yang ditunjukkan dalam komen, dalam hal bool nilai-nilai itu akan menutup True ke 1.0 dan False ke 0.0.

#using type() function
def if_int_to_float(value):
    if type(value) == int:
        return float(value)
    else:
        return value
    
1
2019-05-08 16: 02: 11Z
  1. Ini menukarkan boolean kepada 1.0!
    2019-05-08 16: 01: 55Z
  2. terima kasih kerana menunjukkannya.
    2019-05-08 16: 02: 45Z

apabila data berada dalam senarai, gunakan lambda

data=[1,3,'j','oo']
sol = list(map(lambda x: float(x) if type(x)=='int' else x, data))
print(sol)

output

[1.0, 3.0, 'j', 'oo']

atau gunakan fungsi untuk menguji nilai individu

def fun_int_to_float(value):
    if type(value)=='int':
        return float(value)
    return value
    
1
2019-05-08 16: 05: 14Z
  1. Terima kasih atas penyelesaiannya. Data saya tidak dalam senarai tetapi saya akan menyimpannya sekiranya saya memerlukannya.
    2019-05-08 18: 24: 09Z
sumber diletakkan di sini