cari

Rumah  >  Soal Jawab  >  teks badan

关于python*和**的问题

*和**为可变形参,但是平时在使用的时候感觉很少能有使用到的情况,有些不是很理解它们的用法和用处场景?
而且形参不是可以传递任意类型么?这样我写成:


a = (1,2,3,4)
def test(a):
    print a
    print a[1]

加不加*貌似没什么区别?字典也是一样只不过变成print['keyname']而已。
那么*和**这玩意到底有什么用呢?

PHP中文网PHP中文网2889 hari yang lalu219

membalas semua(1)saya akan balas

  • 巴扎黑

    巴扎黑2017-04-18 09:17:29

    Tambahan

    Saya fikir sebab mengapa kita berasa tidak berguna ialah kita sering jatuh ke dalam situasi berfikir:

    Orang yang menulis fungsi dan orang yang menggunakan fungsi adalah orang yang sama, iaitu saya

    Kerana jika penulis dan pengguna adalah orang yang sama, sudah tentu anda boleh menjadi sangat bebas dalam cara anda mereka bentuk antara muka Tidak kira jika anda memilih * atau menggunakan senarai terus

    Tetapi hari ini, apabila kami menggunakan API orang lain atau menulis fungsi untuk digunakan oleh orang lain, kami tidak mempunyai banyak kefleksibelan

    Pada masa ini, * boleh banyak membantu kami


    Dua perkara ini agak berguna!

    Berikan beberapa contoh untuk ditunjukkan

    Apabila digunakan untuk hujah fungsi

    Andaikan ada fungsi intro:

    def intro(name, age, city, language):
        print('I am {}. I am {} years old. I live in {}. I love {}'.format(
            name, age, city, language
        ))

    Hari ini saya akan memberi anda satu set data senarai lst dan data dict dic:

    lst = ['dokelung', 27, 'Taipei', 'Python']
    dic = {'name': 'dokelung', 'age': 27, 'city': 'Taipei', 'language': 'Python'}

    Daripada * atau ** anda mungkin mahu:

    test(lst[0], lst[1], lst[2], lst[3])
    test(dic['name'], dic['age'], dic['city'], dic['language'])

    Gunakan * dan **:

    test(*lst)
    test(**dic)

    Apabila digunakan untuk param fungsi

    Hari ini kita akan menulis fungsi tambahan:

    def add2(a, b):
        return a + b

    Jika anda ingin mengembangkan untuk mendarab tiga nombor:

    def add3(a, b, c):
        return a + b + c

    Terdapat dua soalan di sini:

    • Satunya ialah senarai parameter mungkin sangat panjang

    • Satunya ialah Python tidak membenarkan berbilang beban, jadi anda tidak boleh menggunakan nama fungsi yang sama

    Tetapi * boleh menyelesaikan masalah ini:

    def add(*n):
        return sum(n)

    Sudah tentu, anda mungkin berfikir bahawa saya juga boleh mereka bentuk parameter di sini untuk menjadi senarai atau tuple, tetapi kadangkala pendekatan ini lebih mudah Anda boleh merujuk kepada konsep print (Python3):

    print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
          ^^^^^^^^

    Itulah konsepnya di sini

    Kedua, pendekatan ini adalah asas untuk menulis penghias:

    def mydeco(func):
        def newfunc(*args, **kwargs):
            return func(*args, **kwargs)
        return newfunc

    Oleh kerana jika anda tidak menggunakan pendekatan ini, anda tidak boleh menangani pelbagai parameter yang mungkin ada pada fungsi yang anda ingin ubah suai

    Apabila digunakan untuk membongkar tuple (Python3)

    Fungsi ini sangat berguna:

    >>> t = ('start', 1 ,2 ,3 ,4 ,5, 'end')
    >>> s, *nums, e = t
    >>> s, nums, e
    ('start', [1, 2, 3, 4, 5], 'end')

    Kesimpulan

    Malah, terdapat lebih banyak perkara yang menarik daripada ini, ia hanya menunggu untuk anda temui!


    Soalan yang saya jawab: Python-QA

    balas
    0
  • Batalbalas