Cara meneruskan variabel dari satu fungsi ke fungsi lain dengan python

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...

Bagaimana Anda mengakses variabel dari satu fungsi ke fungsi lainnya?

Anda dapat menggunakan fungsi untuk menetapkan nilai variabel di luar konteks fungsi, kemudian Anda dapat menggunakannya sebagai argumen dalam fungsi lain. You can use the function to set the value of a variable outside the context of the function, then you can use it as an argument in another function.

Bisakah Anda memanggil variabel dari fungsi lain dengan Python?

Dalam Python dan sebagian besar bahasa pemrograman, variabel yang dideklarasikan di luar fungsi dikenal sebagai variabel global. Anda dapat mengakses variabel tersebut di dalam dan di luar fungsi, karena memiliki cakupan global .

Bagaimana Anda mengirimkan data antar fungsi?

Ketika ada beberapa fungsi (yang sering terjadi), perlu ada cara untuk meneruskan data antar fungsi. Ini dilakukan dengan memasukkan nilai dalam tanda kurung. myFunction(myData) . Bahkan ketika tidak ada data yang dilewatkan, kita tetap harus mendeklarasikan dan mengeksekusi fungsi dengan menggunakan tanda kurung. Fungsiku().