Bộ dữ liệu đối sánh mẫu Python

Xem trang web và nhóm tin để biết thông báo - trong khi chúng tôi thường đăng thông báo ở cả hai nơi;

Như đã thông báo trước đó, phần thứ ba sẽ triệu tập trên MW từ 4. 40 ăn 5. 30 giờ chiều năm 202 Thuston.  

Hôm qua chúng tôi đã có một buổi giới thiệu/trợ giúp cài đặt phần mềm - chúng tôi sẽ có thêm một buổi nữa vào tối nay

Đây sẽ là cơn lốc thông qua một số tính năng quan trọng nhất của SML. Bạn đã thấy một số trong số này trong phần ngày hôm qua

Các bộ dữ liệu nhóm lại với nhau một số giá trị cố định. Nếu một bộ chứa n phần tử, thì chúng ta gọi nó là một bộ n. SML nhận ra 0-bộ, nhưng nó không có 1-bộ. Các phần tử của bộ dữ liệu không nhất thiết phải cùng loại; . (), (3, "a ha. "), (một hai ba)). Nếu các phần tử của một bộ lần lượt có các loại t1, t2,. , tn, thì kiểu của bộ tương ứng là t1*t2*. * không. Nếu t1 không bằng t2, thì các bộ loại t1*t2 không cùng loại với các bộ loại t2*t1;

Bạn có thể chọn phần tử dữ liệu thứ n từ một bộ bằng cách sử dụng toán tử #n. #2 (1, "hai", 3. 0) = "hai"

Các bản ghi tương tự như các bộ dữ liệu, ở chỗ chúng nhóm các phần tử dữ liệu khác nhau lại với nhau. Một bản ghi có các trường và chúng được đặt tên. Trong khi các bộ dữ liệu là một tập hợp các giá trị dữ liệu được sắp xếp theo thứ tự, thì một bộ dữ liệu là một tập hợp các giá trị dữ liệu được gắn nhãn không có thứ tự

Đây là một ví dụ

{commonName="wolf", latinName="Canis Lupus L.", range="Yellowstone", population=174}

Loại bản ghi có nhãn l1, l2,. , ln và các loại liên quan t1, t2,. , tn được viết là {l1. t1, l2. t2,. , trong. tn}; . g. loại {l1. t1, l2. t2} giống với loại {l2. t2, l1. t1}

Kiểu dữ liệu danh sách đóng gói khái niệm về một chuỗi gồm 0 hoặc nhiều giá trị dữ liệu cùng loại. Danh sách là một ví dụ đơn giản về kiểu dữ liệu đệ quy. Thật vậy, một danh sách tốt nhất có thể được định nghĩa theo chính nó. Để làm cho mọi thứ cụ thể, hãy nghĩ về một danh sách các số nguyên. Một danh sách các số nguyên có thể là (a) một danh sách rỗng, hoặc (b) một danh sách không rỗng bao gồm ít nhất một phần tử. Trong trường hợp sau, danh sách bao gồm một phần tử đầu tiên (phần đầu của danh sách), được thêm vào danh sách số nguyên (ngắn hơn, có thể trống). Vì vậy, một danh sách là. một danh sách. Định nghĩa có vẻ vòng vo, và theo một nghĩa nào đó nó là. Chúng tôi được cứu bởi thực tế là đối với bất kỳ danh sách hữu hạn đã cho nào, quá trình mô tả danh sách dưới dạng danh sách có ít phần tử hơn là hữu hạn

Dưới đây là một vài ví dụ về danh sách và thao tác danh sách

- val empty = [];
val empty = [] : 'a list
- hd empty;
uncaught exception Empty
  raised at: boot/list.sml:36.38-36.43
- tl empty;
uncaught exception Empty
  raised at: boot/list.sml:37.38-37.43
- rev empty;
val it = [] : ?.X1 list
- length empty;
val it = 0: int;
- null [];
val it = true : bool


- val l = [1, 2, 3, 4];
val l = [1,2,3,4] : int list
- hd l;
val it = 1 : int
- tl l;
val it = [2,3,4] : int list
- rev l;
val it = [4,3,2,1] : int list
- length l;
val it = 4 : int
- null l;
val it = false : bool

Trong đầu ra ở trên, chúng tôi đã xóa một số cảnh báo. Lưu ý những điều dưới đây

  • Bản thân danh sách trống [] không có kiểu được xác định rõ ràng (ít nhất, không phải về kiểu mà chúng tôi đã giới thiệu cho đến bây giờ). SML cần thêm ngữ cảnh để xác định rõ ràng loại []
  • Chúng tôi không thể cố gắng trích xuất đầu (i. e. phần tử đầu tiên, xem hd) của một danh sách rỗng; . e. danh sách có kết quả sau khi phần tử đầu tiên đã bị xóa, xem tl)

Có nhiều hoạt động danh sách hơn được xác định trong SML;

Danh sách không phải là kiểu dữ liệu đệ quy duy nhất, trên thực tế, kiểu dữ liệu đệ quy rất phổ biến. Chúng ta có thể tự khai báo các kiểu dữ liệu đó với sự trợ giúp của khai báo kiểu dữ liệu (dấu ngoặc chỉ các thành phần tùy chọn)

datatype Y = X1 [of t1| .. Xn [of tn]

Đây Xidatatype constructors

Không phải tất cả các loại được khai báo trong khai báo kiểu dữ liệu đều cần được đệ quy

datatype colors = WHITE | RED | GREEN | BLUE | BLACK
datatype merged = INT of int | REAL of real

Khai báo thứ hai tạo ra một loại, trên thực tế, là sự kết hợp của các loại int và real. Ví dụ về các giá trị thuộc loại này là INT(3)  và  REAL(7. 14)

Bây giờ chúng ta hãy định nghĩa kiểu danh sách int. Sau này chúng ta sẽ tìm hiểu cách xác định loại danh sách có cùng tính tổng quát như danh sách của SML;

datatype intlist = Empty | LIST of int * intlist

Danh sách  [1, 2, 3, 4] hiện có thể được biểu thị dưới dạng LIST[1, LIST[2, LIST[3, LIST[4, Empty]]]]

Chúng ta sẽ thấy nhiều cách khai báo kiểu dữ liệu đệ quy khác trong khóa học

Chúng tôi biết cách kết hợp các bộ dữ liệu, bản ghi, danh sách và các kiểu dữ liệu đệ quy và không đệ quy tùy chỉnh. Chúng tôi thậm chí biết cách truy cập các phần tử của bộ dữ liệu, bản ghi hoặc danh sách. Nhưng làm cách nào để truy cập các thành phần của DANH SÁCH? . Như một phần thưởng, khớp mẫu cũng sẽ đơn giản hóa việc truy cập của chúng tôi vào các phần tử bộ dữ liệu, bản ghi và danh sách

Trong hầu hết các trường hợp, chúng tôi sẽ sử dụng khớp mẫu kết hợp với biểu thức chữ hoa chữ thường. Định nghĩa BNF của biểu thức trường hợp là

case e of p1=>e1 | ... | pn=>en,

trong đó e và ei là các biểu thức và pi là các mẫu. Định nghĩa BNF của các mẫu là

p ::= _ | c  | x | (p1,..., pn) | {x1= p1,...,xn= pn} | [] | p1::p2 | X | X(p),

trong đó p và pi là các mẫu, c là hằng số, x là mã định danh, xi là tên trường bản ghi và X là hàm tạo kiểu dữ liệu.  

Mẫu được biểu thị bằng _ (ký tự gạch dưới) biểu thị một giá trị không quan trọng (một giá trị bị bỏ qua khi kiểm tra khớp). Mẫu có chứa. toán tử là một mẫu danh sách, trong trường hợp này p1 là mẫu cho phần đầu của danh sách và p2 là mẫu cho phần đuôi của danh sách

Một tính năng quan trọng của các mẫu SML là chúng có thể được lồng vào nhau. một mẫu có thể hiện diện bên trong một mẫu khác

Các mẫu được sử dụng làm mẫu để so khớp các giá trị. Các giá trị được định nghĩa là

________số 8_______

- val empty = [];
val empty = [] : 'a list
- hd empty;
uncaught exception Empty
  raised at: boot/list.sml:36.38-36.43
- tl empty;
uncaught exception Empty
  raised at: boot/list.sml:37.38-37.43
- rev empty;
val it = [] : ?.X1 list
- length empty;
val it = 0: int;
- null [];
val it = true : bool


- val l = [1, 2, 3, 4];
val l = [1,2,3,4] : int list
- hd l;
val it = 1 : int
- tl l;
val it = [2,3,4] : int list
- rev l;
val it = [4,3,2,1] : int list
- length l;
val it = 4 : int
- null l;
val it = false : bool
3v và vi là các giá trị, c là hằng số, xi là tên trường bản ghi và X là hàm tạo kiểu dữ liệu.  

Dưới đây là các quy tắc khớp mẫu;

  • Mẫu _ phù hợp với mọi thứ;
  • Mẫu c chỉ khớp với chính nó;
  • Mẫu x khớp với mọi giá trị, với kết quả bổ sung là mã định danh x được liên kết với giá trị mà nó khớp;
  • Hoa văn
    - val empty = [];
    val empty = [] : 'a list
    - hd empty;
    uncaught exception Empty
      raised at: boot/list.sml:36.38-36.43
    - tl empty;
    uncaught exception Empty
      raised at: boot/list.sml:37.38-37.43
    - rev empty;
    val it = [] : ?.X1 list
    - length empty;
    val it = 0: int;
    - null [];
    val it = true : bool
    
    
    - val l = [1, 2, 3, 4];
    val l = [1,2,3,4] : int list
    - hd l;
    val it = 1 : int
    - tl l;
    val it = [2,3,4] : int list
    - rev l;
    val it = [4,3,2,1] : int list
    - length l;
    val it = 4 : int
    - null l;
    val it = false : bool
    4p1______1_______5.
    - val empty = [];
    val empty = [] : 'a list
    - hd empty;
    uncaught exception Empty
      raised at: boot/list.sml:36.38-36.43
    - tl empty;
    uncaught exception Empty
      raised at: boot/list.sml:37.38-37.43
    - rev empty;
    val it = [] : ?.X1 list
    - length empty;
    val it = 0: int;
    - null [];
    val it = true : bool
    
    
    - val l = [1, 2, 3, 4];
    val l = [1,2,3,4] : int list
    - hd l;
    val it = 1 : int
    - tl l;
    val it = [2,3,4] : int list
    - rev l;
    val it = [4,3,2,1] : int list
    - length l;
    val it = 4 : int
    - null l;
    val it = false : bool
    5 pn
    - val empty = [];
    val empty = [] : 'a list
    - hd empty;
    uncaught exception Empty
      raised at: boot/list.sml:36.38-36.43
    - tl empty;
    uncaught exception Empty
      raised at: boot/list.sml:37.38-37.43
    - rev empty;
    val it = [] : ?.X1 list
    - length empty;
    val it = 0: int;
    - null [];
    val it = true : bool
    
    
    - val l = [1, 2, 3, 4];
    val l = [1,2,3,4] : int list
    - hd l;
    val it = 1 : int
    - tl l;
    val it = [2,3,4] : int list
    - rev l;
    val it = [4,3,2,1] : int list
    - length l;
    val it = 4 : int
    - null l;
    val it = false : bool
    7v1
    - val empty = [];
    val empty = [] : 'a list
    - hd empty;
    uncaught exception Empty
      raised at: boot/list.sml:36.38-36.43
    - tl empty;
    uncaught exception Empty
      raised at: boot/list.sml:37.38-37.43
    - rev empty;
    val it = [] : ?.X1 list
    - length empty;
    val it = 0: int;
    - null [];
    val it = true : bool
    
    
    - val l = [1, 2, 3, 4];
    val l = [1,2,3,4] : int list
    - hd l;
    val it = 1 : int
    - tl l;
    val it = [2,3,4] : int list
    - rev l;
    val it = [4,3,2,1] : int list
    - length l;
    val it = 4 : int
    - null l;
    val it = false : bool
    5.
    - val empty = [];
    val empty = [] : 'a list
    - hd empty;
    uncaught exception Empty
      raised at: boot/list.sml:36.38-36.43
    - tl empty;
    uncaught exception Empty
      raised at: boot/list.sml:37.38-37.43
    - rev empty;
    val it = [] : ?.X1 list
    - length empty;
    val it = 0: int;
    - null [];
    val it = true : bool
    
    
    - val l = [1, 2, 3, 4];
    val l = [1,2,3,4] : int list
    - hd l;
    val it = 1 : int
    - tl l;
    val it = [2,3,4] : int list
    - rev l;
    val it = [4,3,2,1] : int list
    - length l;
    val it = 4 : int
    - null l;
    val it = false : bool
    5vn
    datatype Y = X1 [of t1| .. Xn [of tn]
    0
  • datatype Y = X1 [of t1| .. Xn [of tn]
    1x1
    datatype Y = X1 [of t1| .. Xn [of tn]
    2 p1
    - val empty = [];
    val empty = [] : 'a list
    - hd empty;
    uncaught exception Empty
      raised at: boot/list.sml:36.38-36.43
    - tl empty;
    uncaught exception Empty
      raised at: boot/list.sml:37.38-37.43
    - rev empty;
    val it = [] : ?.X1 list
    - length empty;
    val it = 0: int;
    - null [];
    val it = true : bool
    
    
    - val l = [1, 2, 3, 4];
    val l = [1,2,3,4] : int list
    - hd l;
    val it = 1 : int
    - tl l;
    val it = [2,3,4] : int list
    - rev l;
    val it = [4,3,2,1] : int list
    - length l;
    val it = 4 : int
    - null l;
    val it = false : bool
    5.
    - val empty = [];
    val empty = [] : 'a list
    - hd empty;
    uncaught exception Empty
      raised at: boot/list.sml:36.38-36.43
    - tl empty;
    uncaught exception Empty
      raised at: boot/list.sml:37.38-37.43
    - rev empty;
    val it = [] : ?.X1 list
    - length empty;
    val it = 0: int;
    - null [];
    val it = true : bool
    
    
    - val l = [1, 2, 3, 4];
    val l = [1,2,3,4] : int list
    - hd l;
    val it = 1 : int
    - tl l;
    val it = [2,3,4] : int list
    - rev l;
    val it = [4,3,2,1] : int list
    - length l;
    val it = 4 : int
    - null l;
    val it = false : bool
    5xn_______2_______2 pn
    datatype Y = X1 [of t1| .. Xn [of tn]
    6
    datatype Y = X1 [of t1| .. Xn [of tn]
    7x1
    datatype Y = X1 [of t1| .. Xn [of tn]
    2v1
    - val empty = [];
    val empty = [] : 'a list
    - hd empty;
    uncaught exception Empty
      raised at: boot/list.sml:36.38-36.43
    - tl empty;
    uncaught exception Empty
      raised at: boot/list.sml:37.38-37.43
    - rev empty;
    val it = [] : ?.X1 list
    - length empty;
    val it = 0: int;
    - null [];
    val it = true : bool
    
    
    - val l = [1, 2, 3, 4];
    val l = [1,2,3,4] : int list
    - hd l;
    val it = 1 : int
    - tl l;
    val it = [2,3,4] : int list
    - rev l;
    val it = [4,3,2,1] : int list
    - length l;
    val it = 4 : int
    - null l;
    val it = false : bool
    5.
    - val empty = [];
    val empty = [] : 'a list
    - hd empty;
    uncaught exception Empty
      raised at: boot/list.sml:36.38-36.43
    - tl empty;
    uncaught exception Empty
      raised at: boot/list.sml:37.38-37.43
    - rev empty;
    val it = [] : ?.X1 list
    - length empty;
    val it = 0: int;
    - null [];
    val it = true : bool
    
    
    - val l = [1, 2, 3, 4];
    val l = [1,2,3,4] : int list
    - hd l;
    val it = 1 : int
    - tl l;
    val it = [2,3,4] : int list
    - rev l;
    val it = [4,3,2,1] : int list
    - length l;
    val it = 4 : int
    - null l;
    val it = false : bool
    5 xn
    datatype Y = X1 [of t1| .. Xn [of tn]
    2vn
    datatype Y = X1 [of t1| .. Xn [of tn]
    6
    datatype colors = WHITE | RED | GREEN | BLUE | BLACK
    3;
  • Mẫu [] khớp với [];
  • Hoa văn p1. p2 khớp với danh sách l mẫu iff p1 khớp hd l và mẫu p2 khớp tl l
  • Mẫu X khớp với X;
  • Mẫu X(p) sẽ chỉ khớp với giá trị X(v), giả sử rằng mẫu p khớp với giá trị v;

Các mẫu được kiểm tra theo thứ tự mà chúng được viết;

Khi thực hiện so khớp mẫu trong một biểu thức trường hợp, SML có khả năng kiểm tra xem các trường hợp được liệt kê đã đầy đủ hay chưa. Nhiều lỗi tinh vi có thể tránh được do lập trình viên nhận thức được sự trùng khớp không đầy đủ

Để làm rõ các ý kiến ​​trên, chúng ta hãy xem xét một vài ví dụ

(* return true iff the length of the arguments list is at least two *)
fun atLeastTwo(l: int list): bool = 
  case l of
    [] => false
  | _::[] => false
  | _ => true

Lưu ý rằng chúng tôi không thực sự quan tâm đến các giá trị ở đây, tất cả những gì chúng tôi quan tâm là cấu trúc của đối số. Lưu ý rằng mẫu _. [] cũng có thể được viết là [_]

- val empty = [];
val empty = [] : 'a list
- hd empty;
uncaught exception Empty
  raised at: boot/list.sml:36.38-36.43
- tl empty;
uncaught exception Empty
  raised at: boot/list.sml:37.38-37.43
- rev empty;
val it = [] : ?.X1 list
- length empty;
val it = 0: int;
- null [];
val it = true : bool


- val l = [1, 2, 3, 4];
val l = [1,2,3,4] : int list
- hd l;
val it = 1 : int
- tl l;
val it = [2,3,4] : int list
- rev l;
val it = [4,3,2,1] : int list
- length l;
val it = 4 : int
- null l;
val it = false : bool
0

Trong ví dụ này, chúng tôi sử dụng thực tế là các mẫu được kiểm tra theo thứ tự chúng được viết. nếu thành phần đầu tiên của bộ đối số là 0, thì mẫu đầu tiên sẽ khớp, nếu thành phần thứ hai là 0, thì mẫu thứ hai sẽ khớp. Nếu không có mẫu nào trong hai mẫu đầu tiên khớp, thì bộ dữ liệu không chứa số 0 nào cả, chúng ta có thể trả về false mà không cần kiểm tra đối số

Đây là một ví dụ so khớp mẫu đơn giản trên các bản ghi

- val empty = [];
val empty = [] : 'a list
- hd empty;
uncaught exception Empty
  raised at: boot/list.sml:36.38-36.43
- tl empty;
uncaught exception Empty
  raised at: boot/list.sml:37.38-37.43
- rev empty;
val it = [] : ?.X1 list
- length empty;
val it = 0: int;
- null [];
val it = true : bool


- val l = [1, 2, 3, 4];
val l = [1,2,3,4] : int list
- hd l;
val it = 1 : int
- tl l;
val it = [2,3,4] : int list
- rev l;
val it = [4,3,2,1] : int list
- length l;
val it = 4 : int
- null l;
val it = false : bool
1

Khai báo kiểu đặt tên cho một kiểu; . Bạn có thể sẽ cảm thấy rằng biểu thức trường hợp không hoàn toàn thích hợp ở đây, sau tất cả, tất cả những gì chúng ta cần là trích xuất một giá trị từ một bản ghi - khớp mẫu rất hữu ích, nhưng không có trường hợp thực tế nào ở đây. Thật vậy, chúng ta có thể viết lại hàm trên bằng cách sử dụng khớp mẫu trong khai báo val. Chúng tôi chưa đề cập đến tính năng này ở trên, nhưng bạn có thể thấy nó hữu ích trong các tình huống tương tự như tình huống hiện tại

- val empty = [];
val empty = [] : 'a list
- hd empty;
uncaught exception Empty
  raised at: boot/list.sml:36.38-36.43
- tl empty;
uncaught exception Empty
  raised at: boot/list.sml:37.38-37.43
- rev empty;
val it = [] : ?.X1 list
- length empty;
val it = 0: int;
- null [];
val it = true : bool


- val l = [1, 2, 3, 4];
val l = [1,2,3,4] : int list
- hd l;
val it = 1 : int
- tl l;
val it = [2,3,4] : int list
- rev l;
val it = [4,3,2,1] : int list
- length l;
val it = 4 : int
- null l;
val it = false : bool
2

Kết hợp mẫu khác. đệ quy

Dưới đây chúng tôi cung cấp một số hàm hoạt động trên kiểu intlist mà chúng tôi đã định nghĩa ở trên. Kiểm tra chúng cẩn thận - lưu ý mức độ giống nhau của một số chức năng và cách sử dụng đệ quy để thực hiện "vòng lặp. "

Python có hỗ trợ khớp mẫu không?

Bạn có thể sử dụng khớp mẫu cấu trúc với các lớp và lớp dữ liệu của Python . Tài liệu chỉ cho bạn cách làm việc với các lớp dữ liệu, vì vậy tôi sẽ đề cập đến những lớp thông thường ở đây. Tóm lại, bạn có thể sử dụng tên lớp theo sau là danh sách đối số được chuyển vào hàm tạo làm mẫu trường hợp.

Tuple có thể được lặp lại không?

Lặp qua một Tuple . You can loop through the tuple items by using a for loop.

Bạn có thể sử dụng += cho bộ dữ liệu không?

Tại sao danh sách Python cho phép bạn += một bộ, trong khi bạn không thể + một bộ? . Không. Cố gắng thêm danh sách và bộ dữ liệu, ngay cả khi chúng tôi không ảnh hưởng đến cả hai, dẫn đến lỗi trên. Đúng rồi. Thêm danh sách vào bộ với + không hoạt động .

Làm thế nào bạn sẽ tạo một danh sách các bộ phù hợp?

Phương pháp 1. Sử dụng các phương thức list() và tuple() . chúng ta có thể tạo một danh sách các bộ dữ liệu trực tiếp bằng cách sử dụng danh sách và bộ dữ liệu.