Tag: map

  • Hàm ẩn danh trong Python

    Hàm ẩn danh trong Python

    Hàm ẩn danh trong Python

    Hàm ẩn danh trong Python là gì? Cách khai báo hàm lambda trong Python. Ví dụ về hàm lambda trong Python sử dụng với hàm filter và hàm map() trong Python.

    Hàm ẩn danh trong Python là gì?

    • Hàm ẩn danh trong Python (còn gọi là hàm nặc danh –  anonymous function) là một hàm được định nghĩa mà không có tên và câu lệnh return.
    • Các hàm bình thường sử dụng từ khóa def để định nghĩa thì các hàm ẩn danh được định nghĩa bằng từ khóa lambda. Vì vậy các hàm ẩn danh còn được gọi là các Lambda Function.
    • Các hàm ẩn danh lambda  có thể khai báo, định nghĩa ở bất kỳ đâu và không có khả năng tái sử dụng. Lambda chỉ tồn tại trong phạm vi của biến mà nó được định nghĩa, vì vậy nếu như biến đó vượt ra ngoài phạm vi thì hàm này cũng không còn tác dụng nữa.
    • Hàm nặc danh lambda thường được dùng để gán vào biến, hay được gán vào hàm, class như một tham số.

    Cách khai báo hàm lambda trong Python

    Cú pháp của Lambda Function trong python

    lambda arguments_list: expression
    • lambda là keyword bắt buộc
    • arguments_list là các tham số truyền vào lambda
    • expression là các biểu thức xử lý lambda

    Các hàm lambda có thể có bất kỳ số đối số nào nhưng chỉ có một biểu thức expression. Các lambda function có thể được sử dụng ở bất cứ chỗ nào yêu cầu các đối tượng hàm. Hàm lambda không có câu lệnh return mà chính giá trị của biểu thức expression được sử dụng làm kết quả trả về  của hàm.

    Cú pháp khai báo Hàm ẩn danh trong Python là gì

    Ví dụ về hàm lambda trong Python

    Ví dụ sau khai báo một lambda function để tính tổng của 2 biến:

    add = lambda a, b: a + b
    
    # sử dụng hàm lambda bằng cách sử dụng biến add
    add(3, 4) #kết quả 7
    

    Kiểm tra xem hàm lambda ở trên có kiểu dữ liệu là gì:

    add = lambda a, b: a + b
    
    type(add) # kết quả function

    Hàm sau dùng để nhân đôi giá trị của tham số

    double = lambda x: x * 2
    print(double(5)) #kết quả 10

    Function này sẽ không có tên. Nó trả về một object được định danh là double. Giờ thì chúng ta có thể gọi nó như một hàm bình thường. Ví dụ:

    double = lambda x: x * 2

    Nó sẽ tương tự như các khai báo function như sau:

    def double(x):
        return x * 2

    Khi nào nên sử dụng hàm nặc danh lambda?

    Chúng ta thường sử dụng lambda function khi mà cần một hàm không tên trong một khoảng thời gian ngắn. Ví dụ như sử dụng lambda function làm đối số cho một hàm bậc cao hơn (một hàm mà có thể nhận các hàm khác làm đối số) chẳng hạn hàm filter() hàm map()

    Hàm filter trong Python

    Hàm filter() trong Python lọc ra các phần tử theo điều kiện của hàm func từ list, dict… Hàm này sẽ chỉ trả về những giá trị mà điều kiện trong func chấp nhận (có nghĩa là True). Cú pháp của hàm filter() như thế nào, nó có những tham số gì và cách sử dụng ra sao? Mời bạn đọc theo dõi.

    Cú pháp hàm filter() trong Python

    filter(func, iterable)

    Hàm filter() có 2 tham số:

    • func: là hàm điều kiện để kiểm tra các phần tử trong interable có thỏa mãn điều kiện đó hay không. Kết quả của hàm func này là đúng True hoặc sai False.
    • interable: là các iterable cần lọc, có thể là set, list, tuple hoặc container.

    Đây là một ví dụ sử dụng hàm filter() để chỉ lọc ra các số chẵn từ một danh sách.

    my_list = [1, 5, 4, 6, 8, 11, 3, 12, 17, 21]
    
    new_list = list(filter(lambda x: (x%2 == 0) , my_list))
    
    print(new_list) #kết quả:  [4, 6, 8, 12]

    Xem thêm Kiểu dữ liệu list danh sách trong Python

    Hàm map() trong Python

    Hàm map() tích hợp sẵn trong Python có tác dụng duyệt tất cả các phần tử của một iterable (list, tuple, dictionary…) qua một hàm cho trước và trả về một list kết quả sau khi thực thi.

    Cú pháp hàm map() trong Python

    map(function, iterable, ...)

    • function: Hàm thực thi cho từng phần tử trong iterable.
    • iterable: Một list, tuple, dictionary… muốn duyệt.

    Bạn có thể truyền nhiều iterable cho hàm map().

    Hàm map() duyệt tất cả các phần tử của iterable qua function và trả về một list kết quả sau khi thực thi.

    Giá trị trả về từ map() được gọi là map object. Kết quả này có thể được truyền vào các hàm list() (để tạo list trong Python), hay set() (để tạo một set các phần tử mới)…

    Ví dụ sau tạo một danh sách mới bằng cách nhân đôi các phần tử của danh sách ban đầu:

    my_list = [1, 5, 4, 6, 8, 11, 3, 12]
    
    new_list = list(map(lambda x: x * 2 , my_list))
    
    print(new_list) #Kết quả: [2, 10, 8, 12, 16, 22, 6, 24]
  • Kiểu dữ liệu list danh sách trong Python

    Kiểu dữ liệu list danh sách trong Python

    Kiểu dữ liệu list danh sách trong Python

    Danh sách trong Python kí hiệu là list, hiểu đơn là một tập hợp các đối tượng có chung một tính chất nào đó. Ví dụ danh sách các món ăn trên bàn tiệc, danh sách các bài hát của một album, danh sách học sinh trong một lớp học…

    Ta thấy ngay, mỗi danh sách đều gồm có các phần tử khác nhau, để liệt kê chúng, chẳng hạn liệt kê các thực phẩm cần mua cho bữa liên hoan, bạn sẽ sử dụng dấu phẩy để ngăn cách các phần tử này. Python cũng vậy, tuy nhiên, các danh sách các phần tử cần được đặt trong cặp ngoặc vuông [].

    1. Giới thiệu kiểu danh sách trong Python

    Để khai báo một danh sách, chúng ta dùng liệt kê các phần tử của danh sách, được đặt trong cặp ngoặc vuông [], các phần tử được ngăn cách nhau bởi dấu phảy ,. Mỗi phần tử trong danh sách có thể có kiểu bất kỳ như str, float, hay int

    Ví dụ sau tạo một danh sách mon_an gồm có các phần tử kiểu xâu str là các món canh cua, cà pháo, cá khothịt rán.

    >>> mon_an = ['canh cua', 'ca phao', 'ca kho', 'thit ran']

    Một danh sách không có thể phần tử, gọi là danh sách rỗng.

    >>> ban_gai = []
    >>> ban_gai
    []

    Để truy cập vào một phần tử của danh sách list trong Python, ta dùng tên danh sách theo sau là chỉ số index của phần tử đó được đặt trong cặp ngoặc vuông.

    >>> mon_an[3]
    'thit ran'

    Cũng giống như kiểu xâu str, các chỉ số index của một danh sách list được đánh số bắt đầu từ 0. Kiểu danh sách có thể hiểu gần giống như kiểu mảng array trong các ngôn ngữ lập trình khác.

    Không như kiểu xâu str, là những đối tượng immutable, thì kiểu danh sách là đối tượng mutable, tức ta có thể thay đổi các phần tử của một danh sách. Chẳng hạn, thay cà pháo bằng dưa muối, ta sẽ gán giá trị mới cho phần tử mon_an[1].

    >>> mon_an[1] = 'dua muoi'
    >>> mon_an
    ['canh cua', 'dua muoi', 'ca kho', 'thit ran']

    2. Các phép toán và phương thức của kiểu danh sách

    Cũng giống như kiểu xâu str, kiểu danh sách list cũng có các phép toán và phương thức đặc thù. Chúng ta sẽ lần lượt tìm hiểu các toán tử và phương thức/hàm của kiểu danh sách trong Python.

    2.1. Toán tử in

    Toán tử in dùng để kiểm tra xem một phần tử có nằm trong danh sách hay không, kết quả trả về của toán tử này là kiểu boolean đúng True hoặc sai False.

    >>> mon_an = ['canh cua', 'ca phao', 'ca kho', 'thit ran']
    >>> 'canh cua' in mon_an
    True
    >>> 3000 in mon_an
    False

    Bạn cũng có thể sử dụng toán tử in để duyệt danh sách trong vòng lặp for như sau.

    >>> for i in mon_an:
    ...     print(i)
    ...
    canh cua
    ca phao
    ca kho
    thit ran

    2.2. Toán tử +

    Toán tử + cho phép ghép nối hai danh sách với nhau. Lưu ý rằng toán tử + này tương tự phép cộng hai xâu (chuỗi, string) chứ không giống như toán tử cộng các số.

    >>> a = [1, 2, 3]
    >>> b = ['x', 'y', 'z', 'a']
    >>> a + b
    [1, 2, 3, 'x', 'y', 'z', 'a']

    2.3. Toán tử *

    Tương tự toán tử * dùng để lặp lại các phần tử trong danh sách lên k lần.

    >>> a = [0] * 4
    >>> a
    [0, 0, 0, 0]

    2.4. Phương thức append()

    Phương thức <ds>.append(<pt>) này sẽ thêm phần tử <pt> vào cuối danh sách <ds>.

    >>> ds = [1, 2, 3, 4]
    >>> ds.append(5)
    >>> ds
    [1, 2, 3, 4, 5]

    2.5. Phương thức extend()

    Phương thức <ds1>.extend(<ds2>) này sẽ thêm các phần tử của danh sách <ds2> vào cuối của danh sách <ds1>

    >>> l1 = [1, 2, 3]
    >>> l2 = [4, 5, 6, 7]
    >>> l1.extend(l2)
    >>> print(l1)
    [1, 2, 3, 4, 5, 6, 7]

    2.6. Phương thức sort()

    Phương thức <ds>.sort() giúp sắp xếp các phần tử của danh sách <ds> theo thứ tự phần tử từ nhỏ đến lớn, đối với kiểu chuỗi thì sắp theo thứ tự alphabet. Lưu ý rằng các phần tử của danh sách phải thuộc cùng một kiểu dữ liệu, cùng kiểu chuỗi hoặc cùng kiểu số…, tức là các phần tử của danh sách phải so sánh được với nhau.

    >>> ds_so = [1, 5, 7, 3, 2, 9]
    >>> ds_so.sort()
    >>> ds_so
    [1, 2, 3, 5, 7, 9]
    >>> ds_xau = ['a', 'e', 'b', 'g', 'i', 'Aa']
    >>> ds_xau.sort()
    >>> ds_xau
    ['Aa', 'a', 'b', 'e', 'g', 'i']

    2.7. Phương thức pop()

    Phương thức <ds>.pop(i) xóa phần tử có chỉ số i của danh sách <ds>, kết quả trả về chính là giá trị của phần tử có chỉ số i đó. Nhắc lại rằng, các phần tử của danh sách được đánh chỉ số từ 0

    >>> ds = [1, 5, 7, 3, 2, 9]
    >>> ds.pop(1)
    5
    >>> ds
    [1, 7, 3, 2, 9]

    2.8. Toán tử del

    Toán tử del <ds>[i] để xóa phần tử có chỉ số i của danh sách <ds> hoặc del <ds>[i:j] một phần của danh sách từ chỉ sối đến chỉ số j.

    >>> ds = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> del ds[0]
    >>> ds
    [2, 3, 4, 5, 6, 7, 8, 9]
    >>> del ds[1:3]
    >>> ds
    [2, 5, 6, 7, 8, 9]

    2.9. Phương thức remove()

    Phương thức pop() xóa bỏ phần tử của danh sách dựa trên chỉ số của phần tử đó, thì phương thức <ds>.remove(<pt>) sẽ xóa bỏ phần tử có giá trị <pt> đầu tiên của danh sách <ds> khỏi danh sách đó. Giá trị trả về của phương thức remove()None.

    ds = [1, 2, 3, 4, 5, 6, 7, 8, 8, 9]
    >>> ds.remove(8)
    >>> ds
    [1, 2, 3, 4, 5, 6, 7, 8, 9]

    Nếu bạn muốn xóa bỏ tất cả các phần tử có giá trị <pt> khỏi danh sách <ds>, có thể làm như sau:

    >>> ds = [1, 2, 3, 4, 5, 6, 7, 8, 8, 9]
    >>> while 8 in ds: ds.remove(8)
    >>> ds
    [1, 2, 3, 4, 5, 6, 7, 9]

    3. Xử lý danh sách trong Python

    Các thao tác thường được thực hiện trên list trong Python là xử lý từng phần tử của list, lọc lấy một số phần tử thỏa điều kiện nào đó, tính toán trên tất cả các phần tử của list.

    Để đơn giản việc xử lý danh sách list, Python hỗ trợ một số hàm có sẵn để thực hiện các tác vụ trên gồm map(), filter(), reduce()

    3.1. Hàm map() để xử lý danh sách trong Python

    Sử dụng câu lệnh map(func, seq) sẽ áp dụng hàm func cho mỗi phần tử của seq và trả về list kết quả.

    Ví dụ, tính bình phương các số có trong list a sử dụng map():

    a = [1, 2, 3, 4, 5]
    def binh_phuong(x):
       return x*x
    print(list(map(binh_phuong,a)))

    Có thể sử dụng hàm nặc danh lamda thay vì viết riêng một hàm binh_phuong.

    >>> a = [1, 2, 3, 4, 5]
    >>> print(list(map(lambda x: x*x, a)))
    [1, 4, 9, 16, 25]

    Thêm một ví dụ nữa, chúng ta sẽ cộng tương ứng từng phần tử của hai danh sách có cùng số lượng phần tử:

    numbers1 = [1, 2, 3] 
    numbers2 = [4, 5, 6] 
      
    result = map(lambda x, y: x + y, numbers1, numbers2) 
    print(list(result))

    3.2. Hàm filter() xử lý kiểu dữ liệu danh sách trong Python

    Hàm filter(func, list) sẽ  lần lượt gọi hàm func với tham số lần lượt là từng phần tử của danh sách list và trả về danh sách gồm các phần tử thỏa mãn hàm func. Lưu ý rằng hàm func phải là hàm mà kết quả trả về thuộc kiểu Boolean True hoặc False, tức là hàm func như là một hàm điều kiện để lọc ra các phần tử của danh sách list thỏa mãn điều kiện đó.

    Ví dụ lọc ra các số chẵn từ danh sách a.

    a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    def so_chan(number):
       if number % 2 == 0:
          return True
       else:
          return False
    
    print (list(filter(so_chan, a)))

    Hoặc, sử dụng hàm nặc danh lambda, ta có thể viết chương trình gọn hơn như sau:

    >>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> print (list(filter(lambda x: x%2 == 0, a)))
    [2, 4, 6, 8]

    Thêm một ví dụ nữa, sử dụng hàm filter() để in ra các nguyên âm trong một danh sách:

    def nguyen_am(x): 
        ds_nguyen_am = ['a', 'e', 'i', 'o', 'u'] 
        if (x in ds_nguyen_am): 
            return True
        else: 
            return False
    
    ds = ['g', 'e', 'e', 'j', 'k', 's', 'p', 'r'] 
      
    kq = filter(nguyen_am, ds) 
    
    for s in kq: 
        print(s)

    3.3. Hàm reduce() xử lý kiểu dữ liệu danh sách trong Python

    Hàm reduce(func, <ds>) sẽ tính toán, áp dụng hàm func với các phần tử của danh sách và trả về kết quả của.

    Hàm func là một hàm nhận vào 2 tham số có dạng func(arg1, arg2) trong đó arg1 là kết quả tính toán với các phần tử trước, arg2 là giá trị của phần tử của danh sách đang được tính toán.

    Cách thức hoạt động của hàm reduce() chi tiết như sau:

    • Ở bước đầu tiên, hai phần tử đầu tiên của danh sách <ds> được lấy và cung cấp cho hàm func thu được một kết quả kq.
    • Bước tiếp theo, hàm func nhận tham số là kết quả kq đạt được ở bước trước và phần tử tiếp theo của danh sách <ds>, kết quả tính toán lại được sử dụng như một tham số cho bước tiếp theo.
    • Quá trình này tiếp tục cho đến khi không còn phần tử nào trong danh sách <ds>.
    • Kết quả trả về của hàm reduce() là kết quả ở bước cuối cùng của hàm func.

    Lưu ý rằng, hàm reduce nằm trong thư viện functools, nên cần phải khai báo import functools trước khi sử dụng hàm reduce().

    Ví dụ sau in ra tổng các giá trị của danh sách và phần tử lớn nhất của danh sách.

    from functools import *
      
    ds = [ 1 , 3, 5, 6, 2, ] 
    
    print ("Tong cac phan tu cua danh sach la: ",end="") 
    print (reduce(lambda a,b : a+b, ds)) 
      
    
    print ("Phan tu lon nhat cua danh sach la: ",end="") 
    print (reduce(lambda a,b : a if a > b else b, ds))

    Ví dụ tính tổng bình phương của các phần tử trong danh sách a

    a = [1, 2, 3, 4, 5]
    
    def tong_binh_phuong(kq, x):
       return kq + x*x
    
    print(reduce(tong_binh_phuong, a))

    4. Danh sách của danh sách, kiểu danh sách nhiều chiều trong Python

    Các phần tử của một danh sách danh sách trong Python lại có thể là một danh sách, chẳng hạn

    >>> A = [[1,2,3], [4,5,6], [7,8,9,10,11]]
    >>> A[1]
    [4, 5, 6]
    >>> A[1][2]
    6
    >>> A[2][4]
    11
    >>> A[1][5]
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    IndexError: list index out of range

    Danh sách A gồm có ba phần tử, mỗi phần tử lại là một danh sách [1,2,3], [4,5,6], [7,8,9,10,11]. Khi đó, để truy cập đến phần tử j của danh sách A[i] nằm trong danh sách  A ta dùng cú pháp A[i][j].

    Kiểu dữ liệu này tương ứng với kiểu mảng hai chiều array, hoặc là ma trận, trong các ngôn ngữ khác. Tuy nhiên, nếu một ma trận thì, nếu xét riêng từng dòng, bắt buộc các dòng phải có số cột như nhau. Nhưng ở đây thì khác, nếu ta viết lại list A ở trên, mỗi phần tử viết trên một dòng thì ta sẽ có dạng gần giống ma trận, do số cột của từng dòng là khác nhau

    [1,2,3]
    [4,5,6]
    [7,8,9,10,11]

    Rõ ràng, kiểu danh sách của danh sách này linh hoạt hơn – nhưng cũng đồng nghĩa với khó kiểm soát hơn – kiểu mảng hai chiều trong các ngôn ngữ khác.

    5. Danh sách và chuỗi

    Bạn có thể kết hợp danh sách và chuỗi để tách các ký tự trong chuỗi thành một danh sách, sử dụng hàm ép kiểu list() như sau.

    >>> s = 'phan van phuong'
    >>> list(s)
    ['p', 'h', 'a', 'n', ' ', 'v', 'a', 'n', ' ', 'p', 'h', 'u', 'o', 'n', 'g']
    Hoặc có thể tách một chuỗi thành danh sách gồm các phần tử cách nhau bởi <kí_tự_tách> bằng hàm split(<kí_tự_tách>), mặc định <kí_tự_tách> là khoảng trắng.
    >>> s = 'phan van phuong'
    >>> s.split()
    ['phan', 'van', 'phuong']
    >>> s.split('n')
    ['pha', ' va', ' phuo', 'g']

    6. Bài tập kiểu list danh sách trong Python

    Bài 1. Cho một list các số nguyên. Viết chương trình tìm phần tử lớn nhất của list đó.

    Bài 2. Cho một list các số nguyên. Viết chương trình in ra tất cả các phần tử lớn là số chẵn và lớn hơn 10 của list đó.

    Bài 3. Viết chương trình tính số trung bình các giá trị của một list số nguyên.

    Bài 4. Tạo một list gồm n số nguyên không âm ngẫu nhiên.

    Xem thêm về các kiểu dữ liệu list (danh sách trong Python) tại https://www.w3schools.com/python/python_lists.asp