images
02/12/2020 07:06 am

Function, Biến và Phạm vi trong Python

Function là tập hợp các dòng lệnh thực thi tuần tự để đạt mục đích nhất định. Function được thực thi khi có lệnh được gọi đến function đó.

Định nghĩa Function trong Python


- Function là tập hợp các dòng lệnh thực thi tuần tự để đạt mục đích nhất định.


- Function được thực thi khi có lệnh được gọi đến function đó.


- Một function được định nghĩa bởi từ khoá def:


def function_name(argument1, argument2,...):

              code1

      code2

              ...

             return 


- Function được định nghĩa với 4 thành phần:

    • Tên function tiếp theo là dấu “:”;

    • Đầu vào: Có thể có đầu vào hoặc không cần tham số đầu vào. Đây được gọi là tham số đầu vào hay biến số, hay đối số.

    • Body của function: tập hợp các dòng code được thực thi. Code trong body được tuân thủ theo indentation: sử dụng tab hoặc space

    • Đầu ra: Có thể trả về kết quả hoặc không trả về kết quả. Để trả về kết quả, bạn dùng từ khóa return


Ví dụ: Hãy xem sự khác biệt giữa 2 đoạn script sau:


1. Example1.py:

print(“Hello Techzonefun")


2. Example2.py:

def hello():

    print(“Hello Techzonefun")


- Khi chạy lệnh python3 Example1.py, tuần tự các lệnh trong file này sẽ được chạy và dòng chữ  “Hello Techzonefune" sẽ hiện ra.


- Khi chạy lệnh python3 Example2.py, không có kết quả nào hiện ra, thực tế thì không có dòng lệnh nào được thực thi. Vì đây là khai báo hàm và hàm này chưa được gọi.


Quay lại ví dụ trên, để chạy ra kết quả, cần phải gọi hàm, bạn sửa file Example2.py như sau:


Example2.py:

1. function hello():

2. print(“Hello Techzonefun")

3. hello() #Gọi hàm hello()


Trong ví dụ này, dòng 1 là định nghĩa tên hàm: hello()


- Ví dụ về hàm có tham số đầu vào và trả về kết quả:

Hàm sum nhận 2 biến số đầu vào a,b và trả về kết quả


def sum(a,b):  #Định nghĩa với hàm với tên, sau đó là tham số và  dấu :

  return a + b # Dòng code thực thi


Sau khi khai báo hàm trên bạn có thể gọi như sau:

x = sum(4,3)   # Hàm sẽ được thực thi theo các dòng code định nghĩa

print(x)   # In ra số 7


Function với return


Từ khoá return được sử dụng trong function để trả về kết quả.


Trong hàm, hi dòng code thực thi mà gặp từ khóa return, nó sẽ dừng thực thi và trả về kết quả. Dòng code sau đó không thực thi. Ví dụ:


def divide(a,b):

   if b == 0:

      return a;

   print(“Calculate a/b”)

  return a /b


Với hàm trên, nếu ta gọi divide(10/0) ta sẽ nhận kết quả là 10; dòng chữ: “Calculate a/b” sẽ không được in ra do hàm đã return ở bước trước đó.


Function không có return


- Ví dụ về hàm có tham số đầu vào và KHÔNG trả về kết quả:

Hàm print_result nhận 1 biến số đầu vào và không trả về kết quả:

def print_result(a):

  print(“result is”, a)

Sau khi khai báo hàm trên bạn có thể gọi như sau:

x = print_result(7)   # Hàm sẽ được thực thi theo các dòng code định nghĩa, in ra số 7. x sau khi thực thi sẽ không có giá trị do hàm không trả về giá trị.


- Lưu ý, các hàm dạng này THƯỜNG sẽ không chứa từ khóa return


Gọi Function


- Khi gọi hàm, bạn phải truyền đúng tham số theo định nghĩa. Ví dụ với hàm sum(a,b) bạn không thể gọi: sum() hoặc sum(10) hoặc sum(1,2,3) vì hàm sum chỉ có 2 đối số là a,b.


- Ví dụ thực hành: Viết và thực thi hàm tính tổng giá trị của n số chẵn đầu tiên, trả về kết quả số tổng.


Gọi Function với tên tham số


- Function có thể được gọi thông qua tên tham số. Cách gọi này tường minh và dễ hiểu. Ví dụ:

def substract(a,b):

   return a - b


Trường hợp khi gọi bằng tên tham số, thứ tự tham số không ảnh hưởng tới kết quả:

      substract(4,3)

     substract(b=3,a=4)

     substract(3,4)


Function có nhiều tham số


- Bạn có thể định nghĩa hàm có nhiều tham số, không giới hạn. Khi đó bạn dùng từ khoá *, ví dụ *args:

def sum(*args):

   print(args[0])

   print(args[1])

Trường hợp này chúng ta truy xuất thông tin các biến đầu vào thông qua index như trên.

Ta có thể gọi hàm trên như sau:

sum(1)

sum(1,2)


- Bạn có thể định nghĩa hàm có nhiều tham số, không giới hạn. Khi đó bạn dùng từ khoá *, ví dụ *args:

def sum(*args):

   print(args[0])

   print(args[1])

Trường hợp này chúng ta truy xuất thông tin các biến đầu vào thông qua index như trên.

Ta có thể gọi hàm trên như sau:

sum(1)

sum(1,2)


- Bạn có thể định nghĩa hàm có nhiều tham số, không giới hạn. Và để gọi được các tham số theo tên, bạn cần định nghĩa với cú pháp tham số là **args. Ví dụ:

def view(**args):

         print(args[“a”])

         print(args[“b"])


 Ta được phép gọi như sau:

  view(a = “hello", b = “Techzonefun")

  view(a = “hello", b = “Techzonefun", c=”Python")

   view(“hello",”Techzonefun") !!! ERROR


Function với giá trị tham số mặc định


- Bạn có thể định nghĩa hàm có tham số mặc định. Khi đó việc gọi hàm đôi khi sẽ đơn giản hơn. Ví dụ:

def sum(a, b = 10):

         return (a+b)


Khi hàm có khai báo giá trị tham số mặc định, ta có thể gọi hàm và truyền vào tất cả tham số hoặc chỉ tham số nào không được định nghĩa mặc định:

  sum(4) # Trả về 14, do b lấy mặc định là 10.

  sum(4, 11) # Trả về 15, do b lấy giá trị truyền vào là 11


Function với tham số là list


- Bạn có thể định nghĩa hàm có tham số là list. Ví dụ: hàm tính tổng các thành phần trong list.

def sum(list):

    temp = 0

         for i in list:

            temp += i

         return temp;


        Sau đó ta có thể gọi:

        sum([1,2,3])


Function rỗng


- Theo cú pháp, mỗi hàm của Python cần có body theo sau dấu “:”. Tuy vậy đôi khi ta chưa cài đặt hàm đó mà muốn để trống. Python sẽ báo lỗi:

def sum(list):


IndentationError: expected an indented block


- Giải pháp: Ta cần keyword pass ở body của hàm để Python chấp nhận hàm đó là rỗng - hàm không thực hiện logic gì cả.

         def sum(list):

pass


Biến và phạm vi


Thông thường một biến trong Python hay bất kì ngôn ngữ lập trình đều có phạm vi tồn tại của nó, gọi là scope. Trong Python, một biến có thể tồn tại trong hàm gọi là local, hoặc tồn tại ở toàn bộ chương trình, gọi là global.

Ví dụ ta có đoạn code sau:


x = 5

def sum(x,y):

   return x + y


Trường hợp này biến x đầu tiên khác với biến x ở trong hàm. Ở trong hàm thì biến x trong hàm được ưu tiên hơn.


x = 5

def sum(x,y):

    print(“inside x:”,x)

   return x + y

print(“outside x:”,x) 

z = sum(9,5)


Lúc này ở trong hàm, biến x là 9, nhưng khi ra khỏi hàm, biến x = 5; 


outside x: 5

inside x: 9


Nếu trong hàm, ta muốn thay đổi biến x thì sao:

x = 5

def change():

    x = 6

    print(“inside x:”,x)


change()

print(“outside x:”,x) 

 Kết quả:

inside x: 6

outside x: 5


Nguyên nhân: khi ta viết x = 6 đồng nghĩa với việc ta khai báo một biến mới trong hàm với tên là x, khi đó biến này chỉ tồn tại ở trong hàm và là một biến mới.

Vậy có cách nào thay đổi giá trị của biến thông qua 1 hàm không. Để làm điều đó ta phải dùng global. Xem ví dụ sau:

x = 5

def change():

     print(“1. inside x:”,x)

    x = 6

    print(“2. inside x:”,x)

Tuy nhiên khi bạn gọi hàm change() hệ thống sẽ báo lỗi: 

UnboundLocalError: local variable 'x' referenced before assignment


Nguyên nhân: do trong hàm change() ta truy cập đến 1 biến chưa được khai báo trong hàm này. Python không cho phép điều đó. Để làm được, bạn phải thêm từ khóa global để Python biết rằng ta đang muốn truy cập tới biến bên ngoài, tức biến toàn cục (global)

x = 5

def change():

     global x

     print(“1. inside x:”,x)

    x = 6

    print(“2. inside x:”,x)

        change()

       print(“outside x:”,x)


Kết quả: Biến x bên ngoài được thay đổi:


1. inside x: 5

2. inside x: 6

outside x: 6


Mời bạn đọc thêm bài “Vòng lặp Loop với For - While trong Python”.


- Tech Zone

Thư giãn chút nào!!!

Bài viết liên quan