Phạm vi giằng xoăn, tự động hóa và các phương pháp khác để viết mã tốt hơn
Ảnh của Josh Kahen trên unplashPython sẽ luôn tìm thấy một cái gì đó để làm chúng tôi ngạc nhiên - đơn giản là có quá nhiều tính năng tuyệt vời được nhồi nhét vào ngôn ngữ. May mắn thay, điều này có nghĩa là chúng tôi không bao giờ hết mọi thứ để học.ython will always find something to surprise us with — there are simply far too many brilliant features crammed into the language. Fortunately, this means we never run out of things to learn.
Theo thời gian, tôi đã xây dựng thói quen ghi chú mọi tính năng mới mà tôi vấp ngã trong Python. Chủ yếu là họ rất thú vị nhưng đi kèm với các trường hợp sử dụng khá hẹp.
Tuy nhiên, những lần khác, tôi vấp phải một tính năng thực sự rất có thể áp dụng được - và thông thường, nó sẽ thay đổi cách tôi mã. Tôi theo dõi những điều này với một danh sách và bài viết này bao gồm năm tính năng yêu thích của tôi từ danh sách đó.
Get Method for Dictionaries - no more KeyErrors
Tree Datatypes - or autovivification
Advanced List Indexing - [::3]?
Decorator Functions - those @ things
Denote Scopes with Braces - not whitespace [my favorite feature]
Nhận phương pháp cho từ điển
Phương pháp từ điển
dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
9 thực hiện thao tác tương tự như cú pháp dictionary.get['three']
0 phổ biến hơn với một sự khác biệt đáng kể - chúng tôi không có lỗi nếu dictionary.get['three']
1 không tồn tại trong từ điển của chúng tôi:dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
dictionary.get['three']
2Với GET -get —
dictionary.get['three']
dictionary.get['three']
3Thay vì trả về KeyError, phương thức
dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
9 không trả về không.KeyError, the dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
9 method returns None.Chúng ta có thể tiến thêm một bước bằng cách chỉ định giá trị để trả về nếu
dictionary.get['three']
1 không tồn tại với đối số thứ hai của phương thức dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
9:dictionary.get['three', False]
dictionary.get['three']
7dictionary.get['three', "doesn't exist"]
dictionary.get['three']
8Cuối cùng, nếu bạn biết nội dung của từ điển của bạn - đừng sử dụng
dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
9 thì nó chậm hơn! [Cảm ơn Petru]Kiểu dữ liệu cây
Một kiểu dữ liệu cây trông như thế này:
Biểu diễn cây của các từ trong một câu và các phần tương ứng của chúng của các thẻ lời nói [POS]. Nguồn: Tác giả.Nó đại diện cho một cấu trúc cây phân cấp với giá trị gốc ở lớp trên cùng, phân nhánh thành các nút con. Mỗi nút con có một nút cha và mỗi nút cha có thể có một hoặc nhiều nút con.
Bây giờ, đại diện của chúng tôi trong Python sẽ rất giống với một từ điển lồng nhau, mà chúng tôi sẽ xây dựng như thế này:
tree = {
'carnivora': {
'canis': {
'c.lupus': 'c.l.familiaris'
},
'felis': 'f.catus'
}
}
Ở đây chúng ta cần xác định một từ điển mới cho mỗi nút trẻ, từng bước một.
Nó rất chậm, lộn xộn và dễ bị lỗi-hãy tưởng tượng điều này cho một cây năm lớp đơn giản trong đó mỗi nút cha mẹ chỉ có hai nút con.
May mắn thay, chúng ta có thể xây dựng kiểu dữ liệu cây của mình chỉ với điều này:
Bây giờ, thay vì xác định từng từ điển trẻ khi chúng ta đi, chúng ta có thể xây dựng toàn bộ các nhánh ngay lập tức:
tree = Tree[]Cây phân loại của người bạn tốt nhất và những thứ khác mà mọi người thích. Ảnh của Jamie Street trên unplash [trái], ảnh của Kari Shea trên unplash [phải].man’s best friend and those other things people like. Photo by Jamie Street on Unsplash [left], Photo by Kari Shea on Unsplash [right].
tree['carnivora']['canis']['c.lupus'] = 'c.l.familiaris'
tree['carnivora']['felis'] = 'f.catus'
print[tree][Out]: {
'carnivora': {
'canis': {
'c.lupus': 'c.l.familiaris'
},
'felis': 'f.catus'
}
}
Phương pháp này có một tên, tự động hóa - việc tạo tự động các mảng và băm mới mỗi khi giá trị không xác định được giải thích.
Một triển khai dòng duy nhất khác [không bao gồm nhập] có thể được tìm thấy ở đây.
Lập chỉ mục danh sách nâng cao
Các bước
Có một số phương pháp cắt danh sách chưa biết, mặc dù hữu ích. Đầu tiên trong số đó là việc sử dụng các bước:steps:
x = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
x[::2]
dictionary.get['three', False]
0Cú pháp chúng tôi đang sử dụng ở đây là
dictionary.get['three', False]
1 - bởi vì chúng tôi để trống dictionary.get['three', False]
2 và dictionary.get['three', False]
3, chúng tôi lặp lại từ đầu đến cuối danh sách, với dictionary.get['three', False]
4 của dictionary.get['three', False]
5.x[3:8:2]
dictionary.get['three', False]
6Những lát được đặt tên
Phương pháp cắt danh sách nâng cao sau đây được gọi là các lát được đặt tên. Ở đây, chúng tôi gán một lát cho một biến, như vậy:named slices. Here, we assign a slice to a variable, like so:
named_slice = slice[5, None] # this is equivalent to [5:]
Sau đó, chúng tôi có thể áp dụng lát cắt được đặt tên này vào bất kỳ danh sách nào.
dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
0dictionary.get['three', False]
7Cú pháp chúng tôi đang sử dụng ở đây sử dụng cùng một mẫu bắt đầu, kết thúc, bước -
dictionary.get['three', False]
8. Chúng ta có thể viết lại dictionary.get['three', False]
9 như thế này:dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
1dictionary.get['three', "doesn't exist"]
0Chức năng trang trí
Một chức năng trang trí là một trong những điều kỳ lạ
dictionary.get['three', "doesn't exist"]
1 mà tôi chắc chắn rằng nhiều người trong chúng ta đã thấy - đặc biệt, thư viện Flask sử dụng chúng rất nhiều.Họ rất đơn giản đáng ngạc nhiên để hiểu và cực kỳ hữu ích. Các nhà trang trí chỉ cần cho phép chúng tôi sửa đổi hành vi của một chức năng mà không cần sửa đổi rõ ràng chức năng của chúng tôi.
Ví dụ: chúng ta có thể xác định hàm
dictionary.get['three', "doesn't exist"]
2 sẽ lặp lại trong một phạm vi, cuối cùng trả về in giá trị cuối cùng nhân với hai:dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
2dictionary.get['three', "doesn't exist"]
3Chức năng này sẽ không làm gì khác ngoài việc mất nhiều thời gian để chạy - nhưng đó là những gì chúng tôi muốn. Chúng ta sẽ đến lúc thời gian chạy của chức năng này bằng cách sử dụng chức năng trang trí.
Người trang trí được định nghĩa giống như bất kỳ chức năng bình thường nào:
dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
3Sau đó, chúng ta có thể sử dụng cú pháp @ Weird @ đó khi xác định chức năng
dictionary.get['three', "doesn't exist"]
2 của chúng ta để kế thừa hành vi dictionary.get['three', "doesn't exist"]
5.dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
4Chúng tôi cũng có thể sử dụng nhiều nhà trang trí. Hãy để xác định một người khác được gọi là
dictionary.get['three', "doesn't exist"]
6 sẽ lặp đi lặp lại trên bất kỳ chức năng nào hai lần.dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
5Nếu bây giờ chúng tôi áp dụng cả hai người trang trí
dictionary.get['three', "doesn't exist"]
7 và dictionary.get['three', "doesn't exist"]
8 cho các chức năng dictionary.get['three', "doesn't exist"]
2 của chúng tôi, chúng tôi sẽ nhận được điều này:dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
6Ở đây, chúng tôi đã kết thúc
dictionary.get['three', "doesn't exist"]
2 vào dictionary.get['three', "doesn't exist"]
8 và chức năng kết quả thành dictionary.get['three', "doesn't exist"]
7 - giống như một số chức năng Python Frankenstein kỳ lạ của Frankenstein.Các nhà trang trí chúng tôi đã sử dụng ở đây là những ví dụ đồ chơi đơn giản. Chúng ta có thể làm nhiều hơn nữa với các nhà trang trí - Tôi khuyên bạn nên xem xét các bài viết/tài nguyên này:a lot more with decorators — I would recommend taking a look at these articles/resources:
- Primer on Python trang trí [một bài viết miễn phí, toàn diện về trang trí]
- Fluent Python, Luciano Ramalho [rất nhiều Python - không chỉ là người trang trí]
Biểu thị phạm vi với niềng răng
Dễ dàng là tính năng nâng cao yêu thích của tôi trong Python, thay vì dựa vào khoảng trắng để biểu thị phạm vi [nhàm chán] - chúng ta có thể sử dụng niềng răng xoăn!
Chúng tôi nhập chức năng từ thư viện
tree = {
'carnivora': {
'canis': {
'c.lupus': 'c.l.familiaris'
},
'felis': 'f.catus'
}
}
3:dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
7Và chúng ta đi!
Đó là năm tính năng không phổ biến, nhưng các tính năng siêu tiện dụng trong Python. Một vài đề cập danh dự mà tôi đã muốn rời đi để thử:
dictionary = {
'one': 1,
'two': 2
}
dictionary['three']
8Tôi đã kết hợp một repo github nhỏ với các ví dụ về tất cả các tính năng trên, và hơn thế nữa, ở đây. Kiểm tra nó để biết đoạn mã - và tất nhiên, hãy tự thoải mái để thêm của riêng bạn!
Nếu bạn có bất kỳ đề xuất hoặc câu hỏi nào, vui lòng liên hệ qua Twitter hoặc trong các ý kiến dưới đây. Hoặc, nếu bạn thích nhiều nội dung như thế này, tôi cũng đăng trên YouTube.
Cảm ơn vì đã đọc!