Cộng đồng chia sẻ tri thức Lib24.vn

Python - Hàm

Gửi bởi: Phạm Thọ Thái Dương 19 tháng 2 2020 lúc 16:13:20


Mục lục
* * * * *

Hàm là một khối mã có thể sử dụng lại có tổ chức, được sử dụng để thực hiện một hành động liên quan duy nhất. Các chức năng cung cấp tính mô đun tốt hơn cho ứng dụng của bạn và mức độ tái sử dụng mã cao.

Như bạn đã biết, Python cung cấp cho bạn nhiều hàm dựng sẵn như print (), v.v. nhưng bạn cũng có thể tạo các hàm của riêng mình. Các hàm này được gọi là các hàm do người dùng định nghĩa.

Xác định hàm

Bạn có thể xác định các chức năng để cung cấp các chức năng cần thiết. Dưới đây là các quy tắc đơn giản để xác định hàm trong Python.

  1. Các khối chức năng bắt đầu bằng từ khóa def theo sau là tên hàm và dấu ngoặc đơn (()).
  2. Bất kỳ tham số hoặc đối số đầu vào nào cũng phải được đặt trong các dấu ngoặc đơn này. Bạn cũng có thể định nghĩa các tham số bên trong các dấu ngoặc đơn này.
  3. Câu lệnh đầu tiên của hàm có thể là câu lệnh tùy chọn - chuỗi tài liệu của hàm hoặc chuỗi doc .
  4. Khối mã trong mỗi hàm bắt đầu bằng dấu hai chấm (:) và được thụt lề.
  5. Câu lệnh return [biểu thức] thoát khỏi một hàm, tùy ý gửi lại một biểu thức cho người gọi. Một tuyên bố trả về không có đối số cũng giống như trả về Không có.

Cú pháp

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]

Theo mặc định, các tham số có hành vi vị trí và bạn cần thông báo cho chúng theo cùng thứ tự mà chúng được xác định.

Thí dụ

Hàm sau lấy một chuỗi làm tham số đầu vào và in nó trên màn hình tiêu chuẩn.

def printme( str ):
   "This prints a passed string into this function"
   print str
   return

Gọi một chức năng

Việc xác định hàm chỉ cung cấp cho nó một tên, chỉ định các tham số sẽ được bao gồm trong hàm và cấu trúc các khối mã.

Khi cấu trúc cơ bản của một chức năng được hoàn thành, bạn có thể thực hiện nó bằng cách gọi nó từ một chức năng khác hoặc trực tiếp từ dấu nhắc Python. Sau đây là ví dụ để gọi hàm printme () -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme("I'm first call to user defined function!")
printme("Again second call to the same function")

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

I'm first call to user defined function!
Again second call to the same function

Chuyển qua tham chiếu so với giá trị

Tất cả các tham số (đối số) trong ngôn ngữ Python được truyền bằng tham chiếu. Nó có nghĩa là nếu bạn thay đổi những gì một tham số đề cập đến trong một chức năng, thay đổi cũng phản ánh lại trong chức năng gọi. Ví dụ:

#!/usr/bin/python

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist.append([1,2,3,4]);
   print "Values inside the function: ", mylist
   return

# Now you can call changeme function
mylist = [10,20,30];
changeme( mylist );
print "Values outside the function: ", mylist

Ở đây, chúng tôi đang duy trì tham chiếu của đối tượng được thông qua và nối thêm các giá trị trong cùng một đối tượng. Vì vậy, điều này sẽ tạo ra kết quả sau -

Values inside the function:  [10, 20, 30, [1, 2, 3, 4]]
Values outside the function:  [10, 20, 30, [1, 2, 3, 4]]

Có một ví dụ nữa trong đó đối số đang được truyền bằng tham chiếu và tham chiếu đang được ghi đè bên trong hàm được gọi.

#!/usr/bin/python

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist = [1,2,3,4]; # This would assig new reference in mylist
   print "Values inside the function: ", mylist
   return

# Now you can call changeme function
mylist = [10,20,30];
changeme( mylist );
print "Values outside the function: ", mylist

Danh sách mylist là cục bộ của hàm thay đổi. Thay đổi mylist bên trong hàm không ảnh hưởng đến mylist . Hàm không thực hiện được gì và cuối cùng điều này sẽ tạo ra kết quả như sau -

Values inside the function:  [1, 2, 3, 4]
Values outside the function:  [10, 20, 30]

Đối số chức năng

Bạn có thể gọi một hàm bằng cách sử dụng các loại đối số chính thức sau -

  1. Đối số cần thiết
  2. Đối số từ khóa
  3. Đối số mặc định
  4. Đối số độ dài thay đổi

Đối số cần thiết

Các đối số bắt buộc là các đối số được truyền cho một hàm theo đúng thứ tự vị trí. Ở đây, số lượng đối số trong lệnh gọi hàm phải khớp chính xác với định nghĩa hàm.

Để gọi hàm printme () , bạn chắc chắn cần phải truyền một đối số, nếu không, nó sẽ báo lỗi cú pháp như sau -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme()

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

Traceback (most recent call last):
   File "test.py", line 11, in <module>
      printme();
TypeError: printme() takes exactly 1 argument (0 given)

Đối số từ khóa

Đối số từ khóa có liên quan đến các cuộc gọi chức năng. Khi bạn sử dụng các đối số từ khóa trong một cuộc gọi chức năng, người gọi sẽ xác định các đối số theo tên tham số.

Điều này cho phép bạn bỏ qua các đối số hoặc sắp xếp chúng theo thứ tự vì trình thông dịch Python có thể sử dụng các từ khóa được cung cấp để khớp các giá trị với các tham số. Bạn cũng có thể thực hiện các cuộc gọi từ khóa đến hàm printme () theo các cách sau -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme( str = "My string")

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

My string

Ví dụ sau đây cho hình ảnh rõ ràng hơn. Lưu ý rằng thứ tự của các tham số không quan trọng.

#!/usr/bin/python

# Function definition is here
def printinfo( name, age ):
   "This prints a passed info into this function"
   print "Name: ", name
   print "Age ", age
   return;

# Now you can call printinfo function
printinfo( age=50, name="miki" )

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

Name:  miki
Age  50

Đối số mặc định

Đối số mặc định là đối số giả định giá trị mặc định nếu giá trị không được cung cấp trong lệnh gọi hàm cho đối số đó. Ví dụ sau đây đưa ra ý tưởng về các đối số mặc định, nó in tuổi mặc định nếu nó không được thông qua -

#!/usr/bin/python

# Function definition is here
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print "Name: ", name
   print "Age ", age
   return;

# Now you can call printinfo function
printinfo( age=50, name="miki" )
printinfo( name="miki" )

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

Name:  miki
Age  50
Name:  miki
Age  35

Đối số độ dài thay đổi

Bạn có thể cần xử lý một hàm cho nhiều đối số hơn bạn đã chỉ định trong khi xác định hàm. Các đối số này được gọi là đối số có độ dài thay đổi và không được đặt tên trong định nghĩa hàm, không giống như các đối số mặc định và bắt buộc.

Cú pháp cho một hàm với các đối số biến không từ khóa là thế này -

def functionname([formal_args,] *var_args_tuple ):
   "function_docstring"
   function_suite
   return [expression]

Dấu hoa thị (*) được đặt trước tên biến chứa các giá trị của tất cả các đối số biến không từ khóa. Bộ dữ liệu này vẫn trống nếu không có đối số bổ sung nào được chỉ định trong khi gọi hàm. Sau đây là một ví dụ đơn giản -

#!/usr/bin/python

# Function definition is here
def printinfo( arg1, *vartuple ):
   "This prints a variable passed arguments"
   print "Output is: "
   print arg1
   for var in vartuple:
      print var
   return;

# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

Output is:
10
Output is:
70
60
50

Các chức năng ẩn danh

Các hàm này được gọi là ẩn danh vì chúng không được khai báo theo cách chuẩn bằng cách sử dụng từ khóa def . Bạn có thể sử dụng từ khóa lambda để tạo các hàm ẩn danh nhỏ.

  1. Các biểu mẫu Lambda có thể nhận bất kỳ số lượng đối số nào nhưng chỉ trả về một giá trị dưới dạng biểu thức. Chúng không thể chứa các lệnh hoặc nhiều biểu thức.
  2. Một hàm ẩn danh không thể là một cuộc gọi trực tiếp để in vì lambda yêu cầu một biểu thức
  3. Các hàm Lambda có không gian tên cục bộ của riêng chúng và không thể truy cập các biến khác ngoài các biến trong danh sách tham số của chúng và các biến trong không gian tên toàn cục.
  4. Mặc dù có vẻ như lambda là phiên bản một dòng của hàm, chúng không tương đương với các câu lệnh nội tuyến trong C hoặc C ++, mục đích của nó là bằng cách chuyển phân bổ ngăn xếp hàm trong khi gọi vì lý do hiệu năng.

Cú pháp

Cú pháp của các hàm lambda chỉ chứa một câu lệnh, như sau -

lambda [arg1 [,arg2,.....argn]]:expression

Sau đây là ví dụ để cho thấy hình thức chức năng lambda hoạt động như thế nào -

#!/usr/bin/python

# Function definition is here
sum = lambda arg1, arg2: arg1 + arg2;

# Now you can call sum as a function
print "Value of total : ", sum( 10, 20 )
print "Value of total : ", sum( 20, 20 )

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

Value of total :  30
Value of total :  40

Các trở lại Bản Tuyên Bố

Câu lệnh return [biểu thức] thoát khỏi một hàm, tùy ý gửi lại một biểu thức cho người gọi. Một tuyên bố trả về không có đối số cũng giống như trả về Không có.

Tất cả các ví dụ trên không trả lại bất kỳ giá trị. Bạn có thể trả về một giá trị từ một hàm như sau -

#!/usr/bin/python

# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2
   print "Inside the function : ", total
   return total;

# Now you can call sum function
total = sum( 10, 20 );
print "Outside the function : ", total

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

Inside the function :  30
Outside the function :  30

Phạm vi của các biến

Tất cả các biến trong một chương trình có thể không truy cập được ở tất cả các vị trí trong chương trình đó. Điều này phụ thuộc vào nơi bạn đã khai báo một biến.

Phạm vi của một biến xác định phần của chương trình nơi bạn có thể truy cập một mã định danh cụ thể. Có hai phạm vi cơ bản của các biến trong Python -

  1. Biến toàn cầu
  2. Biến cục bộ

Biến toàn cục so với cục bộ

Các biến được định nghĩa bên trong một thân hàm có phạm vi cục bộ và các biến được xác định bên ngoài có phạm vi toàn cục.

Điều này có nghĩa là các biến cục bộ chỉ có thể được truy cập bên trong hàm mà chúng được khai báo, trong khi các biến toàn cục có thể được truy cập trong toàn bộ thân chương trình bởi tất cả các hàm. Khi bạn gọi một hàm, các biến được khai báo bên trong nó được đưa vào phạm vi. Sau đây là một ví dụ đơn giản -

#!/usr/bin/python

total = 0; # This is global variable.
# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2; # Here total is local variable.
   print "Inside the function local total : ", total
   return total;

# Now you can call sum function
sum( 10, 20 );
print "Outside the function global total : ", total

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

Inside the function local total :  30
Outside the function global total :  0

Được cập nhật: hôm kia lúc 11:48:49 | Lượt xem: 541