Cách vẽ mặt trời cho trăn rùa
Bạn có thể nghĩ rằng mô-đun Python >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)8 không hữu ích cho bất cứ điều gì. “Nó chỉ dành cho trẻ em”, là điều mà nhiều người nghĩ về nó. Tuy nhiên, mô-đun này cho phép bạn khám phá và thử nghiệm nhiều lĩnh vực của Python. Trong bài viết này, bạn sẽ viết một hoạt ảnh Python >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)8 về cảnh mặt trời mọc bằng cách sử dụng các bộ dữ liệu được đặt tên Show
Khi bạn hoàn thành bài viết này, bạn sẽ khám phá
Đừng lo lắng nếu bạn chưa bao giờ sử dụng mô-đun >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)8 của Python. Tôi sẽ giải thích những gì bạn cần để viết hoạt hình Python >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)8 này Tôi cho rằng bạn đã quen với việc xác định hàm và cấu trúc dữ liệu tích hợp sẵn của Python. Nếu bạn cần tìm hiểu thêm về những chủ đề này hoặc chỉ cần làm mới bộ nhớ của mình, bạn có thể đọc Power-up Your Coding. Tạo các hàm và dữ liệu, kiểu dữ liệu và cấu trúc dữ liệu của riêng bạn trong cuốn sách viết mã Python Lập kế hoạch Hoạt hình rùa Python mặt trời mọcHãy xem các bước cần thiết để viết hoạt ảnh Python >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)8 này
Bạn sẽ xử lý rất nhiều màu sắc trong suốt hoạt hình. Bạn cần xác định màu bắt đầu và màu kết thúc cho từng mục trong bản vẽ của mình. Mỗi màu được tạo thành từ ba thành phần. đỏ, xanh lá cây và xanh dương Điều này có nghĩa là bạn sẽ bắt đầu với sáu giá trị cho mỗi mục trong bản vẽ của mình. ba để thể hiện màu bắt đầu và ba để thể hiện màu cuối cùng. Bạn cũng cần thay đổi các thành phần màu đỏ, xanh lá cây và xanh lam của từng mục trong mỗi khung của hoạt ảnh Trong phần tiếp theo, bạn sẽ xem những cấu trúc dữ liệu nào bạn có thể sử dụng để giải quyết các yêu cầu này Sử dụng các bộ dữ liệu được đặt tên PythonHãy bắt đầu bằng cách nhìn vào màu sắc. Bạn thường thấy các màu được biểu thị bằng ba giá trị cho biết màu đó được tạo thành từ bao nhiêu màu đỏ, lục và lam. Đây là mô hình màu RGB. Bạn sẽ thường thấy đây là các số trong phạm vi từ >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')3 đến >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')4 vì số này đại diện cho màu >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')5-bit. Nếu mỗi thành phần được đại diện bởi >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')5 bit, thì sẽ có 2^8 giá trị, đó là >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')7. Do đó, màu trắng được đại diện bởi >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')8 vì nó bao gồm lượng màu đỏ, lục và lam tối đa. Màu đen được đại diện bởi >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')9. Các kết hợp giá trị RGB khác đại diện cho các màu khác Bạn có thể biểu thị một màu trong Python bằng cách lưu trữ ba giá trị RGB trong danh sách. Tuy nhiên, thay vào đó, bạn sẽ thường thấy các màu được định nghĩa là các bộ. Các bộ dữ liệu phù hợp hơn cho việc này vì chúng không thay đổi. Một màu sẽ luôn có ba giá trị và các giá trị RGB sẽ không thay đổi đối với màu đó >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)2 Biến >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)30 là một bộ chứa các giá trị RGB. Điều này thể hiện màu xanh nhạt mà bạn sẽ sử dụng làm màu bầu trời trong hoạt ảnh mặt trời mọc Bạn sẽ cần lưu trữ hai màu cho mỗi phần của bản vẽ của mình
Bạn có thể tạo một bộ dữ liệu khác cho việc này >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour) Biến >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)30 là một bộ >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)32. Đó là một tuple có hai mục. Mỗi một trong những mục đó là một bộ >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)33 với các giá trị RGB Bạn có thể truy cập màu khi bắt đầu hoạt ảnh bằng cách lập chỉ mục. >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)34. Bạn cũng có thể đi sâu hơn vào phần lồng nhau, ví dụ >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)35 là giá trị màu xanh lam của màu ở cuối hoạt ảnh Điều này là hoàn toàn tốt. Tuy nhiên, việc sử dụng các chỉ mục có thể gây nhầm lẫn và dẫn đến lỗi trong mã vì bạn sẽ cần theo dõi xem mỗi chỉ mục đại diện cho điều gì Bộ dữ liệu được đặt tênThay vào đó, bạn có thể sử dụng các bộ dữ liệu được đặt tên. Bạn có thể tìm thấy các bộ dữ liệu được đặt tên của Python trong mô-đun >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)36. Hãy xem cách bạn có thể tạo một bộ được đặt tên để biểu thị màu >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue') Bạn tạo một lớp có tên là >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)37, là lớp con của >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)38 >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)37 có ba trường mà bạn đặt trong đối số thứ hai khi bạn gọi >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)50 Bây giờ bạn có thể xác định >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)30 như bạn đã làm trước đó. Bây giờ, bạn sẽ bắt đầu bằng cách chỉ xác định màu kết thúc. Tuy nhiên, lần này, bạn có thể sử dụng lớp tuple có tên là >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)37 thay vì một tuple tiêu chuẩn >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)3 >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)30 vẫn có thể được truy cập bằng cách sử dụng các chỉ mục giống như một bộ dữ liệu tiêu chuẩn. Nhưng bạn cũng có thể truy cập các mục bằng cách sử dụng tên trường, chẳng hạn như >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)54. Điều này có thể làm cho mã của bạn dễ đọc hơn Bạn có thể tạo một bộ có tên khác để xác định điểm bắt đầu và điểm kết thúc của một phạm vi >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)5 Lần này, bạn định nghĩa >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)30 là một bộ dữ liệu có tên là >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)56. Bộ dữ liệu được đặt tên này chứa hai bộ dữ liệu được đặt tên >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)37 Bây giờ, bạn có thể truy cập giá trị màu xanh lam của màu cuối bằng cách sử dụng >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)35 hoặc >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)59. Truy cập các giá trị bằng cách sử dụng tên trường trong trường hợp này dễ đọc hơn và ít có khả năng dẫn đến lỗi hơn Bạn có thể nghĩ rằng một bộ dữ liệu được đặt tên tương tự như một từ điển. Tuy nhiên, một bộ dữ liệu được đặt tên là bất biến, giống như các bộ dữ liệu tiêu chuẩn. Tuy nhiên, từ điển có thể thay đổi Bạn sẽ đọc thêm về sự khác biệt giữa các bộ dữ liệu được đặt tên và từ điển sau trong bài viết này Để tìm hiểu thêm về các bộ dữ liệu được đặt tên, bạn có thể đọc bài viết Real Python Viết mã Pythonic và sạch với têntuple Thiết lập hoạt hình Rùa Python mặt trời mọcBạn có thể bắt đầu thiết lập hoạt ảnh của >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)8 bằng cách tạo một cửa sổ. Bạn có thể tạo tập lệnh có tên là >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)81 >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)8 Biến >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)82 đại diện cho đối tượng màn hình với chiều rộng và chiều cao do bạn chọn. Bạn cũng có thể thêm tiêu đề vào cửa sổ Bạn cũng gọi >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)83, cho phép bạn kiểm soát thời điểm mọi thứ được hiển thị trong hoạt ảnh của bạn. Khi bạn đặt trình theo dõi thành >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')3, bạn sẽ cần gọi >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)85 để cập nhật bản vẽ trên cửa sổ. Hiện tại không có gì được rút ra, vì vậy chưa có cuộc gọi nào tới >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)85 Khi bạn chạy mã này, bạn sẽ thấy một cửa sổ trống được hiển thị. Cuộc gọi >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)87 ngăn chương trình kết thúc Ghi chú. Nếu bạn đang sử dụng trình soạn thảo dựa trên web để viết mã bằng Python, bạn có thể thấy rằng lỗi >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)88 và >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)89 gây ra. Những phương pháp này không có trong phiên bản >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)8 được sử dụng bởi hầu hết các biên tập viên trực tuyến Thêm các lớp Tuple được đặt tênTrong phần trước giới thiệu các bộ dữ liệu được đặt tên, bạn đã tạo các lớp bộ dữ liệu được đặt tên là >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)37 và >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)56. Bạn có thể sử dụng chúng trong mã hoạt hình >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')1 Có một sự khác biệt trong kịch bản này. Các giá trị màu được chia cho >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')4. Chế độ màu mặc định trong mô-đun >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)8 biểu thị màu dưới dạng số float trong phạm vi từ >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')3 đến >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')16 thay vì số nguyên trong phạm vi >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')3 đến >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')4 Bạn cũng gọi >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')19 để thay đổi màu nền. Đầu ra bây giờ là một cửa sổ có nền đen vì >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')90 có màu đen. Đây là màu đầu tiên trong bộ dữ liệu có tên >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)30 Ghi chú. Nếu bạn đang sử dụng trình chỉnh sửa dựa trên web để viết mã bằng Python, bạn nên thêm >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')92 để đặt chế độ này làm chế độ mặc định Tính toán sự thay đổi màu sắc cần thiết trong mỗi khung hình hoạt hìnhĐể tạo hoạt ảnh, bạn sẽ cần một vòng lặp. Mỗi lần lặp của vòng lặp đại diện cho một khung. Bạn có thể kiểm soát hoạt ảnh của mình dựa trên thời gian. Tuy nhiên, tôi sẽ chọn một lộ trình đơn giản hơn cho bài viết này và đặt thời lượng lặp lại dựa trên số lượng khung hình thay vì thời gian Bạn có thể tạo một biến có tên là >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')93 để xác định số lượng khung hình mà bạn muốn hoạt ảnh của mình có. Bạn cũng có thể xác định một hàm để tính toán mức độ bạn sẽ cần thay đổi màu trong mỗi khung hình động >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')9 Hàm >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')94 có ba tham số
Bạn sử dụng gợi ý kiểu để làm cho mã dễ đọc hơn và làm rõ rằng >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')95 và >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')99 là các đối tượng của lớp >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)37. Đây là lớp tuple được đặt tên mà bạn đã tạo Bạn cần tính toán riêng kích thước bước cần thiết cho các thành phần màu đỏ, xanh lá cây và xanh dương để xác định cách thay đổi màu của từng khung hình một. Hàm >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')94 trả về một đối tượng kiểu >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)37. Về mặt kỹ thuật, giá trị trả về không phải là màu mà là các bước cần thiết để các thành phần màu đỏ, lục và lam thực hiện thay đổi về màu. Tuy nhiên, lớp >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)37 cũng hoạt động hoàn hảo cho việc này Bạn gọi hàm này để tìm ra các bước cần thiết để thay đổi màu bầu trời từ đen sang xanh da trời trong khung hình >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')44 Thêm Vòng lặp Hoạt hìnhBây giờ, bạn có thể thêm vòng lặp hoạt ảnh. Vì bạn đang xác định độ dài của hoạt ảnh bằng cách chọn số lượng khung hình, nên bạn có thể sử dụng vòng lặp >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')45 làm vòng lặp chính >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')4 Bạn tạo một biến có tên là >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')46, ban đầu bằng màu bắt đầu. Trong vòng lặp >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')45, bạn sửa đổi các thành phần màu đỏ, lục và lam của màu này bằng cách thêm các bước bạn đã tính toán. Cuối cùng, bạn cập nhật màu nền của màn hình Bạn cũng gọi >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)85 vì bạn muốn cập nhật hiển thị một lần cho mỗi khung hình Mã này tạo hoạt ảnh sau Màu bầu trời chuyển dần từ đen sang xanh da trời. Bạn có thể kiểm soát tốc độ của hoạt ảnh bằng cách thay đổi giá trị của >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')93. Bạn càng sử dụng nhiều bước, sự thay đổi màu sắc của bầu trời sẽ càng chậm Cập nhật một tuple được đặt tên?Bạn có thể nhớ rằng bạn đã sử dụng một bộ được đặt tên để thể hiện màu bắt đầu và kết thúc vì những màu này không thay đổi. Thật hợp lý khi sử dụng một kiểu dữ liệu không thay đổi Tuy nhiên, >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')46 cần được cập nhật mọi khung hình. Vì một đối tượng >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)37 là một bộ dữ liệu được đặt tên và do đó không thể thay đổi, bạn phải ghi đè lên bộ dữ liệu được đặt tên mỗi lần Hiện tại, tôi sẽ tiếp tục sử dụng lớp tuple có tên là >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)37 cho >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')46 và cho các biến tương tự được liên kết với các phần khác của bản vẽ mà bạn sẽ sớm bổ sung Bạn sẽ xem lại điểm này ở cuối bài viết này. Chúng ta sẽ thảo luận xem đây có phải là cách tiếp cận tốt nhất đối với màu sắc đang thay đổi trong mọi khung hình hay không Thêm một bông hoa vào cảnhcông việc khó khăn được thực hiện. Bây giờ, nếu bạn muốn thêm nhiều mục hơn vào cảnh, bạn có thể làm theo mẫu tương tự như bạn đã thực hiện với màu nền Bạn có thể bắt đầu bằng cách thêm một bông hoa có cuống. Có ba thành phần của hoa có màu sắc khác nhau
Bạn có thể thêm màu cho tất cả những thứ này và tìm ra các bước cần thiết trong mỗi khung. Tiếp theo, bạn tạo các đối tượng >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')54 cho bông hoa và thân cây và sử dụng các phương thức của >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')54 để ẩn “bút” đang thực hiện vẽ, xoay nó và thay đổi kích thước của các đường mà nó vẽ >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')5 Bạn xác định >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')56 vẽ thân và hoa bằng cách xoay và di chuyển những con rùa và thay đổi màu sắc của chúng. Hàm này cũng xóa bản vẽ khỏi khung trước đó khi bạn gọi >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')57 và >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')58 Bạn tính toán các bước cần thiết để thay đổi màu sắc trong mọi khung hình và đặt màu ban đầu giống như bạn đã làm cho bầu trời. Bạn thay đổi màu sắc hiện tại trong vòng lặp hoạt hình và vẽ lại bông hoa trong mọi khung hình Hoạt hình bây giờ trông như thế này Thêm các ngôi sao vào cảnhTiếp theo, bạn có thể thêm các ngôi sao ở các vị trí ngẫu nhiên trên màn hình. Vì bạn sẽ cần vẽ lại các ngôi sao trong mọi khung hình nên bạn có thể tạo các vị trí và kích thước ngôi sao ngẫu nhiên và lưu trữ chúng để bạn có thể sử dụng các giá trị giống nhau mỗi khi cần vẽ các ngôi sao. Điều này tốt hơn là tạo một con rùa mới cho mỗi ngôi sao có thể làm chậm hoạt ảnh Xử lý sự thay đổi màu sắc của các ngôi sao theo cùng một khuôn mẫu như với bầu trời và bông hoa >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)0 Màu khởi đầu của các ngôi sao là màu trắng. Tuy nhiên, bạn cần khớp màu cuối của các vì sao với màu cuối của bầu trời để các ngôi sao 'hòa' vào nền trời khi mặt trời mọc hoàn tất Bạn sử dụng các biểu thức trình tạo để tạo các cặp tọa độ sao và kích thước sao, sau đó chuyển đổi chúng thành các bộ dữ liệu. Nếu bạn đã quen với việc hiểu danh sách, bạn có thể thắc mắc tại sao bạn không thể sử dụng cú pháp tương tự mà thay thế dấu ngoặc vuông >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')59 bằng dấu ngoặc đơn >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)00? >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)1 Trong >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)01, bạn cần lặp qua cả >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)02 và >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)03. Do đó, bạn sử dụng hàm >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)04 của Python để 'zip' hai bộ dữ liệu này lại với nhau và lặp qua chúng đồng thời Trong vòng lặp hoạt hình, bạn vẽ các ngôi sao trước khi vẽ bông hoa để đảm bảo rằng các ngôi sao ở 'phía sau' bông hoa trong bức vẽ Hoạt hình hiện có các ngôi sao, bông hoa và bầu trời, tất cả đều thay đổi màu sắc ban đêm thành ban ngày Thêm mặt trời vào cảnhKhi bạn thêm mặt trời, sẽ có một thử thách mới. Việc thiết lập chuyển đổi màu sắc của mặt trời không quá khó vì điều này tuân theo cùng một khuôn mẫu với mọi thứ khác. Tuy nhiên, bạn cũng sẽ cần mặt trời mọc trên bầu trời Tọa độ x của mặt trời không đổi trong suốt hoạt ảnh. Tuy nhiên, tọa độ y thay đổi. Cũng như màu sắc, bạn cũng có giá trị bắt đầu và kết thúc cho tọa độ y. Do đó, bạn có thể sử dụng lớp tuple có tên >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)56 cho phạm vi tọa độ y. Các giá trị bên trong nó là các float thay vì các đối tượng >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)37 Bạn cũng cần xác định >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)07 thực hiện nhiệm vụ tương tự như >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')94. Các đối số đầu vào của nó là tọa độ y bắt đầu và kết thúc cũng như số bước trong hoạt ảnh >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)2 Hàm >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)09 cần màu của mặt trời và vị trí y. Ban đầu, bạn sử dụng >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)11 của >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')54 để đặt cả vị trí x và y của mặt trời. Tuy nhiên, trong >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)09, bạn có thể sử dụng >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)13 vì tọa độ x không còn thay đổi nữa Tăng >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)14 trong vòng lặp hoạt ảnh đơn giản hơn so với màu sắc vì giá trị là một dấu phẩy đơn lẻ chứ không phải là một bộ có tên Hoạt hình hiện đã hoàn tất Bạn có nên sử dụng các bộ dữ liệu được đặt tên trong vòng lặp hoạt hình không?Trước đó trong bài viết, chúng ta đã thảo luận về cách bộ dữ liệu lý tưởng cho màu sắc và các giá trị khác không thay đổi. Tuy nhiên, trong phiên bản mã hiện tại, bạn cũng đang sử dụng các bộ dữ liệu có tên để lưu trữ màu sắc trong vòng lặp hoạt hình. Đây là những màu có tên là >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)15 Vì các bộ dữ liệu là các đối tượng không thể thay đổi, nên bạn phải tạo các bộ dữ liệu có tên >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)37 mới trong vòng lặp >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')45 và gán lại chúng cho các tên biến giống nhau. Tuples không lý tưởng cho việc này Thay vào đó, bạn có thể chuyển đổi các bộ dữ liệu đã đặt tên thành từ điển trước vòng lặp >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')45. Từ điển là loại có thể thay đổi và phù hợp hơn với các giá trị cần thay đổi thường xuyên Bạn có thể cấu trúc lại mã bằng cách sử dụng phương thức >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)19 của tuple có tên để chuyển đổi tuple có tên thành từ điển >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)3 Cũng có những thay đổi trong vòng lặp >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')45. Bạn không còn tạo các bộ dữ liệu có tên >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)37 mới nữa. Thay vào đó, bạn đang thay đổi các giá trị màu trong từ điển bằng cách sử dụng toán tử gia số >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)22 Sau đó, bạn chuyển các giá trị của từ điển làm đối số cho >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')19, >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)01, >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')56 và >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)09. Bạn có thể sử dụng phương pháp >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)27 của từ điển để tạo một lần lặp có thể được sử dụng trong tất cả các chức năng đó Bạn sẽ không thể nhận thấy bất kỳ thay đổi nào giữa hoạt ảnh từ phiên bản này và hoạt ảnh bạn đã hoàn thành trước đó không sử dụng từ điển Vì vậy, tại sao bận tâm?Nếu hoạt hình trông giống nhau, tại sao phải thực hiện thay đổi này? Trong dự án này, nó không quan trọng. Tuy nhiên, đây là một ví dụ tốt để chúng ta suy nghĩ về việc sử dụng kiểu dữ liệu nào. Khi sử dụng các bộ dữ liệu được đặt tên trong vòng lặp >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')45, chương trình phải tạo một số bộ dữ liệu được đặt tên mới trong mỗi khung. Tạo các đối tượng mới cần có thời gian Nhưng cập nhật một từ điển là hiệu quả. Trong phiên bản tái cấu trúc, bạn không tạo các đối tượng mới trong vòng lặp >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')45 mà cập nhật các đối tượng hiện có Bạn có thể so sánh hai phiên bản bằng cách định thời gian cho chúng. Tuy nhiên, hầu hết thời gian được dành để hiển thị đồ họa trên màn hình trong hoạt ảnh chẳng hạn như hoạt ảnh này Bạn có thể so sánh hiệu quả của hai phiên bản bằng cách lược bỏ phần vẽ trong hoạt ảnh và chỉ so sánh đoạn mã cập nhật màu sắc Hãy sử dụng mô-đun >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)30 để tính thời gian cho các vòng lặp >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')45 trong cả hai phiên bản mã. Bắt đầu với việc định thời gian cho phiên bản gốc sử dụng các bộ dữ liệu được đặt tên xuyên suốt, kể cả trong vòng lặp >>> from collections import namedtuple >>> Colour = namedtuple("Colour", "red, green, blue") >>> issubclass(Colour, tuple) True >>> Colour._fields ('red', 'green', 'blue')45 hoạt hình >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)4 Bắt đầu từ dưới cùng của kịch bản này. Bạn đang chạy >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)33 với ba đối số
Khi bạn chạy tập lệnh này, bạn sẽ nhận được kết quả sau >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)5 Mã mất khoảng >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)43 giây để chạy >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)42 lần trên thiết lập của tôi Bạn có thể tạo tập lệnh tương tự cho phiên bản thứ hai trong đó từ điển thay thế các bộ dữ liệu có tên trong vòng lặp for >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)6 Đầu ra của tập lệnh này là >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)7 Phiên bản thứ hai mất khoảng một nửa thời gian để chạy so với phiên bản đầu tiên. Tạo các bộ dữ liệu được đặt tên mới trong mỗi khung tốn nhiều thời gian Lưu ý rằng phần mã thực hiện các thay đổi về màu sắc và vị trí mặt trời không chiếm quá nhiều thời gian trong cả hai phiên bản. Thời gian bạn nhận được từ các tập lệnh này dành cho >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)42 lần chạy hoạt ảnh mà không hiển thị trên màn hình Tuy nhiên, khi bạn chạy mã hoạt ảnh đầy đủ một lần, hoạt ảnh sẽ mất vài giây để chạy. Đó là bởi vì hiển thị đồ họa trên màn hình là phần tốn nhiều thời gian nhất của mã Tuy nhiên, trong các chương trình khác mà bạn có thể viết, hiệu suất có thể là một vấn đề. Vì vậy, luôn hữu ích khi nghĩ về thời điểm bạn nên sử dụng một loại dữ liệu này thay vì một loại dữ liệu khác. Có nhiều yếu tố cần xem xét khi chọn cấu trúc dữ liệu cho chương trình của bạn. Hiệu quả là một trong số đó Từ cuối cùngTrong bài viết này, bạn đã khám phá cách sử dụng các bộ dữ liệu có tên Python để viết hoạt ảnh Python >>> sky_colour = ( .. (0, 0, 0), .. (0, 191, 255) .. ) >>> type(sky_colour)8 về cảnh mặt trời mọc Bạn đã tìm ra những thay đổi về màu sắc và vị trí cần thiết trong từng khung hình động cho từng mục trong bản vẽ của mình. Kết quả là màu sắc và vị trí thay đổi mượt mà khi hoạt ảnh chạy Các bộ dữ liệu được đặt tên là lý tưởng để xác định màu ở đầu và cuối hoạt ảnh. Tuy nhiên, chúng không phải là lựa chọn tốt nhất để lưu trữ các màu thay đổi trong vòng lặp hoạt ảnh. Các kiểu dữ liệu có thể thay đổi sẽ phù hợp hơn khi bạn cần cập nhật dữ liệu thường xuyên Bạn có thể vẽ những hình gì trong con rùa Python?Thay đổi hình dạng con rùa . Quảng trường mũi tên Vòng tròn Rùa Tam giác Cổ điển Làm cách nào để vẽ một ngôi sao bằng Python?Nhận bảng màn hình mà rùa sẽ vẽ trên đó. . Xác định một phiên bản cho rùa Đối với một bản vẽ, Ngôi sao thực hiện một vòng lặp 5 lần Trong mỗi lần lặp, hãy di chuyển con rùa về phía trước 100 đơn vị và di chuyển nó sang phải 144 độ Điều này sẽ tạo thành một góc 36 độ bên trong một ngôi sao 5 lần lặp lại sẽ tạo nên một Ngôi sao hoàn hảo |