Giới thiệu về Hàm trong Python
Một hàm cho phép bạn xác định một khối mã có thể tái sử dụng để có thể thực thi nhiều lần trong chương trình của bạn.
Các chức năng cho phép bạn tạo nhiều giải pháp mô-đun và DRY hơn cho các vấn đề phức tạp.
Mặc dù Python đã cung cấp nhiều chức năng tích hợp sẵn như print()
và len()
bạn cũng có thể xác định các chức năng của riêng mình để sử dụng trong các dự án của mình.
Một trong những lợi thế lớn của việc sử dụng hàm trong mã của bạn là nó làm giảm tổng số dòng mã trong dự án của bạn.
cú pháp
Trong Python, một định nghĩa hàm có các tính năng sau:
- từ khóa
def
- một tên chức năng
- dấu ngoặc đơn'()’ và trong các tham số đầu vào của dấu ngoặc đơn, mặc dù các tham số đầu vào là tùy chọn.
- Một dấu hai chấm ‘:’
- một số khối mã để thực thi
- một tuyên bố trở lại (tùy chọn)
# a function with no parameters or returned values
def sayHello():
print("Hello!")
sayHello() # calls the function, 'Hello!' is printed to the console
# a function with a parameter
def helloWithName(name):
print("Hello " + name + "!")
helloWithName("Ada") # calls the function, 'Hello Ada!' is printed to the console
# a function with multiple parameters with a return statement
def multiply(val1, val2):
return val1 * val2
multiply(3, 5) # prints 15 to the console
Hàm là các khối mã có thể được sử dụng lại đơn giản bằng cách gọi hàm. Điều này cho phép sử dụng lại mã đơn giản, thanh lịch mà không cần viết lại các phần mã một cách rõ ràng. Điều này làm cho mã dễ đọc hơn, giúp gỡ lỗi dễ dàng hơn và hạn chế lỗi đánh máy.
Các hàm trong Python được tạo bằng cách sử dụng def
từ khóa, theo sau là tên hàm và các tham số hàm bên trong dấu ngoặc đơn.
Một hàm luôn trả về một giá trị, return
từ khóa được hàm sử dụng để trả về giá trị, nếu bạn không muốn trả về giá trị nào thì giá trị mặc định None
sẽ trở lại.
Tên hàm được sử dụng để gọi hàm, truyền các tham số cần thiết bên trong dấu ngoặc đơn.
# this is a basic sum function
def sum(a, b):
return a + b
result = sum(1, 2)
# result = 3
Bạn có thể xác định các giá trị mặc định cho các tham số, theo cách đó Python sẽ hiểu rằng giá trị của tham số đó là giá trị mặc định nếu không có giá trị nào được cung cấp.
def sum(a, b=3):
return a + b
result = sum(1)
# result = 4
Bạn có thể chuyển các tham số theo thứ tự bạn muốn bằng cách sử dụng tên của tham số.
result = sum(b=2, a=2)
# result = 4
Tuy nhiên, không thể chuyển đối số từ khóa trước đối số không phải từ khóa
result = sum(3, b=2)
#result = 5
result2 = sum(b=2, 3)
#Will raise SyntaxError
Hàm cũng là Đối tượng, vì vậy bạn có thể gán chúng cho một biến và sử dụng biến đó như một hàm.
s = sum
result = s(1, 2)
# result = 3
ghi chú
Nếu một định nghĩa hàm bao gồm các tham số, bạn phải cung cấp cùng một số lượng tham số khi gọi hàm.
print(multiply(3)) # TypeError: multiply() takes exactly 2 arguments (0 given)
print(multiply('a', 5)) # 'aaaaa' printed to the console
print(multiply('a', 'b')) # TypeError: Python can't multiply two strings
Khối mã mà hàm sẽ chạy bao gồm tất cả các câu lệnh được thụt vào trong hàm.
def myFunc():
print('this will print')
print('so will this')
x = 7
# the assignment of x is not a part of the function since it is not indented
Các biến được định nghĩa trong một hàm chỉ tồn tại trong phạm vi của hàm đó.
def double(num):
x = num * 2
return x
print(x) # error - x is not defined
print(double(4)) # prints 8
Python chỉ diễn giải khối hàm khi hàm được gọi chứ không phải khi hàm được xác định. Vì vậy, ngay cả khi khối định nghĩa hàm chứa một số loại lỗi, trình thông dịch python sẽ chỉ ra điều đó khi hàm được gọi.
Bây giờ hãy xem xét một số chức năng cụ thể với các ví dụ.
hàm tối đa ()
max()
là một hàm tích hợp sẵn trong Python 3. Nó trả về mục lớn nhất trong một lần lặp hoặc giá trị lớn nhất trong hai hoặc nhiều đối số.
Tranh luận
Hàm này nhận hai hoặc nhiều số hoặc bất kỳ loại số lặp nào làm đối số. Trong khi đưa ra một iterable làm đối số, chúng ta phải đảm bảo rằng tất cả các phần tử trong iterable đều cùng loại. Điều này có nghĩa là chúng ta không thể chuyển một danh sách có cả giá trị chuỗi và số nguyên được lưu trữ trong đó. Cú pháp: max(có thể lặp lại, *có thể lặp lại[,key, default]) tối đa(arg1, arg2, *args[, key])
Đối số hợp lệ:
max(2, 3)
max([1, 2, 3])
max('a', 'b', 'c')
Đối số không hợp lệ:
max(2, 'a')
max([1, 2, 3, 'a'])
max([])
Giá trị trả về
Mục lớn nhất trong iterable được trả về. Nếu hai hoặc nhiều đối số vị trí được cung cấp, đối số vị trí lớn nhất sẽ được trả về. Nếu iterable trống và mặc định không được cung cấp, một ValueError
được nuôi dưỡng.
Mẫu mã
print(max(2, 3)) # Returns 3 as 3 is the largest of the two values
print(max(2, 3, 23)) # Returns 23 as 23 is the largest of all the values
list1 = [1, 2, 4, 5, 54]
print(max(list1)) # Returns 54 as 54 is the largest value in the list
list2 = ['a', 'b', 'c' ]
print(max(list2)) # Returns 'c' as 'c' is the largest in the list because c has ascii value larger then 'a' ,'b'.
list3 = [1, 2, 'abc', 'xyz']
print(max(list3)) # Gives TypeError as values in the list are of different type
#Fix the TypeError mentioned above first before moving on to next step
list4 = []
print(max(list4)) # Gives ValueError as the argument is empty
Mã vận hành
Tài liệu chính thức
hàm tối thiểu ()
min()
là một hàm tích hợp sẵn trong Python 3. Nó trả về mục nhỏ nhất trong một lần lặp hoặc mục nhỏ nhất trong số hai hoặc nhiều đối số.
Tranh luận
Hàm này nhận hai hoặc nhiều số hoặc bất kỳ loại số lặp nào làm đối số. Trong khi đưa ra một iterable làm đối số, chúng ta phải đảm bảo rằng tất cả các phần tử trong iterable đều cùng loại. Điều này có nghĩa là chúng ta không thể chuyển một danh sách có cả giá trị chuỗi và số nguyên được lưu trữ trong đó.
Đối số hợp lệ:
min(2, 3)
min([1, 2, 3])
min('a', 'b', 'c')
Đối số không hợp lệ:
min(2, 'a')
min([1, 2, 3, 'a'])
min([])
Giá trị trả về
Mục nhỏ nhất trong iterable được trả về. Nếu hai hoặc nhiều đối số vị trí được cung cấp, đối số vị trí nhỏ nhất
Được trả lại. Nếu iterable trống và mặc định không được cung cấp, thì ValueError sẽ xuất hiện.
Mẫu mã
print(min(2, 3)) # Returns 2 as 2 is the smallest of the two values
print(min(2, 3, -1)) # Returns -1 as -1 is the smallest of the two values
list1 = [1, 2, 4, 5, -54]
print(min(list1)) # Returns -54 as -54 is the smallest value in the list
list2 = ['a', 'b', 'c' ]
print(min(list2)) # Returns 'a' as 'a' is the smallest in the list in alphabetical order
list3 = [1, 2, 'abc', 'xyz']
print(min(list3)) # Gives TypeError as values in the list are of different type
#Fix the TypeError mentioned above first before moving on to next step
list4 = []
print(min(list4)) # Gives ValueError as the argument is empty
Mã vận hành
Tài liệu chính thức
divmod()
là một hàm tích hợp trong Python 3, trả về thương và số dư khi chia số a
bằng số b
. Nó nhận hai số làm đối số a
& b
. Đối số không thể là một số phức.
Tranh luận
Phải mất hai đối số a
& b
– số nguyên hoặc số thập phân. Nó không được là số phức.
Giá trị trả về
Giá trị trả về sẽ là cặp số dương gồm thương và dư có được khi chia a
qua b
. Trong trường hợp các loại toán hạng hỗn hợp, các quy tắc cho toán tử số học nhị phân sẽ được áp dụng.
Vì Đối số số nguyêngiá trị trả về sẽ giống như (a // b, a % b)
.
Vì Đối số số thập phângiá trị trả về sẽ giống như (q, a % b)
ở đâu q
thường là toán.sàn (a / b) nhưng có thể ít hơn 1 số.
Mẫu mã
print(divmod(5,2)) # prints (2,1)
print(divmod(13.5,2.5)) # prints (5.0, 1.0)
q,r = divmod(13.5,2.5) # Assigns q=quotient & r= remainder
print(q) # prints 5.0 because math.floor(13.5/2.5) = 5.0
print(r) # prints 1.0 because (13.5 % 2.5) = 1.0
REPL Nó!
Tài liệu chính thức
Hàm hex(x)
hex(x)
là một hàm tích hợp trong Python 3 để chuyển đổi một số nguyên thành một chuỗi thập lục phân chữ thường có tiền tố là “0x”.
Tranh luận
Hàm này nhận một đối số, x
đó phải là kiểu số nguyên.
Trở lại
Hàm này trả về một chuỗi thập lục phân chữ thường có tiền tố là “0x”.
Ví dụ
print(hex(16)) # prints 0x10
print(hex(-298)) # prints -0x12a
print(hex(543)) # prints 0x21f
Mã vận hành
Tài liệu chính thức
hàm len()
len()
là một hàm tích hợp sẵn trong Python 3. Phương thức này trả về độ dài (số lượng mục) của một đối tượng. Phải mất một đối số x
.
Tranh luận
Phải mất một đối số, x
. Đối số này có thể là một chuỗi (chẳng hạn như chuỗi, byte, bộ, danh sách hoặc phạm vi) hoặc một bộ sưu tập (chẳng hạn như từ điển, tập hợp hoặc tập hợp cố định).
Giá trị trả về
Hàm này trả về số phần tử trong đối số được truyền cho len()
chức năng.
Mẫu mã
list1 = [123, 'xyz', 'zara'] # list
print(len(list1)) # prints 3 as there are 3 elements in the list1
str1 = 'basketball' # string
print(len(str1)) # prints 10 as the str1 is made of 10 characters
tuple1 = (2, 3, 4, 5) # tuple
print(len(tuple1)) # prints 4 as there are 4 elements in the tuple1
dict1 = {'name': 'John', 'age': 4, 'score': 45} # dictionary
print(len(dict1)) # prints 3 as there are 3 key and value pairs in the dict1
Mã vận hành
Tài liệu chính thức
chức năng thứ tự
ord()
là một hàm tích hợp trong Python 3, để chuyển đổi chuỗi đại diện cho một ký tự Unicode thành số nguyên đại diện cho mã Unicode của ký tự đó.
Ví dụ:
>>> ord('d')
100
>>> ord('1')
49
chr chức năng
chr()
là một hàm tích hợp sẵn trong Python 3, để chuyển đổi số nguyên đại diện cho mã Unicode thành một chuỗi đại diện cho một ký tự tương ứng.
Ví dụ:
>>> chr(49)
'1'
Một điều cần lưu ý rằng, nếu giá trị số nguyên được chuyển đến chr()
nằm ngoài phạm vi thì ValueError sẽ xuất hiện.
>>> chr(-10)
'Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
chr(-1)
ValueError: chr() arg not in range(0x110000)'
các hàm đầu vào ()
Nhiều lần, trong một chương trình, chúng tôi cần một số thông tin đầu vào từ người dùng. Lấy đầu vào từ người dùng làm cho chương trình cảm thấy tương tác. Trong Python 3, để lấy đầu vào từ người dùng, chúng tôi có một chức năng input()
. Nếu chức năng đầu vào được gọi, luồng chương trình sẽ bị dừng cho đến khi người dùng đưa ra một đầu vào và kết thúc đầu vào bằng phím quay lại. Hãy xem một số ví dụ:
Khi chúng tôi chỉ muốn lấy đầu vào:
inp = đầu vào ()
Mã vận hành
Để đưa ra lời nhắc bằng tin nhắn:
lời nhắcvớitin nhắn = đầu vào (”)
Mã vận hành
3. Khi chúng ta muốn lấy một số nguyên đầu vào:
number = int(input('Please enter a number: '))
Mã vận hành
Nếu bạn nhập một giá trị không phải là số nguyên thì Python sẽ báo lỗi ValueError
. Vì vậy, bất cứ khi nào bạn sử dụng cái này, hãy đảm bảo rằng bạn cũng nắm bắt được nó. Nếu không, chương trình của bạn sẽ dừng đột ngột sau lời nhắc.
number = int(input('Please enter a number: '))
# Please enter a number: as
# Enter a string and it will throw this error
# ValueError: invalid literal for int() with base 10 'as'
4. Khi chúng ta muốn nhập chuỗi:
string = str(input('Please enter a string: '))
Mã vận hành
Mặc dù vậy, đầu vào được lưu trữ theo mặc định dưới dạng chuỗi. Sử dụng str()
chức năng làm cho trình đọc mã hiểu rõ rằng đầu vào sẽ là một ‘chuỗi’. Đó là một thực hành tốt để đề cập trước loại đầu vào nào sẽ được thực hiện.
Tài liệu chính thức
Cách gọi hàm trong Python
Một câu lệnh định nghĩa hàm không thực thi hàm. Việc thực thi (gọi) một hàm được thực hiện bằng cách sử dụng tên của hàm theo sau dấu ngoặc đơn kèm theo các đối số bắt buộc (nếu có).
>>> def say_hello():
... print('Hello')
...
>>> say_hello()
Hello
Việc thực thi một hàm giới thiệu một bảng ký hiệu mới được sử dụng cho các biến cục bộ của hàm. Chính xác hơn, tất cả các phép gán biến trong một hàm đều lưu trữ giá trị trong bảng ký hiệu cục bộ; trong khi các tham chiếu biến đầu tiên tìm trong bảng ký hiệu cục bộ, sau đó trong bảng ký hiệu cục bộ của các hàm kèm theo, sau đó trong bảng ký hiệu toàn cục và cuối cùng trong bảng tên dựng sẵn. Do đó, các biến toàn cục không thể được gán trực tiếp một giá trị trong một hàm (trừ khi được đặt tên trong câu lệnh toàn cục), mặc dù chúng có thể được tham chiếu.
>>> a = 1
>>> b = 10
>>> def fn():
... print(a) # local a is not assigned, no enclosing function, global a referenced.
... b = 20 # local b is assigned in the local symbol table for the function.
... print(b) # local b is referenced.
...
>>> fn()
1
20
>>> b # global b is not changed by the function call.
10
Các tham số thực tế (đối số) cho một lệnh gọi hàm được đưa vào trong bảng ký hiệu cục bộ của hàm được gọi khi nó được gọi; do đó, các đối số được truyền bằng cách gọi theo giá trị (trong đó giá trị luôn là tham chiếu đối tượng, không phải giá trị của đối tượng). Khi một chức năng gọi một chức năng khác, một bảng ký hiệu cục bộ mới được tạo cho cuộc gọi đó.
>>> def greet(s):
... s = "Hello " + s # s in local symbol table is reassigned.
... print(s)
...
>>> person = "Bob"
>>> greet(person)
Hello Bob
>>> person # person used to call remains bound to original object, 'Bob'.
'Bob'
Các đối số được sử dụng để gọi một hàm không thể được gán lại bởi hàm, nhưng các đối số tham chiếu đến các đối tượng có thể thay đổi có thể thay đổi giá trị của chúng:
>>> def fn(arg):
... arg.append(1)
...
>>> a = [1, 2, 3]
>>> fn(a)
>>> a
[1, 2, 3, 1]