Rumah > Soal Jawab > teks badan
*和**为可变形参,但是平时在使用的时候感觉很少能有使用到的情况,有些不是很理解它们的用法和用处场景?
而且形参不是可以传递任意类型么?这样我写成:
a = (1,2,3,4)
def test(a):
print a
print a[1]
加不加*貌似没什么区别?字典也是一样只不过变成print['keyname']而已。
那么*和**这玩意到底有什么用呢?
巴扎黑2017-04-18 09:17:29
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
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)
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)
>>> t = ('start', 1 ,2 ,3 ,4 ,5, 'end')
>>> s, *nums, e = t
>>> s, nums, e
('start', [1, 2, 3, 4, 5], 'end')
Kesimpulan
Soalan yang saya jawab: Python-QA