Bài 8.3. Python - Giá trị trả về

Một hàm không phải lúc nào cũng phải hiển thị đầu ra của nó trực tiếp. Thay vào đó, nó có thể xử lý một số dữ liệu và sau đó trả về một giá trị hoặc một tập hợp các giá trị. Giá trị mà hàm trả về được gọi là giá trị trả về. Câu lệnh return lấy một giá trị từ bên trong hàm và gửi nó trở lại dòng gọi hàm. Giá trị trả về cho phép bạn di chuyển nhiều công việc của chương trình vào các hàm, điều này có thể đơn giản hóa thân chương trình của bạn.

Trả về một giá trị đơn giản

Hãy xem xét một hàm nhận tên và họ, và trả về một tên đầy đủ được định dạng gọn gàng:

def get_formatted_name(first_name, last_name):
    """Trả về một tên đầy đủ, được định dạng gọn gàng."""
    full_name = f"{first_name} {last_name}"
    return full_name.title()

musician = get_formatted_name('jimi', 'hendrix')
print(musician)

Định nghĩa của get_formatted_name() nhận các tham số là tên và họ. Hàm kết hợp hai tên này, thêm một khoảng trắng giữa chúng và gán kết quả cho full_name. Giá trị của full_name được chuyển đổi thành dạng tiêu đề và sau đó trả về dòng gọi hàm.

Khi bạn gọi một hàm trả về một giá trị, bạn cần cung cấp một biến mà giá trị trả về có thể được gán cho. Trong trường hợp này, giá trị trả về được gán cho biến musician. Đầu ra hiển thị một tên được định dạng gọn gàng bao gồm các phần của tên một người:

Jimi Hendrix

Điều này có vẻ như là rất nhiều công việc để có được một tên đầy đủ được định dạng gọn gàng khi chúng ta có thể chỉ cần viết:

print("Jimi Hendrix")

Tuy nhiên, khi bạn xem xét làm việc với một chương trình lớn cần lưu trữ nhiều tên và họ riêng biệt, các hàm như get_formatted_name() trở nên rất hữu ích. Bạn lưu trữ tên và họ riêng biệt và sau đó gọi hàm này bất cứ khi nào bạn muốn hiển thị một tên đầy đủ.

Làm cho một tham số tùy chọn

Đôi khi có ý nghĩa khi làm cho một tham số tùy chọn, để người sử dụng hàm có thể chọn cung cấp thông tin bổ sung chỉ khi họ muốn. Bạn có thể sử dụng giá trị mặc định để làm cho một tham số tùy chọn.

Ví dụ, giả sử chúng ta muốn mở rộng get_formatted_name() để xử lý cả tên đệm. Một nỗ lực đầu tiên để bao gồm tên đệm có thể trông như thế này:

def get_formatted_name(first_name, middle_name, last_name):
    """Trả về một tên đầy đủ, được định dạng gọn gàng."""
    full_name = f"{first_name} {middle_name} {last_name}"
    return full_name.title()

musician = get_formatted_name('john', 'lee', 'hooker')
print(musician)

Hàm này hoạt động khi được cung cấp tên, tên đệm và họ. Hàm nhận cả ba phần của tên và sau đó xây dựng một chuỗi từ chúng. Hàm thêm khoảng trắng ở nơi thích hợp và chuyển đổi tên đầy đủ thành dạng tiêu đề:

John Lee Hooker

Nhưng tên đệm không phải lúc nào cũng cần thiết, và hàm này như đã viết sẽ không hoạt động nếu bạn cố gắng gọi nó chỉ với tên và họ. Để làm cho tên đệm tùy chọn, chúng ta có thể gán cho tham số middle_name một giá trị mặc định rỗng và bỏ qua tham số trừ khi người dùng cung cấp một giá trị. Để làm cho get_formatted_name() hoạt động mà không cần tên đệm, chúng ta đặt giá trị mặc định của middle_name là một chuỗi rỗng và di chuyển nó đến cuối danh sách các tham số:

def get_formatted_name(first_name, last_name, middle_name=''):
    """Trả về một tên đầy đủ, được định dạng gọn gàng."""
    if middle_name:
        full_name = f"{first_name} {middle_name} {last_name}"
    else:
        full_name = f"{first_name} {last_name}"
    return full_name.title()

musician = get_formatted_name('jimi', 'hendrix')
print(musician)

musician = get_formatted_name('john', 'hooker', 'lee')
print(musician)

Trong ví dụ này, tên được xây dựng từ ba phần có thể. Vì luôn có tên và họ, các tham số này được liệt kê đầu tiên trong định nghĩa hàm. Tên đệm là tùy chọn, vì vậy nó được liệt kê cuối cùng trong định nghĩa, và giá trị mặc định của nó là một chuỗi rỗng.

Trong thân hàm, chúng ta kiểm tra xem có tên đệm được cung cấp hay không. Python diễn giải các chuỗi không rỗng là True, vì vậy kiểm tra điều kiện if middle_name đánh giá là True nếu có một đối số tên đệm trong lệnh gọi hàm. Nếu có tên đệm được cung cấp, tên, tên đệm và họ được kết hợp để tạo thành một tên đầy đủ. Tên này sau đó được chuyển đổi thành dạng tiêu đề và trả về dòng gọi hàm, nơi nó được gán cho biến musician và in ra. Nếu không có tên đệm được cung cấp, chuỗi rỗng không vượt qua kiểm tra if và khối else được thực thi. Tên đầy đủ được tạo chỉ với tên và họ, và tên được định dạng được trả về dòng gọi hàm nơi nó được gán cho musician và in ra.

Gọi hàm này với tên và họ là đơn giản. Nếu chúng ta sử dụng tên đệm, tuy nhiên, chúng ta phải đảm bảo rằng tên đệm là đối số cuối cùng được truyền để Python sẽ khớp đúng các đối số vị trí.

Phiên bản sửa đổi này của hàm hoạt động cho những người chỉ có tên và họ, và nó cũng hoạt động cho những người có tên đệm:

Jimi Hendrix
John Lee Hooker

Các giá trị tùy chọn cho phép các hàm xử lý một loạt các trường hợp sử dụng trong khi vẫn giữ cho các lệnh gọi hàm đơn giản nhất có thể.

Trả về một từ điển

Một hàm có thể trả về bất kỳ loại giá trị nào bạn cần, bao gồm các cấu trúc dữ liệu phức tạp hơn như danh sách và từ điển. Ví dụ, hàm sau đây nhận các phần của một tên và trả về một từ điển đại diện cho một người:

def build_person(first_name, last_name):
    """Trả về một từ điển chứa thông tin về một người."""
    person = {'first': first_name, 'last': last_name}
    return person

musician = build_person('jimi', 'hendrix')
print(musician)

Hàm build_person() nhận tên và họ, và đặt các giá trị này vào một từ điển. Giá trị của first_name được lưu trữ với khóa 'first', và giá trị của last_name được lưu trữ với khóa 'last'. Sau đó, toàn bộ từ điển đại diện cho người đó được trả về. Giá trị trả về được in ra với hai mẩu thông tin văn bản ban đầu bây giờ được lưu trữ trong một từ điển:

{'first': 'jimi', 'last': 'hendrix'}

Hàm này nhận thông tin văn bản đơn giản và đặt nó vào một cấu trúc dữ liệu có ý nghĩa hơn cho phép bạn làm việc với thông tin ngoài việc chỉ in nó. Các chuỗi 'jimi' và 'hendrix' bây giờ được gắn nhãn là tên và họ. Bạn có thể dễ dàng mở rộng hàm này để chấp nhận các giá trị tùy chọn như tên đệm, tuổi, nghề nghiệp hoặc bất kỳ thông tin nào khác bạn muốn lưu trữ về một người. Ví dụ, thay đổi sau đây cho phép bạn lưu trữ tuổi của một người:

def build_person(first_name, last_name, age=None):
    """Trả về một từ điển chứa thông tin về một người."""
    person = {'first': first_name, 'last': last_name}
    if age:
        person['age'] = age
    return person

musician = build_person('jimi', 'hendrix', age=27)
print(musician)

Chúng ta thêm một tham số tùy chọn mới age vào định nghĩa hàm và gán cho tham số giá trị đặc biệt None, được sử dụng khi một biến không có giá trị cụ thể nào được gán cho nó. Bạn có thể nghĩ về None như một giá trị giữ chỗ. Trong các kiểm tra điều kiện, None đánh giá là False. Nếu lệnh gọi hàm bao gồm một giá trị cho age, giá trị đó được lưu trữ trong từ điển. Hàm này luôn lưu trữ tên của một người, nhưng nó cũng có thể được sửa đổi để lưu trữ bất kỳ thông tin nào khác bạn muốn về một người.

Sử dụng hàm với vòng lặp while

Bạn có thể sử dụng các hàm với tất cả các cấu trúc Python mà bạn đã học cho đến nay. Ví dụ, hãy sử dụng hàm get_formatted_name() với một vòng lặp while để chào người dùng một cách trang trọng hơn. Đây là một nỗ lực đầu tiên để chào mọi người bằng tên và họ của họ:

def get_formatted_name(first_name, last_name):
    """Trả về một tên đầy đủ, được định dạng gọn gàng."""
    full_name = f"{first_name} {last_name}"
    return full_name.title()

# Đây là một vòng lặp vô hạn!
while True:
    print("\nPlease tell me your name:")
    f_name = input("First name: ")
    l_name = input("Last name: ")
    formatted_name = get_formatted_name(f_name, l_name)
    print(f"\nHello, {formatted_name}!")

Trong ví dụ này, chúng ta sử dụng một phiên bản đơn giản của get_formatted_name() không liên quan đến tên đệm. Vòng lặp while yêu cầu người dùng nhập tên của họ, và chúng ta yêu cầu tên và họ của họ riêng biệt.

Nhưng có một vấn đề với vòng lặp while này: Chúng ta chưa định nghĩa một điều kiện thoát. Bạn đặt điều kiện thoát ở đâu khi bạn yêu cầu một loạt các đầu vào? Chúng ta muốn người dùng có thể thoát dễ dàng nhất có thể, vì vậy mỗi lời nhắc nên cung cấp một cách để thoát. Câu lệnh break cung cấp một cách đơn giản để thoát khỏi vòng lặp tại bất kỳ lời nhắc nào:

def get_formatted_name(first_name, last_name):
    """Trả về một tên đầy đủ, được định dạng gọn gàng."""
    full_name = f"{first_name} {last_name}"
    return full_name.title()

while True:
    print("\nPlease tell me your name:")
    print("(enter 'q' at any time to quit)")
    f_name = input("First name: ")
    if f_name == 'q':
        break
    l_name = input("Last name: ")
    if l_name == 'q':
        break
    formatted_name = get_formatted_name(f_name, l_name)
    print(f"\nHello, {formatted_name}!")

Chúng ta thêm một thông báo thông báo cho người dùng cách thoát, và sau đó chúng ta thoát khỏi vòng lặp nếu người dùng nhập giá trị thoát tại bất kỳ lời nhắc nào. Bây giờ chương trình sẽ tiếp tục chào mọi người cho đến khi ai đó nhập 'q' cho bất kỳ tên nào:

Please tell me your name:
(enter 'q' at any time to quit)
First name: eric
Last name: matthes
Hello, Eric Matthes!
Please tell me your name:
(enter 'q' at any time to quit)
First name: q

Comments

There are no comments at the moment.