Nilai default dievaluasi saat fungsi didefinisikan, bukan saat dipanggil. Ini bisa menjadi masalah saat menggunakan tipe yang bisa berubah (mis. g. kamus atau daftar) dan memodifikasinya di badan fungsi, karena modifikasi akan tetap ada di seluruh pemanggilan fungsi
Menggunakan tipe yang tidak dapat diubah dalam argumen kata kunci
In [124]: bigx = 10 In [125]: def double_it(x=bigx): .....: return x * 2 .....: In [126]: bigx = 1e9 # Now really big In [128]: double_it() Out[128]: 20
Menggunakan tipe yang bisa berubah dalam argumen kata kunci (dan memodifikasinya di dalam badan fungsi)
In [2]: def add_to_dict(args={'a': 1, 'b': 2}): ...: for i in args.keys(): ...: args[i] += 1 ...: print(args) ...: In [3]: add_to_dict Out[3]: <function __main__.add_to_dict> In [4]: add_to_dict() {'a': 2, 'b': 3} In [5]: add_to_dict() {'a': 3, 'b': 4} In [6]: add_to_dict() {'a': 4, 'b': 5} _
Tip
Contoh yang lebih terlibat menerapkan pemotongan python
In [98]: def slicer(seq, start=None, stop=None, step=None): ....: """Implement basic python slicing.""" ....: return seq[start:stop:step] ....: In [101]: rhyme = 'one fish, two fish, red fish, blue fish'.split() In [102]: rhyme Out[102]: ['one', 'fish,', 'two', 'fish,', 'red', 'fish,', 'blue', 'fish'] In [103]: slicer(rhyme) Out[103]: ['one', 'fish,', 'two', 'fish,', 'red', 'fish,', 'blue', 'fish'] In [104]: slicer(rhyme, step=2) Out[104]: ['one', 'two', 'red', 'blue'] In [105]: slicer(rhyme, 1, step=2) Out[105]: ['fish,', 'fish,', 'fish,', 'fish'] In [106]: slicer(rhyme, start=1, stop=4, step=2) Out[106]: ['fish,', 'fish,']
Urutan argumen kata kunci tidak masalah
In [107]: slicer(rhyme, step=2, start=1, stop=4) Out[107]: ['fish,', 'fish,']
tetapi merupakan praktik yang baik untuk menggunakan pengurutan yang sama dengan definisi fungsi
Argumen kata kunci adalah fitur yang sangat nyaman untuk mendefinisikan fungsi dengan jumlah variabel argumen, terutama ketika nilai default akan digunakan di sebagian besar panggilan ke fungsi
1. 2. 4. 4. Melewati nilai
Tip
Bisakah Anda mengubah nilai variabel di dalam suatu fungsi? . Dalam Python, perbedaan seperti itu agak dibuat-buat, dan agak tidak kentara apakah variabel Anda akan dimodifikasi atau tidak. Untungnya, ada aturan yang jelas
Parameter ke fungsi adalah referensi ke objek, yang diteruskan oleh nilai. Saat Anda meneruskan variabel ke suatu fungsi, python meneruskan referensi ke objek yang dirujuk oleh variabel tersebut (nilainya). Bukan variabel itu sendiri
Jika nilai yang diteruskan dalam suatu fungsi tidak dapat diubah, fungsi tersebut tidak mengubah variabel pemanggil. Jika nilainya bisa berubah, fungsi dapat mengubah variabel pemanggil di tempat
>>> def try_to_modify(x, y, z): .. x = 23 .. y.append(42) .. z = [99] # new reference .. print(x) .. print(y) .. print(z) ... >>> a = 77 # immutable variable >>> b = [99] # mutable variable >>> c = [28] >>> try_to_modify(a, b, c) 23 [99, 42] [99] >>> print(a) 77 >>> print(b) [99, 42] >>> print(c) [28] _
Fungsi memiliki tabel variabel lokal yang disebut namespace lokal
Variabel In [6]: def disk_area(radius): ...: return 3.14 * radius * radius ...: In [8]: disk_area(1.5) Out[8]: 7.0649999999999995 _9 hanya ada di dalam fungsi In [81]: def double_it(x): ....: return x * 2 ....: In [82]: double_it(3) Out[82]: 6 In [83]: double_it() --------------------------------------------------------------------------- Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: double_it() takes exactly 1 argument (0 given) 0
1. 2. 4. 5. Variabel global
Variabel yang dideklarasikan di luar fungsi dapat dirujuk di dalam fungsi
In [114]: x = 5 In [115]: def addx(y): .....: return x + y .....: In [116]: addx(10) Out[116]: 15
Tetapi variabel "global" ini tidak dapat dimodifikasi di dalam fungsi, kecuali dinyatakan global dalam fungsi tersebut
Ini tidak berhasil
In [6]: def disk_area(radius): ...: return 3.14 * radius * radius ...: In [8]: disk_area(1.5) Out[8]: 7.0649999999999995 0
Ini bekerja
In [6]: def disk_area(radius): ...: return 3.14 * radius * radius ...: In [8]: disk_area(1.5) Out[8]: 7.0649999999999995 1
1. 2. 4. 6. Jumlah variabel parameter
Bentuk parameter khusus- In [81]: def double_it(x): ....: return x * 2 ....: In [82]: double_it(3) Out[82]: 6 In [83]: double_it() --------------------------------------------------------------------------- Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: double_it() takes exactly 1 argument (0 given) _1. sejumlah argumen posisi dikemas ke dalam tuple
- In [81]: def double_it(x): ....: return x * 2 ....: In [82]: double_it(3) Out[82]: 6 In [83]: double_it() --------------------------------------------------------------------------- Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: double_it() takes exactly 1 argument (0 given) _2. sejumlah argumen kata kunci yang dikemas ke dalam kamus
In [6]: def disk_area(radius): ...: return 3.14 * radius * radius ...: In [8]: disk_area(1.5) Out[8]: 7.0649999999999995 2
1. 2. 4. 7. Docstring
Dokumentasi tentang apa yang dilakukan fungsi dan parameternya. Konvensi umum
In [6]: def disk_area(radius): ...: return 3.14 * radius * radius ...: In [8]: disk_area(1.5) Out[8]: 7.0649999999999995 _3
Catatan
pedoman Docstring
Demi standardisasi, halaman web Konvensi Docstring mendokumentasikan semantik dan konvensi yang terkait dengan docstring Python
Selain itu, modul Numpy dan Scipy telah menetapkan standar yang tepat untuk mendokumentasikan fungsi ilmiah, yang mungkin ingin Anda ikuti untuk fungsi Anda sendiri, dengan bagian In [81]: def double_it(x): ....: return x * 2 ....: In [82]: double_it(3) Out[82]: 6 In [83]: double_it() --------------------------------------------------------------------------- Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: double_it() takes exactly 1 argument (0 given) 3, bagian In [81]: def double_it(x): ....: return x * 2 ....: In [82]: double_it(3) Out[82]: 6 In [83]: double_it() --------------------------------------------------------------------------- Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: double_it() takes exactly 1 argument (0 given) 4, dll. Lihat
1. 2. 4. 8. Fungsi adalah objek
Fungsi adalah objek kelas satu, yang artinya bisa- ditugaskan ke variabel
- item dalam daftar (atau koleksi apa pun)
- diteruskan sebagai argumen ke fungsi lain
In [6]: def disk_area(radius): ...: return 3.14 * radius * radius ...: In [8]: disk_area(1.5) Out[8]: 7.0649999999999995 _4
1. 2. 4. 9. Metode
Metode adalah fungsi yang melekat pada objek. Anda telah melihat ini dalam contoh kami di daftar, kamus, string, dll...