(91) 350-9520 support@omarine.org M-F: 7 AM - 7 PM; Weekends: 9 AM - 5 PM

Lập trình Web: Python: Ngôn ngữ lập trình Python, phần 2

11. Biểu thức lambda

Biểu thức lambda được sử dụng để tạo các hàm nhỏ không tên, sử dụng từ khóa lambda. Khai báo

lambda x: x + 1

có ý nghĩa như

x ↦ x + 1

trong toán học, trong đó đối số x ánh xạ tới biểu thức x + 1.

Biểu thức lambda có vai trò như hàm, nhưng không có tên. Nó được dùng ở những nơi yêu cầu đối tượng hàm. Ví dụ

f = lambda x: x + 1

print ( f(5) )

Kết quả là

6

Trong hàm mother định nghĩa dưới đây, có hàm child được định nghĩa lồng bên trong

def mother(m):

    def child(c):
        return c + m

    return child

child = mother(1)

print ( child(5) )

Giá trị trả về của hàm mother không phải là giá trị thông thường, mà là một hàm, hàm child. Biến child là một biến hàm, nó đạt được hàm child với đối số m = 1. Từ đó child(5) sẽ cho giá trị c + m = c + 1 = 5 + 1 = 6.

Hàm child có thể được thay bằng biểu thức lambda như sau

def mother(m):
    return lambda c: c + m

child = mother(1)

print ( child(5) )

Kết quả là

6

Một ví dụ khác

f = lambda a, b: a + b

print ( f(5,6) )

Kết quả:

11

12. Kiểu từ điển

Kiểu từ điển được sử dụng thường xuyên trong lập trình Web, điển hình là cung cấp ngữ cảnh tới trang khuôn mẫu.

Từ điển được truy cập thông qua các khóa trong các cặp khóa: giá trị của nó. Khóa phải thuộc kiểu không thay đổi được (có thể xem như dữ liệu hằng), có thể là xâu kí tự, số, hoặc tuple nếu tuple chỉ chứa xâu kí tự, số, hoặc tuple.

Khóa phải không trùng lặp trong phạm vi từ điển. {} là một từ điển rỗng. Một từ điển thông thường sẽ có thêm một chuỗi các cặp khóa: giá trị ngăn cách bởi dấu phẩy (,), ví dụ

d = { 'one': 1, 'two': 2 }

print ( list(d.keys()) )

list(d.keys()) trả về một danh sách các khóa trong từ điển d:

['one', 'two']

Từ điển cũng có thể được tạo sử dụng lớp dict:

d = dict ( [ ('one', 1), ('two', 2) ] )

Trường hợp các khóa là xâu đơn giản như trên, đưa vào đối số như dưới đây là dễ hơn:

d = dict ( one = 1, two = 2 )

Kiểu đối số này là đối số từ khóa mà chúng ta sẽ bàn bên dưới. Từ điển còn có thể được khởi tạo sử dụng biểu thức:

d = { x: x**2 for x in (2, 4, 6) }

for k, v in d.items():
    print( k, repr(v).rjust(2) )

Kết quả:

2  4

4 16

6 36

Từ điển có thể được cập nhật theo vài cách như sau:

d = { 'one': 1, 'two': 2 }

for k, v in d.items():
    d[k] = v * 1000

d['three'] = 3000

d.update(four = 4000)

print ( d )

Kết quả:

{'one': 1000, 'two': 2000, 'three': 3000, 'four': 4000}

13. Đối số từ khóa và đối số vị trí

Đối số và tham số

Tham số được định nghĩa bởi các tên mà xuất hiện trong định nghĩa hàm. Khi hàm được gọi, đối số là các giá trị thực tế đưa tới hàm.

Có hai loại đối số:

Đối số từ khóa

Là đối số được đặt sau một định danh (ví dụ name=) trong một cuộc gọi hàm, hoặc được đưa như một giá trị trong một từ điển đặt sau **. Ví dụ

d = { 'one': 1, 'two': 2 }

def display(one, two):
    print (one, two)

display(one = 1, two =2)

display(**d)

Kết quả:

1 2

1 2

Đối số vị trí

Đối số vị trí như đối số thông thường mà vị trí của chúng có ý nghĩa trong lời gọi hàm. Những đối số này có thể xuất hiện tại điểm bắt đầu của danh sách tham số, và/hoặc được đưa như những phần tử của một đối tượng có thể lặp đặt sau *. Ví dụ

tup = 1, 2

def display(one, two):
    print (one, two)

display(1, 2)

display(*tup)

Kết quả:

1 2

1 2

Sử dụng các toán tử *, ** như trên được gọi là giải nén đối số.

14. Các loại tham số hàm

Có 5 loại tham số:

Vị trí hoặc từ khóa:

Chỉ ra tham số có thể tương ứng với đối số hoặc là từ khóa, hoặc là vị trí. Đây là loại tham số mặc định. Ví dụ

def display(arg):
    print (arg)

display(1)

display(arg = 1)

Kết quả:

1

1

Chỉ vị trí:

Tham số chỉ chấp nhận đối số vị trí. Đây là trường hợp đằng sau tham số này có ít nhất 1 tham số đã chấp nhận đối số vị trí.

Chỉ từ khóa:

Là tham số chỉ chấp nhận đối số từ khóa. Loại tham số này có thể được định nghĩa bằng cách dùng một tham số vị trí biến đổi hoặc một toán tử * trong danh sách tham số, đặt trước chúng. Đối số tương ứng có thể được gọi là đối số chỉ từ khóa. Hàm sorted trong mục bên dưới là một ví dụ, trong đó key và reverse là các tham số chỉ từ khóa.

Vị trí biến đổi:

Tham số loại này chấp nhận một dãy tùy ý các đối số vị trí. Tham số như thế được định nghĩa bằng cách đặt trước tên tham số một toán tử *. Đằng trước tham số này chỉ có thể có tham số chỉ vị trí, và đằng sau tham số này nếu có, phải là tham số chỉ chấp nhận từ khóa, bao gồm tham số chỉ từ khóatừ khóa biến đổi. Ví dụ

def display(start, *args, padding):

    total = start
    for item in args:
        total += item
    total += padding
    print (total)

display(1, 10, 11, 12, padding = 5)

Kết quả:

39

Từ khóa biến đổi:

Chấp nhận một dãy tùy ý các đối số từ khóa. Tham số như thế được định nghĩa bằng cách đặt trước tên tham số một toán tử **. Theo cú pháp Python, chỉ có nhiều nhất 1 tham số kiểu này và nó phải đứng sau cùng. Đối với các tham số phía trước, chỉ có nhiều nhất 1 toán tử * được áp dụng. Như định nghĩa đối số từ khóa, tham số này có thể nhận một dãy đối số trực tiếp theo định danh, hoặc nhận một từ điển giải nén. Ví dụ

d = dict (one = 1, two = 2)

def get_list(useless = -1, *, zero, **kwargs):

    li = [zero]
    for k in kwargs:
        li.append(kwargs[k])
    return li

li = get_list(zero = 0, **d)

print (li)

Kết quả:

[0, 1, 2]

15. Sắp thứ tự các phần tử

Hàm sorted(iterable, *, key=None, reverse=False) trả về một danh sách đã sắp mới từ các phần tử trong iterable, sử dụng so sánh < (nhỏ hơn). Hai đối số tùy chọn phải thuộc dạng đối số từ khóa.

key chỉ ra một hàm một đối số dùng để trích khóa so sánh từ mỗi phần tử trong iterable. Giá trị mặc định là None, so sánh các phần tử trực tiếp.

reverse mang giá trị boolean. Nếu đặt tới True, các phần tử danh sách được sắp theo thứ tự ngược lại.

Sắp thứ tự là ổn định, đảm bảo không thay đổi thứ tự tương đối của các phần tử bằng nhau trong so sánh.

Ví dụ

li = [ 'b', 'a', 'C' ]

li_new = sorted(li)

print (li_new)

li_new = sorted(li, key = lambda s: s.lower() )

print (li_new)

Đầu tiên, các phần tử được so sánh trực tiếp, kí tự ‘C’ là nhỏ nhất nên được xếp lên đầu. Sau đó áp dụng biểu thức lambda, so sánh thực hiện trên chữ in thường nên ‘C’ vẫn ở vị trí cuối cùng. Kết quả như sau

['C', 'a', 'b']

['a', 'b', 'C']

Xét một ví dụ phức tạp hơn

li = [
        ('C', 30),
        ('B', 35),
        ('A', 40),
        ('C', 40),
        ('B', 45), 
        ('A', 50),
]

li_new = sorted(li, key=lambda item: item[1], reverse = True)

print(li_new)

li_final = sorted(li_new, key=lambda item: item[0])

print(li_final)

Danh sách gồm các hạng mục có hai trường: trường phòng ban là 'A', 'B' hoặc 'C', trường lương là một con số. Chúng ta muốn sắp theo phòng ban trước, rồi sắp theo lương nhưng lương cao đặt lên trên. Muốn vậy đầu tiên phải áp dụng hàm sắp theo lương trước và được một danh sách mới. Lúc này không phân biệt phòng ban, cứ mức lương cao hơn là được đặt lên trên. Như vậy với hai mục cùng phòng ban thì đã thỏa yêu cầu. Kết quả trung gian như sau

[('A', 50), ('B', 45), ('A', 40), ('C', 40), ('B', 35), ('C', 30)]

Tiếp theo là áp dụng hàm sắp theo phòng ban. Vì phương pháp sắp là ổn định, nó bảo toàn thứ tự lương đối với các mục cùng phòng ban, dẫn đến kết quả cuối cùng:

[('A', 50), ('A', 40), ('B', 45), ('B', 35), ('C', 40), ('C', 30)]

Ngoài hàm sorted, danh sách có phương thức sort(*, key=None, reverse=False) hoạt động theo cách tương tự nhưng sắp trực tiếp các phần tử danh sách và không trả về danh sách mới.

16. Tạo môi trường ảo

Mỗi phần mềm cần một môi trường riêng tùy theo nhu cầu về các module và phiên bản của chúng. Trong môi trường của mình, một phần mềm nâng cấp thư viện sẽ không ảnh hưởng tới các ứng dụng khác. Môi trường như thế trong Python gọi là môi trường ảo. site thực hành đầu tiên là mysite, bạn tạo môi trường và kích hoạt như hình dưới đây:

Chúng ta còn một bài nữa cho chủ đề Ngôn ngữ lập trình Python.

Advertisements

Gửi phản hồi

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: