Hướng dẫn how do you make a list of symbols in python? - làm thế nào để bạn tạo một danh sách các biểu tượng trong python?

Sử dụng các chuỗi thô [được biểu thị bằng cách đặt một

[i for i in list[r'\/:*?"|']]
[c for c in  r'\/:*?"|']
9 trước chuỗi của bạn]. Sau đó, chuyển đổi chuỗi thô của bạn thành danh sách:

illegals = [i for i in r'\/:*?"|']

# OR, using @abccd's suggestion, just use list[]

illegals = list[r'\/:*?"|']

illegals
# ['\\', '/', ':', '*', '?', '"', '', '|']

Lưu ý

valid_file = 'valid_script.py'
invalid_file = 'invalid?script.py'

validate = lambda f: not any[c for c in r'\/:*?"|' if c in f]

validate[valid_file]
# True

validate[invalid_file]
# False
0 Khi được in vẫn là một dấu gạch chéo ngược, nhưng về giá trị, dấu gạch chéo ngược đầu tiên được lưu trữ dưới dạng ký tự thoát.

Bạn có thể đọc thêm về tài liệu phân tích từ vựng.

Điều này trả lời câu hỏi, nhưng trong thực tế, một

valid_file = 'valid_script.py'
invalid_file = 'invalid?script.py'

validate = lambda f: not any[c for c in r'\/:*?"|' if c in f]

validate[valid_file]
# True

validate[invalid_file]
# False
1 được đối xử như một ____22 của các ký tự, vì vậy cả hai điều sau đây sẽ trả về các yếu tố giống nhau:

[i for i in list[r'\/:*?"|']]
[c for c in  r'\/:*?"|']

Đối với cách xác định nếu một tên tệp có bất kỳ ký tự nào trong số này không, bạn có thể làm điều này:

valid_file = 'valid_script.py'
invalid_file = 'invalid?script.py'

validate = lambda f: not any[c for c in r'\/:*?"|' if c in f]

validate[valid_file]
# True

validate[invalid_file]
# False

Đây chỉ là một trong nhiều cách. Bạn thậm chí có thể chọn cách tiếp cận Regex:

import re

# Note in regex you still need to escape the slash and backslash in the match group
validate = lambda f: not re.search[r'[\\\/:*?\"|]+', f]

validate[valid_file]
# True

validate[invalid_file]
# False

Trong tập này, tôi mở đường đến trung tâm của Lisp, tức là mã nổi tiếng là khái niệm dữ liệu. Để làm điều đó, tôi sẽ phải giới thiệu hai loại dữ liệu cơ bản trước: Biểu tượng và danh sách.

Biểu tượng %

Sơ đồ và LISP có một kiểu dữ liệu cụ thể bị thiếu trong hầu hết các ngôn ngữ [ngoại trừ Ruby]: biểu tượng.

Từ quan điểm ngữ pháp, một biểu tượng chỉ là một định danh được trích dẫn, tức là một chuỗi các ký tự tương ứng với một định danh hợp lệ trước một trích dẫn. Chẳng hạn, 'A,' B1 E 'C_ là các ký hiệu. Trên tập hợp các ký hiệu có một toán tử bình đẳng EQ? có thể xác định xem hai ký hiệu có giống nhau hay không:'a, 'b1 e 'c_ are symbols. On the set of symbols there is an equality operator eq? which is able to determine if two symbols are the same or not:

> [define sym 'a]
> [eq? sym 'b]
#f
> [eq? sym 'a]
#t

#F E #T là các giá trị boolean sai và đúng tương ứng, như bạn có thể tưởng tượng. Toán tử bình đẳng cực kỳ hiệu quả trên các ký hiệu, vì trình biên dịch liên kết với mọi ký hiệu một số nguyên [thao tác này được gọi là băm] và lưu trữ nó trong một sổ đăng ký liên Nó thực sự kiểm tra sự bình đẳng của hai số nguyên, đó là một hoạt động cực kỳ nhanh. e #t are the Boolean values False and True respectively, as you may have imagined. The equality operator is extremely efficient on symbols, since the compiler associates to every symbol an integer number [this operation is called hashing] and stores it in an interal registry [this operation is called interning]: when the compiler checks the identity of two symbols it actually checks the equality of two integer numbers, which is an extremely fast operation.

Bạn có thể nhận được số được liên kết đến một biểu tượng với ký hiệu chức năng-Hash:symbol-hash:

> [symbol-hash sym]
117416170
> [symbol-hash 'b]
134650981
> [symbol-hash 'a]
117416170

Luôn luôn có thể chuyển đổi một chuỗi thành một ký hiệu và ngược lại nhờ vào chuỗi hàm-> ký hiệu và biểu tượng- chuỗi, tuy nhiên về mặt khái niệm - và thực tế - các ký hiệu trong sơ đồ hoàn toàn khác với chuỗi.string->symbol and symbol->string, however conceptually - and also practically - symbols in Scheme are completely different from strings.

Tình hình không thực sự khác nhau ở Python. Đúng là các ký hiệu không tồn tại như một loại dữ liệu nguyên thủy, tuy nhiên các chuỗi tương ứng với tên của các đối tượng Python thực sự được coi là biểu tượng. Bạn có thể suy ra điều này từ tài liệu về các chức năng tích hợp băm e Intern, trong đó nói: Thông thường, các tên được sử dụng trong các chương trình Python được thực tập tự động và các từ điển được sử dụng để giữ mô -đun, thuộc tính lớp hoặc phiên bản có khóa thực tập. BTW, nếu bạn muốn biết chính xác cách so sánh chuỗi hoạt động trong Python, tôi khuyên bạn nên xem bài đăng này:

Sơ đồ có số nhận dạng hợp lệ hơn nhiều so với Python hoặc C, trong đó các ký tự hợp lệ bị giới hạn ở A-ZA-Z-0-9_ [Tôi đang bỏ qua khả năng có các ký tự Unicode trong các định danh, có thể cả trong sơ đồ R6RS và Python 3.0 ]. Theo quy ước, các biểu tượng kết thúc bằng? được liên kết với các giá trị boolean hoặc các hàm có giá trị boolean, trong khi các biểu tượng kết thúc bằng! được liên kết với các chức năng hoặc macro có tác dụng phụ.a-zA-Z-0-9_ [I am ignoring the possibility of having Unicode characters in identifiers, which is possible both in R6RS Scheme and Python 3.0]. By convention, symbols ending by ? are associated to boolean values or to boolean-valued functions, whereas symbols ending by ! are associated to functions or macros with side effects.

Chức năng EQ ?, là đa hình và hoạt động trên bất kỳ loại đối tượng nào, nhưng đôi khi nó có thể làm bạn ngạc nhiên:eq?, is polymorphic and works on any kind of object, but it may surprise you sometimes:

> [eq? "pippo" "pippo"]
#f

Lý do đó là EQ? [Corrisponding là trong Python] Kiểm tra xem hai đối tượng có cùng một đối tượng ở cấp độ con trỏ hay không, nhưng nó không kiểm tra nội dung. Trên thực tế, Python hoạt động giống nhau. Nó chỉ là do tai nạn so với "pippo" là "pippo" trả về đúng trên máy của tôi, vì việc triển khai CPython quản lý các chuỗi ngắn khác nhau từ các chuỗi dài của Long Long:eq? [corrisponding to is in Python] checks if two objects are the same object at the pointer level, but it does not check the content. Actually, Python works the same. It is only by accident than "pippo" is "pippo" returns True on my machine, since the CPython implementation manages differently “short” strings from “long” strings:

>>> "a"*10 is "a"*10 # a short string
True
>>> "a"*100 is "a"*100  # a long string
False

Nếu bạn muốn kiểm tra xem hai đối tượng có cùng nội dung, bạn nên sử dụng hàm bằng không ?, Tương ứng với == trong Python:equal?, corresponding to == in Python:

> [equal? "pippo" "pippo"]
#t

Bạn biết loại đối tượng bạn có thể sử dụng các toán tử bình đẳng hiệu quả hơn; Ví dụ cho các chuỗi bạn có thể sử dụng chuỗi =? và cho số nguyên =:string=? and for integer numbers =:

> [string=? "pippo" "pippo"]
#t

> [= 42 42]
#t

Để hoàn toàn chính xác, ngoài EQ và bằng nhau, Sơ đồ cũng cung cấp một toán tử bình đẳng thứ ba EQV ?. EQV? Trông tôi giống như một biến chứng vô dụng của ngôn ngữ, vì vậy tôi sẽ không thảo luận về nó. Nếu bạn quan tâm, bạn có thể đọc những gì tài liệu R6RS nói về nó.eq and equal, Scheme also provides a third equality operator eqv?. eqv? looks to me like an useless complication of the language, so I will not discuss it. If you are interested, you can read what the R6RS document says about it.

Danh sách

Ý nghĩa ban đầu của LISP là xử lý danh sách, vì danh sách là loại dữ liệu cơ bản của ngôn ngữ. Ngày nay, LISP thực hiện tất cả các loại dữ liệu có thể, nhưng vẫn có danh sách có một vị trí có phần đặc quyền, vì danh sách có thể mô tả mã. Danh sách Lisp/Sơ đồ là loại dữ liệu đệ quy như vậy:

  1. Danh sách trống: '[]'[]
  2. Danh sách này là thành phần của một phần tử và danh sách thông qua thao tác Cons [Cons là viết tắt của hàm tạo]: [Conselemlst].cons operation [cons stands for constructor]: [cons elem lst].

Chẳng hạn, danh sách một phần tử được lấy dưới dạng thành phần của một phần tử với danh sách trống:

[i for i in list[r'\/:*?"|']]
[c for c in  r'\/:*?"|']
0

Danh sách hai phần tử được lấy bằng cách soạn một phần tử có danh sách một phần tử:

[i for i in list[r'\/:*?"|']]
[c for c in  r'\/:*?"|']
1

Điều đó khái quát vào danh sách phần tử N:

[i for i in list[r'\/:*?"|']]
[c for c in  r'\/:*?"|']
2

Để đơn giản, ngôn ngữ cung cấp danh sách trình tạo danh sách n-arylist

[i for i in list[r'\/:*?"|']]
[c for c in  r'\/:*?"|']
3

Nhưng biểu thức [listx1 ... xn] không gì khác ngoài đường cú pháp cho biểu thức hoàn toàn rõ ràng về các hàm tạo.[list x1 ... xN] is nothing else than syntactic sugar for the fully explicit expression in terms of constructors.

Ngoài ra còn có cái gọi là danh sách không phù hợp, tức là những danh sách mà đối số thứ hai của khuyết điểm không phải là một danh sách. Trong trường hợp đó, biểu diễn của danh sách được hiển thị tại bản sao có chứa một dấu chấm:cons is not a list. In that case the representation of the list displayed at the REPL contains a dot:

[i for i in list[r'\/:*?"|']]
[c for c in  r'\/:*?"|']
4

Điều quan trọng cần nhớ là các danh sách không phù hợp không phải là danh sách, do đó các hoạt động như MAP, bộ lọc và tương tự không hoạt động trên chúng.map, filter and similar do not work on them.

Như chúng tôi đã dự đoán trong tập 4, yếu tố đầu tiên của danh sách [thích hợp hoặc không phù hợp] có thể được trích xuất bằng xe hàm; Đuôi của danh sách thay vào đó có thể được trích xuất bằng hàm CDR. Nếu danh sách phù hợp, CDR của nó là thích hợp:car; the tail of the list instead can be extracted with the function cdr. If the list is proper, its cdr is proper:

[i for i in list[r'\/:*?"|']]
[c for c in  r'\/:*?"|']
5

Ở các danh sách sơ đồ cấp thấp được triển khai dưới dạng danh sách được liên kết, tức là như các cặp vợ chồng [con trỏ-xuất bản, giá trị] cho đến khi bạn đến con trỏ null.

Một số ví dụ;

Để đưa ra một ví dụ về cách xây dựng danh sách sơ đồ, ở đây tôi chỉ cho bạn cách bạn có thể xác định một hàm phạm vi tương tự như phạm vi Python. Đây là thông số kỹ thuật:range function analogous to Python range. Here are the specs:

[i for i in list[r'\/:*?"|']]
[c for c in  r'\/:*?"|']
6

Đây là việc thực hiện:

[i for i in list[r'\/:*?"|']]
[c for c in  r'\/:*?"|']
7

Ở đây Case-Lambda là một dạng cú pháp cho phép xác định các chức năng với hành vi khác nhau theo số lượng đối số. For -all là hàm bậc cao hơn R6RS: [for -allpredlst] áp dụng vị trí dự đoán cho các phần tử của danh sách LST, cho đến khi tìm thấy giá trị sai - trong trường hợp đó, nó trả về #F - nếu không nó sẽ trả về #T. Ở đây, việc kiểm tra khẳng định trong thời gian chạy rằng tất cả các đối số được thông qua N0, N và S là số, với s khác không.case-lambda is a syntactic form that allows to define functions with different behavior according to the number of arguments. for-all is an R6RS higher order function: [for-all pred lst] applies the predicate pred to the elements of list lst, until a false value is found - in that case it returns #f - otherwise it returns #t. Here the assertion checks at runtime that all the passed arguments n0, n and s are numbers, with s non-zero.

Đầu tiên cho phép xác định hàm so sánh CMP là> = nếu bước s dương tính hoặclet defines a comparison function cmp which is >= if the step s is positive, or

Chủ Đề