Hướng dẫn python 101 2nd edition pdf - python 101 phiên bản 2 pdf

Table of contents :
About the Technical Reviewers
Ethan Furman
Martin Breuss
Acknowledgments
Introduction
Part I - The Basics
Part II - Intermediate Materials
Part III - Tutorials
Part IV - Python Packaging and Distribution
Target Audience
About the Author
Conventions
Requirements
Book Source Code
Reader Feedback
Errata
Part I - The Python Language
Chapter 1 - Installing Python
Installing on Windows
Installing on Mac
Installing on Linux
Android / iOS
Other Operating Systems
Other Python Variants
Wrapping Up
Chapter 2 - Python Editors
What About the REPL?
Getting Started with IDLE
Getting Started with PyCharm Community Edition
Getting Started with Wing Personal
Getting Started with Visual Studio Code
Wrapping Up
Chapter 3 - Documenting Your Code
What are Comments?
Commenting Out
Multiline Comments
Learning About docstrings
Python’s Style Guide: PEP8
Tools that can help
Wrapping Up
Review Questions
Chapter 4 - Working with Strings
Creating Strings
String Methods
String Formatting
Formatting Strings Using %s [printf-style]
Formatting Strings Using .format[]
Formatting Strings with f-strings
String Concatenation
String Slicing
Wrapping Up
Review Questions
Chapter 5 - Numeric Types
Integers
Floats
Complex Numbers
Numeric Operations
Augmented Assignment
Wrapping Up
Review Questions
Chapter 6 - Learning About Lists
Creating Lists
List Methods
List Slicing
Copying a List
Wrapping Up
Review Questions
Chapter 7 - Learning About Tuples
Creating Tuples
Working With Tuples
Concatenating Tuples
Special Case Tuples
Wrapping Up
Review Questions
Chapter 8 - Learning About Dictionaries
Creating Dictionaries
Accessing Dictionaries
Dictionary Methods
Modifying Your Dictionary
Deleting Items From Your Dictionary
Wrapping Up
Review Questions
Chapter 9 - Learning About Sets
Creating a Set
Accessing Set Members
Changing Items
Adding Items
Removing Items
Clearing or Deleting a Set
Set Operations
Wrapping Up
Review Questions
Chapter 10 - Boolean Operations and None
The bool[] Function
What About None?
Wrapping Up
Review Questions
Chapter 11 - Conditional Statements
Comparison Operators
Creating a Simple Conditional
Branching Conditional Statements
Nesting Conditionals
Logical Operators
Special Operators
Wrapping Up
Review Questions
Chapter 12 - Learning About Loops
Creating a for Loop
Looping Over a String
Looping Over a Dictionary
Extracting Multiple Values in a Tuple While Looping
Using enumerate with Loops
Creating a while Loop
Breaking Out of a Loop
Using continue
Loops and the else Statement
Nesting Loops
Wrapping Up
Review Questions
Chapter 13 - Python Comprehensions
List Comprehensions
Nested List Comprehensions
Dictionary Comprehensions
Set Comprehensions
Wrapping Up
Review Questions
Chapter 14 - Exception Handling
The Most Common Exceptions
Handling Exceptions
Raising Exceptions
Examining the Exception Object
Using the finally Statement
Using the else Statement
Wrapping Up
Review Questions
Chapter 15 - Working with Files
The open[] Function
Reading Files
Reading Binary Files
Writing Files
Seeking Within a File
Appending to Files
Catching File Exceptions
Wrapping Up
Review Questions
Chapter 16 - Importing
Using import
Using from to Import Specific Bits & Pieces
Using as to assign a new name
Importing Everything
Wrapping Up
Review Questions
Chapter 17 - Functions
Creating a Function
Calling a Function
Passing Arguments
Type Hinting Your Arguments
Passing Keyword Arguments
Required and Default Arguments
What are *args and **kwargs?
Positional-only Parameters
Scope
Wrapping Up
Review Questions
Chapter 18 - Classes
Class Creation
Figuring Out self
Public and Private Methods / Attributes
Subclass Creation
Polymorphism
Making the Class Nicer
Wrapping Up
Review Questions
Part II - Beyond the Basics
Chapter 19 - Introspection
Using the type[] Function
Using the dir[] Function
Getting help[]
Other Built-in Introspection Tools
Wrapping Up
Review Questions
Chapter 20 - Installing Packages with pip
Installing a Package
Exploring Command Line Options
Installing with requirements.txt
Upgrading a Package
Checking What’s Installed
Uninstalling Packages
Alternatives to pip
Wrapping Up
Review Questions
Chapter 21 - Python Virtual Environments
Python’s venv Library
The virtualenv Package
Other Tools
Wrapping Up
Review Questions
Chapter 22 - Type Checking in Python
Pros and Cons of Type Hinting
Built-in Type Hinting / Variable Annotation
Collection Type Hinting
Hinting Values That Could be None
Type Hinting Functions
What To Do When Things Get Complicated
Classes
Decorators
Aliasing
Other Type Hints
Type Comments
Static Type Checking
Wrapping Up
Review Questions
Chapter 23 - Creating Multiple Threads
Pros of Using Threads
Cons of Using Threads
Creating Threads
Subclassing Thread
Writing Multiple Files with Threads
Wrapping Up
Review Questions
Chapter 24 - Creating Multiple Processes
Pros of Using Processes
Cons of Using Processes
Creating Processes with multiprocessing
Subclassing Process
Creating a Process Pool
Wrapping Up
Review Questions
Chapter 25 - Launching Subprocesses with Python
The subprocess.run[] Function
The subprocess.Popen[] Class
The subprocess.Popen.communicate[] Function
Reading and Writing with stdin and stdout
Wrapping Up
Review Questions
Chapter 26 - Debugging Your Code with pdb
Starting pdb in the REPL
Starting pdb on the Command Line
Stepping Through Code
Adding Breakpoints in pdb
Creating a Breakpoint with set_trace[]
Using the built-in breakpoint[] Function
Getting Help
Wrapping Up
Review Questions
Chapter 27 - Learning About Decorators
Creating a Function
Creating a Decorator
Applying a Decorator with @
Creating a Decorator for Logging
Stacking Decorators
Passing Arguments to Decorators
Using a Class as a Decorator
Python’s Built-in Decorators
Python Properties
Wrapping Up
Review Questions
Chapter 28 - Assignment Expressions
Using Assignment Expressions
What You Cannot Do With Assignment Expressions
Wrapping Up
Review Questions
Chapter 29 - Profiling Your Code
Learning How to Profile with cProfile
Profiling a Python Script with cProfile
Working with Profile Data Using pstats
Other Profilers
Wrapping Up
Review Questions
Chapter 30 - An Introduction to Testing
Using doctest in the Terminal
Using doctest in Your Code
Using doctest From a Separate File
Using unittest For Test Driven Development
Wrapping Up
Review Questions
Chapter 31 - Learning About the Jupyter Notebook
Installing The Jupyter Notebook
Creating a Notebook
Adding Content
Adding an Extension
Exporting Notebooks to Other Formats
Wrapping Up
Review Questions
Part III - Practical Python
Chapter 32 - How to Create a Command-line Application with argparse
Parsing Arguments
Creating Helpful Messages
Adding Aliases
Using Mutually Exclusive Arguments
Creating a Simple Search Utility
Wrapping Up
Review Questions
Chapter 33 - How to Parse XML
Parsing XML with ElementTree
Creating XML with ElementTree
Editing XML with ElementTree
Manipulating XML with lxml
Wrapping Up
Review Questions
Chapter 34 - How to Parse JSON
Encoding a JSON String
Saving JSON to Disk
Decoding a JSON String
Loading JSON from Disk
Validating JSON with json.tool
Wrapping Up
Review Questions
Chapter 35 - How to Scrape a Website
Rules for Web Scraping
Preparing to Scrape a Website
Scraping a Website
Downloading a File
Wrapping Up
Review Questions
Chapter 36 - How to Work with CSV files
Reading a CSV File
Reading a CSV File with DictReader
Writing a CSV File
Writing a CSV File with DictWriter
Wrapping Up
Review Questions
Chapter 37 - How to Work with a Database Using sqlite3
Creating a SQLite Database
Adding Data to Your Database
Searching Your Database
Editing Data in Your Database
Deleting Data From Your Database
Wrapping Up
Review Questions
Chapter 38 - Working with an Excel Document in Python
Python Excel Packages
Getting Sheets from a Workbook
Reading Cell Data
Iterating Over Rows and Columns
Writing Excel Spreadsheets
Adding and Removing Sheets
Adding and Deleting Rows and Columns
Wrapping Up
Review Questions
Chapter 39 - How to Generate a PDF
Installing ReportLab
Creating a Simple PDF with the Canvas
Creating Drawings and Adding Images Using the Canvas
Creating Multi-page Documents with PLATYPUS
Creating a Table
Wrapping Up
Review Questions
Chapter 40 - How to Create Graphs
Installing Matplotlib
Creating a Simple Line Chart with PyPlot
Creating a Bar Chart
Creating a Pie Chart
Adding Labels
Adding Titles to Plots
Creating a Legend
Showing Multiple Figures
Wrapping Up
Review Questions
Chapter 41 - How to Work with Images in Python
Installing Pillow
Opening Images
Cropping Images
Using Filters
Adding Borders
Resizing Images
Wrapping Up
Review Questions
Chapter 42 - How to Create a Graphical User Interface
Installing wxPython
Learning About Event Loops
How to Create Widgets
How to Lay Out Your Application
How to Add Events
How to Create an Application
Wrapping Up
Review Questions
Part IV - Distributing Your Code
Chapter 43 - How to Create a Python Package
Creating a Module
Creating a Package
Packaging a Project for PyPI
Creating Project Files
Creating setup.py
Generating a Python Wheel
Uploading to PyPI
Wrapping Up
Review Questions
Chapter 44 - How to Create an Exe for Windows
Installing PyInstaller
Creating an Executable for a Command-Line Application
Creating an Executable for a GUI
Wrapping Up
Review Questions
Chapter 45 - How to Create an Installer for Windows
Installing Inno Setup
Creating an Installer
Testing Your Installer
Wrapping Up
Review Questions
Chapter 46 - How to Create an “exe” for Mac
Installing PyInstaller
Creating an Executable with PyInstaller
Wrapping Up
Review Questions
Afterword
Appendix A - Version Control
Version Control Systems
Distributed vs Centralized Versioning
Common Terminology
Python IDE Version Control Support
Wrapping Up
Appendix B - Version Control with Git
Installing Git
Configuring Git
Creating a Project
Ignoring Files
Initializing a Repository
Checking the Project Status
Adding Files to a Repository
Committing Files
Viewing the Log
Changing a File
Reverting a File
Checking Out Previous Commits
Pushing to Github
Wrapping Up
Review Question Answer Key
Chapter 3 - Documenting Your Code
Chapter 4 - Working with Strings
Chapter 5 - Numeric Types
Chapter 6 - Learning About Lists
Chapter 7 - Learning About Tuples
Chapter 8 - Learning About Dictionaries
Chapter 9 - Learning About Sets
Chapter 10 - Boolean Operations and None
Chapter 11 - Conditional Statements
Chapter 12 - Learning About Loops
Chapter 13 - Python Comprehensions
Chapter 14 - Exception Handling
Chapter 15 - Working with Files
Chapter 16 - Importing
Chapter 17 - Functions
Chapter 18 - Classes
Chapter 19 - Introspection
Chapter 20 - Installing Packages with pip
Chapter 21 - Python Virtual Environments
Chapter 22 - Type Checking in Python
Chapter 23 - Creating Multiple Threads
Chapter 24 - Creating Multiple Processes
Chapter 25 - Launching Subprocesses with Python
Chapter 26 - Debugging Your Code
Chapter 27 - Learning About Decorators
Chapter 28 - Assignment Expressions
Chapter 29 - Profiling Your Code
Chapter 30 - An Introduction to Testing
Chapter 31 - Learning About the Jupyter Notebook
Chapter 32 - How to Create a Command Line Application with argparse
Chapter 33 - How to Parse XML
Chapter 34 - How to Parse JSON
Chapter 35 - How to Scrape a Website
Chapter 36 - How to Work with CSV files
Chapter 37 - How to Work with a Database Using sqlite
Chapter 38 - Working with an Excel Document in Python
Chapter 39 - How to Generate a PDF
Chapter 40 - How to Create Graphs
Chapter 41 - How to Work with Images in Python
Chapter 42 - How to Create a Graphical User Interface
Chapter 43 - How to Create a Python Package
Chapter 44 - How to Create an Exe for Windows
Chapter 45 - How to Create an Installer for Windows
Chapter 46 - How to Create an “exe” for Mac

Python 101 Phiên bản thứ 2

Michael Driscoll

Cuốn sách này được bán tại //leanpub.com/py101 Phiên bản này được xuất bản vào ngày 2020-08-29

* * * * * Đây là một cuốn sách Leanpub. LeanPub trao quyền cho các tác giả và nhà xuất bản với quy trình xuất bản nạc. Lean Publishing là hành động xuất bản một ebook inprogress sử dụng các công cụ nhẹ và nhiều lần lặp lại để nhận phản hồi của người đọc, xoay vòng cho đến khi bạn có cuốn sách phù hợp và xây dựng lực kéo khi bạn làm. * * * * * © 2020 Michael Driscoll

Mục lục về các nhà phê bình kỹ thuật Ethan Furman Martin Breuss

Lời cảm ơn Giới thiệu Phần I - Cơ bản Phần II - Tài liệu trung gian Phần III - Hướng dẫn Phần IV - Bao bì Python và đối tượng mục tiêu phân phối về các quy ước của tác giả Yêu cầu Sách Mã nguồn phản hồi phản hồi Errata

Phần I - Ngôn ngữ Python Chương 1 - Cài đặt Python Cài đặt trên Windows Cài đặt trên Mac Cài đặt trên Linux Android / IOS Các hệ điều hành khác Các biến thể Python khác kết thúc

Chương 2 - Biên tập viên Python thì sao? Bắt đầu với việc nhàn rỗi bắt đầu với Pycharm Community Edition

Bắt đầu với Cánh cá nhân bắt đầu với Visual Studio Code kết thúc

Chương 3 - Tài liệu về mã của bạn Nhận xét là gì? Nhận xét về ý kiến ​​đa dòng Tìm hiểu về DocStrings Python Hướng dẫn phong cách: Các công cụ PEP8 có thể giúp kết thúc câu hỏi đánh giá

Chương 4-Làm việc với các chuỗi Tạo chuỗi Chuỗi Phương thức Chuỗi định dạng chuỗi định dạng chuỗi bằng cách sử dụng chuỗi định dạng %s [kiểu printf] bằng cách sử dụng chuỗi định dạng .format []

Chương 5 - Các loại số số nguyên nổi Các số phức tạp Các hoạt động số

Chương 6 - Tìm hiểu về danh sách tạo danh sách

Danh sách các phương pháp Danh sách cắt sao chép một danh sách kết thúc câu hỏi đánh giá

Chương 7 - Tìm hiểu về các bộ dữ liệu tạo bộ dữ

Chương 8 - Tìm hiểu về từ điển Tạo từ điển truy cập các phương pháp từ điển Sửa đổi các mục xóa từ điển của bạn từ từ điển của bạn kết thúc câu hỏi đánh giá

Chương 9 - Tìm hiểu về các bộ tạo một bộ Truy cập các thành viên Thay đổi các mục Thêm các mục Xóa các mục Xóa hoặc Xóa một Bộ Hoạt động Tập hợp các câu hỏi đánh giá

Chương 10 - Các hoạt động boolean và không có chức năng bool [] thì không?

Kết thúc câu hỏi đánh giá

Chương 11 - Các báo cáo có điều kiện Các nhà khai thác so sánh Tạo một phân nhánh đơn giản Các tuyên bố có điều kiện có điều kiện Nesting Điều kiện Người vận hành logic Người vận hành đặc biệt Kết thúc câu hỏi đánh giá

Chương 12 - Tìm hiểu về các vòng lặp tạo một vòng lặp cho vòng lặp trên một vòng lặp trên một từ điển trích xuất nhiều giá trị trong một tuple trong khi vòng lặp bằng cách sử dụng các vòng lặp tạo ra một vòng lặp ra khỏi vòng lặp bằng cách sử dụng các vòng tiếp tục và câu lệnh khác Xem xét câu hỏi

Chương 13 - Danh sách toàn diện của Python Danh sách toàn bộ danh sách lồng nhau Chuyên luận về Từ điển Bộ thông tin Kết thúc câu hỏi đánh giá

Chương 14 - Xử lý ngoại lệ các trường hợp ngoại lệ phổ biến nhất

Xử lý các ngoại lệ Tăng cường ngoại lệ Kiểm tra đối tượng ngoại lệ bằng cách sử dụng câu lệnh cuối cùng bằng cách sử dụng câu lệnh khác kết thúc câu hỏi đánh giá

Chương 15 - Làm việc với các tệp Chức năng mở

Chương 16 - Nhập khẩu Sử dụng Nhập bằng cách sử dụng để nhập các bit & mẩu cụ thể bằng cách chỉ định tên mới Nhập mọi thứ kết thúc câu hỏi đánh giá

Chương 17 - Hàm tạo hàm gọi hàm Một hàm truyền Loại đối số gợi ý các đối số của bạn vượt qua các đối số từ khóa được yêu cầu và các đối số mặc định là *args và ** kwargs là gì? Các tham số chỉ có vị trí

Phạm vi kết thúc câu hỏi đánh giá

Chương 18 - Lớp tạo lớp tìm ra các phương pháp / thuộc tính riêng tư và các thuộc tính Creble Creative Polymorphism làm cho lớp học kết thúc câu hỏi đánh giá hơn

Phần II - Ngoài những điều cơ bản Chương 19 - Hướng nội sử dụng hàm loại [] bằng cách sử dụng hàm dir [] nhận được trợ giúp []

Chương 20 - Cài đặt các gói với PIP Cài đặt gói Khám phá các tùy chọn dòng lệnh Cài đặt với các yêu cầu.

Chương 21 - Môi trường ảo Python Python Thư viện VEN

Gói VirtualEnv Các công cụ khác kết thúc câu hỏi đánh giá

Chương 22 - Kiểu kiểm tra loại python ưu và nhược điểm của loại gợi ý về kiểu gợi ý / biến đổi biến đổi loại giá trị gợi ý loại có thể không có chức năng gợi ý gì khi mọi thứ trở nên phức tạp Kiểm tra kết thúc câu hỏi đánh giá

Chương 23 - Tạo nhiều chủ đề Ưu điểm của việc sử dụng các chủ đề của việc sử dụng các luồng tạo các luồng phân lớp phân nhóm Viết nhiều tệp với các chủ đề kết thúc câu hỏi đánh giá

Chương 24 - Tạo nhiều quy trình Ưu điểm của việc sử dụng các quy trình sử dụng các quy trình tạo ra các quy trình với quy trình phân lớp đa xử lý tạo ra một nhóm quy trình kết thúc

Xem xét câu hỏi

Chương 25 - Khởi chạy các quy trình con với Python Sub thế xử

Chương 26 - Gỡ lỗi mã của bạn với PDB bắt đầu PDB trong bản bắt đầu PDB trên dòng lệnh bước qua mã Thêm điểm dừng trong PDB Tạo điểm dừng với set_trace [] bằng cách sử dụng chức năng Breakpoint [] tích hợp.

Chương 27 - Tìm hiểu về các nhà trang trí Tạo một chức năng tạo ra một người trang trí áp dụng một bộ trang trí với @ Tạo một bộ trang trí để ghi nhật ký các nhà trang trí chuyển các đối số cho các nhà trang trí bằng cách sử dụng một lớp như một người trang trí Python, các nhà trang trí tích hợp Python Properties kết thúc câu hỏi xem xét các câu hỏi đánh giá

Chương 28 - Biểu thức gán sử dụng biểu thức gán những gì bạn không thể làm với các biểu thức gán

Kết thúc câu hỏi đánh giá

Chương 29 - Hồ sơ mã của bạn Học cách lập cấu hình với CPROFILE Cấu hình tập lệnh Python với CPROFILE làm việc với dữ liệu hồ sơ bằng cách sử dụng các PSTATS

Chương 30 - Giới thiệu về thử nghiệm bằng cách sử dụng tài liệu trong thiết bị đầu cuối bằng cách sử dụng tài liệu trong mã của bạn bằng cách sử dụng tài liệu từ một tệp riêng

Chương 31 - Tìm hiểu về sổ ghi chép Jupyter Cài đặt sổ ghi chép Jupyter Tạo một cuốn sổ tay thêm nội dung Thêm một cuốn sổ tay mở rộng vào các định dạng khác kết thúc câu hỏi đánh giá

Phần III - Python thực tế Chương 32 - Cách tạo ứng dụng dòng lệnh với Argparse

Đối số phân tích cú pháp tạo các thông điệp hữu ích thêm các bí danh bằng cách sử dụng các đối số loại trừ lẫn nhau tạo ra một tiện ích tìm kiếm đơn giản

Kết thúc câu hỏi đánh giá

Chương 29 - Hồ sơ mã của bạn Học cách lập cấu hình với CPROFILE Cấu hình tập lệnh Python với CPROFILE làm việc với dữ liệu hồ sơ bằng cách sử dụng các PSTATS

Chương 30 - Giới thiệu về thử nghiệm bằng cách sử dụng tài liệu trong thiết bị đầu cuối bằng cách sử dụng tài liệu trong mã của bạn bằng cách sử dụng tài liệu từ một tệp riêng

Chương 31 - Tìm hiểu về sổ ghi chép Jupyter Cài đặt sổ ghi chép Jupyter Tạo một cuốn sổ tay thêm nội dung Thêm một cuốn sổ tay mở rộng vào các định dạng khác kết thúc câu hỏi đánh giá

Phần III - Python thực tế Chương 32 - Cách tạo ứng dụng dòng lệnh với Argparse

Đối số phân tích cú pháp tạo các thông điệp hữu ích thêm các bí danh bằng cách sử dụng các đối số loại trừ lẫn nhau tạo ra một tiện ích tìm kiếm đơn giản

Chương 33 - Cách phân tích cú pháp XML XML với ElementTree Tạo XML với EementTree Chỉnh sửa XML với ElementTree thao tác XML với LXML kết thúc câu hỏi xem xét lại câu hỏi đánh giá

Chương 34 - Cách phân tích JSON mã hóa một chuỗi JSON Lưu JSON để giải mã một chuỗi JSON tải JSON từ đĩa xác thực JSON với JSON.

Chương 35 - Cách cạo các quy tắc trang web để loại bỏ web Chuẩn bị để loại bỏ một trang web cạo một trang web tải xuống một tập tin kết thúc câu hỏi đánh giá

Chương 36 - Cách làm việc với các tệp CSV Đọc tệp CSV Đọc tệp CSV với DicTreader Viết tệp CSV Viết tệp CSV với Dictwriter kết thúc câu hỏi đánh giá

Kết thúc câu hỏi đánh giá

Chương 41 - Cách làm việc với hình ảnh trong Python Cài đặt gối mở hình ảnh cắt hình ảnh bằng các bộ lọc thêm đường viền thay đổi kích thước hình ảnh kết thúc câu hỏi đánh giá

Chương 42 - Cách tạo giao diện người dùng đồ họa Cài đặt WXPython Tìm hiểu về các vòng lặp sự kiện Cách tạo các tiện ích Cách đặt ứng dụng của bạn Cách thêm các sự kiện Cách tạo ứng dụng kết thúc câu hỏi đánh giá

Phần IV - Phân phối mã của bạn Chương 43 - Cách tạo gói Python tạo mô -đun tạo gói gói một dự án để tạo tệp dự án tạo ra setup.py tạo một bánh xe Python tải lên

Chương 44 - Cách tạo EXE cho Windows

Cài đặt pyinstaller tạo một thực thi cho một ứng dụng dòng lệnh tạo ra một thực thi cho một GUI kết thúc câu hỏi đánh giá

Chương 45 - Cách tạo trình cài đặt để cài đặt Windows Cài đặt Inno Tạo trình cài đặt kiểm tra trình cài đặt của bạn kết thúc câu hỏi đánh giá

Chương 46 - Cách tạo ra một ex exe để cài đặt pyinstaller tạo ra một thực thi với pyinstaller kết thúc câu hỏi đánh giá

Phụ lục sau A - Hệ thống điều khiển phiên bản phiên bản Phân phối so với phiên bản tập trung Phiên bản thuật ngữ phổ biến

Phụ lục B - Điều khiển phiên bản với Git Cài đặt Git Cấu hình Git Tạo một dự án Bỏ qua các tệp khởi tạo kho lưu trữ kiểm tra trạng thái dự án Thêm tệp vào kho lưu trữ cam kết các tệp đang xem nhật ký

Thay đổi tệp hoàn nguyên một tệp kiểm tra các cam kết trước đó đang đẩy sang github kết thúc

Đánh giá câu hỏi Trả lời Khóa Chương 3 - Tài liệu về mã của bạn Chương 4 - Làm việc với các chuỗi Chương 5 - Các loại số Chương 6 - Học về danh sách Chương 7 - Học về các bộ dữ và không có Chương 11 - Phát biểu có điều kiện Chương 12 - Tìm hiểu về các vòng lặp Chương 13 - Chất hiểu biết của Python Chương 14 - Xử lý ngoại lệ Chương 15 - Làm việc với các tệp Chương 16 - Nhập khẩu chương 17 - Hàm Chương 18 - Lớp Chương 19 - Hướng nội Chương 20 - Cài đặt gói Với PIP Chương 21 - Môi trường ảo Python Chương 22 - Kiểu kiểm tra loại Python Chương 23 - Tạo nhiều luồng Chương 24 - Tạo nhiều quy trình Chương 25 - Khởi chạy các quy trình con với Python Chương 26 - Gỡ lỗi mã của bạn Chương 27 - Tìm hiểu về người trang trí Chương 28 - Bài tập Biểu thức Chương 29 - Hồ sơ mã của bạn Chương 30 - Giới thiệu về chương thử nghiệm 31 - Tìm hiểu về Notebook Jupyter

Chương 32 - Cách tạo ứng dụng dòng lệnh với Argparse

Chương 33 - Cách phân tích XML Chương 34 - Cách phân tích JSON Chương 35 - Cách xóa trang web Chương 36 - Cách làm việc với các tệp CSV Chương 37 - Cách làm việc với cơ sở dữ liệu bằng SQLite Chương 38 - Làm việc với tài liệu Excel Trong Python Chương 39 - Cách tạo PDF Chương 40 - Cách tạo đồ thị Chương 41 - Cách làm việc với hình ảnh trong Python Chương 42 - Cách tạo giao diện người dùng đồ họa Chương 43 - Cách tạo gói Python Chương 44 - Cách làm thế nào Để tạo EXE cho Windows Chương 45 - Cách tạo Trình cài đặt cho Windows Chương 46 - Cách tạo một EX EXE cho Mac

Về các nhà đánh giá kỹ thuật Ethan Furman Ethan, một lập trình viên phần lớn tự học, đã phát hiện ra Python vào đầu thế kỷ, nhưng không thể khám phá nó trong gần một thập kỷ. Khi cuối cùng anh ấy đã làm, anh ấy đã yêu nó, cú pháp đơn giản, thiếu tấm nồi hơi và sự dễ dàng mà người ta có thể thể hiện một ý tưởng trên mã trong mã. Sau khi viết thư viện DBF để hỗ trợ chuyển mã của công ty sang Python, ông là tác giả . Anh ấy cảm ơn mẹ vì tình yêu ngôn ngữ, câu chuyện và từ viết.

Martin Breuss Với nền tảng giáo dục, Martin bắt đầu học lập trình chủ yếu là một mình thông qua các tài nguyên trực tuyến sau khi học xong đại học. Kể từ đó, anh ấy làm việc như một nhà phát triển chương trình giảng dạy, cố vấn lập trình, người đánh giá mã và người hướng dẫn Bootcamp Python. Giáo dục chất lượng, kết hợp với việc tìm ra cách vui chơi trong khi học hiệu quả các chủ đề không quen thuộc, luôn luôn là một mối quan tâm lớn trong cuộc sống của anh ấy. Hiện tại, anh ta tạo ra nội dung cho các khóa học thực sự cũng như trực tuyến và trực tiếp cho CodingNomads, một cộng đồng cho những người học tập mã. Nếu bạn mới bắt đầu với lập trình máy tính, hãy nhớ rằng việc học một cái gì đó mới cần có thời gian và công sức, và sẽ dễ dàng hơn nếu bạn vui vẻ trong khi làm điều đó. Một số chiến lược học tập hữu ích cho Martin là [1] tập trung vào các dự án mà cá nhân anh ta quan tâm và [2] tích cực tham gia vào các cộng đồng của những người học có động lực.

Lời cảm ơn Viết là một quá trình tốn thời gian. Đối với Python 101, phiên bản thứ 2, tôi muốn có được một số nhà phê bình kỹ thuật tuyệt vời để cuốn sách sẽ tốt hơn bao giờ hết. Tôi muốn cảm ơn Martin Breuss vì nhiều bình luận sâu sắc và đề xuất hữu ích của anh ấy. Tôi cũng rất vinh dự khi có nhà phát triển Python Core Ethan Furman với tư cách là một nhà phê bình và biên tập viên kỹ thuật. Thời gian của ông dành để đảm bảo mã chính xác và cải thiện nội dung được đánh giá cao. Tôi cũng muốn cảm ơn nhiều người đã hỗ trợ tôi thông qua Kickstarter và blog của tôi. Tôi có nhiều độc giả và bạn bè tuyệt vời, chẳng hạn như Steve Barnes, người đã cho tôi một số phản hồi tuyệt vời về một vài chương đầu tiên của cuốn sách này và Michal đã giúp đỡ một số chương trong Phần III. Có rất nhiều bạn đã giúp tôi tìm hiểu những điều mới về Python và là một cộng đồng tuyệt vời. Cảm ơn bạn! Mike

Giới thiệu Chào mừng bạn đến với phiên bản thứ 2 của Python 101! Python 101 ban đầu ra mắt vào mùa hè năm 2014 và được viết với Python 3.5 trong tâm trí. Phiên bản thứ 2 của cuốn sách này đã được cập nhật và sắp xếp lại hoàn toàn cho phiên bản Python mới nhất, tại thời điểm viết là 3,8. Một số nhà xuất bản / tác giả sẽ chỉ thực hiện các bản cập nhật nhỏ khi tạo một phiên bản mới của một cuốn sách. Đó không phải là cách tôi lăn. Cá nhân tôi đã trải qua toàn bộ cuốn sách và cập nhật từng chương. Tôi đã xóa nội dung không còn liên quan hoặc có thể dẫn đến sự nhầm lẫn cho độc giả. Tôi cũng đã thêm một số chương mới vào cuốn sách bao gồm những thứ như sử dụng kiểm soát phiên bản và thiết lập các dự án. Nhiều cuốn sách lập trình sẽ chỉ dạy cho bạn những điều cơ bản của ngôn ngữ. Với Python 101, mục tiêu là giúp bạn không chỉ tìm hiểu những điều cơ bản của ngôn ngữ mà còn vượt ra ngoài những điều cơ bản và đào sâu vào một số tài liệu cấp trung gian. Lý do cho điều này là bạn thường cần biết nhiều hơn những điều cơ bản để tạo ra một cái gì đó có giá trị. Bởi vì điều này, cuốn sách sẽ được chia thành bốn phần sau: Phần một sẽ bao gồm những điều cơ bản của Python Phần hai sẽ là tài liệu trung gian Phần ba sẽ là một loạt các hướng dẫn nhỏ Phần bốn sẽ bao gồm bao bì Python và Lưu ý phân phối rằng không phải tất cả các phần sẽ là cùng chiều dài. Hãy để lần lượt đi trước và nói về từng phần này!

Phần I - Những điều cơ bản Đây là trái tim của cuốn sách. Trong phần này, bạn sẽ tìm hiểu tất cả những điều cơ bản mà bạn cần biết để bắt đầu sử dụng Python một cách hiệu quả. Mỗi chương sẽ dạy cho bạn một cái gì đó mới và chúng được đặt hàng theo cách mà họ sẽ xây dựng lẫn nhau. Nếu bạn đã biết rõ về Python, thì bạn có thể bỏ qua phần này và chuyển sang Phần II.

Phần II - Tài liệu trung gian Bây giờ bạn biết Python hoạt động như thế nào, bạn có thể đi sâu vào tài liệu cấp trung gian hơn. Trong phần này, bạn sẽ tìm hiểu về các chủ đề sau: Môi trường ảo Loại gợi ý và quy trình gỡ lỗi cho các trình trang trí mã hóa hồ sơ kiểm tra cơ bản các chủ đề này bao gồm một số python cấp trung gian và cũng giúp bạn tìm hiểu một số kỹ năng phát triển phần mềm chính, như biết cách gỡ lỗi mã của bạn , thêm các bài kiểm tra đơn vị cơ bản và sử dụng kiểm soát phiên bản.

Phần III - Hướng dẫn Phần này của cuốn sách là nơi bạn sẽ kết hợp tất cả lại với nhau. Bạn sẽ học cách sử dụng Python với một số kịch bản thế giới thực. Những kịch bản này sẽ là cơ bản, nhưng chúng sẽ chứng minh sức mạnh của Python và những gì bạn có thể làm với nó. Đây là những gì sẽ được bảo hiểm: Cách tạo ứng dụng dòng lệnh Cách phân tích XML Cách phân tích JSON cách tìm kiếm một trang web cách làm việc với các tệp CSV cách làm việc với cơ sở dữ liệu SQLite cách tạo tài liệu Excel cách tạo PDF

Phần IV - Bao bì và phân phối Python Bây giờ bạn biết cách viết chương trình, có lẽ bạn sẽ muốn biết cách chia sẻ chúng với bạn bè của bạn. Trong phần này, bạn sẽ học cách chuyển đổi mã của mình thành một thứ mà các nhà phát triển hoặc người dùng khác có thể sử dụng. Cụ thể, bạn sẽ tìm hiểu cách: Tạo gói Python nền tảng chéo Tạo một exe cho windows tạo trình cài đặt cho windows tạo một ex exe cho mac vào cuối phần này, bạn sẽ có thể tự tin phân phối mã của mình !!

Đối tượng mục tiêu Cuốn sách này được viết cho những người đã sử dụng các ngôn ngữ lập trình khác hoặc lấy một số khoa học máy tính hoặc các lớp liên quan. Mặc dù cuốn sách này đã giành chiến thắng trong tất cả các thuật ngữ, nó sẽ giúp bạn học cách sử dụng Python một cách hiệu quả. Nó cũng bao gồm một số chủ đề cấp trung gian mà hầu hết các cuốn sách mới bắt đầu thì không.

Về tác giả Michael Driscoll đã lập trình với Python trong hơn một thập kỷ. Anh ấy hoạt động trong nhiều cộng đồng Python và là người đóng góp cho Python thực sự. Mike cũng đã viết blog về Python tại //www.blog.pythonl Library.org/ trong nhiều năm và đã viết một số cuốn sách về Python: Python 101 [Phiên bản 1] Python 201: Với Python Jupyter Notebook 101 Tạo các ứng dụng GUI với WxPython

Các quy ước tất cả các cuốn sách kỹ thuật đều có quy ước riêng về cách trình bày mọi thứ. Trong cuốn sách này, các chủ đề mới sẽ táo bạo. Khi đề cập đến các từ khóa hoặc mã liên quan đến Python trong một câu, chúng sẽ ở trong Monospace. Các khối mã sẽ trông như thế này: 1 def Greeter [tên: str] -> none: 2 in [f'hello {name} '] 3 4 Greeter [' mike ']

Cũng sẽ có các khối mã đại diện cho trình thông dịch tương tác của Python, còn được gọi là một bản / lại: 1 >>> name = 'mike' 2 >>> in [tên f'my là {name} '] 3 Tên tôi là Mike

Điều này cho thấy làm thế nào thông dịch viên nên cư xử.

Yêu cầu bạn sẽ cần ngôn ngữ Python để theo dõi trong cuốn sách này. Xem Chương 1 để biết chi tiết cài đặt hoặc đi nhận phân phối Python chính thức miễn phí tại: //python.org/doad/ Nếu bạn cần bất cứ điều gì ngoài những gì đi kèm với Python, chương sẽ cho bạn biết cách cài đặt nó.

Mã nguồn Sách có thể tìm thấy mã nguồn Sách trên Github: //github.com/driscollis/python101code

Phản hồi của người đọc Nếu bạn thích cuốn sách hoặc có bất kỳ loại phản hồi nào khác, tôi rất muốn nghe từ bạn. Bạn có thể liên hệ với tôi tại phần sau: [Email & NBSP; được bảo vệ]

Errata Tôi cố gắng hết sức để không xuất bản lỗi trong các tác phẩm của mình, nhưng đôi khi nó xảy ra. Nếu bạn tình cờ thấy một lỗi trong cuốn sách này, vui lòng cho tôi biết bằng cách gửi email cho tôi theo số sau: * [Email & NBSP; được bảo vệ] Bây giờ hãy để bắt đầu!

Phần I - Ngôn ngữ Python Phần đầu tiên của cuốn sách này được dành riêng để giúp bạn học ngôn ngữ lập trình Python. Bạn sẽ tìm hiểu tất cả những điều cơ bản mà bạn cần biết để hiểu cú pháp Python. Bạn có thể không biết làm thế nào để kết hợp tất cả lại với nhau khi bạn hoàn thành phần này, nhưng đó là mục đích của các phần sau. Trong phần này của cuốn sách, bạn sẽ tìm thấy: Chương 1 - Cài đặt Python Chương 2 - Biên tập viên Python Chương 3 - Tài liệu của bạn Chương 4 - Làm việc với các chuỗi Chương 5 - Các loại số Chương 6 - Học về danh sách Chương 7 - Tìm hiểu về Tuples Chương 8 - Tìm hiểu về từ điển Chương 9 - Tìm hiểu về các bộ Chương 10 - Hoạt động Boolean và không có Chương 11 - Phát biểu có điều kiện Chương 12 - Học về các vòng lặp Chương 13 - Trạng thái Python Chương 14 - Xử lý ngoại lệ Chương 15 - Làm việc với các tệp Chương 16 - Nhập khẩu Chương 17 - Chức năng Chương 18 - Các lớp sau khi bạn hoàn thành phần này, bạn sẽ có thể hiểu được những điều cơ bản của Python và cú pháp của nó. Hãy để bắt đầu ngay bây giờ!

Chương 1 - Cài đặt Python tùy thuộc vào hệ điều hành bạn đang sử dụng, bạn có thể cần cài đặt ngôn ngữ lập trình Python. Chương này sẽ bao gồm các cách chính để cài đặt Python. Trước hết, có một số phiên bản khác nhau của Python, được gọi là phân phối trên mạng. Phân phối là một từ được sử dụng để mô tả một bộ sưu tập phần mềm. Phân phối Python sẽ bao gồm ngôn ngữ Python cốt lõi ở mức tối thiểu và đôi khi bao gồm các thư viện bên thứ 3 bổ sung. Phiên bản chính thức được gọi là Python hoặc Cpython và bạn có thể nhận được nó từ sau: //www.python.org/ Một phân phối Python phổ biến khác được gọi là Anaconda và đến từ Công ty Anaconda. Biến thể của Python này tập trung vào khoa học dữ liệu và bao gồm nhiều gói bên thứ 3 bổ sung ngoài thư viện tiêu chuẩn Python. Bạn có thể đọc thêm về nó ở đây: //www.anaconda.com/ Anaconda được thiết kế để sử dụng một công cụ dòng lệnh gọi là Conda để cài đặt các gói bổ sung trong khi Python sử dụng PIP, mặc dù bạn cũng có thể sử dụng PIP với Anaconda. Cũng lưu ý rằng việc tải xuống Anaconda lớn hơn nhiều so với Python chính thức là vì nó có rất nhiều gói bổ sung bao gồm nó. Nếu bạn đang ở trên PC Windows và không có đặc quyền quản trị viên trên máy của bạn, thì bạn có thể muốn kiểm tra Winpython, có thể chạy từ USB: //winpython.github.io/

Có nhiều phân phối Python khác để lựa chọn. Bạn có thể thấy một loạt nữa ở đây: //wiki.python.org/moin/pythondistributions Cuốn sách này tập trung vào Python 3. Phiên bản hiện tại tại thời điểm viết là Python 3.8. Bạn nên sử dụng phân phối Python chính thức hơn là Anaconda, mặc dù các ví dụ trong cuốn sách này sẽ hoạt động cho cả hai. Bất kỳ ví dụ nào sử dụng một tính năng cụ thể chỉ được tìm thấy trong 3,8 hoặc mới hơn sẽ được ghi nhận như vậy. Có phân phối 32 bit và 64 bit của Python. Nếu bạn không chắc chắn máy tính của bạn sử dụng gì, bạn nên chọn phiên bản 32 bit nếu có sẵn. Mac mới hơn không còn hỗ trợ 32 bit, vì vậy trong trường hợp đó, bạn chỉ có một lựa chọn.

Cài đặt trên Windows, trang web //www.python.org/ có phần tải xuống nơi bạn có thể tải xuống trình cài đặt cho Python. Sau khi trình cài đặt được tải xuống, nhấp đúp vào nó và đi qua trình hướng dẫn cài đặt. Đây là màn hình đầu tiên bạn nên thấy:

Hình 1-1: Cài đặt Python 3.8 thông qua trình cài đặt

Có một hộp kiểm trong trình hướng dẫn để thêm Python vào đường dẫn. Nếu bạn không có phiên bản Python cũ hơn đã được cài đặt hoặc nếu bạn muốn sử dụng phiên bản mới nhất làm Python mặc định của bạn, thì tôi khuyên bạn nên kiểm tra hộp kiểm đó. Nó không được kiểm tra theo mặc định, như thể hiện trong hình trên. Nếu bạn cài đặt Python vào đường dẫn của mình, nó sẽ cho phép bạn chạy Python từ dòng lệnh [cmd.exe] hoặc PowerShell bằng cách gõ Python. Nếu bạn cài đặt Python bằng Windows Store, nó sẽ tự động thêm Python vào đường dẫn của bạn. Trang tiếp theo của Trình hướng dẫn cài đặt cho phép bạn bật hoặc tắt các tính năng tùy chọn:

Hình 1-2: Kích hoạt các tính năng Python tùy chọn

Bạn có thể để bật các mặc định được bật, nhưng nếu bạn bị thiếu không gian, bạn nên tháo gỡ tùy chọn Bộ kiểm tra Python. Trang tiếp theo của trình hướng dẫn sẽ cho phép bạn bật các tùy chọn nâng cao:

Hình 1-3: Tùy chọn nâng cao

Tại đây bạn có thể cài đặt Python cho tất cả người dùng máy. Bạn cũng có thể liên kết các tệp Python với Python, tạo các phím tắt, thêm Python vào môi trường của bạn và hơn thế nữa. Hầu hết thời gian, mặc định sẽ ổn. Tuy nhiên

Đó là một ý tưởng tốt để tiếp tục và kiểm tra thư viện tiêu chuẩn trước đây, vì điều đó có thể làm cho Python chạy tốt hơn trên máy của bạn. Khi bạn nhấn tiếp theo ở đây, có lẽ bạn sẽ nhận được cảnh báo từ kiểm soát truy cập người dùng Window Window:

Hình 1-4: Cảnh báo kiểm soát truy cập người dùng

Đây là một bước xác minh hỏi bạn có thực sự muốn tiến hành cài đặt Python không. Đi trước và nhấn có. Bây giờ Python đang được cài đặt:

Hình 1-5: Cài đặt Python

Khi cài đặt kết thúc, bạn sẽ thấy hộp thoại cuối cùng này:

Hình 1-6: Thiết lập thành công

Bây giờ bạn đã cài đặt Python trên máy Windows của bạn! Hãy thử chạy Python bằng cách mở cmd.exe:

Hình 1-7: Chạy Python trong CMD.exe

Bạn sẽ thấy một cái gì đó như ở trên. Để thoát, bạn có thể nhấn Ctrl+D trên Linux và Mac, Ctrl+Z trên Windows hoặc gõ thoát [] trên bất kỳ nền tảng nào và nhấn Enter.

Cài đặt trên máy Mac thường đi kèm với Python được cài đặt sẵn. Tuy nhiên, nếu bạn muốn phiên bản Python mới nhất, thì bạn có thể cần tải xuống Python. Trang web //www.python.org/ có phần tải xuống nơi bạn cũng có thể tải xuống Trình cài đặt Python cho Mac. Sau khi tải xuống, bạn sẽ cần nhấp đúp vào nó để cài đặt Python. Bạn có thể cần nói với máy Mac của mình để cho phép bạn cài đặt Python vì hệ thống có thể đưa ra một hộp thoại cảnh báo bạn về việc cài đặt các chương trình được tải xuống từ Internet. Lưu ý rằng App Store không có Python trong đó, vì vậy sử dụng trang web Python là cách để đi. Hãy để một chút thời gian để tìm hiểu cách cài đặt Python trên máy Mac. Ở đây, điều đầu tiên bạn sẽ thấy khi bấm đúp vào tệp PKG đã tải xuống:

Hình 1-8: Cài đặt Python trên Mac OSX

Màn hình này về cơ bản cho bạn biết những gì bạn sắp cài đặt và bạn cũng sẽ cần cài đặt một số chứng chỉ SSL. Tiếp tục và nhấn tiếp tục:

Hình 1-9: Cài đặt Python trên Mac OSX [đọc thêm]

Trang này cung cấp cho bạn thêm thông tin về chứng chỉ SSL cũng như thông tin chung về việc sử dụng Idle và Tkinter trên máy Mac. Idle là trình chỉnh sửa mã tích hợp Python. Bạn sẽ tìm hiểu thêm về điều đó trong chương tiếp theo. Tkinter là một thư viện Python mà bạn có thể sử dụng để tạo giao diện người dùng đồ họa đa nền tảng. Tkinter là thư viện được sử dụng để tạo IDLE, trình soạn thảo Python đi kèm với Python. Nếu bạn quan tâm, hãy đọc qua thông tin trên trang này. Nếu không, hãy tiếp tục và tiếp tục:

Hình 1-10: Cài đặt Python trên Mac OSX [Thỏa thuận cấp phép]

Đây là trang Thỏa thuận cấp phép Python. Nó cũng có một chút lịch sử về Python trên đó. Vui lòng kiểm tra nó hoặc bỏ qua nó và nhấn Tiếp tục:

Hình 1-11: Cài đặt Python trên Mac OSX [Cài đặt đích]

Trang này cho phép bạn chọn đĩa nào trên máy tính mà bạn muốn cài đặt Python. Tôi thường sử dụng mặc định, nhưng nếu bạn muốn bạn có thể thay đổi nó thành một số vị trí khác.

Hình 1-12: Cài đặt Python trên Mac OSX [Cài đặt tiêu chuẩn]

Trang này cho phép bạn chọn thư mục nào để cài đặt Python, trái ngược với trang trước cho phép bạn chọn đĩa nào để cài đặt.

Hình 1-13: Cài đặt Python trên Mac OSX [cài đặt thực tế]

Trang này cho thấy việc cài đặt khi nó xảy ra. Bạn có thể chờ đợi và xem Python được cài đặt, hoặc đi lấy thứ gì đó để uống. Dù bằng cách nào, Python sẽ được cài đặt trước khi quá lâu.

Hình 1-14: Cài đặt Python trên Mac OSX [đã hoàn thành]

Đây là trang cuối cùng của Trình hướng dẫn cài đặt.

Cài đặt trên Linux Linux cũng thường đi kèm với Python được cài đặt sẵn, mặc dù nó có thể sẽ không phải là phiên bản mới nhất của Python. Trang web Python có tải xuống nguồn và hướng dẫn mà bạn có thể sử dụng để xây dựng Python mới nhất cho phân phối Linux của bạn. Tải xuống nguồn là mã nguồn Python với một số tập lệnh xây dựng bao gồm sẽ cho phép bạn xây dựng và cài đặt Python trên Linux. Để có hướng dẫn đầy đủ, bạn nên đọc hướng dẫn Dev: //devguide.python.org/setup/ Đôi khi bạn cũng có thể cài đặt một bản sao được xây dựng sẵn của Python mới nhất bằng cách sử dụng trình quản lý gói của bạn. Một nguồn tốt cho Python trên Linux là PPA Deadsnakes. Bạn sẽ cần sử dụng Google để tìm thấy nó, nhưng điều đó giúp việc cài đặt một phiên bản Python khác trên Linux dễ dàng hơn nhiều.

Android / iOS Bạn cũng có thể chạy Python trên Android và iOS thông qua các ứng dụng có thể tải xuống. Pydroid là một ứng dụng phổ biến cho Android trong khi Pythonista là một trong những lựa chọn phổ biến cho iOS. Cố gắng viết mã trên điện thoại có thể thực sự có vấn đề do bàn phím trên màn hình. Nếu bạn phải đi theo con đường này, bạn có thể muốn sử dụng một máy tính bảng.

Các hệ điều hành khác Python cũng có thể chạy trên Raspberry Pi. Nếu bạn không có máy tính, đây là một trong những cách hiệu quả nhất để có được Python vì Raspberry Pi có thể có giá chỉ $ 10. Tất nhiên, bạn sẽ cần kết nối nó với màn hình, bàn phím và chuột. Hầu hết thời gian, Raspberry Pi cũng sẽ cần thẻ SD để lưu trữ. Nhưng chúng là một môi trường phát triển rất khả thi.

Các biến thể Python khác Ngoài Anaconda, Python có một số biến thể khác đáng được đề cập: Jython - một triển khai Python được viết bằng Java cho phép bạn sử dụng mã Java trong Python Ironpython - một triển khai của Python được viết bằng .NET PYPY - được viết bằng RPYTHON, PYPY có trình biên dịch chỉ trong thời gian [JIT] giúp nó nhanh hơn nhiều so với Python thông thường là lý do chính để thử các triển khai Python khác này là về tốc độ hoặc tính linh hoạt. Ví dụ: nếu bạn đã quen thuộc với .NET hoặc Java, thì bạn có thể thấy Ironpython hoặc Jython dễ dàng hơn một chút để nhảy vào. Một lý do khác để sử dụng Jython hoặc Ironpython là vì bạn có mã có từ trước trong Java hoặc .NET mà bạn vẫn cần sử dụng với Python. Trong trường hợp của Pypy, tôi thường khuyên bạn nên nếu bạn có chương trình Python chậm và bạn cần một cách đơn giản để tăng tốc. Hãy thử chạy nó với PYPY và bạn có thể ngạc nhiên về việc cải thiện hiệu suất. Lưu ý rằng không có biến thể nào trong số này hoàn toàn tương thích với tất cả các gói bên thứ 3 của Python, vì vậy nếu chương trình của bạn sử dụng một gói, nó có thể không hoạt động với các biến thể này.

Kết thúc hầu hết thời gian, cài đặt Python là thẳng và dễ thực hiện. Nó có thể trở nên khó khăn khi bạn cần có nhiều phiên bản Python được cài đặt trên máy của bạn cùng một lúc, nhưng nếu bạn mới bắt đầu, tôi nghĩ rằng bạn sẽ thấy quá trình cài đặt khá không đau. Bây giờ bạn đã cài đặt Python, bạn có thể tự chúc mừng chính mình. Bạn đã bắt đầu một nỗ lực mới và bạn vừa thực hiện bước đầu tiên! Tuy nhiên, trước khi bạn thử chạy Python, bạn có thể muốn đọc chương tiếp theo, nơi bạn sẽ tìm hiểu về các công cụ bổ sung sẽ giúp bạn tận dụng tối đa cuộc phiêu lưu Python của mình!

Chương 2 - Các biên tập viên Python Ngôn ngữ lập trình Python đi kèm với môi trường phát triển tích hợp tích hợp [IDE] tích hợp của riêng nó được gọi là IDLE. Cái tên, nhàn rỗi, được cho là đến từ nam diễn viên, Eric Idle, một phần của đoàn kịch Monty Python, đó là những gì Python được đặt theo tên. IDLE đi kèm với Python trên Windows và một số biến thể Linux. Bạn có thể cần cài đặt nhàn rỗi một cách riêng biệt trên hương vị cụ thể của bạn về Linux hoặc trên Mac nếu bạn có kế hoạch sử dụng Python đi kèm với hệ điều hành. Bạn nên kiểm tra trang web Python để biết hướng dẫn đầy đủ về cách thực hiện vì mỗi hệ điều hành là khác nhau. Dưới đây là một số lý do mà môi trường phát triển tích hợp rất hữu ích: chúng cung cấp sự nổi bật của cú pháp giúp ngăn chặn các lỗi mã hóa tự động hoàn thành các tên biến và các điểm dừng tên tích hợp và gỡ lỗi. Vào thời điểm cuối cùng đó, các điểm dừng cho người gỡ lỗi nên tạm dừng thực thi. Gỡ lỗi là quá trình đi qua từng bước của bạn để tìm ra cách thức hoạt động hoặc khắc phục sự cố với mã của bạn. Bản thân Idle có các thuộc tính khác hữu ích, chẳng hạn như truy cập vào tài liệu Python, dễ dàng truy cập mã nguồn thông qua trình duyệt lớp và nhiều hơn nữa. Tuy nhiên, IDLE không phải là cách duy nhất để viết mã trong Python. Có rất nhiều IDS hữu ích ngoài kia. Bạn cũng có thể sử dụng trình soạn thảo văn bản nếu bạn thích. Notepad, Sublimetext, VIM, v.v., là những ví dụ của các biên tập viên văn bản. Các trình chỉnh sửa văn bản không có tất cả các tính năng mà IDE chính thức có, nhưng có xu hướng có lợi thế là đơn giản hơn để sử dụng. Đây là một danh sách rút gọn của IDE mà bạn có thể sử dụng để lập trình trong Python: Pycharm

Wing Python IDE VS Code [còn được gọi là Visual Studio Code] Spyder Eclipse với Pydev Pycharm và Wingide đều có phiên bản miễn phí và trả tiền cho các chương trình của họ. Các phiên bản trả phí có nhiều tính năng hơn, nhưng nếu bạn mới bắt đầu, các dịch vụ miễn phí của họ khá đẹp. Mã VS và Spyder là miễn phí. Mã VS cũng có thể được sử dụng để mã hóa trong nhiều ngôn ngữ khác. Lưu ý rằng để sử dụng mã VS một cách hiệu quả với Python, bạn sẽ cần cài đặt tiện ích mở rộng Python. Bạn cũng có thể sử dụng plugin PYDEV cho Eclipse để lập trình trong Python. Các biên tập viên phổ biến khác cho Python bao gồm sublimetext, vim, emacs và thậm chí là notepad ++. Các biên tập viên này có thể không được cập nhật 100% trên cú pháp của ngôn ngữ, nhưng bạn có thể sử dụng chúng cho nhiều ngôn ngữ lập trình. Nhưng hãy để Lừa sao lưu một chút và nói về bảng điều khiển cơ bản của Python, còn được gọi là The REPLE, viết tắt của Readita AvemorAt Print Loop.

Những gì về bản sao? REP hoặc ĐỌC, EVAL, PRINT, LOOP về cơ bản là trình thông dịch Python. Python cho phép bạn nhập mã vào một trình thông dịch sẽ chạy mã trực tiếp của bạn và cho phép bạn tìm hiểu về ngôn ngữ. Bạn có thể truy cập trình thông dịch hoặc phát lại bằng cách chạy Python trong thiết bị đầu cuối của bạn [nếu bạn đang sử dụng Mac hoặc Linux] hoặc bảng điều khiển lệnh [nếu bạn đang ở trên Windows]. Trên Windows, bạn có thể vào menu Bắt đầu và tìm kiếm lệnh CMD hoặc Lệnh nhắc nhở để mở bảng điều khiển hoặc thiết bị đầu cuối:

Hình 2-1: Chạy dấu nhắc lệnh trong Windows

Khi bạn có thiết bị đầu cuối, bạn có thể thử gõ Python. Bạn sẽ thấy một cái gì đó như thế này:

Hình 2-2: Chạy Python trong cmd.exe

Nếu điều này không hoạt động và bạn nhận được một lệnh không được nhận ra bởi một số lỗi hoặc một số lỗi khác, thì Python có thể không được cài đặt hoặc cấu hình chính xác. Trên Windows, bạn có thể cần thêm Python vào đường dẫn hệ thống của bạn hoặc bạn có thể gõ toàn bộ đường dẫn đến Python vào bảng điều khiển lệnh của bạn. Ví dụ: nếu bạn đã cài đặt Python trong C: \ Python \ Python38, thì bạn có thể chạy nó bằng cmd.exe như bạn đã làm ở trên, nhưng thay vì gõ Python, bạn sẽ nhập C: \ Python \ Python38 \ Python. Nếu bạn cần nhận trợ giúp trong việc phát lại, bạn có thể nhập trợ giúp []:

Hình 2-3: Trợ giúp thay thế

Bạn có thể nhập mã python trực tiếp vào repress và nó sẽ được đánh giá ngay lập tức, điều đó có nghĩa là mã sẽ chạy ngay khi bạn nhấn ENTER. Tại đây, cách thức bạn sẽ in ra Hello Hello World và thêm một số số vào replet:

Hình 2-4: Mã ví dụ thay thế

Python đi kèm với trình chỉnh sửa mã riêng của nó có tên là Idle. Hãy cùng tìm hiểu về điều đó tiếp theo!

Bắt đầu với Idle Idle là một nơi tốt để bắt đầu học Python. Khi bạn đã cài đặt nó, bạn có thể khởi động nó và màn hình ban đầu sẽ trông như thế này:

Hình 2-5: Vỏ nhàn rỗi

Đây là một câu. Bạn có thể nhập mã vào đây và nó sẽ được đánh giá ngay khi bạn nhấn phím trả về hoặc nhập phím. Nếu bạn muốn thực sự viết một chương trình đầy đủ, thì bạn sẽ cần mở chế độ xem Trình chỉnh sửa bằng cách truy cập tệp -> Mới. Bây giờ bạn sẽ có hộp thoại sau trên màn hình của mình:

Hình 2-6: Trình chỉnh sửa nhàn rỗi

Bạn có thể nhập mã của bạn vào đây và lưu nó.

Chạy mã của bạn cho phép viết một chút mã trong trình soạn thảo mã của chúng tôi và sau đó chạy nó. Nhập mã sau và sau đó lưu tệp bằng cách đi vào tệp -> Lưu. 1 in ['Hello World']

Để chạy mã này trong IDLE, hãy chuyển đến menu chạy và chọn tùy chọn đầu tiên có nhãn Module Run:

Hình 2-7: Mã chạy trong Idle

Khi bạn làm điều này, Idle sẽ chuyển sang shell và hiển thị cho bạn đầu ra của chương trình của bạn, nếu có bất kỳ:

Hình 2-8: Đầu ra của mã trong Idle

Bạn cũng có thể sử dụng tùy chọn Mô -đun kiểm tra Menu Run Menu để kiểm tra mã của mình để biết lỗi cú pháp.

Truy cập trợ giúp / tài liệu Đôi khi bạn cần trợ giúp. May mắn thay, Idle cũng có một số trợ giúp tích hợp về chính nó và ngôn ngữ Python! Bạn có thể truy cập trợ giúp về IDLE bằng cách vào menu Trợ giúp và chọn Trợ giúp nhàn rỗi:

Hình 2-9: Trợ giúp nhàn rỗi

Nếu bạn thay vì tìm kiếm cách thức hoạt động của một thứ gì đó trong ngôn ngữ Python, thì hãy vào menu trợ giúp và chọn tài liệu Python hoặc nhấn F1 trên bàn phím của bạn:

Hình 2-10: Tài liệu Python nhàn rỗi

Điều này sẽ cho bạn thấy tài liệu chính thức của Python. Tùy thuộc vào O/S của bạn, điều này có thể tải các tệp trợ giúp cục bộ hoặc bắt đầu trình duyệt để hiển thị các tài liệu trợ giúp trực tuyến chính thức.

Khởi động lại shell cho phép quay trở lại màn hình shell của IDLE chứ không phải là trình soạn thảo. Nó có một số chức năng khác đáng để đi qua. Đầu tiên là bạn có thể khởi động lại vỏ. Khởi động lại vỏ là hữu ích khi bạn cần bắt đầu lại với một bảng xếp hạng sạch nhưng không muốn đóng và mở lại chương trình. Để khởi động lại shell, hãy vào menu shell và chọn khởi động lại shell:

Hình 2-11: Menu khởi động lại nhàn rỗi

Nếu bạn đã khởi động lại shell trước đó, thì màn hình của bạn sẽ trông như thế này:

Hình 2-12: Khởi động lại nhàn rỗi

Điều này cho bạn biết rằng vỏ của bạn đã khởi động lại.

Trình duyệt mô -đun Idle đi kèm với một công cụ tiện dụng gọi là trình duyệt mô -đun. Công cụ này có thể được tìm thấy trong menu tệp. Khi bạn mở nó, bạn sẽ thấy như sau:

Hình 2-13: Trình duyệt mô-đun mở nhàn rỗi

Các mô -đun trong Python là mã mà nhóm phát triển cốt lõi Python đã tạo ra cho bạn. Bạn có thể sử dụng trình duyệt mô -đun để duyệt qua mã nguồn của chính Python. Hãy thử nhập phần sau vào hộp thoại ở trên: HĐH. Sau đó nhấn OK. Bây giờ bạn sẽ thấy những điều sau đây:

Hình 2-14: Trình duyệt mô-đun mở nhàn rỗi

Điều này cho phép bạn duyệt qua mã nguồn cho Os.py. Bạn có thể nhấp đúp vào bất cứ thứ gì trong trình duyệt mô-đun và nó sẽ nhảy đến đầu của nơi

Mã đó được xác định trong Trình chỉnh sửa mã Idle.

Trình duyệt đường dẫn Một công cụ hữu ích khác mà bạn có thể sử dụng trong IDLE là trình duyệt đường dẫn. Trình duyệt đường dẫn cho phép bạn xem nơi được cài đặt Python và cả đường dẫn mà Python sử dụng để nhập các mô -đun từ đó. Bạn sẽ tìm hiểu thêm về nhập khẩu và mô -đun sau này trong cuốn sách này. Bạn có thể mở nó bằng cách đi đến tệp và sau đó trình duyệt đường dẫn:

Hình 2-15: Trình duyệt đường dẫn nhàn rỗi

Trình duyệt đường dẫn là một cách tốt để chẩn đoán các vấn đề với các mô -đun nhập. Nó có thể cho bạn thấy rằng bạn có thể không có cấu hình Python một cách chính xác. Hoặc nó có thể cho bạn thấy rằng bạn đã cài đặt mô -đun bên thứ 3 ở vị trí sai.

Bắt đầu với Pycharm Community Edition Pycharm là một Python IDE thương mại từ một công ty tên là Jetbrains. Họ có một phiên bản chuyên nghiệp, chi phí tiền và phiên bản cộng đồng, miễn phí. Pycharm là một trong những lựa chọn phổ biến nhất để tạo và chỉnh sửa các chương trình Python. Pycharm Professional có hàng tấn tính năng và một trình gỡ lỗi tuyệt vời. Tuy nhiên, nếu bạn là người mới bắt đầu, bạn có thể thấy tất cả các chức năng trong phần mềm này là một chút áp đảo. Để có được một bản sao của Pycharm Community Edition, bạn có thể truy cập trang web sau: //www.jetbrains.com/pycharm/ Phiên bản cộng đồng không có tất cả các tính năng mà Pycharm Professional có. Nhưng điều đó không sao khi bạn chưa quen với Python. Nếu bạn muốn thử Pycharm, hãy tiếp tục và tải xuống và cài đặt phần mềm. Khi bạn chạy pycharm, nó có thể yêu cầu bạn nhập cài đặt. Bạn có thể bỏ qua hoặc nhập cài đặt nếu bạn đã sử dụng Pycharm trước đây và đã có một số cài đặt. Tiếp theo, bạn có thể sẽ cần phải chấp nhận chính sách quyền riêng tư / EULA của họ. Tùy thuộc vào hệ điều hành, bạn cũng có thể được hỏi áp dụng chủ đề nào. Mặc định là Darkula trên Windows. Tại thời điểm này, bạn sẽ thấy biểu ngữ chào mừng sau:

Hình 2-16: Chào mừng Pycharm

Pycharm thích bạn làm việc trong một dự án hơn là mở một tệp đơn giản. Các dự án thường là bộ sưu tập các tập tin hoặc tập lệnh liên quan. Bạn có thể thiết lập một dự án mới ở đây hoặc mở một dự án đã tồn tại trước. Khi bạn đã trải qua quá trình đó, màn hình của bạn sẽ trông như thế này:

Hình 2-17: Dự án Pycharm

Tạo kịch bản Python

Để tạo tập lệnh Python mới trong Pycharm, bạn có thể truy cập tệp và chọn mới. Sau đó chọn tệp Python từ các lựa chọn được trình bày:

Hình 2-18: Pycharm mới

Đặt tên cho tệp, chẳng hạn như Hello.py. Bây giờ Pycharm sẽ trông như thế này:

Hình 2-19: Pycharm Hello World

Đang chạy mã trong pycharm, hãy để thêm một số mã vào tệp của bạn: 1 in ['Xin chào Pycharm']]

Để chạy mã của bạn, đi đến menu chạy và chọn chạy. Pycharm có thể yêu cầu bạn thiết lập cấu hình gỡ lỗi trước khi chạy nó. Bạn có thể lưu mặc định và tiếp tục. Bây giờ bạn sẽ thấy những điều sau đây ở dưới cùng của Pycharm:

Hình 2-20: Đầu ra mã chạy Pycharm

Pycharm có Pycharm có hàng tấn tính năng. Trong thực tế, nó có rất nhiều người mà bạn có thể viết toàn bộ cuốn sách về chúng. Đối với mục đích của cuốn sách này, bạn nên biết rằng Pycharm sẽ cung cấp cho bạn các đề xuất về mã của bạn dựa trên PEP8, đó là Hướng dẫn kiểu mã Python. Bạn sẽ tìm hiểu thêm về điều đó trong chương tiếp theo. Nó cũng sẽ làm nổi bật nhiều thứ khác về mã của bạn. Bạn thường có thể di chuột qua bất kỳ mã nào có vẻ kỳ lạ với bạn và một chú giải công cụ sẽ xuất hiện sẽ giải thích vấn đề hoặc cảnh báo. Trình gỡ lỗi được vận chuyển với pycharm rất hữu ích để tìm ra lý do tại sao mã của bạn không hoạt động. Bạn có thể sử dụng nó để đi qua từng dòng mã của bạn. Tài liệu Pycharm, khá tốt, vì vậy nếu bạn bị mắc kẹt, hãy kiểm tra tài liệu của họ.

Bắt đầu với Wing Personal Wingware từ Python IDE được viết bằng Python và Pyqt. Đó là IDE yêu thích cá nhân của tôi cho Python. Bạn có thể nhận được nó trong chuyên nghiệp [trả phí], cá nhân [miễn phí] hoặc 101 [phiên bản thực sự bị tước xuống, nhưng cũng miễn phí]. Trang web của họ giải thích sự khác biệt giữa 3 phiên bản. Bạn có thể nhận được wingware tại đây: //wingware.com/ Sau khi bạn đã tải xuống và cài đặt phần mềm, tiếp tục và chạy nó. Bạn sẽ cần chấp nhận thỏa thuận cấp phép để tải lên IDE. Khi nó được tải đầy đủ, bạn sẽ thấy một cái gì đó như thế này:

Hình 2-21: Màn hình chính của Wingware Python IDE

Chạy mã trong Wingware cho phép tạo ra một số mã trong cánh. Bạn có thể mở một tệp mới bằng cách vào menu tệp và chọn Mới:

Hình 2-22: Wingware Python IDE - Thêm mã

Bây giờ nhập mã sau: 1 in ['Xin chào wingware']

Lưu mã vào đĩa bằng cách đi vào tệp và sau đó lưu. Để chạy mã này, bạn có thể chuyển đến menu gỡ lỗi, nhấn F5 hoặc nhấp vào nút Xanh xanh Play Play trên thanh công cụ. Bạn sẽ thấy hộp thoại Thông báo gỡ lỗi:

Hình 2-23: Wingware Python IDE - Đầu ra mã

Nhấn OK và mã sẽ chạy. Bạn sẽ thấy đầu ra trong tab I/O gỡ lỗi nếu có.

Lưu ý rằng Wing không yêu cầu bạn tạo một dự án để chạy một tệp Python duy nhất. Bạn có thể tạo các dự án nếu bạn muốn mặc dù.

Tính năng cánh có một trình gỡ lỗi đáng kinh ngạc. Tuy nhiên, bạn không thể sử dụng nó ở mức độ đầy đủ của nó trong các phiên bản miễn phí của phần mềm. Nhưng có một tab Trợ lý nguồn trong phiên bản cá nhân rất hữu ích. Nó sẽ hiển thị cho bạn thông tin về các chức năng / mô -đun mà bạn đã tải khi bạn sử dụng chúng. Điều này làm cho việc học các mô -đun mới dễ dàng hơn nhiều. Cánh cũng sẽ cho bạn thấy các vấn đề khác nhau với mã của bạn trong khi bạn gõ, mặc dù Pycharm dường như làm nhiều hơn trong lĩnh vực này hơn là cánh. Cả hai sản phẩm đều có plugin và bạn cũng có thể viết cho cả hai ID.

Bắt đầu với mã Visual Studio Code Studio Code, hoặc ngắn gọn là mã VS, là một trình soạn thảo lập trình đa năng. Không giống như Pycharm và Wingide, nó được thiết kế để hoạt động với nhiều ngôn ngữ. Pycharm và Wingide cũng sẽ cho phép bạn viết bằng các ngôn ngữ khác, nhưng trọng tâm chính của họ là Python. Mã VS được tạo bởi Microsoft và nó miễn phí. Bạn có thể tải xuống tại đây: //code.visualstudio.com/ Sau khi bạn đã tải xuống và cài đặt, bạn sẽ cần cài đặt hỗ trợ cho Python từ thị trường mã vs. Nếu bạn mở mã VS, màn hình sẽ trông giống như thế này:

Hình 2-24: Mã VS - Màn hình chính

Theo tùy chỉnh, bạn có thể thấy có một tùy chọn để cài đặt Python. Nếu đó không phải là ở đó, bạn có thể nhấp vào nút Tiện ích mở rộng ở bên trái và tìm kiếm Python ở đó:

Hình 2-25: Mã VS - Thêm tiện ích mở rộng Python

Đi trước và cài đặt tiện ích mở rộng Python để mã VS sẽ nhận ra Python một cách chính xác.

Chạy mã trong mã VS Mở một thư mục trong tab File Explorer và sau đó bạn có thể nhấp chuột phải vào đó để tạo một tệp mới. Ngoài ra, bạn có thể vào menu tệp và chọn tệp mới và thực hiện theo cách đó. Sau khi hoàn thành, bạn có thể nhập mã sau và lưu nó: 1 in ['Hello vs Code']

Sau đó nhấp chuột phải vào bất cứ nơi nào trong trình chỉnh sửa và chọn tệp Run Python trong lựa chọn đầu cuối. Điều này sẽ khiến mã của bạn chạy và bạn sẽ thấy như sau:

Hình 2-26: Mã VS - Mã đang chạy

Lưu ý: Tôi đã cài đặt mô -đun PSREADLINE khi tôi chạy mã này, đó là lý do tại sao bạn thấy lỗi trong bảng điều khiển ở trên.

Tính năng mã VS VS có thể chạy tất cả các loại ngôn ngữ khác nhau. Tuy nhiên, với mục đích của Python, Microsoft có một nhóm các nhà phát triển Python không ngừng cải thiện IDE này và thêm các tính năng mới. Có hàng tấn tiện ích mở rộng mà bạn có thể cài đặt để tăng cường chức năng của trình soạn thảo. Một trong những tiện ích mở rộng thú vị nhất mà bạn có thể cài đặt là Live Share, cho phép bạn thực hiện sự hợp tác thời gian thực giữa các nhà phát triển. Về cơ bản, nó chia sẻ phiên mã hóa của bạn với những người khác. Vì IDE này là bộ mới nhất trong nhóm và bộ tính năng của nó đang thay đổi rất nhiều, bạn sẽ cần nghiên cứu nó vào thời gian của riêng bạn.

Kết thúc có rất nhiều biên tập viên mã Python để lựa chọn. Idle là tốt đẹp ở chỗ nó đi kèm với Python và được viết bằng Python, vì vậy bạn thực sự có thể học được rất nhiều chỉ bằng cách nhìn vào mã nguồn của nó. Mã Pycharm và VS rất phổ biến ngay bây giờ. Wing Ide từng phổ biến hơn so với ngày nay, nhưng tôi nghĩ nó vẫn thực sự tuyệt vời. Tất cả các công cụ này đều tốt, nhưng bạn nên thử cho họ xem cái nào hoạt động tốt nhất cho bạn.

Chương 3 - Việc ghi lại mã của bạn ghi lại mã của bạn sớm là khá quan trọng so với hầu hết các nhà phát triển mới nhận ra. Tài liệu trong phát triển phần mềm đề cập đến ý tưởng đưa ra các biến, chức năng và tên nhận dạng khác của bạn tên mô tả. Nó cũng đề cập đến việc thêm ý kiến ​​tốt. Khi bạn đắm chìm trong việc phát triển sáng tạo mới nhất của mình, thật dễ dàng để tạo các biến và chức năng với tên không mô tả. Một tháng hoặc một năm sau, khi bạn chắc chắn sẽ quay lại mã của mình, bạn sẽ dành một lượng thời gian không phù hợp để cố gắng tìm ra mã của bạn làm gì. Bằng cách làm cho mã của bạn tự ghi chép [nghĩa là sử dụng tên mô tả] và thêm nhận xét khi cần thiết, bạn sẽ làm cho mã của mình dễ đọc hơn và cho bất kỳ ai khác có thể sử dụng mã của bạn. Điều này sẽ giúp cập nhật mã của bạn và tái cấu trúc mã của bạn dễ dàng hơn! Trong chương này, bạn sẽ tìm hiểu về các chủ đề sau: Nhận xét DocStrings PEP8 - Hướng dẫn kiểu Python hữu ích cho việc ghi lại mã của bạn, hãy bắt đầu bằng cách tìm hiểu về bình luận.

Nhận xét là gì? Nhận xét là mã dành cho bạn, không phải cho máy tính của bạn. Ý tôi là điều đó là một bình luận về cơ bản là một lưu ý cho chính bạn giải thích những gì đang xảy ra trong phần mã của bạn. Bạn sử dụng nhận xét để giải thích lý do tại sao bạn đã làm một cái gì đó hoặc cách một đoạn mã hoạt động. Khi bạn bắt đầu như một nhà phát triển mới, thật tốt khi để lại cho mình rất nhiều ý kiến ​​để tham khảo lại. Nhưng một khi bạn học cách đặt tên đúng các chức năng và biến của mình, bạn sẽ thấy rằng bạn không cần nhận xét nhiều. Tuy nhiên, các bình luận vẫn được khuyến nghị, đặc biệt là đối với mã phức tạp và không dễ hiểu ngay từ cái nhìn đầu tiên. Tùy thuộc vào công ty bạn làm việc, bạn cũng có thể sử dụng nhận xét để ghi lại các bản sửa lỗi lỗi. Ví dụ: nếu bạn đang sửa lỗi, bạn có thể bao gồm một nhận xét đề cập đến lỗi nào bạn đang sửa để giúp giải thích lý do tại sao bạn phải thay đổi nó. Bạn có thể tạo nhận xét bằng cách sử dụng dấu # theo sau là một số văn bản mô tả. Đây là một ví dụ 1 # Đây là một bình luận xấu 2 x = 10

Trong mã trên, dòng đầu tiên trình bày cách tạo một nhận xét đơn giản. Khi Python đi thực thi mã này, nó sẽ thấy ký hiệu # và bỏ qua tất cả các văn bản theo sau nó. Trong thực tế, Python sẽ bỏ qua dòng đó và cố gắng thực hiện dòng thứ hai. Nhận xét này được đánh dấu là một bình luận xấu của người Viking. Mặc dù nó là tốt cho mục đích trình diễn, nhưng nó không mô tả mã theo sau. Đó là lý do tại sao nó không phải là một nhận xét tốt. Nhận xét tốt mô tả mã tiếp theo. Một nhận xét tốt có thể mô tả mục đích của tập lệnh Python, dòng mã hoặc một cái gì đó khác. Nhận xét là tài liệu mã của bạn. Nếu họ không cung cấp thông tin, thì họ nên được xóa.

Bạn cũng có thể tạo nhận xét nội tuyến: 1 x = 10

# 10 đang được gán cho x

Ở đây bạn một lần nữa gán 10 cho biến X, nhưng sau đó bạn thêm hai khoảng trống và ký hiệu #, cho phép bạn thêm nhận xét về mã. Điều này rất hữu ích khi bạn có thể cần giải thích một dòng mã cụ thể. Nếu bạn đặt tên cho biến của bạn một cái gì đó mô tả, thì rất có thể bạn đã giành được một bình luận.

Nhận xét, bạn sẽ nghe thấy thuật ngữ bình luận về mã khá thường xuyên. Đây là thực tiễn thêm biểu tượng # vào đầu mã của bạn. Điều này sẽ vô hiệu hóa mã của bạn một cách hiệu quả. Ví dụ: bạn có thể có dòng mã này: 1 number_of_people = 10

Nếu bạn muốn nhận xét nó, bạn có thể làm như sau: 1 # number_of_people = 10

Bạn nhận xét mã khi bạn đang thử các giải pháp khác nhau hoặc khi bạn gỡ lỗi mã của mình, nhưng bạn không muốn xóa mã. Python sẽ bỏ qua mã được nhận xét, cho phép bạn thử một cái gì đó khác. Hầu hết các trình chỉnh sửa mã Python [và trình chỉnh sửa văn bản] cung cấp một cách để làm nổi bật nhiều dòng mã và nhận xét hoặc giải phóng toàn bộ khối mã.

Nhận xét đa dòng Một số ngôn ngữ lập trình, chẳng hạn như C ++, cung cấp khả năng tạo các nhận xét đa dòng. Hướng dẫn theo phong cách Python [PEP8] nói rằng dấu hiệu pound được ưa thích. Tuy nhiên, bạn có thể sử dụng các chuỗi trích dẫn ba như một nhận xét đa dòng. Đây là một ví dụ: 1 2 3 4

>>> '' 'Đây là một nhận xét đa dòng' '' >>> "" "Đây cũng là một nhận xét đa dòng" ""

Khi bạn tạo chuỗi ba trích dẫn, bạn có thể tạo ra một tài liệu. Hãy để tìm hiểu những gì Docstrings là gì và làm thế nào bạn có thể sử dụng chúng!

Tìm hiểu về Docstrings Python có khái niệm về đề xuất tăng cường PEP, hoặc Python. Những PEP này là những gợi ý hoặc các tính năng mới cho ngôn ngữ Python được thảo luận và thỏa thuận bởi Hội đồng lái Python. PEP 257 [//www.python.org/dev/peps/pep-0257/] mô tả các quy ước DocString. Bạn có thể đọc rằng nếu bạn thích câu chuyện đầy đủ. Đủ để nói, một DocString là một chuỗi theo nghĩa đen sẽ xảy ra như là câu lệnh đầu tiên trong một mô -đun, hàm, lớp hoặc định nghĩa phương thức. Bạn không cần phải hiểu tất cả các điều khoản này ngay bây giờ. Trên thực tế, bạn sẽ tìm hiểu thêm về chúng sau này trong cuốn sách này. Một DocString được tạo ra bằng cách sử dụng các trích dẫn gấp đôi. Đây là một ví dụ: 1 2 3 4

"" "Đây là một tài liệu với nhiều dòng" ""

Docstrings bị bỏ qua bởi Python. Họ không thể được thực hiện. Tuy nhiên, khi bạn sử dụng DocString làm câu lệnh đầu tiên của một mô -đun, hàm, v.v., DocString sẽ trở thành một thuộc tính đặc biệt có thể được truy cập thông qua __doc__. Bạn sẽ tìm hiểu thêm về các thuộc tính và tài liệu trong chương về các lớp. Docstrings có thể được sử dụng cho một lớp lót hoặc cho các chuỗi nhiều dòng. Dưới đây là một ví dụ về một lớp lót: 1 "" "Đây là một lớp" "" "

Một tài liệu một lớp lót chỉ đơn giản là một tài liệu chỉ có một dòng văn bản. Dưới đây là một ví dụ về một tài liệu được sử dụng trong một hàm: 1 def my_function []: 2 "" "Đây là tài liệu của hàm" "" 3 Pass

Mã trên cho thấy cách bạn có thể thêm một tài liệu vào một hàm. Bạn có thể tìm hiểu thêm về các chức năng trong Chương 14. Một tài liệu tốt mô tả những gì chức năng được cho là để thực hiện. Lưu ý: Mặc dù các trình điều khiển kép ba là tiêu chuẩn được đề xuất, các trình điều khiển đơn ba, bảng điều khiển đơn và các tài liệu đơn lẻ cũng hoạt động [nhưng các trình điều khiển đơn kép và đơn chỉ có thể chứa một dòng, không phải là nhiều dòng ]. Bây giờ, hãy để tìm hiểu về mã hóa theo hướng dẫn phong cách Python.

Hướng dẫn theo phong cách Python: PEP8 Hướng dẫn phong cách là một tài liệu mô tả các thực tiễn lập trình tốt, thường liên quan đến một ngôn ngữ duy nhất. Một số công ty có hướng dẫn phong cách cụ thể cho công ty rằng các nhà phát triển phải tuân theo bất kể họ đang sử dụng ngôn ngữ lập trình nào. Trở lại năm 2001, Hướng dẫn kiểu Python được tạo dưới dạng PEP8 [//www.python.org/dev/peps/pep-0008/]. Nó ghi lại các quy ước mã hóa cho ngôn ngữ lập trình Python và đã được cập nhật nhiều lần trong nhiều năm. Nếu bạn có kế hoạch sử dụng Python rất nhiều, bạn thực sự nên kiểm tra hướng dẫn. Nó sẽ giúp bạn viết mã Python tốt hơn. Ngoài ra, nếu bạn muốn đóng góp cho chính ngôn ngữ Python, tất cả mã của bạn phải tuân thủ các hướng dẫn kiểu hoặc mã của bạn sẽ bị từ chối. Thực hiện theo hướng dẫn kiểu sẽ làm cho mã của bạn dễ đọc và hiểu hơn. Điều này sẽ giúp bạn và bất kỳ ai khác sử dụng mã của bạn trong tương lai. Ghi nhớ tất cả các quy tắc có thể khó, mặc dù. May mắn thay, một số nhà phát triển Intrepid đã tạo ra một số tiện ích có thể giúp đỡ!

Các công cụ có thể giúp có rất nhiều công cụ gọn gàng mà bạn có thể sử dụng để giúp bạn viết mã tuyệt vời. Đây chỉ là một vài: pycodestyle - //pypi.org/project/pycodestyle/ - kiểm tra xem mã của bạn có tuân theo pep8 pylint - //www.pylint.org/ - Các vấn đề phổ biến với mã pyflakes - //pypi.org/project/pyflakes/ - một công cụ kiểm tra mã tĩnh khác cho python flake8 - //pypi.org/project Script Black - //black.readthedocs.io/en/stable/ - Một định dạng mã chủ yếu theo PEP8, bạn có thể chạy các công cụ này so với mã của mình để giúp bạn tìm thấy sự cố với mã của mình. Tôi đã tìm thấy pylint và pyflakes / flake8 là hữu ích nhất. Black rất hữu ích nếu bạn đang làm việc trong một nhóm và bạn muốn mọi người mã hóa theo cùng một định dạng. Màu đen có thể được thêm vào công cụ của bạn để định dạng mã của bạn cho bạn. Các ID Python tiên tiến hơn cung cấp một số séc mà pylint, vv cung cấp trong thời gian thực. Ví dụ, Pycharm sẽ tự động kiểm tra rất nhiều vấn đề mà các công cụ này sẽ tìm thấy. Mã Wingide và VS cũng cung cấp một số kiểm tra mã tĩnh. Bạn nên kiểm tra các IDE khác nhau và xem cái nào hoạt động tốt nhất cho bạn.

Kết thúc Python đi kèm với một số cách khác nhau để ghi lại mã của bạn. Bạn có thể sử dụng nhận xét để giải thích một hoặc nhiều dòng mã. Chúng nên được sử dụng trong chừng mực và khi thích hợp. Bạn cũng có thể sử dụng DocStrings để ghi lại các mô -đun, chức năng, phương thức và lớp học của mình. Bạn cũng nên kiểm tra hướng dẫn phong cách Python có thể tìm thấy trong PEP8. Điều này sẽ giúp bạn phát triển các hoạt động mã hóa Python tốt. Có một số hướng dẫn phong cách khác cho Python. Ví dụ: bạn có thể muốn tìm kiếm hướng dẫn kiểu Google Google hoặc có thể là hướng dẫn theo phong cách Python Numpy. Đôi khi nhìn vào các hướng dẫn phong cách khác nhau cũng sẽ giúp bạn phát triển các thực tiễn tốt. Cuối cùng, bạn đã tìm hiểu về một số công cụ bạn có thể sử dụng để giúp bạn làm cho mã của mình tốt hơn. Nếu bạn có thời gian, tôi khuyến khích bạn kiểm tra Pyflakes hoặc Flake8, đặc biệt là vì chúng có thể khá hữu ích trong việc chỉ ra các vấn đề mã hóa phổ biến trong mã của bạn.

Xem lại câu hỏi 1. Làm thế nào để bạn tạo một bình luận? 2. Bạn sử dụng một DocString để làm gì? 3. Hướng dẫn phong cách Python là gì? 4. Tại sao ghi lại mã của bạn quan trọng?

Chương 4 - Làm việc với các chuỗi bạn sẽ sử dụng chuỗi rất thường xuyên khi bạn lập trình. Một chuỗi là một loạt các chữ cái được bao quanh bởi các trích dẫn đơn, đôi hoặc ba. Python 3 định nghĩa chuỗi là một chuỗi văn bản của loại. Bạn có thể chuyển các loại khác vào một chuỗi bằng cách sử dụng hàm str [] tích hợp. Trong chương này, bạn sẽ tìm hiểu cách: Tạo chuỗi Chuỗi Chuỗi Chuỗi định dạng chuỗi nối chuỗi chuỗi Cắt chuỗi Hãy bắt đầu bằng cách tìm hiểu các cách khác nhau để tạo chuỗi!

Tạo chuỗi Dưới đây là một số ví dụ về việc tạo chuỗi: 1 2 3 4 5

name = 'mike' first_name = 'mike' last_name = "driscoll" ba = "" "chuỗi đa dòng" "" "

Khi bạn sử dụng trích dẫn ba, bạn có thể sử dụng ba dấu ngoặc kép ở đầu và cuối chuỗi hoặc ba trích dẫn đơn. Ngoài ra, lưu ý rằng sử dụng Triple Trích dẫn cho phép bạn tạo chuỗi nhiều dòng. Bất kỳ khoảng trắng nào trong chuỗi cũng sẽ được bao gồm. Dưới đây là một ví dụ về việc chuyển đổi một số nguyên thành chuỗi: 1 >>> số = 5 2 >>> str [số] 3 '5'

Trong Python, dấu gạch chéo ngược có thể được sử dụng để tạo ra các chuỗi thoát. Đây là một vài ví dụ: \ b \ n \ r \ t

- Backspace - Line Feed - ASCII vận chuyển trở lại - tab

Có một số người khác mà bạn có thể tìm hiểu nếu bạn đọc tài liệu Python. Bạn cũng có thể sử dụng dấu gạch chéo ngược để thoát khỏi trích dẫn: 1 >>> 'Chuỗi này có một trích dẫn duy nhất, \', ở giữa '2 "Chuỗi này có một trích dẫn duy nhất,', ở giữa"

Nếu bạn không có dấu gạch chéo ngược trong mã ở trên, bạn sẽ nhận được cú pháp: 1 >>> 'Chuỗi này có một trích dẫn duy nhất,', ở giữa '2 Traceback [cuộc gọi gần đây nhất]:

3 Python Shell, Nhắc 59, dòng 1 4 Cú pháp không hợp lệ:, dòng 1, POS 38

Điều này xảy ra vì chuỗi kết thúc ở một trích dẫn thứ hai đó. Thường tốt hơn để trộn các trích dẫn kép và đơn để giải quyết vấn đề này: 1 >>> "Chuỗi này có một trích dẫn duy nhất ', ở giữa" 2 "chuỗi này có một trích dẫn duy nhất,', ở giữa"

Trong trường hợp này, bạn tạo chuỗi bằng cách sử dụng trích dẫn kép và đặt một trích dẫn duy nhất bên trong nó. Điều này đặc biệt hữu ích khi làm việc với các cơn co thắt, chẳng hạn như Don Don, thì có thể, v.v.

Các phương thức chuỗi trong Python, mọi thứ đều là một đối tượng. Bạn sẽ tìm hiểu làm thế nào hữu ích điều này có thể trong Chương 18 khi bạn tìm hiểu về hướng nội. Hiện tại, chỉ cần biết rằng các chuỗi có các phương thức [hoặc chức năng] mà bạn có thể gọi chúng. Dưới đây là ba ví dụ: 1 2 3 4 5 6 7

>>> Tên = 'Mike' >>> Tên.

Các tên phương pháp cung cấp cho bạn một manh mối về những gì họ làm. Ví dụ: .Capitalize [] sẽ thay đổi chữ cái đầu tiên trong chuỗi thành chữ cái viết hoa. Để có được danh sách đầy đủ các phương thức và thuộc tính mà bạn có thể truy cập, bạn có thể sử dụng hàm dir [] tích hợp của Python: 1 >>> DIR [tên] 2 ['__add__', '__ class__', '__contains__', ' __delattr__ ',' __dir__ ',' __doc__ ', 3' __eq__ ',' __format__ ',' __ge__ ',' __getAttribut __init_subclass__ ', 5' __iter__ ',' __le__ ',' __len__ ',' __lt__ ',' __mod__ ',' __mul__ ',' __ne__ ', 6' __rmod__ ',' __rmul__ ', 7' __setattr__ ',' __sizeof__ ',' __str__ ',' expandtabs ',' find ', 9' format ',' format_map ',' index ',' isalnum ',' isalpha ',' isascii ',' isdecimal ', 10' isdigit ',' isidentifier ',' isLower ',' isnumeric ',' isprintable ',' isspace ', 11' istitle ',' isupper ',' tham gia ',' ljust ',' thấp hơn ',' lstrip ',' maketrans ', 12' phân vùng ',' thay thế ',' rfind ',' rindex ',' rjust ',' rpartition ',' rsplit ', 13' rstrip ',' s plit ',' splitlines ',' startswith ',' dải ',' hoán đổi ',' tiêu đề ', 14' dịch ',' trên ',' zfill ']]]]]]

Phần ba đầu tiên của danh sách là các phương pháp đặc biệt đôi khi được gọi là Phương thức Dunder Dunder [hay còn gọi là các phương thức kép xua tan] hoặc phương pháp ma thuật của Hồi giáo. Bạn có thể bỏ qua những điều này ngay bây giờ vì chúng được sử dụng nhiều hơn cho các trường hợp sử dụng trung gian và nâng cao. Các mục trong danh sách ở trên mà don lồng có DoubleUnderscores lúc đầu là những mục mà bạn có thể sẽ sử dụng nhiều nhất.

Bạn sẽ thấy rằng các phương thức .Strip [] và .split [] đặc biệt hữu ích khi phân tích cú pháp hoặc thao tác văn bản. Bạn có thể sử dụng .Strip [] và các biến thể của nó, .rstrip [] và .lstrip [] để loại bỏ khoảng trắng từ chuỗi, bao gồm các ký tự line và tab mới. Điều này đặc biệt hữu ích khi bạn đang đọc trong một tệp văn bản mà bạn cần phân tích. Trên thực tế, bạn thường sẽ loại bỏ các ký tự cuối dòng từ các chuỗi và sau đó sử dụng .Split [] về kết quả để phân tích các chuỗi phụ. Hãy cùng làm một bài tập nhỏ, nơi bạn sẽ học cách phân tích từ thứ 2 trong một chuỗi. Để bắt đầu, ở đây, một chuỗi: 1 >>> My_String = 'Đây là một chuỗi các từ' 2 'Đây là một chuỗi các từ'

Bây giờ để có được các phần của chuỗi, bạn có thể gọi. , 'từ ngữ']

Kết quả là một danh sách các chuỗi. Bây giờ thông thường bạn sẽ gán kết quả này cho một biến, nhưng với mục đích trình diễn, bạn có thể bỏ qua phần đó. Thay vào đó, vì bây giờ bạn biết rằng kết quả là một chuỗi, bạn có thể sử dụng lập chỉ mục danh sách để có được phần tử thứ hai: 1 >>> 'Đây là một chuỗi các từ'.split [] [1] 2' là ''

Hãy nhớ rằng, trong Python, liệt kê các phần tử bắt đầu ở 0 [không], vì vậy khi bạn nói với nó, bạn muốn phần tử 1 [một], đó là phần tử thứ hai trong danh sách. Khi thực hiện phân tích cú pháp chuỗi cho công việc, cá nhân tôi đã thấy rằng bạn có thể sử dụng các phương thức .Strip [] và .split [] khá hiệu quả để có được hầu hết mọi dữ liệu bạn cần. Thỉnh thoảng bạn sẽ thấy rằng bạn cũng có thể cần

Sử dụng các biểu thức chính quy [regex], nhưng hầu hết thời gian hai phương pháp này là đủ.

Định dạng chuỗi định dạng chuỗi hoặc thay thế chuỗi là nơi bạn có một chuỗi mà bạn muốn chèn vào một chuỗi khác. Điều này đặc biệt hữu ích khi bạn cần tạo một mẫu, chẳng hạn như một chữ cái mẫu. Nhưng bạn sẽ sử dụng thay thế chuỗi rất nhiều để gỡ lỗi đầu ra, in ra tiêu chuẩn và nhiều hơn nữa. Tiêu chuẩn [hoặc stdout] là một thuật ngữ được sử dụng để in vào thiết bị đầu cuối. Khi bạn chạy chương trình của mình từ thiết bị đầu cuối và bạn sẽ thấy đầu ra từ chương trình của mình, đó là do chương trình của bạn in ra vào tiêu chuẩn hoặc lỗi tiêu chuẩn [STDERR]. Python có ba cách khác nhau để thực hiện định dạng chuỗi: Sử dụng phương thức % bằng cách sử dụng .format [] bằng cách sử dụng các chuỗi chuỗi được định dạng [f-strings] Cuốn sách này sẽ tập trung vào các chuỗi F nhiều nhất và cũng sử dụng .format [] thời gian. Nhưng thật tốt khi hiểu làm thế nào cả ba hoạt động. Hãy để một vài khoảnh khắc để tìm hiểu thêm về định dạng chuỗi.

Các chuỗi định dạng bằng cách sử dụng % s [kiểu printf] bằng phương pháp % là phương thức định dạng chuỗi lâu đời nhất của Python. Đôi khi nó được gọi là định dạng chuỗi kiểu printf. Nếu bạn đã sử dụng C hoặc C ++ trong quá khứ, thì bạn có thể đã quen thuộc với loại thay thế chuỗi này. Đối với sự ngắn gọn, bạn sẽ tìm hiểu những điều cơ bản của việc sử dụng % ở đây. Lưu ý: Loại định dạng này có thể được làm việc kỳ quặc và đã được biết là dẫn đến các lỗi phổ biến như không hiển thị chính xác các bộ dữ liệu python và từ điển. Sử dụng một trong hai phương pháp khác được ưa thích trong trường hợp đó. Việc sử dụng phổ biến nhất khi sử dụng dấu hiệu % là khi bạn sử dụng % s, có nghĩa là chuyển đổi bất kỳ đối tượng Python nào thành chuỗi bằng cách sử dụng str []. Đây là một ví dụ: 1 >>> Tên = 'Mike' 2 >>> In ['Tên tôi là % S' % Tên] 3 Tên tôi là Mike

Trong mã này, bạn lấy tên biến và chèn nó vào một chuỗi khác bằng cú pháp %s đặc biệt. Để làm cho nó hoạt động, bạn cần sử dụng % bên ngoài chuỗi theo sau là chuỗi hoặc biến mà bạn muốn chèn. Dưới đây là một ví dụ thứ hai cho thấy rằng bạn có thể chuyển trong INT thành một chuỗi và tự động chuyển đổi cho bạn: 1 >>> Tuổi = 18 2 >>> In ['Bạn phải có ít nhất %s để tiếp tục' % tuổi] 3 bạn phải ít nhất 18 tuổi để tiếp tục

Loại điều này đặc biệt hữu ích khi bạn cần chuyển đổi một đối tượng nhưng không biết đó là loại nào. Bạn cũng có thể thực hiện định dạng chuỗi với nhiều biến. Trong thực tế, có hai cách để làm điều này. Ở đây, người đầu tiên:

1 2 3 4

>>> Tên = 'Mike' >>> Tuổi = 18 >>> In ['Xin chào %s. Bạn phải ít nhất %tôi tiếp tục!' %[tên, tuổi]] Xin chào Mike. Bạn phải ít nhất 18 tuổi để tiếp tục!

Trong ví dụ này, bạn tạo hai biến và sử dụng %s và %i. %Tôi chỉ ra rằng bạn sẽ vượt qua một số nguyên. Để vượt qua trong nhiều mục, bạn sử dụng dấu hiệu phần trăm theo sau là một bộ phận của các mục để chèn. Bạn có thể làm cho điều này rõ ràng hơn bằng cách sử dụng tên, như thế này: 1 >>> in ['Xin chào %[First_name] s. Bạn phải ít nhất là %[tuổi] Tôi tiếp tục!' 2 %{'First_name': Tên, ' Tuổi ': Tuổi}] 3 Xin chào Mike. Bạn phải ít nhất 18 tuổi để tiếp tục!

Khi đối số ở phía bên phải của dấu hiệu % là từ điển [hoặc loại ánh xạ khác], thì các định dạng dấu ngoặc trong chuỗi phải tham khảo các khóa trong từ điển. Nói cách khác, nếu bạn thấy % [tên] s, thì từ điển ở bên phải của % phải có khóa tên. Nếu bạn không bao gồm tất cả các khóa được yêu cầu, bạn sẽ nhận được lỗi: 1 >>> in ['Xin chào %[First_name] s. Bạn phải ít nhất là %[tuổi] Tôi tiếp tục!' 2 %{' Tuổi ': Tuổi}] 3 Traceback [cuộc gọi gần đây nhất cuối cùng]: 4 Python Shell, Nhắc 23, dòng 1 5 KeyError:' First_name '

Để biết thêm thông tin về việc sử dụng định dạng chuỗi kiểu printf, bạn sẽ thấy liên kết sau: //docs.python.org/3/l Library Phương thức định dạng [].

Các chuỗi định dạng sử dụng chuỗi python .format [] đã hỗ trợ phương thức .format [] trong một thời gian dài. Mặc dù cuốn sách này sẽ tập trung vào việc sử dụng F-String, bạn sẽ thấy .format [] vẫn còn khá phổ biến. Để biết chi tiết đầy đủ về cách thức hoạt động của định dạng, hãy xem phần sau: //docs.python.org/3/l Library/String.html#formatstrings Hãy xem một vài ví dụ ngắn để xem cách thức .format [] hoạt động: 1 2 3 4 5

>>> Tuổi = 18 >>> Tên = 'Mike' >>> In ['Xin chào {}. Bạn phải ít nhất {} để tiếp tục!'. Định dạng [tên, tuổi]] Xin chào Mike. Bạn phải ít nhất 18 tuổi để tiếp tục!

Ví dụ này sử dụng các đối số vị trí. Python tìm kiếm hai trường hợp {} và sẽ chèn các biến tương ứng. Nếu bạn không vượt qua đủ đối số, bạn sẽ nhận được một lỗi như thế này: 1 >>> in ['Xin chào {}. Bạn phải ít nhất {} để tiếp tục!'. Định dạng [2 tuổi]] 3 TraceBack [hầu hết Cuộc gọi gần đây cuối cùng]: 4 Python Shell, Nhắc 33, dòng 1 5 IndexError: Tuple Index ra khỏi phạm vi

Lỗi này cho biết bạn không có đủ mục bên trong cuộc gọi .format []. Bạn cũng có thể sử dụng các đối số được đặt tên theo cách tương tự với phần trước: 1 >>> Age = 18 2 >>> Tên = 'Mike' 3 >>> in ['Xin chào {First_name}. Bạn phải ít nhất {tuổi } Để tiếp tục! '. Định dạng [4 first_name = name, tuổi = tuổi]] 5 Xin chào Mike. Bạn phải ít nhất 18 tuổi để tiếp tục!

Thay vì chuyển một từ điển cho .format [], bạn có thể truyền trong các tham số theo tên. Trên thực tế, nếu bạn cố gắng vượt qua từ điển, bạn sẽ nhận được một lỗi:

1 >>> in ['Xin chào {first_name}. Bạn phải ít nhất {Age} để tiếp tục!'. Định dạng [2 {'first_name': name, 'Age': Age}]] ]: 4 Python Shell, Nhắc 34, dòng 1 5 KeyError: 'First_name'

Có một cách giải quyết cho điều này mặc dù: 1 >>> in ['Xin chào }]] 3 Xin chào Mike. Bạn phải ít nhất 18 tuổi để tiếp tục!

Điều này có vẻ hơi kỳ lạ, nhưng trong Python khi bạn nhìn thấy dấu hoa thị đôi [**] được sử dụng như thế này, điều đó có nghĩa là bạn đang chuyển các tham số được đặt tên cho hàm. Vì vậy, Python đang chuyển đổi từ điển thành first_name = name, tuổi = tuổi cho bạn. Bạn cũng có thể lặp lại một biến nhiều lần trong chuỗi khi sử dụng .format []: 1 >>> first_name = 'mike' 2 >>> in ['xin chào {first_name}. Tại sao họ gọi bạn là {first_name}?'. Định dạng [3 first_name = first_name]] 4 Xin chào Mike. Tại sao họ gọi bạn là Mike?

Ở đây bạn tham khảo {first_name} hai lần trong chuỗi và python thay thế cả hai bằng biến First_name. Nếu bạn muốn, bạn cũng có thể nội suy các giá trị bằng số: 1 >>> in ['Xin chào {1}. Bạn phải ít nhất {0} để tiếp tục!'. Định dạng [2 First_name, Age]] 3 Xin chào 18. Bạn Phải ít nhất là Mike để tiếp tục!

Bởi vì hầu hết mọi thứ trong Python bắt đầu ở 0 [0], trong ví dụ này, bạn đã kết thúc việc chuyển tuổi sang {1} và tên thành {0}. Một kiểu mã hóa phổ biến khi làm việc với .format [] là tạo một chuỗi được định dạng và lưu nó vào một biến sẽ được sử dụng sau: 1 >>> tuổi = 18 2 >>> first_name = 'mike' 3 >>> lời chào = 'Xin chào {first_name}. Bạn phải ít nhất {Age} để tiếp tục! '

4 >>> lời chào.format [first_name = first_name, tuổi = tuổi] 5 'Xin chào mike. Bạn phải ít nhất 18 tuổi để tiếp tục! '

Điều này cho phép bạn sử dụng lại lời chào và vượt qua các giá trị được cập nhật cho First_name và tuổi sau này trong chương trình của bạn. Bạn cũng có thể chỉ định chiều rộng chuỗi và căn chỉnh: 1 2 3 4 5 6

>>> '{: 20}'. Định dạng ['Đúng phải']

Căn chỉnh trái là mặc định. Đại tá [:] nói với Python rằng bạn sẽ áp dụng một số loại định dạng. Trong ví dụ đầu tiên, bạn đang chỉ định rằng chuỗi được căn chỉnh và rộng 20 ký tự. Ví dụ thứ hai cũng rộng 20 ký tự, nhưng nó được căn chỉnh đúng. Cuối cùng, ^ bảo Python tập trung vào chuỗi trong 20 ký tự. Nếu bạn muốn truyền trong một biến như trong các ví dụ trước, đây là cách bạn sẽ làm điều đó: 1 >>> '{Ví dụ:^20}'. Định dạng [ví dụ = 'Centraled']

Lưu ý rằng ví dụ phải đến trước: bên trong {}. Tại thời điểm này, bạn nên khá quen thuộc với cách thức hoạt động của .format []. Hãy để đi trước và di chuyển đến F-String!

Các chuỗi định dạng với các chuỗi F được định dạng theo nghĩa đen hoặc các chuỗi F là các chuỗi có một F F F FIG ở đầu và niềng răng xoăn bên trong chúng có chứa các biểu thức, giống như những biểu thức bạn đã thấy trong phần trước. Các biểu thức này cho biết fstring về bất kỳ quá trình xử lý đặc biệt nào cần phải được thực hiện cho chuỗi được chèn, chẳng hạn như biện minh, độ chính xác nổi, v.v., chuỗi F đã được thêm vào Python 3.6. Bạn có thể đọc thêm về nó và cách nó hoạt động bằng cách kiểm tra PEP 498 tại đây: //www.python.org/dev/peps/pep-0498/ Hãy để tiếp tục và xem xét một ví dụ đơn giản: 1 2 3 4

>>> Tên = 'Mike' >>> Age = 20 >>> F'Hello {name}. Bạn là {tuổi} tuổi '' Xin chào Mike. Bạn 20 tuổi '

Tại đây, bạn tạo chuỗi F bằng cách đặt một F F ngay trước khi trích dẫn đơn, gấp đôi hoặc ba bắt đầu chuỗi của bạn. Sau đó, bên trong chuỗi, bạn sử dụng niềng răng xoăn, {}, để chèn các biến vào chuỗi của bạn. Tuy nhiên, niềng răng xoăn của bạn phải kèm theo một cái gì đó. Nếu bạn tạo FSTRING với Niềng răng trống, bạn sẽ gặp lỗi: 1 >>> F'Hello {}. Bạn là {} tuổi '2 cú pháp

Tuy nhiên, chuỗi F có thể làm những việc mà %s và .format [] không thể làm được. Do thực tế là các chuỗi F được đánh giá trong thời gian chạy, bạn có thể đặt bất kỳ biểu thức python hợp lệ nào bên trong chúng. Ví dụ: bạn có thể tăng giá trị hiển thị của biến tuổi: 1 >>> Tuổi = 20 2 >>> f '{Age+2}' 3 '22'

Hoặc gọi một phương thức hoặc chức năng:

1 >>> name = 'mike' 2 >>> f '{name.lower []}' 3 'mike'

Bạn cũng có thể truy cập các giá trị từ điển trực tiếp bên trong một chuỗi f: 1 >>> sample_dict = {'name': 'tom', 'tuổi': 40} 2 >>> f'hello {sample_dict ["name"]} . Bạn là {sample_dict ["tuổi"]} tuổi '3' xin chào Tom. Bạn 40 tuổi '

Tuy nhiên, các dấu gạch chéo ngược không được phép trong các biểu thức f-string: 1 >>> in [tên f'my là {name \ n} '] 2 Cú pháp

Nhưng bạn có thể sử dụng dấu gạch chéo ngược bên ngoài biểu thức trong một chuỗi f: 1 >>> name = 'mike' 2 >>> in [tên f'my là {name} \ n '] 3 Tên tôi là Mike

Một điều khác mà bạn không thể làm là thêm bình luận bên trong biểu thức trong chuỗi f: 1 >>> tên f'my là {tên # tên của người} '2 cú pháp '#'

Trong Python 3.8, các chuỗi F đã thêm hỗ trợ cho =, sẽ mở rộng văn bản của biểu thức để bao gồm văn bản của biểu thức cộng với dấu bằng và sau đó biểu thức được đánh giá. Nghe có vẻ phức tạp, vì vậy hãy để Lôi nhìn vào một ví dụ: 1 >>> tên người dùng = 'jdoe' 2 >>> f'your {username =} '3 "tên người dùng của bạn =' jdoe '"

Ví dụ này chứng minh rằng văn bản bên trong biểu thức, tên người dùng = được thêm vào đầu ra theo sau là giá trị thực của tên người dùng trong trích dẫn. F-Strings rất mạnh mẽ và cực kỳ hữu ích. Họ sẽ đơn giản hóa mã của bạn khá nhiều nếu bạn sử dụng chúng một cách khôn ngoan. Bạn chắc chắn nên thử họ.

Hãy cùng tìm hiểu những gì bạn có thể làm với chuỗi!

Các chuỗi nối dây cũng cho phép nối, đây là một từ lạ mắt để tham gia hai chuỗi thành một. Để nối các chuỗi với nhau, bạn có thể sử dụng dấu +: 1 2 3 4

>>>> >>> >>> 'của tôi

First_String = 'Tên tôi là' Second_String = 'Mike' First_String + Second_String Tên Ismike '

Ối! Có vẻ như các chuỗi được hợp nhất theo một cách kỳ lạ vì bạn quên thêm một khoảng trống vào cuối First_String. Bạn có thể thay đổi nó như thế này: 1 2 3 4

>>>> >>> >>> 'của tôi

First_String = 'Tên tôi là' Second_String = 'Mike' First_String + Second_String Tên Ismike '

Ối! Có vẻ như các chuỗi được hợp nhất theo một cách kỳ lạ vì bạn quên thêm một khoảng trống vào cuối First_String. Bạn có thể thay đổi nó như thế này: 1 2 3 4

>>>> >>> >>> 'của tôi

First_String = 'Tên tôi là' Second_String = 'Mike' First_String + Second_String Tên Ismike '

Ối! Có vẻ như các chuỗi được hợp nhất theo một cách kỳ lạ vì bạn quên thêm một khoảng trống vào cuối First_String. Bạn có thể thay đổi nó như thế này: 1 2 3 4

First_String = 'Tên tôi là' Second_String = 'Mike' First_String + Second_String Tên là Mike '

Một cách khác để hợp nhất chuỗi là sử dụng phương thức .Join []. Phương thức. 1 2 3 4

First_String = 'Tên tôi là' # Không có kết thúc không gian thứ hai_String = 'Mike' '' .Join [[First_String, Second_String]]

Điều này sẽ làm cho các chuỗi nối ngay cạnh nhau, giống như + đã làm. Tuy nhiên, bạn có thể đặt một cái gì đó bên trong chuỗi mà bạn đang sử dụng để tham gia và nó sẽ được chèn giữa mỗi chuỗi trong danh sách: 1 >>> ''. Chuỗi tham gia 2 'Tên tôi là Mike' 3 >>> '-'. Tham gia [[First_String, Second_String]] # một dấu gạch ngang trong chuỗi tham gia 4 'Tên tôi là-Mike'

Thường xuyên hơn không, bạn có thể sử dụng chuỗi F thay vì nối hoặc .join [] và mã sẽ dễ theo dõi hơn.

Chuỗi cắt lát cắt thành các chuỗi hoạt động theo cùng một cách giống như nó cho danh sách Python. Hãy cùng lấy chuỗi chuỗi Mike Mike. Chữ chữ M, ở vị trí 0 và chữ cái E E đang ở vị trí 3. Nếu bạn muốn lấy các ký tự 0-3, bạn sẽ sử dụng cú pháp này: My_String [0: 4]

Điều đó có nghĩa là bạn muốn bộ nền bắt đầu ở vị trí 0 lên đến nhưng không bao gồm vị trí 4. Dưới đây là một vài ví dụ: 1 2 3 4 5 6

>>> Tên = 'Mike' >>> Tuổi = 21 >>> In ['Xin chào %s! Bạn là %I tuổi.' %[Tên, Tuổi]] Xin chào Mike! Bạn 21 tuổi.

4. Làm thế nào để bạn kết hợp hai chuỗi này với nhau? 1 >>> First_String = 'Tên tôi là' 2 >>> Second_String = 'Mike'

5. Sử dụng cắt chuỗi để có được phần phụ

Chương 5 - Các loại số Python khác một chút so với một số ngôn ngữ ở chỗ nó chỉ có ba loại số tích hợp. Một loại dữ liệu tích hợp có nghĩa là bạn không phải làm bất cứ điều gì để sử dụng chúng ngoài việc gõ tên của họ. Các loại số tích hợp là: Int Float Complex

Python 2 cũng có loại số dài, đó là một số nguyên có thể đại diện cho các giá trị lớn hơn một int có thể. Trong Python 3, Int và Long được kết hợp để Python 3 chỉ có int. Bạn có thể tạo một int bằng cách nhập số hoặc bằng cách sử dụng int []. 2, 3, int [4] và int ["5"] đều là số nguyên. Nếu bạn quen thuộc với C ++, có lẽ bạn sẽ biết rằng các số điểm nổi được xác định bằng cách sử dụng từ khóa kép. Trong Python, bạn có thể tạo một chiếc phao bằng cách nhập nó hoặc bằng cách sử dụng float []. 3.14, 5.0, float [7.9] và float ["8.1"] đều là số điểm nổi. Một con số phức tạp có một phần thực và một phần tưởng tượng. Các phần thực và tưởng tượng được truy cập bằng ký hiệu thuộc tính: .real và .imag, tương ứng. Các số phức có thể được tạo bằng cách gõ chúng hoặc sử dụng phức tạp []. 2+1J, 2-1J, 5J, phức tạp [7+2J], phức tạp ["7+2J"] và phức tạp [7, 2] `đều là các số phức. Có hai loại số khác được bao gồm trong Python trong thư viện tiêu chuẩn của nó. Chúng là như sau: - để giữ các số điểm nổi cho phép người dùng xác định các phân số chính xác của họ - Số hợp lý

Bạn có thể nhập các thư viện này bằng cách sử dụng từ khóa nhập Python, mà bạn sẽ tìm hiểu trong Chương 16. Bạn cũng có thể quan tâm đến việc kiểm tra từ khóa Python tựa Round [] hoặc mô -đun toán học của nó. Hãy cùng tiếp tục và tìm hiểu thêm một chút về cách bạn có thể tạo và sử dụng các loại số trong Python!

Số nguyên Bạn có thể tạo một số nguyên theo hai cách trong Python. Cách phổ biến nhất là gán một số nguyên cho một biến: 1 my_integer = 3

Dấu hiệu bằng [=] là toán tử gán Python. Nó chỉ định giá trị bên phải với tên biến ở bên trái. Vì vậy, trong mã trên, bạn đang gán giá trị 3 cho biến my_integer. Cách khác để tạo số nguyên là sử dụng int có thể gọi được, như thế này: 1 my_integer = int [3]

Hầu hết thời gian, bạn đã giành được sử dụng int [] để tạo số nguyên. Trong thực tế, int [] thường được sử dụng để chuyển đổi một chuỗi hoặc loại khác thành số nguyên. Một thuật ngữ khác cho điều này là đúc. Một tính năng ít được biết đến về int [] là nó có một đối số thứ hai tùy chọn cho cơ sở trong đó đối số thứ nhất sẽ được giải thích. Nói cách khác, bạn có thể nói với Python để chuyển đổi sang base2, base8, base16, v.v. Đây là một ví dụ: 1 2 3 4

>>> int ['10 ', 2] 2 >>> int [' 101 ', 2] 5

Đối số đầu tiên phải là một chuỗi trong khi đối số thứ hai là cơ sở, trong trường hợp này là 2. Bây giờ, hãy để tiếp tục và tìm hiểu cách tạo một chiếc phao!

Phao một chiếc phao trong Python đề cập đến một số có một điểm thập phân trong đó. Ví dụ, 2.0 là một chiếc phao trong khi 2 là INT. Bạn có thể tạo một chiếc phao trong Python như thế này: 1 my_float = 2.0

Mã này sẽ gán số, 2.0, cho biến my_float. Bạn cũng có thể tạo một chiếc phao như thế này: 1 my_float = float [2.0]

Python sườn float [] tích hợp sẽ chuyển đổi một số nguyên hoặc thậm chí một chuỗi thành một float nếu nó có thể. Ở đây, một ví dụ về việc chuyển đổi một chuỗi thành một chiếc phao: 1 my_float = float ["2.0"]

Mã này chuyển đổi chuỗi, 2.0 2.0, thành một chiếc phao. Bạn cũng có thể đúc chuỗi hoặc phao nổi vào int bằng int [] tích hợp từ phần trước. Lưu ý: Loại số float là không chính xác và có thể khác nhau giữa các nền tảng. Bạn không nên sử dụng loại float khi xử lý các loại số nhạy cảm, chẳng hạn như giá trị tiền, do các vấn đề làm tròn. Thay vào đó, bạn nên sử dụng mô -đun thập phân Python.

Các số phức Một số phức có một phần thực và một phần tưởng tượng, mỗi số là một số điểm nổi. Chúng ta hãy xem một ví dụ với một đối tượng số phức được đặt tên comp để xem cách bạn có thể truy cập từng phần này bằng cách sử dụng comp.real và comp.imag để trích xuất các phần thực và tưởng tượng, tương ứng, từ số: 1 2 3 4 5 6 7

>>> comp = 1 + 2j >>> Loại [comp]

>>> comp.real 1.0 >>> comp.imag 2.0

Trong mẫu mã ở trên, bạn đã tạo một số phức. Để xác minh rằng đó là một số phức, bạn có thể sử dụng chức năng loại tích hợp Python trên biến. Sau đó, bạn trích xuất các bộ phận thực và hình ảnh từ số phức. Bạn cũng có thể sử dụng các cuộc gọi tích hợp phức tạp [] có thể gọi để tạo số phức: 1 >>> phức tạp [10, 12] 2 [10+12J]

Ở đây bạn đã tạo một số phức tạp trong trình thông dịch, nhưng bạn không gán kết quả cho một biến.

Các hoạt động số tất cả các loại số, ngoại trừ phức tạp, hỗ trợ một tập hợp các hoạt động số. Dưới đây là danh sách các hoạt động mà bạn có thể thực hiện: Hoạt động A +B A -B A*B A/B A // B A%B -A +A ABS [A] INT [A] FLOAT [X] .conjugate [] divmod [a, b] pow [a, b] a ** b

Kết quả tổng a và b chênh lệch a và b sản phẩm của a và b, chỉ số của a và b, chỉ số của a và b trong phần còn lại của a / b a phủ định [nhân với -1] một giá trị tuyệt đối không thay đổi của A A được chuyển đổi thành số nguyên A chuyển đổi thành số điểm nổi A Số phức với thực và tưởng tượng liên hợp của số phức C

Bạn nên kiểm tra tài liệu đầy đủ để biết thêm chi tiết về cách thức các loại số hoạt động [cuộn xuống phần các loại số]: //docs.python.org/3/l Library/stdtypes.html

Phân công tăng cường Python hỗ trợ thực hiện một số loại số học bằng cách sử dụng một khái niệm gọi là phân công tăng cường. Ý tưởng này lần đầu tiên được đề xuất trong PEP 203: //www.python.org/dev/peps/pep-0203/ cú pháp cho phép bạn thực hiện các hoạt động số học khác nhau bằng cách sử dụng các toán tử sau: += -= *=/= % = ** = = & = ^= | =

Cú pháp này là một lối tắt để thực hiện số học phổ biến trong Python. Với nó, bạn có thể thay thế mã sau: 1 2 3 4

>>> x = 1 >>> x = x + 2 >>> x 3

Với điều này: 1 2 3 4

>>> x = 1 >>> x += 2 >>> x 3

Mã này tương đương với ví dụ trước.

Kết thúc trong chương này, bạn đã học được những điều cơ bản của các loại số Python. Ở đây bạn đã học được một chút về cách Python xử lý Int, Float và các loại số phức. Bạn có thể sử dụng các loại này để làm việc với hầu hết các hoạt động liên quan đến số. Tuy nhiên, nếu bạn đang làm việc với các số điểm nổi cần chính xác, bạn sẽ muốn kiểm tra mô-đun thập phân Python. Nó được thiết kế riêng để làm việc với loại số đó.

Xem lại câu hỏi 1. Hỗ trợ Python 3 loại nào mà không cần nhập bất cứ thứ gì? 2. Bạn nên sử dụng mô -đun nào cho tiền hoặc các tính toán chính xác khác? 3. Cho một ví dụ về cách sử dụng nhiệm vụ tăng cường.

Chương 6 - Tìm hiểu về danh sách danh sách là một loại dữ liệu cơ bản trong ngôn ngữ lập trình Python. Danh sách là một chuỗi có thể thay đổi thường là một tập hợp các mục đồng nhất. Mutable có nghĩa là bạn có thể thay đổi một danh sách sau khi tạo ra nó. Bạn sẽ thường xuyên thấy các danh sách chứa các danh sách khác. Chúng được gọi là danh sách lồng nhau. Bạn cũng sẽ thấy các danh sách chứa tất cả các loại dữ liệu khác, chẳng hạn như từ điển, bộ dữ liệu và các đối tượng khác. Trong chương này, bạn sẽ tìm hiểu những điều sau: Tạo danh sách các phương thức Danh sách Danh sách cắt bỏ danh sách Sao chép Danh sách Hãy tìm hiểu cách bạn có thể tạo danh sách!

Tạo danh sách Có một số cách để tạo một danh sách. Bạn có thể xây dựng một danh sách theo bất kỳ cách nào sau: Sử dụng một cặp dấu ngoặc vuông không có gì bên trong tạo ra một danh sách trống: [] Sử dụng dấu ngoặc vuông với các mục được phân tách bằng dấu phẩy: [1, 2, 3] bằng cách sử dụng danh sách hiểu [xem Chương 13 để biết thêm thông tin]: [x cho x trong itable] Sử dụng hàm danh sách []: list [itable]

Một sự khác biệt là một tập hợp các mặt hàng có thể trả lại một thành viên của nó một lần; Một số vòng lặp có một thứ tự [tức là các chuỗi] và một số không. Danh sách bản thân là trình tự. Chuỗi là trình tự là tốt. Bạn có thể nghĩ về các chuỗi như một chuỗi các nhân vật. Hãy cùng xem một vài ví dụ về việc tạo một danh sách để bạn có thể thấy nó trong hành động: 1 >>> my_list = [1, 2, 3] 2 >>> my_list 3 [1, 2, 3]

Ví dụ đầu tiên này là khá đơn giản. Ở đây bạn tạo một danh sách với 3 số trong đó. Sau đó, bạn in nó ra để xác minh rằng nó chứa những gì bạn nghĩ nó nên. Cách tiếp theo để tạo danh sách là sử dụng chức năng danh sách tích hợp [] Python, 1 >>> list_of_strings = list ['abc'] 2 >>> list_of_strings 3 ['a', 'b', 'c']]

Trong trường hợp này, bạn chuyển một chuỗi ba chữ cái vào hàm danh sách []. Nó tự động lặp lại các ký tự trong chuỗi để tạo danh sách ba chuỗi, trong đó mỗi chuỗi là một ký tự. Ví dụ cuối cùng để xem xét là cách tạo danh sách trống:

1 2 3 4 5 6

>>> >>> [] >>> >>> []

clan

Cách nhanh nhất để tạo một danh sách trống là bằng cách sử dụng dấu ngoặc vuông mà không đặt bất cứ thứ gì bên trong chúng. Cách dễ nhất thứ hai là gọi Danh sách [] mà không có bất kỳ đối số nào. Điều tuyệt vời về việc sử dụng danh sách [] nói chung là bạn có thể sử dụng nó để chuyển một loại dữ liệu tương thích vào danh sách, như bạn đã làm với chuỗi ABC ABC trong ví dụ trước đó.

Liệt kê các phương pháp mà bạn đã học được về các phương pháp, nhưng điều quan trọng là phải bao gồm các phương pháp danh sách ngay bây giờ. Đừng lo. Bạn sẽ tìm hiểu thêm về các phương pháp trong suốt cuốn sách này và cuối cùng bạn sẽ hiểu chúng khá rõ! Danh sách Python có một số phương thức mà bạn có thể gọi. Một phương pháp cho phép bạn làm một cái gì đó vào danh sách. Dưới đây là danh sách các phương thức bạn có thể sử dụng với danh sách: append [] Cry [] copy [] Count [] extend [] index [] chèn [] pop [] remove [] lartic [] sort []

Hầu hết trong số này sẽ được đề cập trong các phần sau. Trước tiên, hãy nói về những người mà aren được bao phủ trong một phần cụ thể. Bạn có thể sử dụng Count [] để đếm số lượng phiên bản của đối tượng bạn đã chuyển vào. Đây là một ví dụ: 1 2 3 4 5

>>> my_list = list ['abcc'] >>> my_list.count ['a'] 1 >>> my_list.count ['c'] 2

Đây là một cách đơn giản để đếm số lần xuất hiện của một mục trong danh sách.

Phương thức Index [] rất hữu ích để tìm trường hợp đầu tiên của một mục trong danh sách: 1 2 3 4 5

>>> my_list = list ['abcc'] >>> my_list.index ['c'] 2 >>> my_list.index ['a'] 0

Danh sách Python không được lập chỉ mục, vì vậy, A A ở vị trí 0, B Biêu ở vị trí 1, v.v. Bạn có thể sử dụng phương thức đảo ngược [] để đảo ngược danh sách tại chỗ: 1 2 3 4

>>> my_list = list ['abcc'] >>> my_list.reverse [] >>> my_list ['c', 'c', 'b', 'a']]

Lưu ý rằng phương thức đảo ngược [] trả về không. Điều đó có nghĩa là nếu bạn cố gắng gán danh sách đảo ngược cho một biến mới, bạn có thể kết thúc với một cái gì đó bất ngờ: 1 >>> x = my_list.reverse [] 2 >>> in [x] 3 không

Ở đây bạn kết thúc với không có thay vì danh sách đảo ngược. Đó là những gì tại chỗ có nghĩa là. Danh sách ban đầu được đảo ngược, nhưng phương thức đảo ngược [] tự nó không trả lại bất cứ điều gì. Bây giờ, hãy để tìm hiểu những gì bạn có thể làm với các phương pháp danh sách khác!

Thêm vào danh sách Có ba phương thức danh sách mà bạn có thể sử dụng để thêm vào danh sách. Chúng là như sau: expend [] extend [] chèn []

Phương thức append [] sẽ thêm một mục vào cuối danh sách có sẵn:

1 2 3 4 5 6

>>> my_list = list ['abcc'] >>> my_list ['a', 'b', 'c', 'c'] >>> my_list.append [1] >>> my_list ['a', 'B', 'C', 'C', 1]

Đầu tiên bạn tạo một danh sách được tạo thành từ bốn chuỗi một ký tự. Sau đó, bạn nối một số nguyên vào cuối danh sách. Bây giờ danh sách nên có 5 mục trong đó với 1 ở cuối. Bạn có thể sử dụng chức năng Len [] tích hợp Python, để kiểm tra số lượng mục trong danh sách: 1 >>> len [my_list] 2 5

Vì vậy, điều này cho bạn biết rằng bạn thực tế có năm mục trong danh sách. Nhưng điều gì sẽ xảy ra nếu bạn muốn thêm một yếu tố ở đâu đó ngoài phần cuối của danh sách? Bạn có thể sử dụng chèn [] cho rằng: 1 >>> my_list.insert [0, 'đầu tiên'] 2 >>> my_list 3 ['first', 'a', 'b', 'c', 'c', 1]

Phương thức chèn [] lấy hai đối số: vị trí để chèn mục để chèn vào mã trên, bạn nói với Python rằng bạn muốn chèn chuỗi, đầu tiên, vào vị trí 0, là vị trí đầu tiên trong danh sách. Có hai cách khác để thêm các mục vào một danh sách. Bạn có thể thêm một số khác vào danh sách bằng cách sử dụng Extend []: 1 2 3 4 5

>>> >>> >>> >>> [1,

my_list = [1, 2, 3] other_list = [4, 5, 6] my_list.extend [other_list] my_list 2, 3, 4, 5, 6]

Ở đây bạn tạo hai danh sách. Sau đó, bạn sử dụng phương thức my_list mở rộng [] để thêm các mục trong other_list vào my_list. Phương thức mở rộng [] sẽ lặp lại các mục trong danh sách được thông qua và thêm từng mục vào danh sách. Bạn cũng có thể kết hợp các danh sách bằng cách sử dụng kết nối: 1 2 3 4 5

>>> >>> >>> >>> [1,

my_list = [1, 2, 3] other_list = [4, 5, 6] my_list.extend [other_list] my_list 2, 3, 4, 5, 6]

Ở đây bạn tạo hai danh sách. Sau đó, bạn sử dụng phương thức my_list mở rộng [] để thêm các mục trong other_list vào my_list. Phương thức mở rộng [] sẽ lặp lại các mục trong danh sách được thông qua và thêm từng mục vào danh sách. Bạn cũng có thể kết hợp các danh sách bằng cách sử dụng kết nối: 1 2 3 4 5

>>> >>> >>> >>> [1,

my_list = [1, 2, 3] other_list = [4, 5, 6] my_list.extend [other_list] my_list 2, 3, 4, 5, 6]

Ở đây bạn tạo hai danh sách. Sau đó, bạn sử dụng phương thức my_list mở rộng [] để thêm các mục trong other_list vào my_list. Phương thức mở rộng [] sẽ lặp lại các mục trong danh sách được thông qua và thêm từng mục vào danh sách. Bạn cũng có thể kết hợp các danh sách bằng cách sử dụng kết nối: 1 2 3 4 5

my_list = [1, 2, 3] other_list = [4, 5, 6] Kết hợp = my_list + other_list kết hợp 2, 3, 4, 5, 6]

Trong trường hợp này, bạn tạo hai danh sách và sau đó kết hợp chúng bằng toán tử Python, + +. Lưu ý rằng my_list và other_list không thay đổi. Bạn cũng có thể sử dụng += với danh sách Python: 1 2 3 4 5

my_list = [1, 2, 3] other_list = [4, 5, 6] my_list += other_list my_list 2, 3, 4, 5, 6]

Ví dụ này chứng minh rằng khi bạn vượt qua -1, bạn sẽ nhận được mục cuối cùng trong danh sách được trả về. Hãy thử sử dụng một số giá trị khác và xem bạn có thể nhận được mục đầu tiên bằng cách sử dụng lập chỉ mục âm không. Nếu bạn cố gắng sử dụng một chỉ mục không tồn tại trong danh sách, bạn sẽ nhận được một indexError: 1 2 3 4

>>> my_list [-5] Traceback [cuộc gọi gần đây nhất]

Bây giờ hãy để Lừa tìm hiểu về việc loại bỏ các mặt hàng!

Xóa khỏi danh sách xóa các mục khỏi danh sách là khá đơn giản. Có 4 phương thức chính để loại bỏ các mục khỏi danh sách: Clear [] pop [] Remove [] del

Bạn có thể sử dụng Clear [] để xóa mọi thứ khỏi danh sách. Hãy để xem cách hoạt động của nó: 1 2 3 4

>>> my_list = [7, 8, 9] >>> my_list.clear [] >>> my_list []

Sau khi gọi Clear [], danh sách hiện đang trống. Điều này có thể hữu ích khi bạn đã hoàn thành làm việc trên các mục trong danh sách và bạn cần bắt đầu lại từ đầu. Tất nhiên, bạn cũng có thể làm điều này thay vì rõ ràng []: 1 >> my_list = []

Điều này sẽ tạo ra một danh sách trống mới. Nếu điều quan trọng đối với bạn là luôn luôn sử dụng cùng một đối tượng, thì việc sử dụng Clear [] sẽ tốt hơn. Nếu điều đó không quan trọng, thì việc đặt nó thành một danh sách trống cũng sẽ hoạt động tốt. Nếu bạn muốn loại bỏ các mục riêng lẻ, thì bạn nên kiểm tra pop [] hoặc xóa []. Hãy bắt đầu với pop []: 1 2 3 4 5

>>> >>> 9 >>> [7,

my_list = [7, 8, 9] my_list.pop [] my_list 8]

Bạn có thể chuyển một chỉ mục cho pop [] để xóa mục bằng chỉ mục cụ thể đó và trả về nó. Hoặc bạn có thể gọi pop [] mà không có đối số, như trong ví dụ trên và nó sẽ mặc định xóa mục cuối cùng trong danh sách và trả về nó. pop [] là cách linh hoạt nhất để loại bỏ các mục khỏi danh sách. Nếu danh sách trống hoặc bạn vượt qua trong một chỉ mục không tồn tại, pop [] sẽ ném một ngoại lệ: 1 2 3 4

>>> my_list.pop [10] Traceback [cuộc gọi gần đây nhất]

Bây giờ, hãy để xem cách loại bỏ [] hoạt động: 1 2 3 4

>>> >>> >>> [7,

my_list = [7, 8, 9] my_list.remove [8] my_list 9]

sẽ xóa phiên bản đầu tiên của mục được thông qua trong mục. Vì vậy, trong trường hợp này, bạn nói với danh sách để xóa lần xuất hiện đầu tiên của số 8. Xóa []

Nếu bạn nói với Remove [] để xóa một mục không có trong danh sách, bạn sẽ nhận được một ngoại lệ: 1 2 3 4

>>> my_list.remove [4] Traceback [cuộc gọi gần đây nhất]

Bạn cũng có thể sử dụng từ khóa Del tích hợp Python, để xóa các mục khỏi danh sách: 1 2 3 4

>>> >>> >>> [7,

my_list = [7, 8, 9] my_list.remove [8] my_list 9]

sẽ xóa phiên bản đầu tiên của mục được thông qua trong mục. Vì vậy, trong trường hợp này, bạn nói với danh sách để xóa lần xuất hiện đầu tiên của số 8. Xóa []

Nếu bạn nói với Remove [] để xóa một mục không có trong danh sách, bạn sẽ nhận được một ngoại lệ: 1 2 3 4

>>> my_list.remove [4] Traceback [cuộc gọi gần đây nhất]

Bạn cũng có thể sử dụng từ khóa Del tích hợp Python, để xóa các mục khỏi danh sách: 1 2 3 4

my_list = [7, 8, 9] del my_list [1] my_list 9]

Bạn sẽ nhận được một lỗi nếu bạn cố gắng xóa một chỉ mục không tồn tại: 1 2 3 4 5

>>> my_list = [7, 8, 9] >>> del my_list [6] traceback [cuộc gọi gần đây nhất]

Bây giờ, hãy để tìm hiểu về việc sắp xếp một danh sách!

Sắp xếp một danh sách danh sách trong Python có thể được sắp xếp. Bạn có thể sử dụng phương thức Sắp xếp tích hợp [] để sắp xếp danh sách tại chỗ hoặc bạn có thể sử dụng hàm python đã sắp xếp [] để trả về một danh sách được sắp xếp mới. Hãy để tạo một danh sách và thử phân loại nó: 1 2 3 4

my_list = [7, 8, 9] del my_list [1] my_list 9]

Bạn sẽ nhận được một lỗi nếu bạn cố gắng xóa một chỉ mục không tồn tại: 1 2 3 4 5

>>> my_list = [7, 8, 9] >>> del my_list [6] traceback [cuộc gọi gần đây nhất]

Bây giờ, hãy để tìm hiểu về việc sắp xếp một danh sách!

Sắp xếp một danh sách danh sách trong Python có thể được sắp xếp. Bạn có thể sử dụng phương thức Sắp xếp tích hợp [] để sắp xếp danh sách tại chỗ hoặc bạn có thể sử dụng hàm python đã sắp xếp [] để trả về một danh sách được sắp xếp mới. Hãy để tạo một danh sách và thử phân loại nó: 1 2 3 4

>>> >>> >>> [1,

Đụ này trả về INDEX 1 [10] và INDEX 2 [2] làm danh sách mới. Bạn cũng có thể sử dụng các giá trị âm để lát: 1 >>> my_list = [4, 10, 2, 1, 23, 9] 2 >>> my_list [-2:] 3 [23, 9]

Trong ví dụ này, bạn đã không chỉ định giá trị cuối cùng. Điều đó có nghĩa là bạn muốn bắt đầu ở mục thứ hai đến mục cuối cùng trong danh sách, 23 và đưa nó đến cuối danh sách. Hãy thử thử một ví dụ khác trong đó bạn chỉ chỉ định chỉ số cuối: 1 >>> my_list = [4, 10, 2, 1, 23, 9] 2 >>> my_list [: 3] 3 [4, 10, 2]

Trong ví dụ này, bạn muốn lấy tất cả các giá trị bắt đầu từ chỉ mục 0 lên đến nhưng không bao gồm chỉ mục 3.

Sao chép danh sách đôi khi bạn sẽ muốn sao chép một danh sách. Một cách đơn giản để sao chép danh sách của bạn là sử dụng phương thức sao chép: 1 2 3 4

>>> >>> >>> [1,

my_list = [1, 2, 3] new_list = my_list.copy [] new_list 2, 3]

Điều này tạo thành công một danh sách mới và gán nó cho biến, new_list. Tuy nhiên, lưu ý rằng khi bạn làm điều này, bạn đang tạo ra những gì được gọi là bản sao nông cạn. Điều đó có nghĩa là nếu bạn có các đối tượng có thể thay đổi trong danh sách của mình, chúng có thể được thay đổi và nó sẽ ảnh hưởng đến cả hai danh sách. Ví dụ: nếu bạn có một từ điển trong danh sách của mình và từ điển đã được sửa đổi, cả hai danh sách sẽ thay đổi, có thể không phải là điều bạn muốn. Bạn sẽ tìm hiểu về từ điển trong Chương 8. 1 2 3 4 5 6

>>> >>> >>>> [1, >>> [1,

my_list = [1, 2, 3] new_list = my_list.copy [] my_list 2, 3] new_list 2, 3]

Bạn cũng có thể sao chép danh sách bằng cách sử dụng cú pháp vui nhộn này: 1 2 3 4

>>> >>> >>> [1,

my_list = [1, 2, 3] new_list = my_list.copy [] new_list 2, 3]

Điều này tạo thành công một danh sách mới và gán nó cho biến, new_list. Tuy nhiên, lưu ý rằng khi bạn làm điều này, bạn đang tạo ra những gì được gọi là bản sao nông cạn. Điều đó có nghĩa là nếu bạn có các đối tượng có thể thay đổi trong danh sách của mình, chúng có thể được thay đổi và nó sẽ ảnh hưởng đến cả hai danh sách. Ví dụ: nếu bạn có một từ điển trong danh sách của mình và từ điển đã được sửa đổi, cả hai danh sách sẽ thay đổi, có thể không phải là điều bạn muốn. Bạn sẽ tìm hiểu về từ điển trong Chương 8. 1 2 3 4 5 6

>>> >>> >>> [1,

my_list = [1, 2, 3] new_list = my_list.copy [] new_list 2, 3]

Điều này tạo thành công một danh sách mới và gán nó cho biến, new_list. Tuy nhiên, lưu ý rằng khi bạn làm điều này, bạn đang tạo ra những gì được gọi là bản sao nông cạn. Điều đó có nghĩa là nếu bạn có các đối tượng có thể thay đổi trong danh sách của mình, chúng có thể được thay đổi và nó sẽ ảnh hưởng đến cả hai danh sách. Ví dụ: nếu bạn có một từ điển trong danh sách của mình và từ điển đã được sửa đổi, cả hai danh sách sẽ thay đổi, có thể không phải là điều bạn muốn. Bạn sẽ tìm hiểu về từ điển trong Chương 8. 1 2 3 4 5 6

>>> >>> >>>> [1, >>> [1,

my_list = [1, 2, 3] new_list = my_list.copy [] my_list 2, 3] new_list 2, 3]

Bạn cũng có thể sao chép danh sách bằng cách sử dụng cú pháp vui nhộn này: 1 2 3 4

my_list = [1, 2, 3] new_list = my_list [:] new_list 2, 3]

Ví dụ này đang nói với Python tạo một lát từ phần tử 0 [đầu tiên] đến phần cuối cùng, có hiệu lực là toàn bộ danh sách. Cuối cùng, bạn cũng có thể sử dụng hàm danh sách Python [] để sao chép danh sách: 1 2 3 4

my_list = [1, 2, 3] new_list = list [my_list] new_list 2, 3]

Bất kể bạn chọn phương thức nào, cho dù bạn sao chép danh sách bằng cách sử dụng [:], copy [] hoặc list [], cả ba sẽ tạo một bản sao nông. Để tránh chạy vào các vấn đề kỳ lạ trong đó thay đổi một danh sách ảnh hưởng đến danh sách được sao chép, bạn nên sử dụng phương thức DeepCopy từ mô -đun sao chép thay thế.

Kết thúc trong chương này, bạn đã học được tất cả về loại dữ liệu danh sách tuyệt vời của Python. Bạn sẽ sử dụng danh sách rộng rãi khi bạn đang lập trình trong Python. Bạn đã học được những điều sau đây trong chương này: Tạo danh sách Danh sách Danh sách Danh sách Sao chép danh sách Danh sách ngay bây giờ bạn đã sẵn sàng để tiếp tục và tìm hiểu về Tuples!

Xem lại câu hỏi 1. Làm thế nào để bạn tạo một danh sách? 2. Tạo một danh sách với 3 mục và sau đó sử dụng append [] để thêm hai mục nữa. 3. Có gì sai với mã này? 1 >>> my_list = [1, 2, 3] 2 >>> my_list.remove [4]

4. Làm thế nào để bạn xóa mục thứ 2 trong danh sách này? 1 >>> my_list = [1, 2, 3]

5. Tạo một danh sách trông như thế này: [4, 10, cắt để chỉ nhận được 3 mục giữa.

2, 1, 23].

Sử dụng chuỗi

Chương 7 - Tìm hiểu về các bộ dữ liệu là một loại trình tự khác trong Python. Các bộ dữ liệu bao gồm một số giá trị được phân tách bằng dấu phẩy. Một tuple là bất biến trong khi một danh sách không. Bất biến có nghĩa là tuple có giá trị cố định và không thể thay đổi. Bạn không thể thêm hoặc xóa các mục trong một tuple. Các đối tượng bất biến là hữu ích khi bạn cần một giá trị băm hằng số. Ví dụ phổ biến nhất về giá trị băm trong Python là chìa khóa cho từ điển Python, mà bạn sẽ tìm hiểu trong Chương 8. Trong chương này, bạn sẽ tìm hiểu cách: Tạo bộ dữ Làm thế nào để tạo bộ dữ liệu!

Trong trường hợp này, bạn có thể tìm ra số lần số 3 xuất hiện trong bộ tuple. Bạn có thể sử dụng index [] để tìm chỉ mục đầu tiên của một giá trị: 1 >>> a_tuple = [1, 2, 3, 3] 2 >>> a_tuple.index [2] 3 1

Ví dụ này cho bạn thấy rằng số 2 là tại INDEX 1, đây là mục thứ hai trong tuple. Các bộ dữ liệu không được chỉ số bằng không, có nghĩa là phần tử đầu tiên bắt đầu ở mức 0. Bạn có thể sử dụng phương pháp lập chỉ mục mà bạn đã học trong chương trước để truy cập các yếu tố trong một tuple: 1 >>> a_tuple = [1, 2, 3, 3] 2 >>> a_tuple [2] 3 3

Phần đầu tiên 3 3 trong bộ tuple là tại INDEX 2. Hãy để cố gắng sửa đổi một phần tử trong bộ tuple của bạn: 1 >>> a_tuple [0] = 8 2 Traceback [cuộc gọi gần đây nhất]:

3 Python Shell, Nhắc 92, dòng 1 4 Kiểu hàng

Ở đây bạn cố gắng đặt phần tử đầu tiên trong tuple thành 8. Tuy nhiên, điều này khiến một kiểu mẫu được nâng lên vì các bộ dữ liệu là bất biến và không thể thay đổi.

Các bộ dữ liệu ghép nối có thể được kết hợp với nhau, trong việc lập trình được gọi là cách ghép nối. Tuy nhiên, khi bạn làm điều đó, cuối cùng bạn sẽ tạo ra một tuple mới: 1 2 3 4 5 6

>>> a_tuple = [1, 2, 3, 3] >>> id [a_tuple] 140617302751760 >>> a_tuple += [6, 7] >>> id [a_tuple] 140617282270944

Ở đây bạn kết hợp một tuple thứ hai vào tuple đầu tiên. Bạn có thể sử dụng hàm python id [] để thấy rằng biến, a_tuple, đã thay đổi. Hàm id [] trả về id của đối tượng. ID đối tượng ID tương đương với một địa chỉ trong bộ nhớ. Số ID đã thay đổi sau khi kết hợp bộ thứ hai. Điều đó có nghĩa là bạn đã tạo ra một đối tượng mới.

Bộ dữ liệu đặc biệt Có hai bộ dữ liệu đặc biệt. Một tuple với các mục bằng không và một tuple với một mục. Lý do chúng là trường hợp đặc biệt là cú pháp để tạo ra chúng là một chút khác biệt. Để tạo một tuple trống, bạn có thể thực hiện một trong những điều sau: 1 2 3 4 5 6 7 8

>>> trống = tuple [] >>> len [trống] 0 >>> gõ [trống]

>>> cũng_empty = [] >>> len [cũng_empty] 0

Bạn có thể tạo một bộ xử lý trống bằng cách gọi hàm tuple [] không có đối số hoặc thông qua gán khi sử dụng một cặp dấu ngoặc đơn trống. Bây giờ, hãy để tạo ra một tuple với một phần tử duy nhất: 1 2 3 4 5

>>> đơn = 2, >>> len [đơn] 1 >>> gõ [đơn]

Để tạo một tuple với một phần tử duy nhất, bạn có thể gán một giá trị với dấu phẩy sau. Lưu ý dấu phẩy sau 2 trong ví dụ trên. Mặc dù các dấu ngoặc đơn thường là tùy chọn, tôi đánh giá cao chúng cho các bộ đồ đơn hàng vì dấu phẩy có thể dễ dàng bỏ lỡ.

Kết thúc bộ tuple là một loại dữ liệu cơ bản trong Python. Nó được sử dụng khá thường xuyên và chắc chắn là một thứ mà bạn nên quen thuộc. Bạn sẽ sử dụng các bộ dữ liệu trong các loại dữ liệu khác. Bạn cũng sẽ sử dụng các bộ dữ liệu liên quan đến nhóm, chẳng hạn như tên, địa chỉ và quốc gia. Trong chương này, bạn đã học cách tạo ra một tuple theo ba cách khác nhau. Bạn cũng học được rằng các bộ dữ liệu là bất biến. Cuối cùng, bạn đã học được cách kết hợp các bộ dữ liệu và tạo các bộ dữ liệu trống. Bây giờ bạn đã sẵn sàng để chuyển sang chương tiếp theo và tìm hiểu tất cả về từ điển!

Xem lại câu hỏi 1. Làm thế nào để bạn tạo một tuple? 2. Bạn có thể chỉ ra cách truy cập phần tử thứ 3 trong bộ tuple này không? 1 >>> a_tuple = [1, 2, 3, 4]

3. Có thể sửa đổi một tuple sau khi bạn tạo nó không? Tại sao hoặc tại sao không? 4. Làm thế nào để bạn tạo một tuple với một mục duy nhất?

Chương 8 - Tìm hiểu về từ điển từ điển là một loại dữ liệu cơ bản khác trong Python. Một từ điển là một cặp [khóa, giá trị]. Một số ngôn ngữ lập trình gọi chúng là bảng băm. Chúng được mô tả như một ánh xạ ánh xạ các phím [đối tượng băm] đến các giá trị [bất kỳ đối tượng nào]. Các đối tượng bất biến có thể băm [có nghĩa là không thể thay đổi]. Bắt đầu từ Python 3.7, từ điển được đặt hàng. Điều đó có nghĩa là khi bạn thêm một cặp [khóa, giá trị] mới vào từ điển, nó nhớ những gì họ đã được thêm vào. Trước Python 3.7, đây không phải là trường hợp và bạn không thể dựa vào thứ tự chèn. Bạn sẽ học cách thực hiện như sau trong chương này: Tạo từ điển truy cập các phương thức từ điển Sửa đổi từ điển xóa các mục từ từ điển của bạn, hãy bắt đầu bằng cách tìm hiểu về việc tạo từ điển!

Tạo từ điển Bạn có thể tạo một từ điển theo một vài cách khác nhau. Phương pháp phổ biến nhất là bằng cách đặt một danh sách phân tách bằng dấu phẩy: các cặp giá trị trong niềng răng xoăn. Hãy nhìn vào một ví dụ: 1 2 3 4

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; : 'DOE', 'Email': '[Email & nbsp; được bảo vệ]'}

Bạn cũng có thể sử dụng hàm Dict [] tích hợp Python để tạo từ điển. Dict [] sẽ chấp nhận một loạt các đối số từ khóa [tức là 1 = một người khác, 2 = Hồi hai, v.v.], một danh sách các bộ dữ liệu hoặc từ điển khác. Dưới đây là một vài ví dụ: 1 2 3 4 5 6 7 8

>>> số = Dict [một = 1, hai = 2, ba = 3] >>> số {'một': 1, 'hai': 2, 'ba': 3} >>> info_list = [[' First_name ',' James '], [' last_name ',' doe '], [' email ',' [email & nbsp; được bảo vệ] ']] 'James', 'last_name': 'doe', 'email': '[Email & nbsp; được bảo vệ]'}

Ví dụ đầu tiên sử dụng Dict [] trên một loạt các đối số từ khóa. Bạn sẽ tìm hiểu thêm về những điều này khi bạn tìm hiểu về các chức năng. Bạn có thể nghĩ về các đối số từ khóa như một loạt các từ khóa với dấu hiệu bình đẳng giữa chúng và giá trị của chúng. Ví dụ thứ hai chỉ cho bạn cách tạo một danh sách có 3 bộ dữ liệu bên trong nó. Sau đó, bạn chuyển danh sách đó cho Dict [] để chuyển đổi nó thành một từ điển.

Truy cập từ điển từ điển yêu cầu về sự nổi tiếng là chúng rất nhanh. Bạn có thể truy cập bất kỳ giá trị nào trong từ điển thông qua khóa. Nếu không tìm thấy khóa, bạn sẽ nhận được KeyError. Hãy cùng xem cách sử dụng từ điển: 1 2 3 4

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp;

Để có được giá trị của First_Name, bạn phải sử dụng cú pháp sau: Dictionary_name [khóa]

Bây giờ, hãy để cố gắng để có được một chìa khóa không tồn tại: 1 2 3 4

>>> Sample_dict ['Địa chỉ'] Traceback [cuộc gọi gần đây nhất cuối cùng]: Python Shell, Prompt 118, Line 1 Buildins.KeyError: 'Địa chỉ'

Vâng, điều đó đã làm việc! Bạn đã yêu cầu từ điển cung cấp cho bạn một giá trị mà không phải là trong từ điển! Bạn có thể sử dụng Python, trong từ khóa để hỏi xem một khóa có nằm trong từ điển không: 1 2 3 4

>>> 'địa chỉ' trong sample_dict false >>> 'first_name' trong sample_dict true

Bạn cũng có thể kiểm tra xem liệu khóa không nằm trong từ điển bằng cách sử dụng từ khóa Python không: 1 2 3 4

>>> 'First_name' không trong sample_dict false >>> 'địa chỉ' không có trong sample_dict true

Một cách khác để truy cập các khóa trong từ điển là sử dụng một trong các phương thức từ điển. Hãy để tìm hiểu thêm về các phương pháp từ điển ngay bây giờ!

Phương pháp từ điển Như với hầu hết các loại dữ liệu Python, từ điển có các phương pháp đặc biệt bạn có thể sử dụng. Hãy cùng kiểm tra một số phương pháp từ điển! D.Get [khóa [, mặc định]]

Bạn có thể sử dụng phương thức get [] để có được giá trị. Nhận [] yêu cầu bạn chỉ định một khóa để tìm kiếm. Nó tùy chọn cho phép bạn trả về một mặc định nếu không tìm thấy khóa. Mặc định cho giá trị đó là không có. Hãy để xem: 1 2 3 4

>>> in [sample_dict.get ['địa chỉ']] Không có >>> in [sample_dict.get ['địa chỉ', 'không tìm thấy']] không tìm thấy

Ví dụ đầu tiên cho bạn thấy những gì xảy ra khi bạn cố gắng nhận [] một khóa không tồn tại mà không cần thiết lập mặc định. Trong trường hợp đó, nó không trả lại. Sau đó, ví dụ thứ hai chỉ cho bạn cách đặt mặc định thành chuỗi không tìm thấy. D.Clear []

Phương thức rõ ràng [] có thể được sử dụng để loại bỏ tất cả các mục khỏi từ điển của bạn. 1 2 3 4 5 6 7

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; Hay

D.Copy []

Nếu bạn cần tạo một bản sao nông của từ điển, thì phương thức sao chép [] là dành cho bạn: 1 2 3 4 5

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; First_name ':' James ',' last_name ':' doe ',' email ':' [Email & nbsp; được bảo vệ] '}

Nếu từ điển của bạn có các đối tượng hoặc từ điển bên trong nó, thì cuối cùng bạn có thể gặp lỗi logic do sử dụng phương pháp này, bởi vì thay đổi một từ điển sẽ ảnh hưởng đến phương pháp khác. Trong trường hợp này, bạn nên sử dụng mô -đun bản sao Python, có chức năng DeepCopy sẽ tạo ra một bản sao hoàn toàn riêng biệt cho bạn. Bạn có thể nhớ vấn đề này được đề cập trở lại trong chương trong danh sách. Đây là những vấn đề phổ biến với việc tạo ra các bản sao nông cạn. D.Items []

Phương thức Itit [] sẽ trả về một chế độ xem mới về các mục từ điển: 1 2 3 4 5

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; 'James'], ['last_name', 'doe'], ['email', '[email & nbsp; được bảo vệ]']]]]

Đối tượng xem này sẽ thay đổi khi chính đối tượng từ điển thay đổi. D.Keys []

Nếu bạn cần có một cái nhìn về các khóa trong từ điển, thì các khóa [] là phương pháp cho bạn. Là một đối tượng xem, nó sẽ cung cấp cho bạn một cái nhìn năng động về các phím từ điển. Bạn có thể lặp lại một chế độ xem và cũng kiểm tra tư cách thành viên thông qua từ khóa: 1 2 3 4 5 6 7 8 9

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; ['First_name', 'last_name', 'email']]

D.Values ​​[]

Phương thức giá trị [] cũng trả về một đối tượng xem, nhưng trong trường hợp này, nó là một cái nhìn động về các giá trị của từ điển: 1 >>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 2 ' Email ':' [Email & nbsp;

4 5 6 7 8 9

>>> giá trị dict_values ​​[['James', 'doe', '[email & nbsp; được bảo vệ]']] >>> 'doe' trong các giá trị đúng >>> len [giá trị] 3

D.Pop [khóa [, mặc định]]

Bạn có cần xóa một chìa khóa khỏi từ điển không? Sau đó pop [] là phương pháp cho bạn. Phương thức pop [] lấy một khóa và một chuỗi mặc định tùy chọn. Nếu bạn không đặt mặc định và không tìm thấy chìa khóa, KeyError sẽ được nâng lên. Dưới đây là một số ví dụ: 1 2 3 4 5 6 7 8 9 10 11 12

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; Cuối cùng]: Python Shell, Prompt 146, Line 1 Builds.KeyError: 'Something' >>> sample_dict.pop ['cái gì đó', 'không tìm thấy!'] 'Không tìm thấy!' >>> sample_dict.pop ['first_name'] 'James' >>> sample_dict {'last_name': 'doe', 'email': '[email & nbsp; được bảo vệ]'}

D.Popitem []

Phương thức PopItem [] được sử dụng để xóa và trả về một cặp [giá trị, giá trị] khỏi từ điển. Các cặp được trả về theo thứ tự đầu tiên [LIFO] cuối cùng, điều đó có nghĩa là mục cuối cùng được thêm cũng sẽ là thứ đầu tiên được xóa khi bạn sử dụng phương pháp này. Nếu được gọi trên một từ điển trống, bạn sẽ nhận được KeyError. 1 2 3 4 5 6

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; ;

D.Update [[Khác]]

Cập nhật một từ điển với các cặp [khóa, giá trị] từ các khóa khác, ghi đè lên các khóa hiện có. Cái kia có thể là một từ điển khác, một danh sách các bộ dữ liệu, v.v.

cập nhật[]

sẽ trả lại không khi được gọi.

Hãy nhìn vào một vài ví dụ: 1 2 3 4 5 6 7 8

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; [

Hãy thử sử dụng Update [] để ghi đè lên khóa đã tồn tại trước: 1 2 3 4 5

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; ]]] >>> sample_dict {'first_name': 'mike', 'last_name': 'doe', 'email': '

Sửa đổi từ điển của bạn, bạn sẽ cần sửa đổi từ điển của bạn theo thời gian. Hãy giả sử rằng bạn cần thêm một cặp [khóa, giá trị] mới: 1 2 3 4 5 6 7 8 9

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; >> sample_dict {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; được bảo vệ]', 'địa chỉ': '123 dunn st'}

Để thêm một mục mới vào từ điển, bạn có thể sử dụng niềng răng vuông để nhập khóa mới và đặt nó thành một giá trị. Nếu bạn cần cập nhật khóa đã tồn tại trước, bạn có thể thực hiện như sau: 1 2 3 4 5

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; được bảo vệ]'} >>> sample_dict ['email'] = ' '>>> sample_dict {' first_name ':' James ',' last_name ':' doe ',' email ':' [email & nbsp; được bảo vệ] '}

Trong ví dụ này, bạn đặt Sample_dict ['Email'] thành [Email & NBSP; được bảo vệ] Bất cứ khi nào bạn đặt khóa đã tồn tại thành một giá trị mới, bạn sẽ ghi đè lên giá trị trước đó. Bạn cũng có thể sử dụng phương thức Update [] từ phần trước để sửa đổi từ điển của bạn.

Xóa các mục khỏi từ điển của bạn Đôi khi bạn sẽ cần phải xóa một khóa khỏi từ điển. Bạn có thể sử dụng từ khóa Python sườn del cho điều đó: 1 2 3 4 5

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; First_name ':' James ',' last_name ':' doe '}

Trong trường hợp này, bạn nói với Python xóa khóa Email Key, khỏi Sample_Dict Phương pháp khác để xóa khóa là sử dụng phương thức từ điển pop [], được đề cập trong phần trước: 1 2 3 4 5 6

>>> sample_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; được bảo vệ]'} >>> sample_dict.pop ['email'] ' ] '>>> sample_dict {' first_name ':' James ',' last_name ':' doe '}

Khi bạn sử dụng pop [], nó sẽ loại bỏ khóa và trả về giá trị đang được xóa.

Kết thúc kiểu dữ liệu từ điển là vô cùng hữu ích. Bạn sẽ thấy nó tiện dụng để sử dụng để tra cứu nhanh tất cả các loại dữ liệu. Bạn có thể đặt giá trị của cặp khóa: Giá trị cho bất kỳ đối tượng nào trong Python. Vì vậy, bạn có thể lưu trữ danh sách, bộ dữ liệu và các đối tượng khác là giá trị trong từ điển. Bạn đã học các chủ đề sau trong chương này: Tạo từ điển truy cập các phương thức từ điển Sửa đổi từ điển xóa các mục từ từ điển của bạn, điều khá phổ biến cần một từ điển sẽ tạo khóa khi bạn cố gắng truy cập một từ không tồn tại. Nếu bạn có nhu cầu như vậy, bạn nên kiểm tra mô -đun Bộ sưu tập Python. Nó có một lớp DefaultDict được tạo cho chính xác trường hợp sử dụng đó.

Xem lại câu hỏi 1. Làm thế nào để bạn tạo một từ điển? 2. Bạn có từ điển sau. Làm thế nào để bạn thay đổi trường Last_name thành ‘Smith,? 1 >>> my_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; được bảo vệ]'}

3. Sử dụng từ điển ở trên, làm thế nào bạn sẽ xóa trường email khỏi từ điển? 4. Làm thế nào để bạn nhận được các giá trị từ một từ điển?

Chương 9 - Tìm hiểu về các bộ Một kiểu dữ liệu được đặt được định nghĩa là một tập hợp không có thứ tự của các đối tượng băm khác biệt, theo tài liệu Python 3. Bạn có thể sử dụng một tập hợp để kiểm tra thành viên, loại bỏ các bản sao khỏi trình tự và các hoạt động toán học, như giao lộ, liên minh, khác biệt và sự khác biệt đối xứng. Do thực tế là chúng là các bộ sưu tập không có thứ tự, một bộ không ghi lại vị trí phần tử hoặc thứ tự chèn. Do đó, họ cũng không hỗ trợ lập chỉ mục, cắt lát hoặc các hành vi giống như trình tự khác mà bạn đã thấy với danh sách và bộ dữ liệu. Có hai loại bộ tích hợp cho ngôn ngữ Python: Set - là Frozenset có thể thay đổi - là bất biến

và có thể băm

Chương này sẽ tập trung vào tập hợp. Bạn sẽ tìm hiểu cách thực hiện như sau với các bộ: Tạo một bộ Truy cập các thành viên Thay đổi các mục Thêm các mục xóa các mục Xóa một bộ cho phép bắt đầu bằng cách tạo một bộ!

Tạo một bộ tạo một bộ là khá đơn giản. Bạn có thể tạo chúng bằng cách thêm một loạt các đối tượng được phân tách bằng dấu phẩy bên trong niềng răng xoăn hoặc bạn có thể chuyển một chuỗi cho hàm set [] tích hợp []. Hãy nhìn vào một ví dụ: 1 2 3 4 5

>>> my_set = {"a", "b", "c", "c"} >>> my_set {'c', 'a', 'b'} >>> gõ [my_set]

Một bộ sử dụng cùng một niềng răng xoăn mà bạn đã sử dụng để tạo từ điển. Lưu ý rằng thay vì khóa: các cặp giá trị, bạn có một loạt các giá trị. Khi bạn in ra bộ, bạn có thể thấy rằng các bản sao đã được xóa tự động. Bây giờ, hãy thử tạo một bộ bằng cách sử dụng set []: 1 2 3 4 5 6

>>> my_list = [1, 2, 3, 4] >>> my_set = set [my_list] >>> my_set {1, 2, 3, 4} >>> gõ [my_set]

Trong ví dụ này, bạn đã tạo một danh sách và sau đó đúc nó vào một bộ bằng Set []. Nếu đã có bất kỳ bản sao nào trong danh sách, chúng sẽ bị xóa. Bây giờ, hãy để di chuyển cùng và xem một số điều bạn có thể làm với kiểu dữ liệu này.

Truy cập các thành viên đã đặt Bạn có thể kiểm tra xem một mục nằm trong một tập hợp bằng cách sử dụng Python's trong toán tử: 1 >>> my_set = {"A", "B", "C", "C"} 2 >>> " my_set 3 true

Các bộ không cho phép bạn sử dụng cắt hoặc muốn truy cập các thành viên riêng lẻ của bộ. Thay vào đó, bạn cần lặp lại qua một bộ. Bạn có thể làm điều đó bằng cách sử dụng một vòng lặp, chẳng hạn như vòng lặp hoặc một vòng lặp. Bạn đã thắng được các vòng lặp cho đến Chương 12, nhưng đây là cú pháp cơ bản để lặp qua một bộ sưu tập sử dụng vòng lặp cho vòng lặp: 1 2 3 4 5 6

>>> cho mục trong my_set: ... in [mục] ... c a b b

Điều này sẽ lặp qua từng mục trong tập hợp một lần và in nó ra. Bạn có thể truy cập các mục trong bộ nhanh hơn nhiều so với danh sách. Một danh sách Python sẽ lặp lại trên mỗi mục trong một danh sách cho đến khi nó tìm thấy mục bạn đang tìm kiếm. Khi bạn tìm kiếm một mục trong một bộ, nó hoạt động giống như một từ điển và sẽ tìm thấy nó ngay lập tức hoặc không.

Thay đổi các mục trong khi cả Dict và Set đều yêu cầu các thành viên có thể băm, một bộ không có giá trị để thay đổi. Tuy nhiên, bạn có thể thêm các mục vào một bộ cũng như loại bỏ chúng. Hãy để tìm hiểu làm thế nào!

Thêm các mục Có hai cách để thêm các mục vào một bộ: thêm [] update []

Hãy thử thêm một mục bằng cách sử dụng thêm []: 1 2 3 4

>>> my_set = {"a", "b", "c", "c"} >>> my_set.add ['d'] >>> my_set {'d', 'c', 'a', 'B'}

Điều đó thật dễ dàng! Bạn đã có thể thêm một mục vào tập hợp bằng cách chuyển nó vào phương thức add []. Nếu bạn muốn thêm nhiều mục cùng một lúc, thì bạn nên sử dụng Update [] thay vào đó: 1 2 3 4

>>> my_set = {"a", "b", "c", "c"} >>> my_set.update [['d', 'e', ​​'f']] >>> my_set {'a ',' c ',' d ',' e ',' b ',' f '}

Lưu ý rằng Update [] sẽ lấy bất kỳ điều gì bạn chuyển sang nó. Vì vậy, nó có thể mất, ví dụ, một danh sách, tuple hoặc một bộ khác.

Loại bỏ các mục Bạn có thể loại bỏ các mục khỏi bộ theo nhiều cách khác nhau. Bạn có thể sử dụng: Remove [] Discard [] pop []

Hãy để Lừa đi qua từng phần này trong các phần phụ sau đây!

Sử dụng .Remove [] Phương thức Remove [] sẽ cố gắng xóa mục được chỉ định khỏi tập hợp: 1 2 3 4

>>> my_set = {"a", "b", "c", "c"} >>> my_set.remove ['a'] >>> my_set {'c', 'b'}

Nếu bạn tình cờ yêu cầu bộ để xóa [] một mục không tồn tại, bạn sẽ nhận được lỗi: 1 2 3 4 5

>>> my_set = {"a", "b", "c", "c"} >>> my_set.remove ['f'] Traceback [cuộc gọi gần đây nhất] .Keyerror: 'f'

Bây giờ, hãy để xem cách thức hoạt động của phương thức loại bỏ [] liên quan chặt chẽ!

Sử dụng .discard [] Phương thức DISCARD [] hoạt động theo cách chính xác giống như cách xóa [] trong đó nó sẽ loại bỏ mục được chỉ định khỏi tập hợp: 1 2 3 4

>>> my_set = {"a", "b", "c", "c"} >>> my_set.discard ['b'] >>> my_set {'c', 'a'}

Mặc dù vậy, sự khác biệt với Discard [] là nó sẽ không gặp lỗi nếu bạn cố gắng xóa một mục không tồn tại: 1 >>> my_set = {"a", "b", "c", "c "} 2 >>> my_set.discard ['d'] 3 >>>

Nếu bạn muốn có thể bắt lỗi khi bạn cố gắng xóa một mục không tồn tại, hãy sử dụng Remove []. Nếu điều đó không quan trọng với bạn, thì hãy loại bỏ [] có thể là một lựa chọn tốt hơn.

Sử dụng .Pop [] Phương thức pop [] sẽ xóa và trả về một mục tùy ý từ tập hợp: 1 2 3 4 5

>>> my_set = {"a", "b", "c", "c"} >>> my_set.pop [] 'c' >>> my_set {'a', 'b'}

Nếu bộ của bạn trống và bạn cố gắng bật [] một mục, bạn sẽ nhận được lỗi: 1 2 3 4 5 6 7

>>> my_set = {"A"} >>> my_set.pop [] 'a' >>> my_set.pop [] Traceback [cuộc gọi gần đây nhất] bật từ một bộ trống '

Điều này rất giống với cách pop [] hoạt động với kiểu dữ liệu danh sách, ngoại trừ với danh sách, nó sẽ tăng chỉ số. Ngoài ra, các danh sách được đặt hàng trong khi các bộ thì không, vì vậy bạn có thể chắc chắn rằng những gì bạn sẽ xóa với pop [] vì các bộ không được đặt hàng.

Xóa hoặc xóa một bộ Đôi khi bạn sẽ muốn làm trống một bộ hoặc thậm chí loại bỏ hoàn toàn nó. Để làm trống một bộ, bạn có thể sử dụng Clear []: 1 2 3 4

>>> my_set = {"a", "b", "c", "c"} >>> my_set.clear [] >>> my_set set set []

Nếu bạn muốn loại bỏ hoàn toàn bộ, thì bạn có thể sử dụng Python từ Del tích hợp: 1 2 3 4 5 6

>>> my_set = {"a", "b", "c", "c"} >>> del my_set >>> my_set traceback [cuộc gọi gần đây nhất] : Tên 'my_set' không được định nghĩa

Bây giờ, hãy để tìm hiểu những gì bạn có thể làm với các bộ!

Bộ các bộ hoạt động cung cấp cho bạn một số hoạt động phổ biến như: Union [] - kết hợp hai bộ và trả về một bộ mới giao nhau [] - trả về một bộ mới với các phần tử

Đó là

Phổ biến giữa hai bộ khác biệt [] - Trả về một bộ mới với các phần tử không nằm trong tập hợp khác, các hoạt động này là những hoạt động phổ biến nhất mà bạn sẽ sử dụng khi làm việc với các bộ. Phương thức Union [] thực sự giống như phương thức Update [] mà bạn đã tìm hiểu trước đó, trong đó nó kết hợp hai hoặc nhiều bộ với nhau thành một bộ mới. Tuy nhiên, sự khác biệt là nó trả về một bộ mới thay vì cập nhật bộ gốc với các mục mới: 1 2 3 4 5 6

>>> First_set = {'One', 'Two', 'ba'} >>> Second_set = {'Orange', 'Banana', 'Peach'} >>> First_set.union [Second_set] {'Hai', 'chuối', 'ba', 'đào', 'cam', 'một'} >>> first_set {'hai', 'ba', 'one'}

Trong ví dụ này, bạn tạo hai bộ. Sau đó, bạn sử dụng Union [] trên bộ thứ nhất để thêm bộ thứ hai vào nó. Tuy nhiên, Liên minh không cập nhật bộ. Nó tạo ra một bộ mới. Nếu bạn muốn lưu bộ mới, thì bạn nên làm như sau: 1 >>> United_set = First_set.union [Second_set] 2 >>> United_set 3 {'hai', 'Banana', 'ba', 'Peach ',' Orange ',' One '}

Phương thức giao lộ [] mất hai bộ và trả về một bộ mới chỉ chứa các mục giống nhau trong cả hai bộ. Hãy cùng nhìn vào một ví dụ: 1 >>> first_set = {'one', 'hai', 'ba'} 2 >>> second_set = {'cam', 'chuối', 'đào', 'one'}

3 >>> first_set.interection [second_set] 4 {'one'}

Hai bộ này chỉ có một mục chung: chuỗi một lần. Vì vậy, khi bạn gọi Intersection [], nó sẽ trả về một bộ mới với một phần tử duy nhất trong đó. Như với Union [], nếu bạn muốn tiết kiệm bộ mới này, thì bạn sẽ muốn làm điều gì đó như thế này: 1 >>> Giao lộ = First_set.interection [Second_set] 2 >>> Giao lộ 3 {'One'}}

Phương thức khác biệt [] sẽ trả về một tập mới với các phần tử trong tập hợp không nằm trong tập hợp khác. Điều này có thể hơi khó hiểu, vì vậy hãy để Lôi nhìn vào một vài ví dụ: 1 2 3 4 5 6

>>> first_set = {'one', 'hai', 'ba'} >>> second_set = {'ba', 'bốn', 'một'} >>> first_set.difference [second_set] {'hai' >>> Second_set.difference [First_set] {'Four'}

Khi bạn gọi chênh lệch [] trên first_set, nó sẽ trả về một tập hợp với hai phần tử là phần tử duy nhất của nó. Điều này là do bởi vì hai người là chuỗi duy nhất không được tìm thấy trong Second_set. Khi bạn gọi chênh lệch [] trên Second_set, nó sẽ trả về Four Four, vì Four Four không có trong First_set. Có những phương pháp khác mà bạn có thể sử dụng với các bộ, nhưng chúng được sử dụng khá thường xuyên. Bạn nên đi kiểm tra tài liệu để biết chi tiết đầy đủ về các phương thức đã đặt nếu bạn cần sử dụng chúng.

Kết thúc bộ là một loại dữ liệu tuyệt vời được sử dụng cho các tình huống khá cụ thể. Bạn sẽ tìm thấy các bộ hữu ích nhất cho việc khử trùng hợp danh sách hoặc bộ dữ liệu hoặc bằng cách sử dụng chúng để tìm sự khác biệt giữa nhiều danh sách. Trong chương này, bạn đã tìm hiểu về những điều sau: Tạo một bộ Truy cập các thành viên Thay đổi các mục Thêm các mục Xóa các mục Xóa một bộ bất cứ khi nào bạn cần sử dụng thao tác giống như bộ, bạn nên xem kiểu dữ liệu này. Tuy nhiên, trong tất cả khả năng, bạn sẽ sử dụng danh sách, từ điển và bộ đếm thường xuyên hơn nhiều.

Xem lại câu hỏi 1. Làm thế nào để bạn tạo một bộ? 2. Sử dụng tập hợp sau, làm thế nào bạn sẽ kiểm tra xem nó có chứa chuỗi không, có phải là B B không? 1 >>> my_set = {"a", "b", "c", "c"}

3. Làm thế nào để bạn thêm một mục vào một bộ? 4

5. Làm thế nào để bạn tìm thấy các mục phổ biến giữa hai bộ?

Chương 10 - Các hoạt động của Boolean và không ai bạn sẽ thấy rằng bạn thường cần biết nếu có điều gì đó đúng hay sai. Ví dụ: bạn có thể muốn biết nếu ai đó đủ tuổi để tạo tài khoản ngân hàng. Nếu họ là, điều đó thường được đại diện là đúng. Các giá trị này được gọi là booleans hoặc bool viết tắt. Trong Python, bản đồ sai đến 0 [không] và bản đồ thực sự thành 1 [một]. Bạn có thể dễ dàng thấy điều này là đúng khi sử dụng trình thông dịch Python: 1 2 3 4 5 6

>>> Đúng == 1 Đúng >>> Sai == 0 Đúng >>> Sai == Đúng Sai

Khi bạn muốn so sánh hai giá trị trong Python, bạn cần sử dụng == thay vì đơn =. Một = đơn lẻ được gọi là toán tử gán, như đã được đề cập trong các chương trước. Nó gán giá trị ở bên phải với biến ở bên trái. Chúng ta hãy cố gắng gán một giá trị cho đúng và xem những gì xảy ra: 1 >>> true = 1 2 Traceback [cuộc gọi gần đây nhất cuối cùng]: 3 Python Shell, Nhắc 4, dòng 1 4 Lỗi cú pháp: Không thể gán cho từ khóa:, dòng 1, pos 0

Python không cho phép điều đó! Bạn có thể gán bất cứ điều gì cho các từ khóa trong Python.

Hàm bool [] Python cũng cung cấp hàm bool [], cho phép bạn chuyển các loại khác thành đúng hoặc sai. Hãy thử cho nó: 1 2 3 4 5 6

>>> bool ['1'] Đúng >>> bool ['2'] Đúng >>> bool ['0']

Bất cứ điều gì lớn hơn 0 nên được đúc là đúng. Nhưng chờ đã, cái thứ ba đó là một chuỗi có số 0 trong đó và nó cũng trở lại đúng! Những gì đang xảy ra ở đây? Python có khái niệm về sự thật của người Viking và người đánh giá. Điều đó có nghĩa là khi bạn đang xử lý các loại không phải là số, True sẽ ánh xạ tới các chuỗi với một hoặc nhiều mục và Sai sẽ ánh xạ tới các chuỗi bằng các mục bằng không. Trong trường hợp này, chuỗi, '0', có một ký tự, vì vậy nó ánh xạ thành true. Hãy để thử nó với một chuỗi trống: 1 >>> bool [''] 2 sai

Vì chuỗi trống [nghĩa là nó không có ký tự trong đó], nó sẽ được chuyển thành sai. Hãy để xem những gì xảy ra khi chúng ta thử đúc một số loại khác của Python: 1 2 3 4 5 6 7 8 9 10

>>> bool [[]] false >>> bool [['something']] đúng >>> ] ĐÚNG VẬY

Tại đây, bạn thử đúc một danh sách trống, một danh sách với một mục, từ điển trống, một từ điển với một cặp khóa/giá trị và một số nguyên. Danh sách trống và từ điển ánh xạ sai, trong khi danh sách và từ điển với một hoặc nhiều mục bản đồ theo đúng. Số nguyên hoặc phao là 0 hoặc 0,0 sẽ ánh xạ thành sai, trong khi bất kỳ giá trị nào khác sẽ ánh xạ thành true.

Những gì về không? Python cũng có khái niệm không có gì, đó là giá trị null Python. Không có từ khóa nào trong Python và kiểu dữ liệu của nó là không định danh. Không có gì không giống với 0, sai hoặc một chuỗi trống. Trên thực tế, việc so sánh không có gì khác ngoài chính nó sẽ trả về Sai: 1 2 3 4 5 6 7 8

>>> không sai >>> không sai >>> không sai >>> không đúng

== 1 == [] == '' == Không có

Bạn có thể gán không cho một biến. Lưu ý rằng tất cả các trường hợp không có điểm nào vào cùng một đối tượng mặc dù: 1 2 3 4 5 6 7

>>> x = none >>> y = none >>> x >>> id [x] 4478513256 >>> id [y] 4478513256

Khi bạn muốn kiểm tra xem một biến không có, bạn nên sử dụng Python, là toán tử. Lý do cho điều đó là sẽ kiểm tra danh tính biến biến và xác minh rằng nó thực sự không có. Bạn sẽ tìm hiểu thêm về lý do tại sao điều này quan trọng trong chương tiếp theo.

Kết thúc loại bool hoặc boolean rất quan trọng trong việc lập trình vì nó là một cách rất đơn giản để kiểm tra xem có gì đúng hay sai không. Bạn cũng đã học được một chút về Python, không có loại, tương tự như NULL trong các ngôn ngữ khác. Bạn sẽ sử dụng các giá trị boolean đúng và sai, cũng như không có, thường khi bạn đang lập trình trong Python.

Xem lại câu hỏi 1. Số nào đúng bằng? 2. Làm thế nào để bạn chuyển các loại dữ liệu khác vào đúng hay sai? 3. Loại Null Python là gì?

Chương 11 - Các báo cáo có điều kiện Các nhà phát triển phải đưa ra quyết định mọi lúc. Làm thế nào để bạn tiếp cận vấn đề này? Bạn có sử dụng công nghệ x hay công nghệ y không? Bạn có thể sử dụng [các] ngôn ngữ lập trình nào để giải quyết vấn đề này? Mã của bạn đôi khi cũng cần đưa ra quyết định. Dưới đây là một số điều phổ biến mà mã kiểm tra mỗi ngày: Bạn có được phép làm điều đó không? Đó có phải là một địa chỉ email hợp lệ? Giá trị đó có hợp lệ trong lĩnh vực đó không? Những điều này được kiểm soát bằng cách sử dụng các câu lệnh có điều kiện. Chủ đề này thường được gọi là luồng điều khiển. Trong Python, bạn có thể kiểm soát luồng chương trình của mình bằng cách sử dụng các câu lệnh IF, ELIF và các câu lệnh khác. Bạn cũng có thể thực hiện một loại dòng điều khiển thô bằng cách sử dụng xử lý ngoại lệ, mặc dù điều đó thường không được khuyến khích. Một số ngôn ngữ lập trình cũng có các câu lệnh chuyển đổi hoặc trường hợp có thể được sử dụng cho luồng điều khiển. Python không có những thứ đó. Trong chương này, bạn sẽ tìm hiểu về những điều sau: Các nhà khai thác so sánh tạo ra một câu lệnh phân nhánh đơn giản có điều kiện có điều kiện có điều kiện làm tổ Các toán tử logic Các nhà khai thác đặc biệt cho phép bắt đầu bằng cách tìm hiểu về các nhà khai thác so sánh!

Comparison Operators Before you get started using conditionals, it will be useful to learn about comparison operators. Comparison operators let you ask if something equals something else or if they are greater than or less than a value, etc. Python’s comparison operators are shown in the following table: Operator Meaning Greater than - This is True if the left operand is greater > than the right Less than - This is True if the left operand is less than the < right one == Equal to - This is True only when both operands are equal != Not equal to - This is True if the operands are not equal Greater than or equal to - This is True when the left >= operand is greater than or equal to the right Less than or equal to - This is True when the left operand >> a >>> b >>> a False >>> a False >>> a True >>> a False >>> a True >>> a True

= 2 = 3 == b > b < b >= b >> authenticated = True >>> if authenticated: ... print['You are logged in'] ... You are logged in

Trong ví dụ này, bạn tạo một biến có tên là xác thực và đặt nó thành True. Sau đó, bạn tạo một câu lệnh có điều kiện bằng cách sử dụng từ khóa nếu từ khóa. Một tuyên bố có điều kiện trong Python có biểu mẫu này: 1 nếu: 2 # làm điều gì đó ở đây

Để tạo ra một điều kiện, bạn bắt đầu nó với từ nếu, theo sau là một biểu thức sau đó kết thúc bằng một dấu hai chấm. Khi biểu thức đó đánh giá là TRUE, mã bên dưới điều kiện được thực thi.

Các vấn đề thụt vào trong Python Python quan tâm đến thụt. Một khối mã là một loạt các dòng mã được thụt vào đồng đều. Python xác định nơi khối mã bắt đầu và kết thúc bằng thụt lề này. Các ngôn ngữ khác sử dụng dấu ngoặc đơn hoặc bán đại học để đánh dấu phần đầu hoặc kết thúc của khối mã. Nhắc mã của bạn đồng đều được yêu cầu trong Python. Nếu bạn không làm điều này một cách chính xác, mã của bạn sẽ không chạy như bạn dự định. Một lời cảnh báo khác. Không trộn các tab và không gian. Idle sẽ phàn nàn nếu bạn làm và mã của bạn có thể có vấn đề khó chẩn đoán. Hướng dẫn kiểu Python [PEP8] khuyến nghị sử dụng 4 khoảng trống để thụt vào khối mã. Bạn có thể thụt mã mã của bạn bất kỳ số lượng không gian miễn là nó nhất quán. Tuy nhiên, 4 không gian thường được khuyến nghị.

Nếu được xác thực đã được đặt thành sai, thì sẽ không có gì được in ra. Mã này sẽ tốt hơn nếu bạn xử lý cả hai điều kiện mặc dù. Hãy cùng tìm hiểu làm thế nào để làm điều đó tiếp theo!

Phân nhánh các tuyên bố có điều kiện Bạn thường sẽ cần phải làm những việc khác nhau tùy thuộc vào câu trả lời cho một câu hỏi. Vì vậy, đối với tình huống giả thuyết này, bạn muốn cho người dùng biết khi họ đã xác thực để họ sẽ đăng nhập. Để có được điều đó, bạn có thể sử dụng từ khóa khác: 1 2 3 4 5 6 7

>>> được xác thực = false >>> nếu được xác thực: ... in ['bạn đã đăng nhập'] ... khác: ... in ['vui lòng đăng nhập'] ... vui lòng đăng nhập

Những gì mã này đang làm là kiểm tra giá trị của được xác thực: nếu nó đánh giá đúng, nó sẽ in ra Bạn đã đăng nhập vào, nếu không nó sẽ in ra xin vui lòng đăng nhập. Trong một chương trình thực, bạn sẽ có nhiều hơn chỉ là một câu lệnh in []. Bạn sẽ có mã chuyển hướng người dùng đến trang đăng nhập hoặc, nếu chúng được xác thực, nó sẽ chạy mã để tải hộp thư đến của họ. Hãy cùng nhìn vào một kịch bản mới. Trong đoạn mã sau, bạn sẽ tạo một tuyên bố có điều kiện sẽ kiểm tra tuổi của bạn và cho bạn biết làm thế nào bạn có thể tham gia vào các cuộc bầu cử tùy thuộc vào yếu tố đó: 1 2 3 4 5 6 7 8 9

>>> >>>> ... ... ... ... ... ... ... bạn

age = 10 if age < 18: print['You can follow the elections on the news'] elif age < 35: print['You can vote in all elections'] elif age >= 35: print['You can stand for any election'] can follow the elections on the news

Trong ví dụ này, bạn sử dụng nếu và Elif. Từ khóa Elif là viết tắt của những người khác nếu khác. Vì vậy, mã ở đây là kiểm tra độ tuổi so với các giá trị được mã hóa cứng khác nhau. Nếu tuổi dưới 18, thì công dân có thể theo dõi các cuộc bầu cử trên tin tức. Nếu họ lớn hơn 18 nhưng dưới 35, họ có thể bỏ phiếu trong tất cả các cuộc bầu cử. Tiếp theo, bạn kiểm tra xem tuổi của công dân có lớn hơn hoặc bằng 35. Sau đó, họ có thể tự mình chạy cho bất kỳ văn phòng nào và tham gia vào nền dân chủ của họ với tư cách là một chính trị gia.

Bạn có thể thay đổi ELIF cuối cùng chỉ đơn giản là một điều khoản khác nếu bạn muốn, nhưng Python khuyến khích các nhà phát triển rõ ràng trong mã của họ và nó dễ hiểu hơn bằng cách sử dụng Elif trong trường hợp này. Bạn có thể sử dụng nhiều câu lệnh ELIF như bạn cần, mặc dù nó thường được khuyến nghị chỉ có một số ít - một câu lệnh dài nếu/Elif có thể cần phải được làm lại.

Các điều kiện làm tổ Bạn có thể đặt một câu lệnh IF bên trong một câu lệnh khác. Điều này được gọi là làm tổ. Hãy nhìn vào một ví dụ ngớ ngẩn: 1 2 3 4 5 6 7 8 9 10 11

>>> >>> >>>> ... ... ... ... ... ... ... ... bạn

Tuổi = 18 xe = 'ford' nếu tuổi> = 18: Nếu xe trong ['Honda', 'Toyota']: in ['Bạn mua ô tô Nhật Bản'] Elif Car in ['Ford', 'Chevrolet']: In ['Bạn mua ô tô Mỹ']

Mã này có nhiều đường dẫn mà nó có thể đi vì nó phụ thuộc vào hai biến: tuổi và xe hơi. Nếu độ tuổi lớn hơn một giá trị nhất định, thì nó rơi vào khối mã đầu tiên và sẽ thực thi câu lệnh Nested IF, kiểm tra loại xe. Nếu tuổi nhỏ hơn một lượng tùy ý thì nó sẽ chỉ cần in ra một tin nhắn. Về mặt lý thuyết, bạn có thể làm tổ điều kiện bất kỳ số lần. Tuy nhiên, bạn càng làm tổ, càng phức tạp để gỡ lỗi sau này. Bạn nên giữ cho việc làm tổ chỉ một hoặc hai cấp độ sâu trong hầu hết các trường hợp. May mắn thay, các nhà khai thác logic có thể giúp giảm bớt vấn đề này!

Toán tử logic Các toán tử logic cho phép bạn chuỗi nhiều biểu thức lại với nhau bằng cách sử dụng các từ khóa đặc biệt. Dưới đây là ba toán tử logic mà Python hỗ trợ: và - chỉ đúng nếu cả hai toán hạng là đúng hoặc - đúng nếu một trong hai toán hạng là đúng không - đúng nếu toán hạng là sai

Hãy thử sử dụng toán tử logic và với ví dụ từ phần cuối cùng để làm phẳng các câu lệnh có điều kiện của bạn: 1 2 3 4 5 6 7 8 9 10

>>> >>> >>>> ... ... ... ... ... ... ... bạn

Tuổi = 18 xe = 'ford' nếu tuổi> = 18 và xe trong ['Honda', 'Toyota']: in ['bạn mua ô tô Nhật Bản'] elif Age> = 18 và xe trong ['ford', 'Chevrolet ']: In [' Bạn mua xe hơi Mỹ ']

Khi bạn sử dụng và, cả hai biểu thức phải đánh giá đúng với mã bên dưới chúng để thực thi. Vì vậy, kiểm tra có điều kiện đầu tiên để xem tuổi có lớn hơn hoặc bằng 21 và chiếc xe nằm trong danh sách xe hơi Nhật Bản. Vì đó là cả hai điều đó, bạn rơi xuống Elif đầu tiên và kiểm tra các điều kiện đó. Lần này cả hai điều kiện đều đúng, vì vậy nó in sở thích xe của bạn. Hãy để xem những gì xảy ra nếu bạn thay đổi và thành một OR: 1 2 3 4 5 6 7 8 9 10

>>> >>> >>>> ... ... ... ... ... ... ... bạn

Tuổi = 18 xe = 'ford' nếu tuổi> = 18 và xe trong ['Honda', 'Toyota']: in ['bạn mua ô tô Nhật Bản'] elif Age> = 18 và xe trong ['ford', 'Chevrolet ']: In [' Bạn mua xe hơi Mỹ ']

Khi bạn sử dụng và, cả hai biểu thức phải đánh giá đúng với mã bên dưới chúng để thực thi. Vì vậy, kiểm tra có điều kiện đầu tiên để xem tuổi có lớn hơn hoặc bằng 21 và chiếc xe nằm trong danh sách xe hơi Nhật Bản. Vì đó là cả hai điều đó, bạn rơi xuống Elif đầu tiên và kiểm tra các điều kiện đó. Lần này cả hai điều kiện đều đúng, vì vậy nó in sở thích xe của bạn. Hãy để xem những gì xảy ra nếu bạn thay đổi và thành một OR: 1 2 3 4 5 6 7 8 9 10

Tuổi = 18 xe = 'ford' nếu tuổi> = 18 hoặc xe trong ['Honda', 'Toyota']: in ['bạn mua ô tô Nhật Bản'] elif Age> = 18 hoặc xe trong ['ford', 'Chevrolet ']: In [' Bạn mua xe hơi Mỹ ']

Đợi tí! Bạn nói chiếc xe của bạn là Ford Ford, nhưng mã này đang nói rằng bạn mua xe Nhật Bản! Những gì đang xảy ra ở đây?

Vâng, khi bạn sử dụng logic hoặc mã trong khối mã đó sẽ thực thi nếu một trong hai câu lệnh là đúng. Hãy để phá vỡ điều này một chút. Có hai biểu thức nếu tuổi> = 21 hoặc xe trong ['Honda', 'Toyota']. Cái đầu tiên là tuổi> = 21. Điều đó đánh giá là đúng. Ngay khi Python nhìn thấy OR và tuyên bố đầu tiên là đúng, nó đánh giá toàn bộ điều là đúng. Tuổi của bạn lớn hơn hoặc bằng 21 hoặc xe của bạn là Ford. Dù bằng cách nào, nó thật sự và mã đó được thực thi. Sử dụng không khác một chút. Nó không thực sự phù hợp với ví dụ này, nhưng làm việc với ví dụ xác thực trước đây của chúng tôi: 1 2 3 4 5 6 7

>>> màu = 'trắng' >>> tuổi = 10 >>> nếu tuổi> x = [1, 2, 3] >>> y = [1, 2, 3] >>> x == y true> >> x là y false >>> id [x] 140328193994832 >>> id [y] 140328193887760

Đợi đã, cái gì? Bạn có chỉ cần gán cùng một danh sách cho cả X và Y không? Không thực sự, không. Đầu tiên [1, 2, 3] tạo ra một danh sách mà Python sau đó gán cho X; Phần thứ hai [1, 2, 3] tạo ra một danh sách khác và Python gán cho một cho Y - hai sáng tạo có nghĩa là hai đối tượng. Mặc dù chúng là những đối tượng bằng nhau, chúng vẫn khác nhau. Hãy thử lại với các chuỗi: 1 2 3 4 5 6 7 8 9 10

>>> x = 'Hello World' >>> y = 'Hello World' >>> x

Được rồi, trông đẹp! Một lần nữa: 1 2 3 4 5 6

>>> x >>> y >>> x true >>> x true

= 'hi' = 'hi' == y là y

Điều gì vừa xảy ra? Chà, hãy để Lừa nghĩ về điều này trong một khoảnh khắc, một danh sách là có thể thay đổi, điều đó có nghĩa là chúng ta có thể thay đổi nó, nhưng một STR là bất biến, điều đó có nghĩa là chúng ta không thể thay đổi nó. Bởi vì các đối tượng bất biến không thể thay đổi, Python có thể tự do sử dụng lại các đối tượng tương đương, tương đương thay vì tạo các đối tượng mới. Vì vậy, hãy rất cẩn thận để chỉ sử dụng là khi bạn thực sự có nghĩa là chính xác cùng đối tượng - sử dụng là cho sự bình đẳng đôi khi sẽ vô tình hoạt động, nhưng cuối cùng sẽ thất bại và là một lỗi trong chương trình của bạn. Bạn có thể sử dụng và không vào để kiểm tra nếu có gì đó trong một bộ sưu tập. Các bộ sưu tập trong Python đề cập đến những thứ như danh sách, chuỗi, bộ dữ liệu, từ điển, v.v ... Ở đây, một cách bạn có thể sử dụng kiến ​​thức này: 1 2 3 4 5 6 7 8

>>> logal_chars = 'yn' >>> char = 'x' >>> nếu char trong logal_chars: ... print [f '{char} là một ký tự hợp lệ'] ... khác: ... in [ f '{char} không có trong {loagal_chars}'] ... x không có trong yn

Ở đây bạn kiểm tra xem liệu char có nằm trong chuỗi của lealf_chars không. Nếu nó không phải là người, nó sẽ in ra những chữ cái hợp lệ là gì. Hãy thử thay đổi char thành một ký tự hợp lệ, chẳng hạn như chữ thường của Y Y hoặc chữ thường, N N. và chạy lại mã. Đây là một cách bạn không thể sử dụng không trong: 1 >>> my_list = [1, 2, 3, 4] 2 >>> 5 không trong my_list 3 true

Trong trường hợp này, bạn đang kiểm tra xem liệu số nguyên không có trong danh sách.

Hãy để sử dụng một ví dụ xác thực khác để chứng minh cách bạn có thể sử dụng không trong: 1 2 3 4 5 6

>>> >>> >>>> ... ... bạn

IDS = [1234, 5678] my_id = 1001 nếu my_id không ở IDS: in ['Bạn không được ủy quyền!'] Không được ủy quyền!

Ở đây bạn có một bộ ID đã biết. Những ID này có thể là số giống như chúng ở đây hoặc chúng có thể là địa chỉ email hoặc một cái gì đó khác. Bất kể, bạn cần kiểm tra xem ID đã cho, My_id, có trong danh sách ID đã biết của bạn không. Nếu nó không, thì bạn có thể cho người dùng biết rằng họ không được phép tiếp tục.

Kết thúc các câu lệnh có điều kiện rất hữu ích trong lập trình. Bạn sẽ thường xuyên sử dụng chúng để đưa ra quyết định dựa trên những gì người dùng đã chọn làm. Bạn cũng sẽ sử dụng các câu lệnh có điều kiện dựa trên các câu trả lời từ cơ sở dữ liệu, trang web và bất cứ điều gì khác mà chương trình của bạn nhận được đầu vào của nó. Nó có thể cần một số nghề thủ công để tạo ra một tuyên bố có điều kiện thực sự tốt, nhưng bạn có thể làm điều đó nếu bạn đặt đủ suy nghĩ và nỗ lực vào mã của mình!

Đánh giá câu hỏi 1. Đưa ra một vài ví dụ về các nhà khai thác so sánh: 2. Tại sao thụt lề lại quan trọng trong Python? 3. Làm thế nào để bạn tạo một tuyên bố có điều kiện? 4. Làm thế nào để bạn sử dụng các toán tử logic để kiểm tra nhiều thứ cùng một lúc? 5. Một số ví dụ của các nhà khai thác đặc biệt là gì? 6. Sự khác biệt giữa hai người này là gì? 1 x = [4, 5, 6] 2 y = [4, 5, 6]

và 1 x = [4, 5, 6] 2 y = x

Chương 12 - Tìm hiểu về các vòng lặp Có nhiều lần khi bạn viết mã mà bạn sẽ cần phải xử lý từng đối tượng trong một bộ sưu tập. Để làm điều đó, bạn sẽ lặp lại bộ sưu tập đó, điều đó có nghĩa là lấy từng đối tượng từ bộ sưu tập đó một lần. Bộ sưu tập các đối tượng bao gồm các chuỗi như "Hello, World", Danh sách như [1, 2, 3] và thậm chí các tệp. Quá trình lặp lại trên một cái gì đó được thực hiện thông qua một vòng lặp và các đối tượng hỗ trợ được lặp lại được gọi là Iterables. Trong Python, có hai loại cấu trúc vòng lặp: vòng lặp trong khi vòng lặp bên cạnh việc lặp lại trên các chuỗi và các bộ sưu tập khác, bạn có thể sử dụng một vòng lặp để làm điều tương tự nhiều lần. Một ví dụ về điều này là một máy chủ web: nó chờ đợi, lắng nghe khách hàng gửi tin nhắn; Khi nhận được tin nhắn, mã bên trong vòng lặp sẽ gọi một hàm để phản hồi. Một ví dụ khác là vòng lặp trò chơi. Khi bạn đánh bại một trò chơi hoặc thua một trò chơi, trò chơi thường không thoát ra. Thay vào đó, nó sẽ hỏi bạn nếu bạn muốn chơi lại. Điều này được thực hiện bằng cách gói toàn bộ chương trình trong một vòng lặp. Trong chương này, bạn sẽ tìm hiểu cách: Tạo một vòng lặp cho vòng lặp qua một vòng lặp trên một trích xuất từ ​​điển trích xuất nhiều giá trị từ một Tuple sử dụng được liệt kê với các vòng lặp tạo ra một vòng lặp vòng lặp của một vòng sử dụng tiếp tục sử dụng khác với các vòng lặp khác với các vòng lặp khác với các vòng lặp khác với các vòng lặp khác

Nest Loops cho phép bắt đầu bằng cách nhìn vào vòng lặp!

Tạo một vòng lặp For For Loop là cấu trúc vòng lặp phổ biến nhất trong Python. A For Loop được tạo bằng cú pháp sau: 1 cho x trong ITable: 2 # làm gì đó

Bây giờ mã trên không làm gì cả. Vì vậy, hãy để Viết viết một vòng lặp mà lặp lại trong danh sách, một mục tại một thời điểm: 1 2 3 4 5 6 7

>>> my_list = [1, 2, 3] >>> cho mục trong my_list: ... in [mục] ... 1 2 3

Trong mã này, bạn tạo một danh sách với ba số nguyên trong đó. Tiếp theo, bạn tạo một vòng lặp cho các mục nói với mỗi mục trong danh sách của tôi, hãy in ra mục ra. Tất nhiên, hầu hết thời gian bạn sẽ thực sự muốn làm điều gì đó với mặt hàng. Ví dụ: bạn có thể muốn nhân đôi nó: 1 2 3 4 5 6 7

>>> my_list = [1, 2, 3] >>> cho mục trong my_list: ... in [f '{item * 2}'] ... 2 4 6 6

Hoặc bạn có thể chỉ muốn chỉ in ra các mục được đánh số chẵn: 1 2 3 4 5 6

>>> my_list = [1, 2, 3] >>> cho mục trong my_list: ... nếu mục % 2 == 0: ... in [f '{item} là chẵn'] ... 2 là thậm chí

Ở đây bạn sử dụng toán tử mô đun, %, để tìm phần còn lại của mục chia cho 2. Nếu phần còn lại là 0, thì bạn biết rằng mục này là một số chẵn.

Bạn có thể sử dụng các vòng lặp và điều kiện và bất kỳ cấu trúc Python nào khác để tạo ra các đoạn mã phức tạp chỉ bị giới hạn bởi trí tưởng tượng của bạn. Hãy cùng tìm hiểu những gì bạn có thể lặp lại ngoài danh sách.

Vòng lặp qua một chuỗi Một trong những khác biệt của vòng lặp trong Python so với các ngôn ngữ lập trình khác là bạn có thể lặp lại bất kỳ bộ sưu tập nào. Vì vậy, bạn có thể lặp lại nhiều loại dữ liệu. Hãy nhìn vào việc lặp lại trên một chuỗi: 1 2 3 4 5 6 7 8 9 10 11

>>> my_str = 'abcdefg' >>> cho thư trong my_str: ... in [thư] ... a b c d e f g g

Điều này cho bạn thấy nó dễ dàng lặp lại trên một chuỗi. Bây giờ, hãy để thử lặp lại một loại dữ liệu phổ biến khác!

Vòng lặp trên một từ điển từ điển từ điển cũng hỗ trợ lặp lại. Theo mặc định, khi bạn lặp qua một từ điển, bạn sẽ lặp qua các phím của nó: 1 2 3 4 5 6 7 8 9

>>> người dùng = {'mdriscoll': 'mật khẩu', 'guido': 'python', 'steve': 'guac', 'ethanf': 'enum'} >>> cho người dùng ở người dùng: ... in [Người dùng] ... Mdriscoll Guido Steve Ethanf

Bạn có thể lặp qua cả khóa và giá trị của từ điển nếu bạn sử dụng phương thức mục của nó []: 1 2 3 4 5 6 7 8 9

>>> người dùng = {'mdriscoll': 'mật khẩu', 'guido': 'python', 'steve': 'guac', 'ethanf': 'enum'} >>> cho người dùng, mật khẩu trong người dùng. ].

Trong ví dụ này, bạn chỉ định rằng bạn muốn trích xuất người dùng và mật khẩu trong mỗi lần lặp. Như bạn có thể nhớ lại, phương thức Mục [] trả về một chế độ xem được định dạng giống như một danh sách các bộ dữ liệu. Do đó, bạn có thể trích xuất từng khóa: cặp giá trị từ chế độ xem này và in chúng ra. Lưu ý rằng bạn không nên sửa đổi một dict trong khi lặp lại nó. Thay vào đó, bạn nên tạo một bản sao và lặp qua bản sao trong khi sửa đổi bản gốc. Điều này dẫn chúng ta đến việc lặp lại các bộ dữ liệu và lấy ra các vật phẩm riêng lẻ từ một bộ phận trong khi lặp lại!

Trích xuất nhiều giá trị trong một tuple trong khi lặp đôi khi bạn sẽ cần phải lặp qua một danh sách các bộ dữ liệu và nhận từng mục trong bộ thuật. Nghe có vẻ kỳ lạ, nhưng bạn sẽ thấy rằng đó là một nhiệm vụ lập trình khá phổ biến. 1 2 3 4 5 6 7

>>> >>>> ... ... 1 2 3 -

list_of_tuples = [[1, 'chuối'], [2, 'apple'], [3, 'pear']] cho số

Để có được điều này để làm việc, bạn tận dụng thực tế là bạn biết mỗi tuple có hai mục trong đó. Vì bạn biết định dạng của danh sách các bộ dữ liệu trước thời hạn, bạn biết cách trích xuất các giá trị. Nếu bạn đã trích xuất các mục riêng lẻ từ các bộ dữ liệu, bạn sẽ kết thúc với loại đầu ra này: 1 2 3 4 5 6 7

>>> >>>> ... ... [1, [2, [3,

list_of_tuples = [[1, 'chuối'], [2, 'apple'], [3, 'pear']] cho mục trong list_of_tuples: in [mục] 'chuối'] 'apple'] 'pear']]

Đây có lẽ không phải là những gì bạn mong đợi. Bạn thường sẽ muốn trích xuất một mục từ tuple hoặc có thể nhiều mục, thay vì trích xuất toàn bộ tuple. Bây giờ, hãy để khám phá một cách hữu ích khác để lặp lại!

Sử dụng liệt kê với các vòng lặp Python đi kèm với một chức năng tích hợp gọi là Enumerate. Hàm này có thể sử dụng một chuỗi, như một chuỗi, danh sách hoặc đặt và trả về một tuple dưới dạng [đếm, mục]. Giá trị đầu tiên của số lượng là 0 bởi vì, trong Python, việc đếm bắt đầu từ 0. Nếu có thể lặp lại là một chuỗi, như một chuỗi hoặc danh sách, thì đếm cũng là vị trí của mục được trả về. Ở đây, một ví dụ: 1 2 3 4 5 6 7 8 9 10 11

>>> >>>> ... ... 0 1 2 3 4 5 6 -

my_str = 'abcdefg' cho pos, chữ cái trong liệt kê [my_str]: print [f '{pos} - {thư}'] a b c d e f g g g

Bây giờ, hãy để Lôi nhìn vào loại vòng lặp khác mà Python hỗ trợ!

Tạo một vòng lặp trong thời gian có một loại cấu trúc vòng lặp khác được gọi là vòng lặp trong khi. Một vòng lặp trong thời gian được tạo bằng từ khóa trong khi theo sau bởi một biểu thức. Nói cách khác, trong khi các vòng lặp sẽ chạy cho đến khi một điều kiện cụ thể thất bại, hoặc không còn là sự thật nữa. Hãy cùng xem cách các vòng lặp này hoạt động: 1 2 3 4

>>> đếm = 0 >>> trong khi đếm >> đếm = 0 >>> trong khi đếm >> list_of_tuples = [[1, 'chuối'], [2, 'apple'], [3, 'pear']] >>> cho số, trái cây trong list_of_tuples: ... nếu trái cây == 'táo' : ... in ['apple tìm thấy!'] ... Break ... in [f '{number} - {fruit}'] ... 1 - quả táo chuối được tìm thấy!

Trong ví dụ này, bạn muốn thoát ra khỏi vòng lặp khi bạn tìm thấy một quả táo. Nếu không, bạn in ra những trái cây bạn đã tìm thấy. Vì quả táo đang ở trong tuple thứ hai, bạn sẽ không bao giờ đến được thứ ba.

Khi bạn sử dụng Break, vòng lặp sẽ chỉ thoát ra khỏi vòng lặp trong cùng mà tuyên bố phá vỡ - một điều quan trọng cần nhớ khi bạn có các vòng lặp! Bạn có thể sử dụng Break để giúp kiểm soát luồng của chương trình. Trong thực tế, các câu lệnh có điều kiện và vòng lặp được gọi là báo cáo kiểm soát dòng chảy. Một tuyên bố điều khiển dòng vòng khác là tiếp tục. Hãy cùng nhìn vào điều đó tiếp theo!

Sử dụng TIẾP TỤC Tuyên bố tiếp tục được sử dụng để tiếp tục lặp tiếp theo trong vòng lặp. Bạn có thể sử dụng Tiếp tục bỏ qua một cái gì đó. Hãy để viết một vòng lặp bỏ qua các số chẵn: 1 2 3 4 5 6 7 8 9 10

>>> cho số trong phạm vi [2, 12]: ... nếu số % 2 == 0: ... Tiếp tục ... in [số] ... 3 5 7 9 11

Trong mã này, bạn lặp qua một loạt các số bắt đầu từ 2 và kết thúc ở mức 11. Đối với mỗi số trong phạm vi này, bạn sử dụng toán tử mô đun, %, để có phần còn lại của số chia cho 2. Nếu phần còn lại bằng 0 , đó là một số chẵn và bạn sử dụng câu lệnh tiếp tục để tiếp tục đến giá trị tiếp theo trong chuỗi. Điều này có hiệu quả bỏ qua các số thậm chí để bạn chỉ in ra những cái lẻ. Bạn có thể sử dụng các câu lệnh có điều kiện thông minh để bỏ qua bất kỳ số lượng nào trong bộ sưu tập bằng cách sử dụng câu lệnh tiếp tục.

Các vòng lặp và câu lệnh khác Một tính năng ít được biết đến về các vòng lặp Python là bạn có thể thêm một câu lệnh khác cho chúng giống như bạn làm với câu lệnh IF/ELSE. Tuyên bố khác chỉ được thực thi khi không có câu lệnh Break xảy ra. Một cách khác để xem xét nó là câu lệnh khác chỉ thực thi nếu vòng lặp hoàn thành thành công. Trường hợp sử dụng chính cho câu lệnh khác trong một vòng lặp là tìm kiếm một mục trong một bộ sưu tập. Bạn có thể sử dụng câu lệnh khác để nêu ra một ngoại lệ nếu vật phẩm không được tìm thấy hoặc tạo mục còn thiếu hoặc bất cứ điều gì phù hợp cho trường hợp sử dụng của bạn. Hãy nhìn vào một ví dụ nhanh: 1 2 3 4 5 6 7 8 9 10 11 12 13

>>> my_list = [1, 2, 3] >>> cho số trong my_list: ... nếu số == 4: ... in ['tìm thấy số 4!'] ... Break ... in [in [ số] ... khác: ... in ['số 4 không tìm thấy'] ... 1 2 3 số 4 không tìm thấy

Ví dụ này lặp qua một danh sách ba số nguyên. Nó tìm kiếm số 4 và sẽ thoát ra khỏi vòng lặp nếu nó được tìm thấy. Nếu số đó không được tìm thấy, thì câu lệnh khác sẽ thực thi và cho bạn biết. Thử thêm số 4 vào danh sách và sau đó chạy lại mã: 1 2 3 4 5 6 7 8 9 10 11

>>> my_list = [1, 2, 3, 4] >>> [số] ... khác: ... in ['số 4 không tìm thấy'] ... 1 2

12 3 13 tìm thấy số 4

Một cách phù hợp hơn để truyền đạt một lỗi sẽ là nêu ra một ngoại lệ để báo hiệu sự vắng mặt của số 4 thay vì in tin nhắn. Bạn sẽ học cách làm điều đó trong Chương 14.

Các vòng lặp làm tổ cũng có thể được lồng bên trong nhau. Có nhiều lý do để làm tổ. Một trong những lý do phổ biến nhất là làm sáng tỏ cấu trúc dữ liệu lồng nhau. Hãy để sử dụng một danh sách lồng nhau cho ví dụ của bạn: 1 2 3 4 5

>>> lồng nhau = [['Mike', 12], ['Jan', 15], ['Alice', 8]] >>> cho LST trong lồng nhau: ... in [f'list = {lst} '] ... cho mục trong lst: ... in [f'item -> {item}']

Vòng lặp bên ngoài sẽ trích xuất từng danh sách lồng nhau và in nó ra. Sau đó, trong vòng lặp bên trong, mã của bạn sẽ trích xuất từng mục trong danh sách lồng nhau và in nó ra. Nếu bạn chạy mã này, bạn sẽ thấy đầu ra trông như thế này: 1 2 3 4 5 6 7 8 9

Liệt kê mục hàng mục tiêu danh sách mục nhập mục hàng

= ['Mike', 12] -> Mike -> 12 = ['Jan', 15] -> Jan -> 15 = ['Alice', 8] -> Alice -> 8

Loại mã này đặc biệt hữu ích khi các danh sách lồng nhau có độ dài khác nhau. Bạn có thể cần thực hiện xử lý thêm trên các danh sách có thêm dữ liệu hoặc không đủ dữ liệu trong đó.

Kết thúc các vòng lặp rất hữu ích cho việc lặp lại dữ liệu. Trong chương này, bạn đã tìm hiểu về hai cấu trúc vòng lặp của Python: Cụ thể vòng lặp trong khi vòng lặp trong khi vòng lặp vòng lặp trên một vòng lặp trên một chuỗi từ điển trích xuất nhiều giá trị từ một bộ thuật sử dụng các vòng lặp với các vòng lặp tạo Một vòng lặp trong một vòng lặp ra khỏi vòng lặp bằng cách sử dụng các vòng tiếp tục và câu lệnh khác làm tổ với một thực hành nhỏ, bạn sẽ sớm trở nên khá lão luyện trong việc sử dụng các vòng trong mã của riêng bạn!

Xem lại câu hỏi 1. Python hỗ trợ hai loại vòng nào? 2. Làm thế nào để bạn lặp qua một chuỗi? 3. Bạn sử dụng từ khóa nào để thoát một vòng lặp? 4. Làm thế nào để bạn bỏ qua một mục khi bạn lặp đi lặp lại? 5. Tuyên bố khác cho các vòng lặp là gì? 6. Các câu lệnh kiểm soát dòng chảy trong Python là gì?

Chương 13 - Python Confensions Python hỗ trợ một phương pháp tay ngắn để tạo danh sách, từ điển và bộ được gọi là toàn bộ. Trường hợp sử dụng phổ biến là bạn muốn tạo một danh sách mới trong đó mỗi yếu tố đã có một số hoạt động được thực hiện cho họ. Ví dụ: nếu bạn có một danh sách các số và bạn muốn tạo một danh sách mới với tất cả các số được nhân đôi, bạn có thể sử dụng khả năng hiểu. Trong chương này, bạn sẽ tìm hiểu về: Danh sách trình biết toàn bộ từ điển Bộ toàn diện Đặt toàn bộ, hãy để Lừa đi trước và tìm hiểu về danh sách toàn diện trước!

Danh sách hiểu biết một danh sách Hiểu cho phép bạn tạo một danh sách từ một bộ sưu tập khác, chẳng hạn như danh sách khác hoặc Dict. Một danh sách hiểu, như một danh sách, bắt đầu và kết thúc bằng dấu ngoặc vuông, []; Nó cũng có một vòng lặp tích hợp trong nó, tất cả trên một dòng. Điều này có thể tùy chọn được theo sau bởi 0 hoặc nhiều hơn cho hoặc nếu các mệnh đề [bên trong dấu ngoặc vuông]. Dưới đây là một ví dụ: 1 >>> Trình tự = [1, 2, 3] 2 >>> new_list = [x cho x theo trình tự]

Điều này tương đương với vòng lặp sau: 1 2 3 4 5 6 7

>>> >>> >>>> ... ... >>> [1,

Trình tự = [1, 2, 3] new_list = [] cho x theo chuỗi: new_list.append [x] new_list 2, 3]

Thông thường khi bạn sử dụng khả năng hiểu danh sách, bạn muốn làm điều gì đó cho từng mục trong bộ sưu tập. Ví dụ: hãy thử thử gấp đôi từng mục: 1 2 3 4

>>> >>> >>> [2,

Trình tự = [1, 2, 3] new_list = [x * 2 cho x theo chuỗi] new_list 4, 6]

Trong ví dụ này, đối với mỗi mục [x] trong chuỗi, bạn nhân x với 2.

Lọc Danh sách Tolections Bạn có thể thêm câu lệnh IF vào danh sách hiểu như một loại bộ lọc. Python đi kèm với hàm Range [] tích hợp [] có số nguyên. Sau đó, nó trả về một đối tượng Range có thể cho phép bạn có được một loạt các số nguyên bắt đầu từ 0 và kết thúc tại số nguyên bạn đã vượt qua trong trừ một số. Đây là cách nó làm việc:

1 2 3 4

>>> Phạm vi [10] Phạm vi [0, 10] >>> Danh sách [phạm vi [10]] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Bạn có thể sử dụng hàm danh sách Python [] để biến đối tượng phạm vi thành danh sách các số, 0-9. Bây giờ, hãy để nói rằng bạn muốn tạo một danh sách chỉ chứa các số lẻ trong phạm vi đó. Bạn có thể sử dụng danh sách hiểu biết với câu lệnh IF trong đó để làm điều đó: 1 >>> ODD_NUMBERS = [x cho x trong phạm vi [10] nếu x % 2] 2 >>> ODD_NUMBERS 3 [1, 3, 5, 7, 7, , 9]

Hãy cùng thử sử dụng lồng nhau cho các vòng lặp trong một danh sách hiểu. Đối với bài tập này, bạn sẽ tạo ra một dict và biến nó thành một danh sách các bộ dữ , animal] for num in my_dict for animal in my_dict.values[] if my_dict[num]\ 3 == animal] 4 [[1, 'dog'], [2, 'cat'], [3, 'python' ]]

Mã này tạo ra một bộ số và động vật cho mỗi số trong từ điển và mỗi con vật, nhưng nó lọc nó để nó chỉ tạo ra Tuple nếu khóa từ điển bằng giá trị của nó. Đây là tương đương như một thông thường cho vòng lặp: 1 2 3 4 5 6 7 8 9

>>> my_dict = {1: 'Dog', 2: 'Cat', 3: 'Python'} >>> my_list = [] >>> : ... nếu my_dict [num] == động vật: ... my_list.append [[num, động vật]] ... >>> my_list [[1, 'chó'], [2, 'con mèo'], [3, 'Python']]

Nếu không có bộ lọc, danh sách trên sẽ là 1 [[1, 'chó'], [1, 'mèo'], [1, 'python'], [2, 'chó'], [2, 'con mèo', ...]

Bạn có thể làm cho danh sách trước đó hiểu được dễ đọc hơn một chút bằng cách đặt một số lần phá vỡ dòng vào đó, như thế này: 1 2 3 4 5

>>> my_dict = {1: 'Dog', 2: 'Cat', 3: 'Python'} >>> . nếu my_dict [num] == animal] [[1, 'chó'], [2, 'cat'], [3, 'python']]]]]]

Điều này dễ đọc hơn phiên bản một lớp lót. Danh sách sự hiểu biết rất thú vị để viết, nhưng chúng có thể khó gỡ lỗi hoặc tự làm lại. Luôn luôn chắc chắn đặt tên tốt cho các biến bên trong của toàn bộ danh sách. Nếu sự hiểu biết trở nên quá phức tạp, có lẽ sẽ tốt hơn nếu chia nó thành một vòng thực tế.

Tổ chức danh sách lồng nhau Bạn cũng có thể làm tổ trong danh sách toàn bộ danh sách bên trong nhau. Đối với hầu hết các phần, điều này không được khuyến khích. Nếu bạn tìm kiếm trên Internet, bạn sẽ thấy rằng trường hợp sử dụng phổ biến nhất cho sự hiểu biết của danh sách làm tổ là dành cho Matrix Math. Một ma trận thường được biểu diễn dưới dạng danh sách các danh sách trong đó các danh sách nội bộ chứa số nguyên hoặc phao. Chúng ta hãy xem một ví dụ về điều đó: 1 >>> ma trận = [[9, 8, 7], [6, 5, 4], [3, 2, 1]] 2 >>> [[Phần tử * 2 cho phần tử theo hàng] cho hàng trong ma trận] 3 [[18, 16, 14], [12, 10, 8], [6, 4, 2]]]]

Ma trận này có ba danh sách trong đó. Những danh sách nội bộ này có thể được coi là hàng. Tiếp theo, bạn tạo một danh sách hiểu biết được lặp lại trên từng phần tử theo một hàng và nhân phần tử đó với 2. Sau đó, trong phần bên ngoài của danh sách hiểu, bạn sẽ lặp qua mỗi hàng trong chính ma trận. Nếu bạn có cơ hội, bạn nên kiểm tra tài liệu Python về sự hiểu biết danh sách. Nó có một số ví dụ thú vị khác trong đó rất đáng để bạn dành thời gian.

Trình bày từ điển Trolutions từ điển ban đầu được tạo ra trong Python 3.0, nhưng sau đó chúng được đưa vào Python 2.7. Bạn có thể đọc tất cả về họ trong đề xuất tăng cường Python 274 [PEP 274], đi sâu vào tất cả các chi tiết về cách họ làm việc. Cú pháp để hiểu từ điển khá giống với khả năng hiểu danh sách. Thay vì dấu ngoặc vuông, bạn sử dụng niềng răng xoăn. Bên trong niềng răng, bạn có một khóa: biểu thức giá trị theo sau là vòng lặp cho chính nó có thể được theo sau bởi bổ sung nếu hoặc cho các mệnh đề. Bạn có thể viết một từ điển hiểu như thế này: 1 >>> {khóa: giá trị cho khóa, giá trị trong liệt kê ['abcde']} 2 {0: 'a', 1: 'b', 2: 'c', 3 : 'd', 4: 'e'}

Trong ví dụ này, bạn tạo một cặp khóa: giá trị cho mọi khóa và giá trị được trả về từ Enumerate. Hàm liệt kê trả về số lượng hiện tại [bắt đầu từ 0] và mục hiện tại khi nó lặp lại cấu trúc dữ liệu. Bạn có thể đã giành được sự hiểu biết từ điển thường xuyên như bạn sẽ liệt kê các toàn diện, vì danh sách này phổ biến hơn nhiều như các cấu trúc dữ liệu tạm thời. Bạn cũng phải cẩn thận khi bạn tạo ra một sự hiểu biết từ điển vì các phím phải có thể băm. Nếu họ aren, bạn sẽ nhận được một ngoại lệ. Sự hiểu biết từ điển cũng hỗ trợ bằng cách sử dụng các câu lệnh có điều kiện cho các bộ lọc. Hãy thử một lần thử đó!

Đặt sự hiểu biết mà bạn đã học về các bộ trở lại trong Chương 8. Chúng rất hữu ích cho việc tạo các bộ sưu tập có chứa một nhóm các yếu tố duy nhất. Bạn có thể tạo một bộ bằng cách sử dụng một bộ hiểu. Để tạo ra một sự hiểu biết thiết lập, bạn sẽ cần sử dụng niềng răng xoăn và lặp qua một bộ sưu tập. Trên thực tế, cú pháp cho một sự hiểu biết được thiết lập phù hợp hoàn toàn với một danh sách hiểu ngoại trừ việc thiết lập toàn bộ việc sử dụng niềng răng xoăn thay vì dấu ngoặc vuông. Hãy để xem: 1 2 3 4 5 6

>>> my_list = list ['aaabbcde'] >>> my_list ['a', 'a', 'a', 'b', 'b', 'c', 'd', 'e'] >> >> > my_set = {item cho mục trong my_list} >>> my_set {'d', 'e', ​​'c', 'b', 'a'}

Set comprehensions are pretty straightforward. Here you loop over each item in the list and put it into a set. Then you print out the set to verify that the elements were deduped.

Wrapping Up This chapter covered Python’s comprehension syntax. You can create lists, dictionaries, and sets using comprehensions. Comprehensions can be used to filter collections. In general, a comprehension is a one line for loop that returns a data structure. List comprehensions are the most common type of comprehension. With a little practice, you will not only be able to write your own comprehensions, but you’ll be able to read and understand others too!

Review Questions 1. How do you create a list comprehension? 2. What is a good use case for a list comprehension? 3. Create a dictionary using a dict comprehension 4. Create a set using a set comprehension

Chapter 14 - Exception Handling Creating software is hard work. To make your software better, your application needs to keep working even when the unexpected happens. For example, let’s say your application needs to pull information down from the Internet. What happens if the person using your application loses their Internet connectivity? Another common issue is what to do if the user enters invalid input. Or tries to open a file that your application doesn’t support. All of these cases can be handled using Python’s built-in exception handling capabilities, which are commonly referred to as the try and except statements. In this chapter you will learn about: Common exceptions Handling exceptions Raising exceptions Examining exception objects Using the finally statement Using the else statement Let’s get starting by learning about some of the most common exceptions.

The Most Common Exceptions Python supports lots of different exceptions. Here is a short list of the ones that you are likely to see when you first begin using the language: Exception - The base exception that all the others are based on AttributeError - Raised when an attribute reference or assignment

fails. - Raised when an import statement fails to find the module definition or when a from … import fails to find a name that is to be imported. ModuleNotFoundError - A subclass of ImportError which is raised by import when a module could not be located IndexError - Raised when a sequence subscript is out of range. KeyError - Raised when a mapping [dictionary] key is not found in the set of existing keys. KeyboardInterrupt - Raised when the user hits the interrupt key [normally Control-C or Delete]. NameError - Raised when a local or global name is not found. OSError - Raised when a function returns a system-related error. RuntimeError- Raised when an error is detected that doesn’t fall in any of the other categories. SyntaxError - Raised when the parser encounters a syntax error. TypeError - Raised when an operation or function is applied to an object of inappropriate type. The associated value is a string giving details about the type mismatch. ValueError - Raised when a built-in operation or function receives an argument that has the right type but an inappropriate value, and the situation is not described by a more precise exception such as IndexError. ZeroDivisionError - Raised when the second argument of a division or modulo operation is zero. ImportError

For a full listing of the built-in exceptions, you can check out the Python documentation here: //docs.python.org/3/library/exceptions.html.

Now let’s find out how you can actually handle an exception when one occurs.

Handling Exceptions Python comes with a special syntax that you can use to catch an exception. It is known as the try/except statement. This is the basic form that you will use to catch an exception: 1 try: 2 # Code that may raise an exception goes here 3 except ImportError: 4 # Code that is executed when an exception occurs

You put code that you expect might have an issue inside the try block. This might be code that opens a file or code that gets input from the user. The second block is known as the except block. In the above example the except block will only get executed if an ImportError is raised. When you write the except without specifying the exception type, it is known as a bare exception. These are not recommended: 1 try: 2 with open['example.txt'] as file_handler: 3 for line in file_handler: 4 print[line] 5 except: 6 print['An error occurred']

The reason it is bad practice to create a bare except is that you don’t know what types of exceptions you are catching, nor exactly where they are occurring. This can make figuring out what you did wrong more difficult. If you narrow the exception types down to the ones you know how to deal with, then the unexpected ones will actually make your application crash with a useful message. At that point, you can decide if you want to catch that other exception or not. Let’s say you want to catch multiple exceptions. Here is one way to do that: 1 try: 2 with open['example.txt'] as file_handler: 3 for line in file_handler: 4 print[line] 5 import something 6 except OSError: 7 print['An error occurred']

8 Ngoại trừ Bộ nhập khẩu: 9 In ['Nhập không xác định!']

Trình xử lý ngoại lệ này sẽ bắt được hai loại ngoại lệ: Oserror và Irtunterror. Nếu một loại ngoại lệ khác xảy ra, người xử lý này đã giành được nó và mã của bạn sẽ dừng lại. Bạn có thể viết lại mã ở trên để đơn giản hơn một chút bằng cách thực hiện điều này: 1 Hãy thử: 2 với Open ['example.txt'] dưới dạng file_handler: 3 cho dòng trong file_handler: 4 in [dòng] IrtUterror]: 7 in ['Đã xảy ra lỗi']

Tất nhiên, bằng cách tạo ra một bộ ngoại lệ, điều này sẽ làm xáo trộn ngoại lệ nào đã xảy ra. Nói cách khác, mã này làm cho khó khăn hơn để biết vấn đề thực sự đã xảy ra.

Tăng ngoại lệ Bạn làm gì sau khi bắt được một ngoại lệ? Bạn có một cặp đôi tùy chọn. Bạn có thể in ra một tin nhắn như bạn đã có trong các ví dụ trước. Bạn cũng có thể đăng nhập thông báo vào tệp nhật ký để gỡ lỗi sau. Hoặc, nếu ngoại lệ là một ngoại lệ mà bạn biết cần phải dừng việc thực hiện ứng dụng của mình, bạn có thể ghi lại ngoại lệ-có thể thêm nhiều thông tin vào nó. Tăng một ngoại lệ là quá trình buộc một ngoại lệ xảy ra. Bạn nêu ra các trường hợp ngoại lệ trong các trường hợp đặc biệt. Ví dụ: nếu một tệp bạn cần truy cập được tìm thấy trên máy tính, bạn có thể nêu ra một ngoại lệ. Bạn có thể sử dụng câu lệnh RAISE tích hợp Python, để nêu ra một ngoại lệ: 1 Thử: 2 RAISE INTERRROR 3 Ngoại trừ Bộ nhập khẩu: 4 in ['Caught An Consultror']]

Khi bạn nêu ra một ngoại lệ, bạn có thể in nó ra một tin nhắn tùy chỉnh: 1 >>> Nâng cao ngoại lệ ['Một cái gì đó xấu đã xảy ra!'] 2 Traceback [cuộc gọi gần đây nhất] .Exception: Một cái gì đó xấu đã xảy ra!

Nếu bạn không cung cấp một tin nhắn, thì ngoại lệ sẽ trông như thế này: 1 >>> Tăng ngoại lệ 2 Traceback [cuộc gọi gần đây nhất cuối cùng]: 3 Python Shell, Prompt 2, Line 1 4 Buildins.exception:

Bây giờ, hãy để tìm hiểu về đối tượng ngoại lệ!

Kiểm tra đối tượng ngoại lệ khi xảy ra ngoại lệ, Python sẽ tạo ra một đối tượng ngoại lệ. Bạn có thể kiểm tra đối tượng ngoại lệ bằng cách gán nó cho một biến bằng cách sử dụng câu lệnh AS: 1 2 3 4 5 6 7 8 9 10

>>> thử: ... nâng cao nhà nhập khẩu ['nhập xấu'] ... ngoại trừ IrtUterror là lỗi: ... in [loại [lỗi]] ... in [error.args] ... in [lỗi] ...

['Nhập tệ',] nhập khẩu xấu

Trong ví dụ này, bạn đã gán cho đối tượng nhập khẩu cho lỗi. Bây giờ bạn có thể sử dụng hàm python loại [] để tìm hiểu loại ngoại lệ của nó. Điều này sẽ cho phép bạn giải quyết vấn đề được đề cập trước đó trong chương này khi bạn có một loạt các trường hợp ngoại lệ nhưng bạn có thể ngay lập tức biết ngoại lệ nào bạn đã bắt được. Nếu bạn muốn đi sâu hơn nữa vào các ngoại lệ gỡ lỗi, bạn nên tìm kiếm mô -đun Traceback Python.

Sử dụng câu lệnh cuối cùng có nhiều hơn để thử/ngoại trừ câu lệnh hơn là chỉ thử và ngoại trừ. Bạn cũng có thể thêm một câu lệnh cuối cùng. Câu lệnh cuối cùng là một khối mã sẽ luôn được chạy ngay cả khi có một ngoại lệ được nêu ra bên trong phần thử. Bạn có thể sử dụng câu lệnh cuối cùng để dọn dẹp. Ví dụ: bạn có thể cần đóng kết nối cơ sở dữ liệu hoặc xử lý tệp. Để làm điều đó, bạn có thể bọc mã trong một thử/ngoại trừ/cuối cùng là câu lệnh. Hãy nhìn vào một ví dụ giả tạo: 1 2 3 4 5 6 7 8 9

>>> thử: ... 1/0 ... ngoại trừ ZerodivisionError: ... in ['bạn không thể chia cho số không!'] ... cuối cùng: ... in ['dọn dẹp'] ... Bạn không thể chia cho 0! Dọn dẹp

Ví dụ này cho thấy cách bạn có thể xử lý ngoại lệ ZerodivisionError cũng như thêm mã Clean Up. Bạn cũng có thể bỏ qua hoàn toàn câu lệnh ngoại trừ và tạo thử/cuối cùng thay vào đó: 1 2 3 4 5 6 7 8 9

>>> Hãy thử: ... 1/0 ... Cuối cùng: ... In ['Dọn dẹp'] ... Làm sạch Traceback [cuộc gọi gần đây nhất] : chia cho số không

Lần này, bạn không xử lý ngoại lệ ZerodivisionError, nhưng dù sao thì Khối mã cuối cùng của câu lệnh đã chạy.

Sử dụng câu lệnh khác Có một câu lệnh khác mà bạn có thể sử dụng với xử lý ngoại lệ Python và đó là tuyên bố khác. Bạn có thể sử dụng câu lệnh khác để thực thi mã khi không có ngoại lệ. Đây là một ví dụ: 1 2 3 4 5 6 7 8 9

>>> thử: ... in ['đây là khối thử'] ... ngoại trừ ioerror: ... in ['một ioerror đã xảy ra'] ... khác: ... in ['đây là Khối khác '] ... Đây là khối thử Đây là khối khác

Trong mã này, không có ngoại lệ nào xảy ra, vì vậy khối thử và cả hai chặn cả hai đều chạy. Hãy thử nâng một ioerror và xem điều gì sẽ xảy ra: 1 2 3 4 5 6 7 8 9

>>> thử: ... nâng ioerror ... in ['Đây là khối thử'] ... ngoại trừ ioerror: ... in ['một ioerror đã xảy ra'] ... khác: ... in ['Đây là khối khác'] ... một ioerror đã xảy ra

Vì một ngoại lệ đã được nâng lên, chỉ có thử và các khối ngoại trừ chạy. Lưu ý rằng khối thử dừng chạy tại câu lệnh RAISE. Nó không bao giờ đạt đến hàm in []. Khi một ngoại lệ được nâng lên, tất cả các mã sau được bỏ qua và bạn đi thẳng vào mã xử lý ngoại lệ.

Kết thúc bây giờ bạn biết những điều cơ bản của việc sử dụng xử lý ngoại lệ tích hợp Python. Trong chương này, bạn đã tìm hiểu về các chủ đề sau: Các ngoại lệ phổ biến xử lý các ngoại lệ Tăng cường ngoại lệ Kiểm tra các đối tượng ngoại lệ bằng cách sử dụng câu lệnh cuối cùng bằng cách sử dụng câu lệnh khác Học cách bắt các ngoại lệ thực hành một cách hiệu quả. Một khi bạn đã học được cách nắm bắt các ngoại lệ, bạn sẽ có thể làm cứng mã của mình và làm cho nó hoạt động theo cách đẹp hơn nhiều ngay cả khi điều bất ngờ xảy ra. Khi bạn đã tìm hiểu về các lớp trong Chương 18, bạn sẽ có thể tạo các ngoại lệ tùy chỉnh của riêng mình nếu bạn muốn.

Đánh giá câu hỏi 1. Một vài ngoại lệ phổ biến là gì? 2. Làm thế nào để bạn bắt được một ngoại lệ trong Python? 3. Bạn cần làm gì để tăng lỗi thời gian chạy? 4. Tuyên bố cuối cùng là gì? 5. Câu lệnh khác được sử dụng với một trình xử lý ngoại lệ như thế nào?

Chương 15 - Làm việc với các tập tin, các nhà phát triển ứng dụng luôn làm việc với các tệp. Bạn tạo chúng bất cứ khi nào bạn viết một tập lệnh hoặc ứng dụng mới. Bạn viết báo cáo trong Microsoft Word, bạn lưu email hoặc tải sách hoặc nhạc. Các tập tin ở khắp mọi nơi. Trình duyệt web của bạn tải xuống rất nhiều tệp nhỏ để làm cho trải nghiệm duyệt của bạn nhanh hơn. Khi bạn viết các chương trình, bạn phải tương tác với các tệp đã có từ trước hoặc tự viết tệp. Python cung cấp một hàm đẹp, tích hợp gọi là Open [] có thể giúp bạn thực hiện các nhiệm vụ này. Trong chương này, bạn sẽ tìm hiểu cách: Mở tệp Đọc tệp Viết tệp nối vào các tệp, hãy bắt đầu!

Hàm Open [] Bạn có thể mở một tệp để đọc, viết hoặc nối thêm. Để mở một tệp, bạn có thể sử dụng hàm Open-in [] tích hợp. Đây là hàm mở [] đối số và mặc định: 1 mở [file, mode = 'r', buffering = -1, mã hóa = none, error = none, newLine = none

Khi bạn mở một tệp, bạn được yêu cầu truyền trong một tên tệp hoặc đường dẫn tệp. Mặc định khi mở một tệp là mở nó ở chế độ chỉ đọc, đó là ý nghĩa của ’r. Bảng sau đây đi qua các chế độ khác có thể được sử dụng khi mở một tệp: ký tự ’r,‘ w, ’a

Có nghĩa là mở tệp để đọc [mặc định] Mở để viết. Nếu tệp tồn tại, thay thế nội dung của nó mở để viết. Nếu tệp tồn tại, việc kết thúc chế độ văn bản chế độ nhị phân [mặc định] đọc và ghi

Bạn sẽ tập trung vào việc đọc, viết và nối tiếp trong chương này. Nếu bạn cần mã hóa tệp của mình ở một định dạng cụ thể, chẳng hạn như UTF-8, bạn có thể đặt nó thông qua tham số mã hóa. Xem tài liệu để biết danh sách đầy đủ các loại mã hóa mà Python hỗ trợ. Có hai phương pháp chính được sử dụng để mở một tệp. Bạn có thể làm một cái gì đó như thế này: 1 file_handler = open ['example.txt'] 2 # làm gì đó với tệp 3 file_handler.close []

Ở đây bạn mở tập tin và bạn đóng nó. Nhưng điều gì xảy ra nếu một ngoại lệ xảy ra khi bạn cố gắng mở tệp? Ví dụ, hãy để nói rằng bạn đã cố gắng mở một tệp không tồn tại. Hoặc bạn đã mở một tập tin, nhưng bạn có thể viết cho nó. Những điều này xảy ra và chúng có thể khiến một tay cầm tệp bị mở và không đóng đúng. Một giải pháp là sử dụng thử/Cuối cùng: 1 Hãy thử: 2 file_handler = open ['example.txt'] 3 Ngoại trừ: 4 # bỏ qua lỗi, in cảnh báo hoặc đăng nhập ngoại lệ 5 Pass 6 Cuối cùng: 7 file_handler.close [ ]

Tuy nhiên, cách tốt nhất để mở một tệp trong Python là sử dụng Python, đặc biệt với câu lệnh. Tuyên bố kích hoạt những gì được gọi là Trình quản lý ngữ cảnh. Các nhà quản lý bối cảnh được sử dụng khi bạn muốn thiết lập một cái gì đó và xé nát một cái gì đó. Trong ví dụ này, bạn muốn mở một tệp, làm một cái gì đó và sau đó đóng tệp. Các nhà phát triển cốt lõi của Python đã mở [] thành một người quản lý bối cảnh. Điều đó có nghĩa là bạn cũng có thể mở một tệp như thế này: 1 với Open ['example.txt'] dưới dạng file_handler: 2 # làm gì đó với trình xử lý ở đây 3 data = file_handler.read []

Những gì nó làm là nó mở tệp và gán đối tượng tệp cho file_handler. Sau đó, bất kỳ mã nào được thụt vào bên trong câu lệnh với câu lệnh được coi là một phần của bối cảnh. Đó là nơi bạn sẽ tương tác với trình xử lý tệp, cho dù đó là đọc hay ghi vào tệp. Sau đó, khi bạn thoát ra khỏi câu lệnh, nó sẽ tự động đóng tệp. Nó giống như có một tuyên bố cuối cùng được tích hợp! Bây giờ bạn đã biết cách mở một tập tin, hãy để Lừa di chuyển và tìm hiểu cách đọc một tệp với Python.

Đọc các tệp đọc các tệp với ngôn ngữ lập trình Python khá đơn giản. Trên thực tế, khi bạn mở một tệp và don lồng đặt đối số chế độ, mặc định là mở tệp trong chế độ chỉ đọc trên mạng. Dưới đây là một ví dụ: 1 với Open ['example.txt'] dưới dạng file_handler: 2 cho dòng trong file_handler: 3 in [dòng]

Mã này sẽ mở tệp văn bản và sau đó lặp qua từng dòng trong tệp và in nó ra. Có, File_Handler có thể được lặp lại bằng cách sử dụng Python, cho vòng lặp, rất tiện dụng. Trên thực tế, đây thực sự là một trong những phương pháp được đề xuất để đọc một tệp khi bạn đang đọc nó trong các đoạn để bạn giành được bộ nhớ chạy ra khỏi bộ nhớ. Một cách khác để lặp qua các dòng trong một tệp sẽ là thực hiện như sau: 1 với Open ['example.txt'] dưới dạng file_handler: 2 dòng = file_handler.readLines [] 3 cho dòng trong dòng: 4 in [dòng ]

Nếu bạn đi theo tuyến đường này, thì bạn chỉ cần đọc toàn bộ tệp vào bộ nhớ. Tùy thuộc vào số lượng RAM của máy bạn có trong đó, bạn có thể hết bộ nhớ. Đây là lý do tại sao phương pháp đầu tiên được khuyến nghị. Tuy nhiên, nếu bạn biết tệp khá nhỏ, có một cách khác để đọc toàn bộ tệp vào bộ nhớ: 1 với Open ['example.txt'] dưới dạng file_handler: 2 file_contents = file_handler.read []

Phương thức Read [] sẽ đọc toàn bộ tệp vào bộ nhớ và gán nó cho biến của bạn.

Thỉnh thoảng bạn có thể muốn đọc một tệp trong các khối nhỏ hơn hoặc lớn hơn. Điều này có thể được thực hiện bằng cách chỉ định kích thước tính bằng byte để đọc []. Bạn có thể sử dụng vòng lặp thời gian cho điều này: 1 trong khi đúng: 2 với Open ['example.txt'] dưới dạng file_handler: 3 data = file_handler.read [1024] 4 nếu không dữ liệu: 5 break 6 in [dữ liệu]

Trong ví dụ này, bạn đã đọc 1024 byte cùng một lúc. Khi bạn gọi Read [] và nó trả về một chuỗi trống, thì vòng lặp trong khi sẽ dừng vì câu lệnh Break sẽ được thực thi.

Đọc các tệp nhị phân Đôi khi bạn sẽ cần đọc một tệp nhị phân. Python cũng có thể làm điều đó bằng cách kết hợp chế độ R với B: 1 với Open ['example.pdf', 'rb'] dưới dạng file_handler: 2 file_contents = file_handler.read []

Lưu ý đối số thứ hai để mở [] là RB. Điều đó bảo Python mở tệp ở chế độ nhị phân chỉ đọc. Nếu bạn đã in ra File_Contents, bạn sẽ thấy số tiền cho vô nghĩa vì hầu hết các tài liệu nhị phân không thể đọc được của con người.

Viết các tập tin viết một tệp mới bằng Python sử dụng khá nhiều cú pháp chính xác như đọc. Nhưng thay vì đặt chế độ thành R, bạn đặt nó thành W cho chế độ ghi. Nếu bạn cần viết ở chế độ nhị phân, thì bạn sẽ mở tệp ở chế độ WB. Cảnh báo: Khi sử dụng các chế độ W và WB, nếu tệp đã tồn tại, bạn sẽ kết thúc việc ghi đè nó. Python không cảnh báo bạn bằng mọi cách. Python cung cấp một cách để kiểm tra sự tồn tại của tệp bằng cách sử dụng mô -đun HĐH thông qua OS.Path.Exists []. Xem tài liệu Python sườn để biết thêm chi tiết. Hãy để viết một dòng văn bản duy nhất vào một tệp: 1 >>> với Open ['example.txt', 'w'] dưới dạng file_handler: 2 ... file_handler.write ['Đây là một bài kiểm tra']

Điều này sẽ viết một dòng văn bản duy nhất vào một tệp. Nếu bạn viết thêm văn bản, nó sẽ được viết ngay bên cạnh văn bản trước đó. Vì vậy, nếu bạn cần thêm một dòng mới, thì bạn sẽ cần viết một dòng bằng \ n. Để xác minh rằng điều này đã hoạt động, bạn có thể đọc tệp và in nội dung của nó: 1 2 3 4

>>> với Open ['example.txt'] dưới dạng file_handler: ... in [file_handler.read []] ... Đây là một bài kiểm tra

Nếu bạn cần viết nhiều dòng cùng một lúc, bạn có thể sử dụng phương thức writeLines [], chấp nhận một chuỗi các chuỗi. Bạn có thể sử dụng một danh sách các chuỗi và chuyển chúng cho writeLines [], ví dụ.

Tìm kiếm trong một tệp, trình xử lý tệp cũng cung cấp một phương pháp khác đáng được đề cập. Phương thức đó là Seek [] mà bạn có thể sử dụng để thay đổi vị trí đối tượng tệp. Nói cách khác, bạn có thể nói Python ở đâu trong tệp để bắt đầu đọc từ đó. Phương thức Seek [] chấp nhận hai đối số: bù đắp từ đâu

- Một số byte từ đâu - điểm tham chiếu

Bạn có thể đặt từ một trong ba giá trị sau: 0 - Phần đầu của tệp [mặc định] 1 - Vị trí tệp hiện tại 2 - Phần cuối của tệp Hãy sử dụng tệp mà bạn đã viết trước đó trong chương để ví dụ: 1 2 3 4 5 6

>>> với Open ['example.txt'] dưới dạng file_handler: ... file_handler.seek [4] ... chunk = file_handler.read [] ... print [chunk] ... là một bài kiểm tra

Ở đây bạn mở tệp ở chế độ chỉ đọc. Sau đó, bạn tìm kiếm vào byte thứ 4 và đọc phần còn lại của tệp vào đoạn biến. Cuối cùng, bạn in ra đoạn và thấy rằng bạn chỉ lấy được một phần của tệp.

Lắp đặt vào các tệp, bạn cũng có thể nối dữ liệu vào tệp đã có từ trước bằng chế độ A, đó là chế độ Phụ lục. Dưới đây là một ví dụ: 1 >>> với Open ['example.txt', 'a'] as file_handler: 2 ... file_handler.write ['Đây là một số văn bản khác']

Nếu tệp tồn tại, điều này sẽ thêm một chuỗi mới vào cuối tệp. Mặt khác, nếu tệp không tồn tại, Python sẽ tạo tệp và thêm dữ liệu này vào đó.

Bắt các ngoại lệ khi bạn đang làm việc với các tệp, đôi khi bạn sẽ gặp lỗi. Ví dụ: bạn có thể không có quyền đúng để tạo hoặc chỉnh sửa tệp. Trong sự kiện đó, Python sẽ nâng một Oserror. Có những lỗi khác đôi khi xảy ra, nhưng đó là trường hợp phổ biến nhất khi làm việc với các tệp. Bạn có thể sử dụng các cơ sở xử lý ngoại lệ của Python để giữ cho chương trình của bạn hoạt động: 1 Hãy thử: 2 với Open ['example.txt'] dưới dạng file_handler: 3 cho dòng trong file_handler: 4 in [dòng] 5 ngoại trừ oserror: 6 in ['một lỗi lỗi đã xảy ra']

Mã này sẽ cố gắng mở một tệp và in nội dung của nó một dòng tại một thời điểm. Nếu một Oserror được nâng lên, bạn sẽ bắt nó với thử/ngoại trừ và in ra một tin nhắn cho người dùng.

Kết thúc bây giờ bạn biết những điều cơ bản của việc làm việc với các tập tin trong Python. Trong chương này, bạn đã học cách mở các tập tin. Sau đó, bạn đã học cách đọc và viết tập tin. Bạn cũng đã học cách tìm kiếm trong một tệp, nối vào một tệp và xử lý các ngoại lệ khi truy cập các tệp. Tại thời điểm này, bạn thực sự chỉ cần thực hành những gì bạn đã học được. Hãy tiếp tục và thử những điều bạn đã học trong chương này và xem những gì bạn có thể tự làm!

Xem lại câu hỏi 1. Làm thế nào để bạn mở một tập tin? 2. Bạn cần làm gì để đọc một tập tin? 3. Viết câu sau vào tệp có tên Test.txt: 1 Con cáo đỏ nhanh đã nhảy qua Python

4. Làm thế nào để bạn nối dữ liệu mới vào một tệp đã tồn tại trước? 5. Bạn cần làm gì để bắt một ngoại lệ tệp?

Chương 16 - Nhập một trong những lợi thế mạnh nhất của Python, so với các ngôn ngữ lập trình khác là thư viện tiêu chuẩn lớn, toàn diện của nó. Thư viện tiêu chuẩn là một tập hợp các mô -đun hoặc thư viện mà bạn có thể nhập vào các ứng dụng của riêng mình để nâng cao các chương trình của mình. Dưới đây chỉ là một vài ví dụ về các mô -đun bạn có thể sử dụng: ArgParse - Tạo giao diện dòng lệnh Email - Tạo, gửi và xử lý đăng nhập email - Tạo nhật ký thời gian chạy của Pathlib thực thi chương trình - hoạt động với tên tệp và quá trình phụ Tương tác với các quy trình khác SYS - Làm việc với các chức năng cụ thể của hệ thống và Urllib thông tin - Làm việc với các URL

Có hàng tá và hàng chục thư viện khác. Bạn có thể thấy một danh sách đầy đủ ở đây: //docs.python.org/3/l Library/index.html Nếu không có thứ gì đó trong thư viện tiêu chuẩn sẽ hoạt động cho Usecase của bạn, bạn thường có thể tìm thấy gói bên thứ 3 răng se. Bạn sẽ tìm hiểu thêm về việc cài đặt các gói của bên thứ 3 trong Chương 20. Trong chương này, bạn sẽ tìm hiểu cách: Sử dụng sử dụng nhập khẩu từ để nhập các bit và mảnh cụ thể sử dụng để cung cấp cho thứ nhập khẩu một tên mới nhập mọi thứ, hãy bắt đầu bằng cách học Làm thế nào để nhập thư viện!

Sử dụng nhập Python có một số cách khác nhau để nhập thư viện. Đơn giản nhất và phổ biến nhất là sử dụng từ khóa nhập, theo sau tên của thư viện bạn muốn nhập. Nhập khẩu thường nên được đặt ở đầu tệp hoặc tập lệnh Python của bạn để tất cả các mã trong chương trình của bạn có quyền truy cập vào thư viện. Chúng ta hãy xem một ví dụ: 1 >>> nhập sys 2 >>> dir [sys] 3 ['__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', 4 '__loader__', ' __package__ ',' __spec__ ',' __stderr__ ', 5' __stdin__ ',' __stdout__ ',' _clear_type_cache ',' 'abiflags', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 8 'buildin_module_names', 'byteorder', 'call_tracing', 'callStats', 9 ' 'exc_info', 10 'excethook', 'exec_prefix', 'thực thi', 'thoát', 'cờ', 11 'float_info', 'float_repr_style', 'get_asyncgen_hooks' , 13 'getDefaultencoding', 'getDlopenFlags', 'getfilesystemencodeerrors', 14 'getfilesystemencoding', 'getProfile', 'getRecursionLimit', 15 'getRefcount', ' hexversion ',' triển khai ',' int_info ',' Intern ',' is_finalizing ', 17' MaxSize ',' Maxunicode ',' Meta_path ',' Modules ',' Path ',' Path_hooks ', 18' Path_Importer_Cache ',' Platform ',' Purfix ',' PS1 ' ps2 ', 19' set_asyncgen_hooks ',' set_coroutine_wrapper ',' setCheckInterval ', 20' setdlopenflags ',' setProfile ',' setRecursionLimit ',' setSwitchInterval ', 21' 'Thread_info', 'Phiên bản', 22 'Phiên bản_info', 'Warnoptions']]]

What happened here? When you wrote import sys, it imported Python’s sys module, which is useful for figuring out such things as what arguments were passed to a Python script, adding an audit hook, and more. You can read all the nitty gritty details here: //docs.python.org/3/library/sys.html You used Python’s dir[] command to see what is available to you in the sys library. This is known as introspection in Python, which you will learn more about in chapter 19. A more fun import is one of Python’s Easter eggs:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

>>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. Special cases aren't special enough to break the rules. Although practicality beats purity. Errors should never pass silently. Unless explicitly silenced. In the face of ambiguity, refuse the temptation to guess. There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. Now is better than never. Although never is often better than *right* now. If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea. Namespaces are one honking great idea -- let's do more of those!

When you run that code, it prints out the “Zen of Python”, which is a fun little set of “rules” that describe the “best” way to write Python. You can also import multiple libraries in one line of code: 1 >>> import math, os

This is usually discouraged, but it is certainly allowed. If you want to follow Python’s style guide, PEP8, then you really shouldn’t do this. But if it is okay with your organization, then it’s up to you. Just be consistent! Once you have imported a library, you can call its functions and classes. For example: 1 >>> import math 2 >>> math.sqrt[4] 3 2.0

Here you called the sqrt[] function that was in the math module to get the square root of 4. Sometimes you may want to import just bits and pieces from a module. Let’s find out how to do that next!

Using from to Import Specific Bits & Pieces There are times when it is nice to import parts of a library. Python supports this using the following syntax: 1 from module import function

You can import functions, classes, and variables from a module. Let’s look at a more realistic example: 1 >>> from math import sqrt

Here you are importing the sqrt[] [square root] function from the math module. You can also import multiple items from a module: 1 from math import sin, cos, tan

In this example, you import the sin[], cos[], and tan[] functions, which are used for find the sine, cosine and tangent of an angle. Besides importing individual functions, you can also import anything else in that module: variables enumerations classes sub-modules For example, the http module has [sub-]modules of its own: 1 2 3 4 5 6

>>> import http >>> type[http]

>>> from http import client >>> type[client]

When you use many functions from a module, it can be helpful if that module has a shorter name. Let’s find out how to do that!

Using as to assign a new name You can use as to assign a different name for things you import. For example, if you are using many math functions and don’t want to have to type math many times, you can do this: 1 >>> import math as m 2 >>> m.sqrt[4] 3 2.0

Likewise, if you would rather have sine, cosine, and tangent spelled out, you would do the following: 1 >>> from math import sin as sine, cos as cosine, tan as tangent 2 >>> sine[90] 3 0.8939966636005579

Python also supports importing everything at once. Let’s find out how!

Importing Everything You can import all the functions and variables in one go as well. However, you really shouldn’t do this. The reason is that when you import everything, you don’t always know what you import. This can cause namespace contamination, which is a fancy term for importing a function or variable and then accidentally re-using one of those names yourself, or overwriting one of your own previously imported functions. Let’s look at a simple example: 1 2 3 4 5 6

>>> from math import * >>> tan = 5 >>> tan[10] Traceback [most recent call last]: Python Shell, prompt 10, line 1 builtins.TypeError: 'int' object is not callable

Here you import everything from the math library via the * wildcard. The asterisk tells Python to import everything in the module. Then you decide to create a variable called tan. What you may not realize is that you imported tan from the math module. If you try to call the tan function, you’ll get a TypeError because you overwrote the tan function with your own variable, tan. This is known as shadowing. The only time from ... import * is acceptable is when the module is specifically designed to support it. Overall, though, it is recommended that you avoid importing everything using the wildcard because it can make debugging issues like this very difficult. One of the few examples that you will find in Python where importing everything is done often is with the Tkinter library. Tkinter is a built-in cross-platform GUI library for Python that you can use to create desktop applications. The variables, functions, and classes that you import from Tkinter are fairly unusual, so the likelihood of you accidentally overwriting / shadowing one of them is low. However it is still not recommended even in this case.

Kết thúc Python có một thư viện tiêu chuẩn tuyệt vời mà bạn có thể sử dụng để xây dựng tất cả các loại ứng dụng thú vị. Trong chương này, bạn đã học cách nhập chúng vào mã của riêng bạn. Sau khi được nhập, bạn đã học được những điều cơ bản về việc truy cập các chức năng và biến có trong mã mới được nhập. Bạn cũng đã học cách nhập các bộ phận của thư viện cũng như cách nhập mọi thứ. Có rất nhiều thứ để nhập khẩu hơn những gì được đề cập trong cuốn sách này. Bạn có thể muốn xem phần tiếp theo của tôi trong cuốn sách này, Python 201: Python trung gian bao gồm nhiều hơn về nhập khẩu cũng như thư viện nhập khẩu, cho phép bạn làm rất nhiều điều thú vị khác khi nhập.

Xem lại câu hỏi 1. Làm thế nào để bạn bao gồm thư viện toán học từ thư viện tiêu chuẩn Python trong mã của bạn? 2. Làm thế nào để bạn bao gồm COS từ thư viện toán học trong mã của riêng bạn? 3. Làm thế nào để bạn nhập một mô -đun/chức năng/vv. với một cái tên khác? 4. Python có cú pháp đặc biệt mà bạn có thể sử dụng để bao gồm mọi thứ. Nó là gì?

Chương 17 - Chức năng chức năng là các đoạn mã có thể tái sử dụng. Bất cứ khi nào bạn thấy mình viết cùng một mã hai lần, mã đó có thể sẽ đi trong một hàm. Bạn đã thực sự sử dụng một số chức năng trong các chương trước. Ví dụ, Python có nhiều chức năng tích hợp, chẳng hạn như dir [] và sum []. Bạn cũng đã nhập mô -đun toán học và sử dụng hàm gốc của nó, sqrt []. Trong chương này, bạn sẽ tìm hiểu về: Tạo một hàm gọi một hàm truyền các đối số Loại gợi ý các đối số của bạn vượt qua các đối số từ khóa được yêu cầu và các đối số mặc định *args và ** Kwargs Phạm vi đối số chỉ có vị trí cho phép bắt đầu!

Tạo một hàm Một hàm bắt đầu với từ khóa, def theo sau là tên của hàm, hai dấu ngoặc đơn và sau đó là một dấu hai chấm. Tiếp theo, bạn thụt một hoặc nhiều dòng mã trong hàm để tạo thành hàm Khối khối. Đây là một hàm trống: 1 def my_function []: 2 Pass

Khi bạn tạo một hàm, thường nên tên của hàm là tất cả các chữ thường với các từ được phân tách bằng dấu gạch dưới. Đây được gọi là trường hợp rắn. Đèo là một từ khóa trong Python mà Python biết để bỏ qua. Bạn cũng có thể xác định một hàm trống như thế này: 1 def my_function []: 2 ...

Trong ví dụ này, hàm không có nội dung ngoài hình elip. Hãy cùng học cách sử dụng một chức năng tiếp theo!

Gọi một chức năng ngay bây giờ mà bạn có một chức năng, bạn cần phải làm một cái gì đó. Hãy để điều đó trước tiên: 1 def my_function []: 2 in ['Xin chào từ my_function']

Bây giờ thay vì một hình elip hoặc từ khóa, bạn có một chức năng in ra một tin nhắn. Để gọi một hàm, bạn cần viết tên của nó theo sau là dấu ngoặc đơn: 1 2 3 4 5

>>> def my_function []: ... in ['Xin chào từ my_function'] ... >>> my_function [] Xin chào từ my_function

Đó là tốt đẹp và dễ dàng! Bây giờ, hãy để tìm hiểu về việc chuyển các đối số cho các chức năng của bạn.

Truyền các đối số Hầu hết các chức năng cho phép bạn chuyển các đối số cho họ. Lý do cho điều này là bạn thường muốn chuyển một hoặc nhiều đối số vị trí cho một hàm để chức năng có thể làm điều gì đó với chúng. Hãy để tạo ra một chức năng lấy một đối số được gọi là tên và sau đó in ra một thông báo chào mừng: 1 2 3 4 5

>>> def chào mừng [tên]: ... in [f'welcome {name} '] ... >>> Chào mừng [' Mike '] Chào mừng Mike

Nếu bạn đã sử dụng các ngôn ngữ lập trình khác, bạn có thể biết rằng một số trong số chúng yêu cầu các chức năng để trả về một cái gì đó. Python tự động trả về không có nếu bạn không chỉ định giá trị trả về. Hãy để thử gọi gọi chức năng và gán kết quả của nó cho một biến có tên là return_value: 1 2 3 4 5 6 7

>>> def chào mừng [tên]: ... in [f'welcome {name} '] ... >>> return_value = chào mừng bạn

Khi bạn in ra return_value, bạn có thể thấy rằng nó không có.

Loại gợi ý đối số của bạn Một số ngôn ngữ lập trình sử dụng các loại tĩnh để khi bạn biên dịch mã của mình, trình biên dịch sẽ cảnh báo bạn về các lỗi liên quan đến loại. Python là một ngôn ngữ được đánh máy động, do đó, điều đó không xảy ra cho đến khi thời gian chạy, tuy nhiên, trong Python 3.5, mô -đun gõ đã được thêm vào Python để cho phép các nhà phát triển thêm gộp loại vào mã của họ. Điều này cho phép bạn chỉ định các loại đối số và trả về giá trị trong mã của bạn, nhưng không thực thi nó. Bạn có thể sử dụng các tiện ích bên ngoài, chẳng hạn như MyPy [//mypy-lang.org/] để kiểm tra xem cơ sở mã của bạn có tuân theo các gợi ý loại mà bạn đã đặt không. Loại gợi ý là không cần thiết trong Python và nó không được thực thi bởi ngôn ngữ, nhưng nó rất hữu ích khi làm việc với các nhóm nhà phát triển, đặc biệt là khi các đội được tạo thành từ những người không quen thuộc với Python. Hãy để viết lại ví dụ cuối cùng để nó sử dụng loại gợi ý: 1 2 3 4 5 6 7

>>> DEF Chào mừng [Tên: Str] -> Không Không có

Lần này khi bạn đặt vào đối số tên, bạn kết thúc nó bằng một dấu hai chấm [:] theo sau là loại mà bạn mong đợi. Trong trường hợp này, bạn mong đợi một loại chuỗi sẽ được truyền vào. Sau đó, bạn sẽ lưu ý -> none: bit mã. -> là cú pháp đặc biệt để chỉ ra giá trị trả về dự kiến ​​là gì. Đối với mã này, giá trị trả về là không có. Nếu bạn muốn trả về một giá trị rõ ràng, thì bạn có thể sử dụng từ khóa trả về theo sau là những gì bạn muốn trả về. Khi bạn chạy mã, nó sẽ thực thi theo cách tương tự như trước đây. Để chứng minh rằng gợi ý loại không được thực thi, bạn có thể yêu cầu Python trả về một số nguyên bằng cách sử dụng từ khóa trả về:

1 2 3 4 5 6 7 8

>>> def chào mừng [tên: str] -> none: ... in [f'welcome {name} '] ... return 5 ... >>> return_value = chào mừng [' mike '] chào mừng mike >> > in [return_value] 5

Khi bạn chạy mã này, bạn có thể thấy loại gợi ý nói rằng giá trị trả về không có, nhưng bạn đã mã hóa nó sao cho nó trả về số nguyên 5. Python không ném ngoại lệ. Bạn có thể sử dụng công cụ MyPy so với mã này để xác minh rằng nó đang theo kiểu gợi ý loại. Nếu bạn làm như vậy, bạn sẽ thấy rằng nó cho thấy một vấn đề. Bạn sẽ học cách sử dụng MyPy trong Phần II của cuốn sách này. Điều quan trọng chính ở đây là Python hỗ trợ loại gợi ý. Python không thực thi các loại mặc dù. Tuy nhiên, một số biên tập viên Python có thể sử dụng loại gợi ý bên trong để cảnh báo bạn về các vấn đề liên quan đến các loại hoặc bạn có thể sử dụng MyPy theo cách thủ công để tìm sự cố. Bây giờ, hãy để tìm hiểu những gì bạn có thể chuyển đến một chức năng.

Vượt qua các đối số từ khóa Python cũng cho phép bạn vượt qua các đối số từ khóa. Một đối số từ khóa được chỉ định bằng cách truyền trong một đối số được đặt tên, ví dụ: bạn có thể vượt qua trong độ tuổi = 10. Hãy để tạo một ví dụ mới cho thấy một đối số thông thường và một đối số từ khóa duy nhất: 1 2 3 4 5

>>> DEF Chào mừng [Tên: Str, Age: Int = 15] -> Không: ... In [F'welcome {name}. 'Mike'] Chào mừng Mike. Bạn đã 15 tuổi.

Ví dụ này có một đối số thường xuyên, tên và đối số từ khóa, tuổi, được mặc định là 15. Khi bạn gọi mã này mà không chỉ định độ tuổi, bạn thấy rằng nó mặc định là 15. Để làm cho mọi thứ rõ ràng hơn, đây là một cách khác có thể gọi nó: 1 2 3 4 5

>>> def chào mừng [tên: str, tuổi: int] -> none: ... in [f'welcome {name}. bạn {tuổi} tuổi. '] ... >>> chào mừng 12, name = 'Mike'] Chào mừng Mike. Bạn 12 tuổi.

Trong ví dụ này, bạn đã chỉ định cả hai tham số tuổi và tên. Khi bạn làm điều đó, bạn có thể chỉ định chúng theo bất kỳ thứ tự nào. Ví dụ: ở đây bạn đã chỉ định chúng theo thứ tự ngược lại và Python vẫn hiểu ý của bạn vì bạn đã chỉ định cả hai giá trị. Hãy để xem những gì xảy ra khi bạn không sử dụng từ khóa đối số: 1 2 3 4 5

>>> DEF Chào mừng [Tên: Str, Age: Int] -> Không: ... In [F'welcome {name}. 'Mike'] Chào mừng 12. Bạn là Mike năm tuổi.

Khi bạn vượt qua các giá trị mà không cần chỉ định nơi chúng nên đi, chúng sẽ được thông qua theo thứ tự. Vì vậy, tên trở thành 12 và tuổi trở thành 'Mike'.

Đối số yêu cầu và mặc định Đối số mặc định là một cách tiện dụng để làm cho chức năng của bạn có thể gọi được với ít đối số hơn, trong khi các đối số được yêu cầu là các đối số mà bạn phải chuyển vào hàm để hàm thực thi. Hãy xem xét một ví dụ có một đối số bắt buộc và một đối số mặc định: 1 2 3 4 5

>>> def nhân [x: int, y: int = 5] -> int: ... return x * y ... >>> nhân [5] 25

Đối số đầu tiên, x là bắt buộc. Nếu bạn gọi nhân [] mà không có bất kỳ đối số nào, bạn sẽ nhận được lỗi: 1 >>> Nhân [] 2 Traceback [cuộc gọi gần đây nhất] 1 Đối số vị trí bắt buộc: 'X'

Đối số thứ hai y, không cần thiết. Nói cách khác, đó là một đối số mặc định trong đó mặc định là 5. Điều này cho phép bạn gọi nhân [] chỉ bằng một đối số!

*Args và ** kwargs là gì? Hầu hết thời gian, bạn sẽ muốn các chức năng của mình chỉ chấp nhận một số lượng nhỏ các đối số, đối số từ khóa hoặc cả hai. Bạn thường không muốn có quá nhiều đối số vì nó trở nên phức tạp hơn để thay đổi chức năng của bạn sau này. Tuy nhiên, Python không hỗ trợ khái niệm về bất kỳ số lượng đối số hoặc từ khóa nào. Bạn có thể sử dụng cú pháp đặc biệt này trong các chức năng của mình: *args - một số lượng đối số tùy ý ** kwargs - một số từ khóa tùy ý

tranh luận

Một chút mà bạn cần chú ý là *và **. Tên, Arg hoặc Kwarg có thể là bất cứ điều gì, nhưng đó là một quy ước để đặt tên cho họ là Args và Kwargs. Nói cách khác, hầu hết các nhà phát triển Python gọi họ là *args hoặc ** kwargs. Mặc dù bạn không bị buộc phải làm như vậy, có lẽ bạn nên dễ dàng nhận ra và hiểu. Hãy nhìn vào một ví dụ: 1 2 3 4 5 6 7

>>> ... ... >>> [1, >>> [1,

def Any_args [*args]: in [args] any_args [1, 2, 3] 2, 3] any_args [1, 2, 'mike', 4] 2, 'mike', 4]

Tại đây bạn đã tạo bất kỳ_args [] nào chấp nhận bất kỳ số lượng đối số nào bao gồm không và in chúng ra. Bạn thực sự có thể tạo một hàm có đối số bắt buộc cộng với bất kỳ số lượng đối số bổ sung: 1 2 3 4 5

>>> def one_required_arg [bắt buộc, *args]: ... print [f '{yêu cầu =}'] ... in [args] ... >>> one_required_arg ['mike', 1, 2]

6 yêu cầu = 'Mike' 7 [1, 2]

Vì vậy, trong ví dụ này, đối số đầu tiên của bạn là cần thiết. Nếu bạn gọi One_Required_arg [] mà không có bất kỳ đối số nào, bạn sẽ gặp lỗi. Bây giờ chúng ta hãy thử thêm các đối số từ khóa: 1 >>> def any_keyword_args [** kwargs]: 2 ... in [kwargs] 3 ... 4 >>> any_keyword_args [1, 2, 3] Năm

Ối! Bạn đã tạo chức năng để chấp nhận các đối số từ khóa nhưng chỉ được truyền trong các đối số thông thường. Điều này gây ra một kiểu loại được ném. Hãy thử truyền đi trong cùng các giá trị như từ khóa đối số: 1 2 3 4 5

>>> def any_keyword_args [** kwargs]: ... in [kwargs] ... >>> any_keyword_args [một = 1, hai = 2, ba = 3] {'one': 1, 'hai': 2 , 'ba': 3}

Lần này nó hoạt động theo cách bạn mong đợi. Bây giờ, hãy để kiểm tra *args và ** kwargs của chúng tôi và xem chúng là gì: 1 2 3 4 5 6 7

>>> def arg_inspector [*args, ** kwargs]: ... in [f'args thuộc loại {type [args]} '] ... in [f'kwargs thuộc loại {type [kwargs]} '] ... >>> arg_inspector [1, 2, 3, x =' test ', y = 5] args thuộc loại kwargs thuộc loại

Điều này có nghĩa là Args là một tuple và kwargs là một điều kỳ diệu. Hãy xem liệu chúng ta có thể vượt qua chức năng của mình là một tuple và ra lệnh cho *args và ** kwargs: 1 >>> my_tuple = [1, 2, 3] 2 >>> my_dict = {'one': 1, 'hai' : 2}

3 4 5 6 7 8 9 10 11 12

>>> đầu ra def [*args, ** kwargs]: ... print [f '{args =}'] ... print [f '{kwargs =}'] ... >>> in [my_tuple] args = [[1, 2, 3],] kwargs = {} >>> in [my_tuple, my_dict] args = [[1, 2, 3], {'one': 1, 'hai': 2}] kwargs = {}

Vâng, điều đó đã làm việc khá đúng. Cả tuple và dict đã kết thúc trong *args. Không chỉ vậy, mà Tuple vẫn giữ một tuple thay vì bị biến thành ba đối số. Bạn có thể thực hiện công việc này nếu bạn sử dụng cú pháp đặc biệt mặc dù: 1 2 3 4 5 6 7 8 9 10 11 12 13

>>> đầu ra def [*args, ** kwargs]: ... print [f '{args =}'] ... print [f '{kwargs =}'] ... >>> in ] args = [1, 2, 3] kwargs = {} >>> in [** my_dict] args = [] kwargs = {'one': 1, 'hai': 2} >>> ra [*my_tuple, ** my_dict] args = [1, 2, 3] kwargs = {'one': 1, 'hai': 2}

Trong ví dụ này, bạn gọi đầu ra [] với *my_tuple. Python sẽ trích xuất các giá trị riêng lẻ trong tuple và chuyển từng giá trị chúng trong các đối số. Tiếp theo, bạn đã vượt qua ** my_dict, nói với Python sẽ truyền trong từng cặp khóa/giá trị làm đối số từ khóa. Ví dụ cuối cùng vượt qua cả Tuple và Dict. Khá gọn gàng!

Các tham số chỉ có vị trí Python 3.8 đã thêm một tính năng mới vào các hàm được gọi là các tham số chỉ có vị trí. Chúng sử dụng một cú pháp đặc biệt để nói với Python rằng một số tham số phải là vị trí và một số phải là từ khóa. Hãy nhìn vào một ví dụ: 1 2 3 4 5 6 7 8

>>> def vị trí [tên, tuổi, /, a, b, *, khóa]: ... in [tên, tuổi, a, b, key] ... >>> vị trí [tên = 'mike'] Traceback [cuộc gọi gần đây nhất cuối cùng]: Python Shell, Prompt 21, Line 1 Buildins.TypeError: vị trí [] có một số đối số chỉ dành cho vị trí được chuyển làm đối số từ khóa: 'Tên'

Hai tham số đầu tiên, tên và tuổi chỉ dành cho vị trí. Họ có thể được truyền trong các đối số từ khóa, đó là lý do tại sao bạn thấy kiểu mẫu ở trên. Các đối số, A và B có thể là từ khóa hoặc từ khóa. Cuối cùng, khóa, chỉ là từ khóa. Sự chém về phía trước, /, cho thấy Python rằng tất cả các đối số trước khi chém về phía trước là đối số chỉ có vị trí. Bất cứ điều gì theo dấu gạch chéo về phía trước đều là đối số vị trí hoặc từ khóa cho đến th *. Dấu hoa thị chỉ ra rằng mọi thứ theo nó dưới dạng đối số chỉ từ khóa. Đây là một cách hợp lệ để gọi hàm: 1 >>> vị trí ['mike', 17, 2, b = 3, từ khóa = 'kiểm tra'] 2 mike 17 2 3 kiểm tra

Tuy nhiên, nếu bạn cố gắng vượt qua chỉ trong các đối số vị trí, bạn sẽ gặp lỗi: 1 >>> vị trí ['Mike', 17, 2, 3, 'test'] 2 Traceback [cuộc gọi gần đây nhất] Nhắc 25, dòng 1 4 Buildins.TypeError: vị trí [] lấy 4 đối số vị trí nhưng 5 đã được đưa ra

Hàm vị trí [] hy vọng đối số cuối cùng sẽ là một đối số từ khóa.

Ý tưởng chính là các tham số chỉ dành cho vị trí cho phép tên tham số thay đổi mà không phá vỡ mã máy khách. Bạn cũng có thể sử dụng cùng tên cho các đối số chỉ có vị trí và ** kwargs: 1 2 3 4 5 6 7 8 9

>>> def positional[name, age, /, **kwargs]: ... print[f'{name=}'] ... print[f'{age=}'] ... print[f'{kwargs=}'] ... >>> positional['Mike', 17, name='Mack'] name='Mike' age=17 kwargs={'name': 'Mack'}

You can read about the full implementation and reasoning behind the syntax here: //www.python.org/dev/peps/pep-0570 Let’s move on and learn a little about the topic of scope!

Scope All programming languages have the idea of scope. Scope tells the programming language what variables or functions are available to them. Let’s look at an example: 1 2 3 4 5 6 7 8 9 10 11 12

>>> name = 'Mike' >>> def welcome[name]: ... print[f'Welcome {name}'] ... >>> welcome[] Traceback [most recent call last]: Python Shell, prompt 34, line 1 builtins.TypeError: welcome[] missing 1 required positional argument: 'name' >>> welcome['Nick'] Welcome Nick >>> name 'Mike'

The variable name is defined outside of the welcome[] function. If you try to call welcome[] without passing it an argument, it throws an error even though the argument matches the variable name. If you pass in a value to welcome[], that variable is only changed inside of the welcome[] function. The name that you defined outside of the function remains unchanged. Let’s look at an example where you define variables inside of functions: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

>>> def add[]: ... a = 2 ... b = 4 ... return a + b ... >>> def subtract[]: ... a = 3 ... return a - b ... >>> add[] 6 >>> subtract[] Traceback [most recent call last]: Python Shell, prompt 40, line 1 Python Shell, prompt 38, line 3 builtins.NameError: name 'b' is not defined

In add[], you define a and b and add them together. The variables, a and b have local scope. That means they can only be used within the add[] function.

In subtract[], you only define a but try to use b. Python doesn’t check to see if b exists in the subtract[] function until runtime. What this means is that Python does not warn you that you are missing something here until you actually call the subtract[] function. That is why you don’t see any errors until there at the end. Python has a special global keyword that you can use to allow variables to be used across functions. Let’s update the code and see how it works: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

>>> ... ... ... ... ... >>> ... ... ... >>> 6 >>> -1

def add[]: global b a = 2 b = 4 return a + b def subtract[]: a = 3 return a - b add[] subtract[]

This time you define b as global at the beginning of the add[] function. This allows you to use b in subtract[] even though you haven’t defined it there. Globals are usually not recommended. It is easy to overlook them in large code files, which makes tracking down subtle errors difficult – for example, if you had called subtract[] before you called add[] you would still get the error, because even though b is global, it doesn’t exist until add[] has been run. In most cases where you would want to use a global, you can use a class instead. You will learn about classes in the next chapter. There is nothing wrong with using globals as long as you understand what you are doing. They can be helpful at times. But you should use them with care.

Wrapping Up Functions are a very useful way to reuse your code. They can be called repeatedly. Functions allow you to pass and receive data too. In this chapter, you learned about the following topics: Creating a function Calling a function Passing arguments Type hinting your arguments Passing keyword arguments Required and default arguments *args and **kwargs Positional-only arguments Scope You can use functions to keep your code clean and useful. A good function is self-contained and can be used easily by other functions. While it isn’t covered in this chapter, you can nest functions inside of each other. You will learn about one good use-case for that in Part II of the book.

Review Questions 1. How do you create a function that accepts two positional arguments? 2. Create a function named address_builder that accepts the following and add type hints: name [string] address [string] zip code [integer] 3. Using the function from question 2, give the zip code a default of 55555

4. How do you allow an arbitrary number of keyword arguments to be passed to a function? 5. What syntax do you use to force a function to use positional-only parameters?

Chapter 18 - Classes Everything in Python is an object. What that means is that everything you create in Python has functions or attributes or both attached to them that you can use. This is because everything in Python comes from a class. Take a string, for example: 1 >>> name = 'Mike' 2 >>> dir[name] 3 ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', 4 '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', 5 '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', 6 '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', 7 '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', 8 '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 9 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 10 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 11 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 12 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 13 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 14 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 15 'title', 'translate', 'upper', 'zfill']

Có 78 phương pháp và thuộc tính liên quan đến STR trong Python. Bạn đã đề cập đến một số trong số này trở lại trong Chương 9 khi bạn đang tìm hiểu về các chuỗi. Python cũng cho phép bạn tạo các đối tượng tùy chỉnh của riêng mình bằng các lớp. Điều này cho phép bạn tạo các phương thức và thuộc tính của riêng bạn cho đối tượng của mình, vì vậy bạn có thể làm cho mã của bạn làm bất cứ điều gì bạn muốn! Tuy nhiên, lưu ý rằng trong khi Python có hỗ trợ lớp mạnh mẽ, còn được gọi là lập trình hướng đối tượng [OOP], thì nó cũng có thể dễ dàng sử dụng như một ngôn ngữ chức năng [nghĩa là không có lớp nào]. Đó là tùy thuộc vào bạn cách bạn sử dụng Python! Trong chương này bạn sẽ học:

Bản thân tạo lớp - Ý nghĩa của nó và các phương thức / thuộc tính riêng tư và đa hình tạo lớp con, hãy để bắt đầu bằng cách tạo ra một lớp!

Tạo lớp Một lớp là một bản thiết kế mà Python sử dụng để xây dựng đối tượng của bạn. Một ví dụ phổ biến để sử dụng là một quả bóng. Một quả bóng có các thuộc tính sau: Bóng màu trọng lượng kích thước cũng có thể có hành động. Họ có thể làm một cái gì đó. Những hành động đó được gọi là phương thức trong một lớp. Một phương pháp chỉ là một chức năng bên trong một lớp. Các phương pháp bóng điển hình sẽ là: Roll Bounce Toss để tạo một lớp, bạn sẽ cần sử dụng từ khóa tích hợp Python, Lớp: Lớp theo tên của lớp và sau đó là dấu hai chấm. Đó là thông thường để đặt tên cho các lớp bằng cách sử dụng trường hợp lạc đà: MyClass. Ít nhất, lá thư đầu tiên nên được viết hoa. Ở đây, cách bạn tạo ra một lớp bóng trống: 1 Lớp bóng: 2 Pass

Lớp học này không làm bất cứ điều gì. Trong các vòng tròn lập trình, bạn có thể nghe lớp này được gọi là sơ khai. Hãy để viết một lớp có 3 thuộc tính được đề cập trước đó: 1 Lớp bóng: 2 3 def __init __ [bản thân, màu, kích thước, trọng lượng]: 4 "" "Khởi tạo" "" 5 self.color = color

6 7

self.size = size self. weight = trọng lượng

Lớp này có ba đối số để tạo ra nó: trọng lượng kích thước màu

Khi bạn gọi một lớp, bạn đang tạo một thể hiện của lớp đó. Đây là một ví dụ: 1 >>> Lớp bóng: 2 ... 3 ... def __init __ [tự, màu, kích thước, trọng lượng]: 4 ... self.color = color 5 ... self.size = kích thước 6. Beach_ball.color} và nặng {Beach_ball. weight} lb '] 12 quả bóng của tôi có màu đỏ và nặng 1 lb

Để tạo một thể hiện của một quả bóng, bạn gọi nó bằng cách chuyển trong 3 tham số được đề cập trước đó. Điều này hoạt động theo cách chính xác giống như nó đã làm với các chức năng. Tuy nhiên, trong một lớp, bạn có các chức năng được gọi là phương pháp. Sự khác biệt khác là gọi một lớp, bạn thường cần phải có một phương thức đặc biệt gọi là __init__. Đây được gọi là một bộ khởi tạo. Bạn sử dụng __init __ [] để khởi tạo đối tượng đã tạo của bạn. __init __ [] thường chỉ được gọi một lần, khi bạn tạo thể hiện của lớp. Cùng với bộ khởi tạo, __init__, có hàm tạo, __new__. Bạn sẽ hiếm khi, nếu có, cần chỉ định __new__ và chỉ có thể sử dụng mặc định được cung cấp bởi Python. Khi bạn in ra bãi biển_ball, bạn có thể thấy Python nói với bạn rằng đó là một đối tượng bóng, nhưng không nhiều. Bạn sẽ học cách làm cho điều đó hữu ích hơn sau này trong chương. Bạn cũng có thể in ra các thuộc tính bạn đặt, được hiển thị ở trên trong hai dòng mã cuối cùng.

Nếu bạn muốn thêm loại gợi ý vào lớp của mình, đây là cách bạn sẽ làm điều đó: 1 2 3 4 5 6

>>> Lớp bóng: ... ... def __init __ [tự, màu: str, kích thước: float, trọng lượng: float] -> none: ... self.color = color ... self.size = size. .. tự. weight = trọng lượng

Bạn có thể nhận thấy rằng đối số đầu tiên cho __init __ [] là một thứ gọi là bản thân. Hãy cùng tìm hiểu những gì mà về điều đó!

Tìm ra bản thân khi bạn tạo một lớp, bạn cần một cách để theo dõi các trường hợp mà bạn tạo ra. Ví dụ: nếu bạn tạo hai quả bóng với các đặc điểm độc đáo, bạn không muốn đối tượng bóng thứ hai ghi đè lên cái đầu tiên. Các lớp Python sử dụng đối số tự để theo dõi ví dụ nào. Nếu bạn đã lập trình trong Java hoặc ngôn ngữ lập trình giống Java, họ sẽ gọi bản thân của họ đối số này. Điều này dễ hiểu nếu bạn có thể thấy nó trong hành động: 1 2 3 4 5 6 7 8 9 10 11 12

>>> Lớp bóng: ... ... def __init __ [tự, màu: str, kích thước: float, trọng lượng: float] -> none: ... self.color = color ... self.size = size. .. self. weight = trọng lượng >>> bowling_ball = ball ['đen', 6, 12] >>> bãi biển_ball = ball ['đỏ', 12, 1] >>> id [bowling_ball] 4327842432 >>> id [ BEACH_BALL] 4327842576

Cách nhanh nhất để biết nếu bạn ghi đè lên một thể hiện của một lớp là để xem liệu ID thể hiện có khớp hay không. Ở đây nó được chỉ ra rằng các ID khác nhau. Đó là một cách để nói rằng bạn có các đối tượng khác nhau. Một cách dễ dàng khác để nói là truy cập các thuộc tính của lớp: 1 2 3 4

>>>

Bản ngã về cơ bản được thay thế bằng tên của trường hợp. Vì vậy, Bowling_ball là bản thân cho trường hợp đó trong khi Beach_ball là bản thân trong trường hợp riêng của nó. Nói cách khác, bản thân được Python sử dụng để theo dõi ví dụ nào là.

Điều này càng trở nên rõ ràng hơn nếu bạn thêm một phương thức vào lớp. Hãy tạo một tệp có tên Ball.py và thêm mã sau vào nó: 1 # Ball.Py 2 3 Lớp bóng: 4 5 def __init __ [self, color: str, kích thước: float, trọng lượng: float, 6 ball_type: str] -> Không có: 7 self.color = color 8 self.size = size 9 self : 14 in ["Bowling Balls không thể nảy!"] 15 Khác: 16 In [f "The {self.ball_type} Ball đang nảy!"] 17 18 nếu __name__ == "__main__": 19 Ball_one = Ball [' Đen ', 6, 12,' bowling '] 20 Ball_two = Ball [' Red ', 12, 1,' Beach '] 21 22 Ball_one.bounce [] 23 BALL_TWO.BOUND []

Bạn đã thêm một đối số mới vào __init __ [] được gọi là BALL_TYPE để giúp bạn theo dõi loại bóng bạn đang tạo. Bạn cũng đã tạo một phương thức mới, Bounce []. Tiếp theo bạn đã viết một số mã ở phía dưới bên trong một khối trông lạ. Khi bạn muốn chạy mã khi bạn chạy Python Ball.py, bạn nên đặt nó vào bên trong các khối đặc biệt này: 1 nếu __name__ == '__main__': 2 # mã ở đây

Khi bạn chạy trực tiếp một mô -đun, tên của mô -đun được đặt thành __main__. Bạn có thể kiểm tra tên của mô -đun thông qua thuộc tính mô -đun đặc biệt, __name__. Đó là những gì cú pháp đặc biệt này dành cho. Nếu bạn tình cờ nhập tập lệnh Ball.py của mình vào một tập lệnh Python khác, tên sẽ được đặt thành một thứ khác vì nó không còn là mô -đun chính. Hãy để chạy kịch bản này. Mở một thiết bị đầu cuối [hoặc cmd.exe trên Windows] và điều hướng đến thư mục nơi bạn đã lưu Ball.py.

Sau đó chạy lệnh sau: 1 Python Ball.py

Điều này sẽ xuất hiện như sau: 1 quả bóng bowling không thể nảy! 2 Quả bóng bãi biển đang nảy!

Mã của bạn chứng minh rằng Python đang sử dụng bản thân để theo dõi ví dụ bóng nào. Khi bạn gọi Bounce [], bạn sẽ lưu ý rằng bạn có thể kiểm tra phiên bản của Ball Ball_Type bằng cách chờ đợi trước đó với bản thân, trông giống như self.ball_type. Khi bạn gọi phương thức Bounce [] bên ngoài lớp, bạn gọi nó với tên thể hiện. Ví dụ: ball_one.bounce []. Lưu ý rằng từ bản thân chỉ là một quy ước, mặc dù gần như toàn cầu tuân theo. Điều này rất quan trọng vì Python sẽ gán thể hiện cho tham số đầu tiên được đưa ra, cho dù nó được gọi là bản thân, inst, this hay xyz - nói cách khác, nếu bạn quên chỉ định một tham số cho bản thân [hoặc bất kỳ cách viết nào bạn thích] Một số lỗi kỳ lạ.

Các phương thức / thuộc tính công khai và riêng tư Hầu hết các ngôn ngữ lập trình đều có khái niệm công khai và riêng tư. Một thuộc tính hoặc phương thức công khai có thể nhìn thấy cho tất cả Python. Điều đó có nghĩa là khi bạn tạo một thể hiện của một lớp, bạn có thể truy cập tất cả các phương thức công khai của lớp đó. Một phương thức riêng hoặc thuộc tính chỉ có thể được sử dụng trực tiếp trong lớp nơi chúng được xác định. Có một loại thứ ba gọi là bảo vệ. Các phương thức được bảo vệ chỉ có thể được nhìn thấy bên trong lớp mà chúng được xác định trong hoặc trong một lớp phụ [xem phần tiếp theo để biết thêm thông tin về các lớp con]. Python không thực sự có khái niệm riêng tư hoặc được bảo vệ. Mọi thứ đều có hiệu quả trong Python. Tuy nhiên, có một quy ước rằng nếu một cái gì đó nên là riêng tư trong Python, bạn nên bắt đầu phương thức hoặc thuộc tính đó bằng một dấu gạch dưới hoặc kép. Điều này báo hiệu cho các nhà phát triển khác rằng phương pháp hoặc thuộc tính đó nên được coi là một phương pháp riêng tư và không được sử dụng bên ngoài lớp đó. Khi bạn thấy một phương thức hoặc thuộc tính có dấu gạch dưới và kết thúc gấp đôi, chẳng hạn như __init __ [], thì đó được coi là một phương pháp ma thuật của người Hồi giáo. Đôi khi chúng cũng được gọi là các phương pháp của Dunder Dunder, đối với các phương pháp kép. Các phương pháp ma thuật này giúp xác định cách thức hoạt động của mô hình dữ liệu Python. Các lớp học nói chung là nơi bạn sẽ làm việc với khái niệm lập trình hướng đối tượng [OOP]. Khi bạn bắt đầu sử dụng các lớp, bạn đang thực hiện OOP và bạn đang làm việc với mô hình dữ liệu Python. Bạn có thể đọc về các phương thức ma thuật tích hợp Python, sau đây: //docs.python.org/3/reference/datamodel.html Bạn có thể sử dụng các phương thức này để thêm phép thuật vào các lớp của bạn. Ví dụ: bạn có thể tạo các đối tượng có thể làm số học, kiểm tra xem chúng có lớn hơn hoặc ít hơn và nhiều hơn nữa. Bạn nên kiểm tra tài liệu hoặc đi

Đào trên Internet. Có một số hướng dẫn tốt về chủ đề này ngoài kia.

Tạo lớp con Khi bạn có một lớp, bạn có thể tham gia lớp đó và tạo một lớp con. Một lớp con kế thừa các thuộc tính và phương thức của lớp nó dựa trên. Bạn cũng có thể ghi đè các thuộc tính và phương thức của cha mẹ. Điều đó có nghĩa là nếu đứa trẻ có một phương thức hoặc thuộc tính được đặt tên giống như một phương thức/thuộc tính trong cha mẹ, Python sẽ sử dụng trẻ con thay thế. Chúng ta hãy lấy lớp bóng của chúng ta từ trước đó và sử dụng nó làm ví dụ cho lớp con từ: 1 # Ball.py 2 3 Lớp bóng: 4 5 def __init __ [tự, màu: str, kích thước: float, trọng lượng: float, 6 ball_type: str ] -> Không có: 7 self.color = color 8 self.size = size 9 self. weight = trọng lượng 10 self.ball_type = ball_type 11 12 def bounce [self]: 13 if self.ball_type.lower [] == 'Bowling ': 14 in ["Bowling Balls không thể nảy!"] 15 Khác: 16 in [f "The {self.ball_type} Ball đang nảy!"]

Bây giờ, hãy để bóng lớp con và tạo một mô -đun mới có tên bowling_ball.py trong cùng một thư mục với Ball.py: 1 2 3 4 5 6 7 8 9 10 11

# Bowling_ball.py Nhập bóng Lớp Bowlingball [Ball.ball]: Def Roll [self]: in [f'you đang lăn {self.ball_type} bóng '] nếu __name__ ==' __main__ ' .cuộn[]

Để bóng lớp, bạn viết như sau: BOOMLETBALL [BALL.BALL]. Bóng con này và tạo ra một lớp học mới, bowlingball.

Lớp này không có phương thức __init __ [] được xác định. Điều đó có nghĩa là bạn sẽ thừa hưởng cha mẹ __init __ [] và sử dụng nó thay thế. Bạn cũng đã thêm một phương thức mới, roll [] mà lớp cha không có. Bây giờ chúng ta hãy cố gắng chạy mã này trong thiết bị đầu cuối của bạn: 1 python3 bowling_ball.py 2 traceback [cuộc gọi gần đây nhất] 4 Đối số vị trí bắt buộc: 'Màu', 'Kích thước', 'Wei \ 6 ght' và 'Ball_Type'

Rất tiếc! Chúng tôi đã tạo ra trường hợp bowlingball một cách chính xác. Như đã ám chỉ ở trên, bowlingball đang sử dụng phương pháp Ball từ __init__, vì vậy chúng tôi phải cung cấp các lập luận mà Ball Ball __init__ đang mong đợi. Hãy để sửa lỗi mã để nó hoạt động đúng: 1 2 3 4 5 6 7 8 9 10 11

# Bowling_ball.py Nhập bóng Lớp Bowlingball [Ball.ball]: Def Roll [self]: in [f'you đang lăn {self.ball_type} ball '] nếu __name__ ==' __main__ ' ', 10, 15,' bowling '] Ball.Roll []

Bây giờ khi bạn chạy nó, bạn sẽ nhận được đầu ra sau 1, bạn đang lăn bóng bowling

Hãy thử quay lại và chỉnh sửa lại mã để thêm một cuộc gọi vào phương thức bounce [] và đảm bảo nó cũng hoạt động cho bạn.

Đa hình dựa trên một lớp trên một lớp khác được gọi là di truyền. Đây cũng là một hình thức rất cơ bản của đa hình. Các lớp đa hình có một giao diện chung [phương pháp và thuộc tính] được chia sẻ từ cha mẹ của họ thông qua kế thừa. Mặc dù bạn có thể làm cho các lớp học của mình trở nên cứng nhắc hơn bằng cách sử dụng các lớp cơ sở trừu tượng thông qua mô -đun ABC Python, bạn thường sẽ sử dụng khái niệm ducktyping thay thế. Ý tưởng lớn đằng sau việc gõ vịt là nếu nó đi như một con vịt và nói chuyện như một con vịt, nó có thể được đối xử như một con vịt. Điều đó có nghĩa là nếu một lớp Python có cùng giao diện với cha mẹ hoặc lớp tương tự, thì nó không quan trọng lắm nếu việc thực hiện bên dưới là khác nhau!

Làm cho lớp học đẹp hơn Bạn có nhớ làm thế nào khi bạn in ra một thể hiện của lớp học của bạn không? Nếu bạn don, kết quả trông như thế này: 1

Điều đó cho bạn biết trường hợp là gì và giá trị thập lục phân ở cuối cho bạn biết vị trí bộ nhớ của đối tượng. Tuy nhiên, điều này chính xác là hữu ích. Sẽ thật tuyệt nếu nó in ra Ball_Type và có thể là màu của quả bóng. Hãy để cập nhật mã của bạn bằng cách sử dụng một phương pháp ma thuật khác nhau, sẽ giúp việc in trở nên hữu ích hơn. Sao chép mã từ Ball.py vào một tệp mới có tên Ball_Printable.py và sau đó chỉnh sửa nó như thế này: 1 # Ball_Printable.Py 2 3 Lớp bóng: 4 5 Def __init , 6 BALL_TYPE: STR] -> Không ] == 'Bowling': 14 in ["Bowling Balls không thể nảy!"] 15 f "" 20 21 22 nếu __name__ == "__main__": 23 ball_one = ball ['đen', 6, 12, 'bowling'] 24 ball_two = ball ['red', 12, 1, 'beach'] 25 26 26 in [ball_one] 27 in [ball_two]

Ở đây bạn đã thêm phương thức ma thuật __repr __ [] mới mà bạn có thể sử dụng để tạo một biểu diễn chuỗi đẹp của đối tượng khi nó được in. Khi nào

Bạn đi để in một thể hiện của một đối tượng, Python sẽ xem xét xem bạn có __repr __ [] hoặc __str __ [] được xác định không. Hầu hết thời gian, nên sử dụng __repr __ [] cho các nhà phát triển làm công cụ gỡ lỗi. Khi bạn chạy mã này, nó sẽ xuất ra như sau: 1 2

Nếu bạn tiếp tục và thực hiện __STR __ [], nó thực sự sẽ thay thế __repr __ [] khi bạn in. Đây là một ví dụ: 1 # Ball_Printable.py 2 3 Lớp bóng: 4 5 def __init __ [tự, màu: str, kích thước: float, trọng lượng: float, 6 ball_type: str] -> none: 7 self.color = color 8 self.size = size 9 self. weight = trọng lượng 10 self.ball_type = ball_type 11 12 def bounce [self]: 13 if self.ball_type.lower [] == 'bowling': 14 in ["Bowling Balls không thể bật ! "] 15 Khác: 16 in [f'the {self.ball_type} bóng đang nảy! '] 17 18 def __repr __ [self]: 19 return f' 20 21 def __str __ [self] .Color} {self.ball_type} ball '23 24 25 nếu __name__ == "__main__": 26 ball_one = ball [' đen ', 6, 12,' bowling '] 27 ball_two = ball [' red ', 12, 1 .

Trong mã này, bạn đã thêm phương thức __str __ [] và đã trả về một chuỗi rất giống với __repr __ [] ngoại trừ việc nó không thêm tên lớp vào

sợi dây. Sau đó để hiển thị sự khác biệt, bạn in ra các đối tượng bóng. Cuối cùng, bạn in ra kết quả của việc gọi __repr __ [] và __str __ [] trực tiếp. Đây là những gì bạn nên nhận làm đầu ra: 1 2 3 4

bóng đen bóng đỏ Bãi biển Bãi biển

Bowling bóng đen

Điều này chỉ làm trầy xước bề mặt của những gì bạn có thể làm với các phương pháp ma thuật Python.

Kết thúc bạn đã bao gồm rất nhiều thông tin có giá trị trong chương này. Bạn đã học về: Bản thân tạo lớp - Ý nghĩa của nó và các phương thức / thuộc tính riêng tư và đa hình tạo lớp con Bạn cũng đã học cách sử dụng một số phương pháp ma thuật cơ bản trong Python để sửa đổi cách thức hoạt động của một đối tượng. Bạn có thể sử dụng kiến ​​thức từ chương này để thiết kế các đối tượng của riêng bạn đơn giản hoặc phức tạp như bạn cần. Bạn có thể tạo các lớp cha mẹ đẹp để sử dụng làm mẫu cho các lớp con quá. Khi bạn viết mã của mình, luôn luôn tìm kiếm cách bạn có thể làm cho nó đơn giản và dễ hiểu hơn. Sử dụng nhận xét tốt, tài liệu và tên cho các chức năng và thuộc tính và bạn sẽ tiếp tục có một số mã tự ghi chép tuyệt vời!

Xem lại câu hỏi 1. Làm thế nào để bạn tạo một lớp học trong Python? 2. Bạn đặt tên cho một trình khởi tạo lớp là gì? 3. Giải thích việc sử dụng bản thân theo cách riêng của bạn 4. Việc ghi đè một phương pháp làm gì? 5. Lớp con là gì?

Phần II - Ngoài những điều cơ bản, phần thứ hai của cuốn sách này có các chương về tài liệu cấp trung gian. Ở đây bạn sẽ tìm hiểu về các chủ đề sẽ giúp bạn trở thành một nhà phát triển tốt hơn. Trong phần này của cuốn sách, bạn sẽ trình bày như sau: Chương 19 - Hướng nội Chương 20 - Cài đặt các gói với PIP Chương 21 - Môi trường ảo Python Chương 22 - Loại gợi ý Chương 23 - Chủ đề Chương 24 - Đa xử lý Chương 25 - Khởi động các quá trình phụ với Python Chương 26 - Gỡ lỗi mã của bạn Chương 27 - Người trang trí Chương 28 - Biểu thức gán Chương 29 - Hồ sơ mã của bạn Chương 30 - Giới thiệu để kiểm tra mã của bạn Chương 31 - Jupyter Notebook Khi bạn hoàn thành Phần II, bạn sẽ có nhiều công cụ mới tại Đầu ngón tay để sử dụng trong các dự án của bạn. Hãy bắt đầu tìm hiểu về chúng ngay bây giờ!

Chương 19 - Sự hướng nội Một trong những lý do Python đặc biệt là nó cung cấp rất nhiều công cụ cho phép bạn tìm hiểu về chính Python. Khi bạn tìm hiểu về bản thân, nó được gọi là nội tâm. Có một loại nội tâm tương tự có thể xảy ra với các ngôn ngữ lập trình. Python cung cấp một số chức năng tích hợp mà bạn có thể sử dụng để tìm hiểu về mã mà bạn đang làm việc. Trong chương này, bạn sẽ tìm hiểu cách sử dụng: hàm loại [] hàm dir [] hàm trợ giúp [] Các công cụ tích hợp hữu ích khác cho phép bắt đầu!

Sử dụng hàm loại [] Khi bạn đang làm việc với mã lạ, có thể hữu ích để kiểm tra và xem loại đó là gì. Mã là một chuỗi, một số nguyên hay một loại đối tượng? Điều này đặc biệt đúng khi bạn đang làm việc với mã mà bạn chưa từng sử dụng trước đây, có thể là một mô -đun, gói hoặc ứng dụng kinh doanh mới. Hãy xem xét một ví dụ: 1 Số nhân def [x, y]: 2 return str [x * y]

Bạn sẽ gặp rất nhiều mã không có tài liệu hoặc tài liệu không chính xác. Đây là một ví dụ về một hàm dường như nhân số. Trên thực tế, nó làm điều đó, nhưng lưu ý rằng thay vì trả về một giá trị số, nó trả về một chuỗi. Đây là nơi sử dụng hàm loại [] có thể có giá trị. Hãy thử gọi mã này và kiểm tra loại trả về: 1 2 3 4 5

>>> return_value = số nhân [4, 5] >>> in [return_value] 20 >>> gõ [return_value]

Nhìn vào mã, bạn sẽ mong đợi một hàm có tên Multiplier [] sẽ lấy một số loại số và cũng trả về một kết quả số và khi bạn in ra kết quả, nó có vẻ là số - tuy nhiên, đó là một chuỗi! Bạn thực sự sẽ gặp phải vấn đề này khá thường xuyên và nó có thể dẫn đến một số lỗi kỳ lạ.

Sử dụng hàm Dir [] Có hàng ngàn gói Python mà bạn có thể cài đặt để có các tính năng mới trong Python. Bạn sẽ học cách thực hiện điều đó trong Chương 20. Tuy nhiên, thư viện tiêu chuẩn Python có rất nhiều mô-đun tích hợp mà bạn có thể không quen thuộc. Bạn có thể sử dụng hàm Dir [] tích hợp Python, để tìm hiểu thêm về một mô-đun mà bạn không quen thuộc. Khi bạn chạy dir [], nó sẽ trả về một danh sách tất cả các chức năng và thuộc tính có sẵn cho bạn. Hãy thử sử dụng nó trên mô -đun mã: 1 >>> Nhập mã 2 >>> DIR [Mã] 3 ['CommandCompiler', 'InteractiveConsole', 'InteractiveTinterPreter', '__all__', 4 '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', 5 '__package__', '__spec__', 'compile_command', 'tương tác', 'sys', 'traceback']]

Hầu hết mọi người không quen thuộc với mô -đun mã. Bạn sử dụng nó để tạo các vòng in in readeval trong Python. Một cách để tìm hiểu làm thế nào bạn có thể sử dụng mô -đun bí ẩn này là sử dụng hàm Dir []. Đôi khi bằng cách đọc các tên chức năng mô -đun, bạn có thể suy ra những gì nó làm. Trong ví dụ này, bạn có thể thấy rằng có một cách để biên dịch_command và tương tác. Đó là những manh mối cho những gì thư viện làm. Nhưng vì bạn vẫn không chắc chắn những gì họ làm, bạn luôn có thể yêu cầu giúp đỡ [].

Nhận trợ giúp [] Python cũng cung cấp chức năng trợ giúp [] hữu ích. Hàm trợ giúp [] sẽ đọc các tài liệu trong mô -đun và in chúng ra. Vì vậy, nếu nhà phát triển thêm tài liệu tốt vào mã của họ, thì bạn có thể sử dụng Python để hướng nội. Hãy để cho nó thử bằng cách sử dụng mô -đun mã: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

>>> Trợ giúp [Mã] Trợ giúp trên Mã mô -đun: Mã tên - Các tiện ích cần thiết để mô phỏng trình thông dịch tương tác của Python. Tham chiếu mô -đun //docs.python.org/3.8/l Library/code Tài liệu sau đây được tự động tạo từ các tệp nguồn Python. Nó có thể không đầy đủ, không chính xác hoặc bao gồm các tính năng được coi là chi tiết thực hiện và có thể khác nhau giữa việc triển khai Python. Khi nghi ngờ, hãy tham khảo tham chiếu mô -đun tại vị trí được liệt kê ở trên. Các lớp xây dựng. InteractiveConsole [locals = none, fileName = ''] | | Mô phỏng chặt chẽ hành vi của trình thông dịch python tương tác.

Ví dụ này hiển thị trang đầu tiên của sự trợ giúp mà bạn nhận được khi bạn chạy trợ giúp [mã]. Bạn có thể SpaceBar để trang thông qua tài liệu hoặc quay lại để tiến hành một dòng tại một thời điểm. Nếu bạn muốn thoát khỏi trợ giúp, nhấn q. Hãy thử nhận trợ giúp trên hàm Tương tác [] ] 6 mô phỏng chặt chẽ trình thông dịch python tương tác. 7 8 Đây là giao diện tương thích ngược với lớp InteractiveConsole 9. Khi READFUNC không được chỉ định, nó cố gắng nhập 10 mô -đun READLINE để bật GNU Readline nếu có sẵn. 11

12 đối số [tất cả tùy chọn, tất cả đều mặc định là không]: 13 14 Banner - được chuyển cho InteractiveConsole.Interact [] 15 ReadFunc - nếu không có, thay thế InteractiveConsole.Raw_Input [] 16 cục bộ - được chuyển cho InteractiveTinterreter .__ init __ [] 17 EXITMSG - Được chuyển đến InteractiveConsole.Interact [] 18 [kết thúc]

Bạn có thể sử dụng Dir [] để có được thông tin về các phương thức và thuộc tính trong một mô -đun không quen thuộc. Sau đó, bạn có thể sử dụng trợ giúp [] để có thêm chi tiết về mô -đun hoặc bất kỳ thành phần nào của nó.

Các công cụ nội tâm tích hợp khác Python bao gồm một số công cụ khác bạn có thể sử dụng để giúp bạn tìm ra mã. Dưới đây là một vài hàm tích hợp hữu ích hơn: Call [] Len [] locals [] Globals []

Hãy cùng đi qua những thứ này và xem bạn có thể sử dụng chúng như thế nào!

Sử dụng hàm callable [], hàm callable [] được sử dụng để kiểm tra nếu một đối tượng có thể gọi được. Điều đó có nghĩa là gì? Một người có thể gọi là một cái gì đó trong Python mà bạn có thể gọi để có được kết quả, chẳng hạn như một chức năng hoặc lớp học. Khi bạn đang xử lý một mô -đun không xác định, bạn có thể luôn luôn nói những gì mà một biến hoặc một chức năng hoặc một lớp. Hàm trợ giúp [] từ trước sẽ cho bạn biết, nhưng nếu bạn không muốn chuyển sang chế độ trợ giúp, sử dụng Callable [] có thể là cách để đi. Dưới đây là một số ví dụ: 1 2 3 4 5 6 7 8 9 10 11 12 13

>>> a = 5 >>> có thể gọi được [a] false >>> def adder [x, y]: ... vượt qua ... >>> có thể gọi được [adder] Đúng >>> bóng lớp: ... vượt qua ... >>> có thể gọi [bóng] đúng

Ví dụ đầu tiên cho thấy một biến không phải là một đối tượng có thể gọi được. Vì vậy, bạn có thể nói với sự tự tin tốt rằng biến, A, khá có thể là một biến.

Hai ví dụ tiếp theo là kiểm tra một chức năng, adder và một lớp, bóng, có thể gọi được []. Cả hai đều trả về đúng vì cả hai có thể được gọi. Tất nhiên, khi bạn gọi là một lớp, bạn đang khởi tạo nó, vì vậy nó không hoàn toàn giống như một hàm.

Sử dụng hàm len [] hàm len [] rất hữu ích để tìm độ dài của một đối tượng. Bạn có thể sẽ sử dụng nó rất nhiều để gỡ lỗi cho dù một chuỗi hoặc danh sách có dài như nó phải có. Dưới đây là một vài ví dụ: 1 2 3 4

>>> Len ['ABCD'] 4 >>> Len [[1, 'hai', 3]] 3

Bạn có thể sử dụng Len [] trên nhiều loại đối tượng khác nhau trong Python. Tuy nhiên, có những lúc nó đã giành được công việc, chẳng hạn như với số nguyên: 1 2 3 4 5

>>> A = 4 >>> Len [a] Traceback [cuộc gọi gần đây nhất cuối cùng]: Python Shell, Prompt 15, Line 1 Buildins.TypeError: Đối tượng của loại 'int' không có Len []

Sử dụng hàm locals [], hàm locals [] trả về một từ điển của bảng ký hiệu cục bộ hiện tại. Điều đó có nghĩa là nó cho bạn biết những gì hiện có sẵn cho bạn trong bối cảnh hiện tại hoặc phạm vi của bạn. Hãy cùng nhìn vào một ví dụ. Mở lại Python bằng cách chạy Python3 trong thiết bị đầu cuối của bạn. Sau đó, chạy như sau: 1 >>> người dân địa phương [] 2 {'__name__': '__main__', '__doc__': none, '__package__': none, 3 '__loader__':, '__spec__' : {}, '__builtins__':}

Điều này cho bạn biết những gì hiện đang có trong không gian tên hoặc phạm vi của bạn. Những aren này đặc biệt hữu ích mặc dù. Hãy để tạo ra một vài biến và chạy lại lệnh: 1 2 3 4 5 6 7

>>> a = 3 >>> b = 4 >>> người dân địa phương [] {'__name__': '__main__', '__doc__': none, '__package__': Không '__annotations__': {}, '__builtins__':, 'A': 3, 'B': 4}

Bây giờ bạn có thể thấy rằng các biến bạn đã tạo được bao gồm trong từ điển. Sử dụng locals [] trở nên hữu ích hơn khi bạn sử dụng nó bên trong hàm: 1 2 3 4 5

>>> def adder [x, y]: ... in [locals []] ... >>> adder [4, 5] {'x': 4, 'y': 5}

Điều này cho phép bạn thấy những gì đối số đã được chuyển vào một chức năng cũng như giá trị của chúng.

Sử dụng hàm Globals [], hàm toàn cầu [] khá giống với hàm locals []; Sự khác biệt là Globals [] luôn trả về không gian tên cấp mô-đun, trong khi locals [] trả về không gian tên hiện tại. Trên thực tế, nếu bạn chạy cả hai ở cấp độ mô -đun [nghĩa là bên ngoài bất kỳ chức năng hoặc lớp nào], các từ điển mà chúng trở lại sẽ khớp. Hãy thử gọi Gọi Globals [] bên trong adder []: 1 >>> def adder [x, y]: 2 ... in [globals []] 3 ... 4 >>> adder [4, 5] 5 { '__name__': '__main__', '__doc__': none, '__package__': none, 6 '__loader__':, 7 '__spec__': Không

Như bạn có thể thấy, khi bạn chạy mã này, bạn sẽ nhận được các thuộc tính, hàm, v.v.

Kết thúc Python có một bộ công cụ phong phú mà bạn có thể sử dụng để tìm hiểu về mã của bạn và những người khác mã mã. Trong chương này, bạn đã tìm hiểu về các chủ đề sau: hàm loại [] hàm dir [] hàm HELL [] Hàm các công cụ tích hợp hữu ích khác mà bạn có thể sử dụng các công cụ này lại với nhau để tìm ra cách sử dụng hầu hết các gói Python. Sẽ có một vài thứ không được ghi chép tốt cả trên trang web của họ và nội bộ. Những loại gói đó nên tránh vì bạn có thể không xác định được những gì chúng đang làm.

Xem lại câu hỏi 1. Nội tâm là gì? 2. Hàm loại [] được sử dụng cho? 3. Dir [] hữu ích như thế nào?

Chương 20 - Cài đặt các gói với thư viện tiêu chuẩn PIP Python, thật tuyệt vời. Bạn có thể xây dựng tất cả các loại chương trình khác nhau bằng cách sử dụng không có gì ngoài những gì đi kèm với Python. Tuy nhiên, có toàn bộ hệ sinh thái gồm các gói Python bổ sung mà bạn có thể cài đặt. Phần lớn các gói này có thể được tìm thấy trên Chỉ số gói Python [PYPI] hoặc GitHub. Bạn có thể duyệt pypi tại đây: //pypi.org/ bạn có thể nghĩ về các gói như là cải tiến. Họ thêm chức năng mới vào mã của bạn. Ví dụ: bạn có thể muốn thêm tầm nhìn máy tính vào ứng dụng của mình. Bạn có thể tự mình đi xuống con đường tẻ nhạt của việc viết nó hoặc bạn có thể cài đặt OpenCV-Python, một trình bao bọc xung quanh gói OpenCV phổ biến. Trong chương này, bạn sẽ tìm hiểu về những điều sau: Cài đặt tùy chọn dòng lệnh khám phá Cài đặt với các yêu cầu.

Cài đặt gói bắt đầu với Python 3.4, chương trình trình cài đặt PIP được bao gồm với ngôn ngữ lập trình Python. PIP cũng là một mô -đun trong Python. Có những trường hợp python hệ thống không được cài đặt PIP với nó. Hệ thống Python là phiên bản Python đi kèm với hệ điều hành của bạn. Bạn có thể kiểm tra xem bạn có nó như một mô -đun như thế này không: 1 python3 -m pip

Tùy chọn dòng lệnh -M nói với Python rằng bạn sẽ chạy trực tiếp một thư viện Python. Nếu điều này hoạt động chính xác, bạn sẽ thấy rất nhiều đầu ra được in vào màn hình của bạn chi tiết những lệnh bạn có thể sử dụng với PIP. Hầu hết các mô -đun trong Python cũng cho phép bạn nhập chúng. Trong trường hợp PIP, bạn nên gọi nó bằng giao diện dòng lệnh PIP. Nếu bạn chưa cài đặt PIP, bạn có thể nhận được nó từ đây: //pip.pypa.io/en/stable/installing/ Khi bạn có PIP, bạn có thể cài đặt gói bằng cách mở thiết bị đầu cuối của mình và chạy như sau: 1 PIP Cài đặt gói_name

Điều này giả định rằng PIP được cài đặt như một ứng dụng và trên đường dẫn. Nhược điểm của phương pháp này là bạn không thể biết phiên bản Python nào mà PIP này được đính kèm. Vì vậy, nếu bạn đã cài đặt Python 3.6 và Python 3.8, lệnh trên có thể sẽ cài đặt gói của bạn thành 3.6 thay vì phiên bản mới nhất.

Con đường của người Viking là gì? Khi nói về đường dẫn đường dẫn, các hệ điều hành có cách biết ứng dụng nào sẽ chạy khi bạn mở một thiết bị đầu cuối và nhập lệnh như Python hoặc Cmd.exe. Nếu PIP đã được cài đặt chính xác trên hệ điều hành của bạn, thì bạn cũng có thể gọi PIP mà không cần chỉ định vị trí cài đặt của nó. Nếu điều đó không hoạt động, thì bạn sẽ cần sử dụng Google để tìm hiểu cách thêm ứng dụng vào đường dẫn của mình vì mỗi hệ điều hành thực hiện khác nhau.

Để chỉ định Python bạn muốn cài đặt gói nào, bạn có thể thực hiện việc này: 1 Python3.8 -M Pip Cài đặt Gói_Name

Ở đây bạn đang chỉ định rằng bạn muốn cài đặt gói vào Python 3.8. Trên Windows, bạn có thể cần phải nhập toàn bộ đường dẫn đến Python 3.8 thay vì sử dụng Python3.8. Cho dù bạn có trên Windows hay không, khi bạn chạy lệnh này, PIP sẽ đi tìm gói bạn chỉ định từ chỉ mục gói Python, tải xuống tệp và cài đặt nó. Khi gói của bạn được cài đặt, bạn sẽ có thể nhập nó và sử dụng nó như bất kỳ thư viện Python nào khác. Bạn có thể cài đặt nhiều gói cùng một lúc bằng cách tách tên của gói với khoảng trống: 1 Python -M Pip Cài đặt gói_1 Gói_2 Gói_3

Bây giờ, hãy để tìm hiểu về các tùy chọn dòng lệnh mà bạn có thể sử dụng với PIP!

Khám phá các tùy chọn dòng lệnh Tiện ích PIP có một số lệnh bạn có thể sử dụng. Dưới đây là các lệnh hiện tại cho phiên bản đi kèm với các lệnh Python 3.8: 1: 2 Cài đặt 3 Tải xuống 4 Gỡ cài đặt 5 Danh sách 6 FREEZE 6 Hiển thị 8 Kiểm tra phụ thuộc. 9 Cấu hình 10 Tìm kiếm 11 Bánh xe 12 Hash 13 Hoàn thành 14 Debug 15 Trợ giúp

Cài đặt gói. Tải xuống các gói. Gói gỡ cài đặt. Đầu ra Các gói cài đặt ở định dạng yêu cầu. Danh sách các gói đã cài đặt. Hiển thị thông tin về các gói đã cài đặt. Xác minh các gói được cài đặt có cấu hình quản lý địa phương và toàn cầu tương thích. Tìm kiếm pypi cho các gói. Xây dựng bánh xe từ yêu cầu của bạn. Tính toán băm của tài liệu lưu trữ gói. Một lệnh trợ giúp được sử dụng để hoàn thành lệnh. Hiển thị thông tin hữu ích để gỡ lỗi. Hiển thị trợ giúp cho các lệnh.

Có một số tùy chọn chung [nghĩa là các tùy chọn dòng lệnh] mà bạn cũng có thể sử dụng: 1 Tùy chọn chung: 2 -H, - -Help 3 --isolated 4 5 -v, --verbose 6 7 -V, --Version 8 -Q, --quiet 9 10 11-log 12 --proxy 13 14-retries 15 16-thời gian 17 23 24 25-Cache-DIR 26--NO-CACHE-DIR 27

Hiển thị trợ giúp. Chạy PIP trong một chế độ bị cô lập, bỏ qua các biến môi trường và cấu hình người dùng. Cho nhiều đầu ra hơn. Tùy chọn là phụ gia, và có thể được sử dụng tối đa 3 lần. Hiển thị phiên bản và thoát. Cho ít đầu ra. Tùy chọn là phụ gia và có thể được sử dụng tối đa 3 lần [tương ứng với các mức cảnh báo, lỗi và mức ghi nhật ký quan trọng]. Đường dẫn đến một nhật ký nối dài dòng. Chỉ định proxy trong biểu mẫu [Người dùng: [Email & NBSP; được bảo vệ]] Proxy.Server: Port. Số lần thử lại tối đa mỗi kết nối sẽ thử [mặc định 5 lần]. Đặt thời gian chờ ổ cắm [mặc định 15 giây]. Hành động mặc định khi một đường dẫn đã tồn tại: [s] Phù thủy, [i] gnore, [w] ipe, [b] ackup, [a] bort. Đánh dấu máy chủ này là đáng tin cậy, mặc dù nó không có hợp lệ hoặc bất kỳ HTTPS nào. Đường dẫn đến gói CA thay thế. Đường dẫn đến chứng chỉ máy khách SSL, một tệp duy nhất chứa khóa riêng và chứng chỉ ở định dạng PEM. Lưu trữ dữ liệu bộ đệm trong. Tắt bộ đệm. Không định kỳ kiểm tra PYPI để xác định xem phiên bản PIP mới có sẵn để tải xuống hay không. Ngụ ý với--Không chỉ số. Triệt tiêu đầu ra màu

Chương này đã giành được tất cả các tùy chọn mà PIP hỗ trợ. Thay vào đó, nó sẽ tập trung vào một số ít những người mà bạn có khả năng sử dụng nhất. Bạn có thể nhận thêm thông tin về các tùy chọn bằng cách chạy -H sau một lệnh. Ví dụ: 1 python -m pip cài đặt -H

Điều này sẽ hiển thị tùy chọn cài đặt và tùy chọn chỉ mục gói.

Cài đặt với các yêu cầu.TXT Tiện ích cài đặt PIP sẽ tự động cố gắng cài đặt tất cả các phụ thuộc của gói. Các phụ thuộc được chỉ định trong một tệp gọi là aborment.txt. Bạn có thể cài đặt tất cả các phụ thuộc của gói bằng cách sử dụng tệp yêu cầu.txt trực tiếp: 1 python -m pip install -r aborments.txt

Định dạng tệp yêu cầu yêu cầu mỗi gói được yêu cầu được đặt trên dòng riêng của nó. Bạn có thể chỉ định một phiên bản hoặc phạm vi phiên bản, để cài đặt; Nếu bạn không, thì phiên bản mới nhất sẽ được cài đặt. Dưới đây là một ví dụ về những gì có thể có trong một yêu cầu.txt Tệp: 1 mũi 2 sqlalchemy

Ví dụ này không chỉ định bất kỳ phiên bản nào, vì vậy phiên bản mới nhất của cả gói Mũi và Sqlalchemy sẽ được cài đặt. Dưới đây là một ví dụ về một yêu cầu.txt với một phiên bản được chỉ định: 1 docopt == 0.6.1

Khi bạn cài đặt các phụ thuộc của mình bằng cách sử dụng tệp này, nó sẽ cài đặt phiên bản 0,6.1 của Docopt.

Nâng cấp một gói gói từ Chỉ số gói Python có thể được cập nhật khá nhanh. Nếu bạn đang sử dụng một trong các gói này và bạn muốn nâng cấp lên mới nhất, PIP có cách để làm điều đó. Bạn có thể sử dụng -U hoặc -nâng cấp để nâng cấp lên phiên bản mới nhất của gói. Dưới đây là một ví dụ: 1 Python -M Pip Cài đặt -Cao cấp gói_name

Điều này sẽ nâng cấp gói được chỉ định lên phiên bản mới nhất của nó.

Kiểm tra những gì đã cài đặt thư viện PIP cho phép bạn xem các gói nào bạn đã cài đặt với nó. Bạn có thể sử dụng danh sách để hiển thị các gói đã cài đặt, ví dụ: 1 Python3.8 -M Danh sách PIP

Khi tôi chạy lệnh này, tôi đã nhận được đầu ra sau: 1 2 3 4

Gói --------- Pip Setuptools

Phiên bản ------ 19.2.3 41.2.0

Đầu ra của bạn sẽ phụ thuộc vào những gì bạn đã cài đặt với PIP.

Các gói không được cài đặt với PIP Nếu bạn đã cài đặt các gói Python bằng APT-Get hoặc Brew hoặc qua trình cài đặt, sau đó chúng sẽ không hiển thị khi bạn chạy lệnh Danh sách PIP vì chúng không được cài đặt với PIP. Bạn sẽ cần sử dụng trình quản lý gói của mình để xem những gì bạn đã cài đặt.

Bây giờ, hãy để học cách gỡ cài đặt một gói!

Các gói gói gỡ cài đặt cũng có thể được gỡ cài đặt bằng PIP. Bạn có thể sử dụng một trong các lệnh sau để làm cho nó hoạt động: 1 PIP Gỡ cài đặt [Tùy chọn] 2 PIP Gỡ cài đặt [Tùy chọn] -R

Lệnh gỡ cài đặt có thể được sử dụng để gỡ cài đặt nhiều gói theo cách giống như lệnh cài đặt có thể được sử dụng để cài đặt nhiều gói. Sau khi gỡ cài đặt, bạn có thể sử dụng lệnh danh sách để xác minh rằng [các] gói đã được gỡ cài đặt.

Các lựa chọn thay thế cho PIP Có một số lựa chọn thay thế để sử dụng PIP làm trình quản lý gói của bạn. Dưới đây là một vài trong số đó: Conda - //docs.conda.io/en/latest/ pipenv - //github.com/pypa/pipenv pipx - //github.com/pipxproject - //python-poemy.org/ Conda là một tiện ích được cung cấp với phiên bản Anaconda của Python. Nếu bạn là một nhà khoa học dữ liệu hoặc làm nhiều việc học máy, bạn có thể thấy rằng sử dụng Conda là cách để đi. Anaconda được thiết kế cho các nhà khoa học dữ liệu và đi kèm với nhiều gói Python khoa học được cài đặt sẵn, như Numpy và Matplotlib. Gói Pipenv là một gói xung quanh PIP và môi trường ảo Python. Bạn sẽ tìm hiểu thêm về môi trường ảo trong chương tiếp theo. Pipenv cũng là một người quản lý phụ thuộc. Dự án PIPX cũng được sử dụng để cài đặt các gói Python trong môi trường bị cô lập. Gói thơ là một công cụ quản lý phụ thuộc. Nó giống như Conda trong khía cạnh đó và dường như đang đạt được rất nhiều sự hỗ trợ. Conda, pipenv và thơ tập trung vào quản lý phụ thuộc và phiên bản của các gói hơn là chính PIP. Họ cũng quảng bá bằng cách sử dụng môi trường ảo cho mã của bạn. Nếu bạn sẽ làm việc với nhiều phiên bản của các gói hoặc thấy mình cần kiểm tra nhiều gói thường xuyên, thì bạn có thể muốn xem xét các gói này.

Mỗi công cụ này hoạt động khác nhau và không tương thích với nhau hoặc chỉ tương thích một phần. Không mong đợi có thể gỡ cài đặt gói Conda với PIP hoặc Liệt kê các gói Conda với PIP, ví dụ.

Kết thúc bạn đã học được rất nhiều về việc cài đặt và quản lý các gói với PIP. Để xem xét, đây là những gì bạn đã đề cập: Cài đặt tùy chọn dòng lệnh khám phá Gói cài đặt với các yêu cầu. Bạn cũng biết về một số lựa chọn thay thế mà bạn có thể sử dụng thay vì PIP.

Xem lại câu hỏi 1. Làm thế nào để bạn cài đặt gói với PIP? 2. Bạn sử dụng lệnh nào để xem phiên bản của các gói bạn đã cài đặt? 3. Làm thế nào để bạn gỡ cài đặt một gói?

Chương 21 - Môi trường ảo Python Python có khái niệm về môi trường ảo được tích hợp theo ngôn ngữ. Môi trường ảo Python là một môi trường nơi bạn có thể cài đặt các gói bên thứ 3 để thử nghiệm mà không ảnh hưởng đến việc cài đặt Python hệ thống. Mỗi môi trường ảo có bộ gói được cài đặt riêng và tùy thuộc vào môi trường ảo và cách thức thiết lập, có thể có bản sao riêng của thư viện nhị phân và tiêu chuẩn Python. Có một số cách khác nhau để tạo ra môi trường ảo Python. Bạn sẽ tập trung vào hai phương pháp sau: Mô-đun VEN tích hợp Gói VirtualEnv Có các công cụ khác mà bạn có thể sử dụng để tạo môi trường Python ảo. Bạn sẽ tìm hiểu một chút về họ trong phần cuối của chương này. Hiện tại, hãy để bắt đầu bằng cách nhìn vào Thư viện VENV!

Thư viện Python sườn VenV Python đã thêm mô -đun VENV trong phiên bản 3.3. Bạn có thể đọc tất cả về nó ở đây: //docs.python.org/3/l Library/venv.html để sử dụng Venv, bạn có thể chạy Python bằng cờ -M. Cờ -M bảo Python chạy mô -đun được chỉ định theo sau -M. Hãy để thử nó ra. Mở CMD.exe trên Windows hoặc thiết bị đầu cuối trong Mac hoặc Linux. Sau đó nhập như sau: 1 bài kiểm tra Python -M VENV

Điều này sẽ tạo một thư mục có tên là kiểm tra trong bất kỳ thư mục nào bạn mở trong phiên cuối của mình. Để kích hoạt môi trường ảo, bạn sẽ cần các thư mục thay đổi vào thư mục thử nghiệm và chạy điều này trên Linux/Mac: 1 Nguồn Bin/Activeat

Nếu bạn là người dùng Windows, bạn có thể kích hoạt nó bằng cách chạy tệp BAT bên trong phần phụ của tập lệnh mà bạn sẽ tìm thấy trong thư mục thử nghiệm của mình. Bây giờ bạn sẽ thấy một cái gì đó như thế này:

Hình 21-1: Kích hoạt VENV

Lưu ý rằng tên của lời nhắc bây giờ là thử nghiệm. Điều đó chỉ ra rằng môi trường ảo đã được kích hoạt và sẵn sàng sử dụng. Bây giờ bạn có thể cài đặt các gói mới và chúng sẽ cài đặt vào môi trường ảo của bạn thay vì python hệ thống của bạn. Khi bạn kết thúc, bạn có thể hủy kích hoạt môi trường ảo bằng cách chạy vô hiệu hóa trong dấu nhắc thiết bị đầu cuối hoặc lệnh. Bản chất chính xác của việc hủy kích hoạt là phụ thuộc vào triển khai: nó có thể là một tập lệnh hoặc tệp hàng loạt hoặc một cái gì đó khác. Mã Pycharm, Wingide và VS đều hỗ trợ bằng môi trường ảo Python. Trên thực tế, bạn thường có thể tạo và kích hoạt chúng từ bên trong IDE thay vì thực hiện nó trên dòng lệnh.

Gói VirtualENV Gói VirtualEnv là phương thức ban đầu để tạo môi trường ảo Python. Bạn có thể đọc tài liệu cho gói VirtualEnv tại đây: //virtualenv.pypa.io/en/latest/ Một tập hợp con của VirtualEnv cuối cùng đã được tích hợp vào mô -đun VEN của Python. Gói VirtualEnv thực tế tốt hơn VETV theo các cách sau: nó nhanh hơn để mở rộng có thể tạo môi trường ảo cho nhiều phiên bản Python có thể được nâng cấp thông qua PIP có API lập trình phong phú, bạn có thể cài đặt VirtualenV bằng cách sử dụng PIP: 1 PIP Cài đặt ảo

Sau khi được cài đặt, bạn có thể tạo môi trường ảo bằng thiết bị đầu cuối hoặc cmd.exe như thế này: 1 thư mục ảo

Kích hoạt và hủy kích hoạt môi trường ảo hoạt động chính xác như khi bạn tạo ra một môi trường ảo bằng mô -đun PythonTHER VEN. Có khá nhiều tham số dòng lệnh bạn có thể sử dụng với VirtualEnv. Bạn có thể đọc danh sách đầy đủ tại đây: //virtualenv.pypa.io/en/latest/cli_interface.html Hầu hết thời gian, bạn có thể sử dụng mặc định. Nhưng có những lúc thật tuyệt khi định cấu hình môi trường ảo của bạn để sử dụng các phiên bản PIP khác hoặc cho

Nó truy cập vào thư mục gói trang web của bạn. Kiểm tra liên kết ở trên để xem tất cả những gì bạn có thể làm với VirtualEnv.

Các công cụ khác có các công cụ khác bạn có thể sử dụng để làm việc với các môi trường ảo Python. Đây chỉ là một vài: Anaconda - //www.anaconda.com/ pipx - //pypi.org/project/pipx/ pipenv - //github.com/pypa/pipenv anaconda có công cụ riêng của mình để tạo môi trường ảo. Hai gói còn lại là các gói phổ biến để tạo và quản lý môi trường ảo. Cả PIPX và PIPENV đều khá phổ biến. Bạn nên đọc về chúng và xác định xem chúng có thể hữu ích cho các dự án của riêng bạn không.

Kết thúc môi trường ảo Python là một cách tuyệt vời để cô lập Python hệ thống của bạn trong khi cho phép bạn kiểm tra các gói mới. Bạn có thể kiểm tra nhiều phiên bản của gói bằng cách sử dụng nhiều môi trường ảo. Sau đó, khi bạn hoàn thành, bạn chỉ có thể xóa thư mục môi trường ảo. Điều này cho phép các lần lặp nhanh để xác minh rằng không có gì trong ngăn xếp gói của bạn gây ra vỡ. Thực tiễn tiêu chuẩn là luôn luôn sử dụng môi trường Python ảo bất cứ khi nào bạn đang thử nghiệm một gói mới. Hãy tiếp tục và thử nó. Bạn sẽ sớm thấy rằng nó trở thành bản chất thứ hai và nó siêu hữu ích để khởi động!

Xem lại câu hỏi 1. Làm thế nào để bạn tạo ra một môi trường ảo Python? 2. Bạn cần làm gì sau khi tạo ra một môi trường ảo để sử dụng nó? 3. Tại sao bạn sẽ sử dụng môi trường ảo Python?

Chương 22 - Kiểu kiểm tra loại kiểm tra hoặc gợi ý loại Python là một tính năng mới hơn của Python đã được thêm vào Python 3.5. Loại gợi ý còn được gọi là chú thích loại. Bạn đã học được một chút về loại gợi ý loại trở lại trong Chương 17. Loại gợi ý loại đang thêm cú pháp đặc biệt vào các chức năng và khai báo biến cho nhà phát triển loại đối số hoặc biến là gì. Python không thực thi các gợi ý loại. Bạn vẫn có thể thay đổi các loại theo ý muốn trong Python vì điều này. Tuy nhiên, một số môi trường phát triển tích hợp, chẳng hạn như pycharm, loại gợi ý loại hỗ trợ và sẽ làm nổi bật các lỗi gõ. Bạn cũng có thể sử dụng một công cụ gọi là MyPy để kiểm tra gõ cho bạn. Bạn sẽ tìm hiểu thêm về công cụ đó sau này trong chương này. Bạn sẽ tìm hiểu về những điều sau: Ưu và nhược điểm của loại gợi ý loại gợi ý loại / biến đổi biến đổi loại các giá trị gợi ý không thể là loại gợi ý loại phải làm gì khi mọi thứ trở nên phức tạp Kiểu kiểm tra Hãy bắt đầu!

Những ưu và nhược điểm của kiểu dáng có thể có một số điều cần biết về phía trước khi nói đến loại gợi ý trong Python. Hãy xem xét các ưu của kiểu gợi ý trước: Loại gợi ý là cách hay để ghi lại mã của bạn ngoài các gợi ý loại DocStrings có thể tạo ra IDE và Linters đưa ra phản hồi tốt hơn và tự động bổ sung các gợi ý về loại buộc bạn phải suy nghĩ về các loại, điều này có thể giúp bạn Đưa ra quyết định tốt trong quá trình thiết kế các ứng dụng của bạn. Thêm loại gợi ý là tất cả các cầu vồng và hoa hồng. Có một số nhược điểm: Mã dài hơn và được cho là khó viết hơn để viết thêm gợi ý về loại thời gian phát triển chỉ hoạt động trong Python 3.5+. Trước đó, bạn phải sử dụng loại Nhận xét Loại gợi ý có thể có hình phạt thời gian khởi động nhỏ trong mã sử dụng nó, đặc biệt nếu bạn nhập mô -đun gõ. Khi nào bạn nên sử dụng loại gợi ý loại sau đó? Dưới đây là một số ví dụ: nếu bạn có kế hoạch viết đoạn mã ngắn hoặc tập lệnh một lần, bạn không cần phải bao gồm các gợi ý loại. Người mới bắt đầu không cần thêm gợi ý loại khi học Python Nếu bạn đang thiết kế thư viện cho các nhà phát triển khác sử dụng, việc thêm gợi ý loại có thể là một ý tưởng tốt Các nhà phát triển cốt lõi khuyên bạn nên thêm gợi ý loại nếu bạn định viết gợi ý loại unittests là một chút của một chủ đề gây tranh cãi trong Python. Bạn không cần phải sử dụng nó mọi lúc, nhưng có một số trường hợp gợi ý loại giúp.

Hãy để dành phần còn lại của chương này để học cách sử dụng gợi ý loại!

Chú thích về gợi ý / biến đổi loại tích hợp Bạn có thể thêm loại gợi ý với các loại tích hợp sau: int float bool str byte

Chúng có thể được sử dụng cả trong các chức năng và trong chú thích thay đổi. Khái niệm chú thích thay đổi đã được thêm vào ngôn ngữ Python trong 3.6. Chú thích biến cho phép bạn thêm gợi ý loại vào các biến. Dưới đây là một số ví dụ: 1 2 3 4

X: Y: Z: A:

int # một biến có tên x mà không cần khởi tạo float = 1.0 # một biến float, khởi tạo thành 1.0 bool = false str = 'hello type gõ gợi ý'

Bạn có thể thêm một gợi ý loại vào một biến mà không cần khởi tạo nó, như trường hợp trong dòng mã đầu tiên. 3 dòng mã khác cho thấy cách chú thích từng biến và khởi tạo chúng một cách thích hợp. Hãy để xem cách bạn sẽ thêm gõ gợi ý cho các bộ sưu tập tiếp theo!

Loại thu thập một bộ sưu tập là một nhóm các mặt hàng trong Python. Các bộ sưu tập hoặc trình tự phổ biến là danh sách, dict, tuple và set. Tuy nhiên, bạn không thể chú thích các biến bằng cách sử dụng các loại tích hợp này. Thay vào đó, bạn phải sử dụng mô -đun gõ. Hãy nhìn vào một vài ví dụ: 1 2 3 4

>>> Từ việc nhập danh sách nhập >>> Tên: Danh sách [str] = ['Mike'] >>> Tên ['Mike']]

Ở đây bạn đã tạo một danh sách với một str duy nhất trong đó. Điều này chỉ định rằng bạn đang tạo một danh sách các chuỗi. Nếu bạn biết danh sách luôn có cùng kích thước, bạn có thể chỉ định loại của từng mục trong danh sách: 1 >>> từ việc nhập danh sách nhập 2 >>> Tên: Danh sách [str, str] = ['mike', 'James']

Các bộ dữ liệu gợi ý rất giống nhau: 1 >>> Từ việc nhập nhập tple 2 >>> s: tuple [int, float, str] = [5, 3.14, 'xin chào']

Từ điển có một chút khác nhau ở chỗ bạn nên gợi ý các loại khóa và giá trị là: 1 >>> từ việc nhập nhập Dict 2 >>> d: dict [str, int] = {'one': 1}

Nếu bạn biết một bộ sưu tập sẽ có kích thước thay đổi, bạn có thể sử dụng hình elip: 1 >>> từ việc nhập nhập tple 2 >>> t: tuple [int, ...] = [4, 5, 6]

Bây giờ, hãy để học hỏi những gì cần làm nếu một mục không có gì!

Các giá trị gợi ý có thể là không có giá trị nào cần được khởi tạo là không có, nhưng khi nó được đặt sau, bạn muốn nó là một cái gì đó khác. Vì vậy, bạn có thể sử dụng tùy chọn: 1 >>> từ việc nhập nhập tùy chọn 2 >>> Kết quả: Tùy chọn [str] = my_function []

Mặt khác, nếu giá trị không bao giờ có

Hãy cùng tìm hiểu làm thế nào để chú thích các chức năng tiếp theo!

Loại Gõ các chức năng Loại Gõ các chức năng tương tự như các biến gợi ý loại. Sự khác biệt chính là bạn cũng có thể thêm loại trả về vào một hàm. Hãy cùng xem một ví dụ: 1 def adder [x: int, y: int] -> none: 2 in [tổng số {x} + {y} = {x + y} ']

Ví dụ này cho bạn thấy rằng adder [] lấy hai đối số, x và y, và cả hai nên là số nguyên. Loại trả lại là không có, mà bạn chỉ định bằng cách sử dụng -> sau dấu ngoặc đơn kết thúc nhưng trước đại tràng. Hãy nói rằng bạn muốn gán hàm adder [] cho một biến. Bạn có thể chú thích biến có thể gọi được như thế này: 1 từ việc nhập nhập khẩu có thể gọi 2 3 def adder [x: int, y: int] -> none: 4 in [tổng số {x} + {y} = {{ x+y} '] 5 6 a: có thể gọi được [[int, int], none] = adder

Các cuộc gọi có thể gọi trong một danh sách các đối số cho chức năng. Nó cũng cho phép bạn chỉ định loại trả về. Chúng ta hãy xem thêm một ví dụ mà bạn vượt qua trong các đối số phức tạp hơn: 1 từ việc gõ nhập khẩu, tùy chọn 2 3 4 def some_func [x: int, 5 y: tuple [str, str], 6 z: tùy chọn [float]: = Không có]: -> Tùy chọn [str]: 7 nếu x> 10: 8 return none 9 return 'Bạn đã gọi một số_func'

Trong ví dụ này, bạn đã tạo một số_func [] chấp nhận 3 đối số: một int một bộ hai chuỗi

Một chiếc phao tùy chọn được mặc định là không có gì Lưu ý rằng khi bạn sử dụng mặc định trong một hàm, bạn nên thêm một khoảng trống trước và sau khi dấu hiệu khi sử dụng gợi ý loại. Nó cũng trả về không có hoặc một chuỗi. Hãy cùng tiếp tục và khám phá những gì cần làm trong những tình huống thậm chí phức tạp hơn!

Phải làm gì khi mọi thứ trở nên phức tạp mà bạn đã học được khi làm gì khi giá trị không thể là gì, nhưng bạn có thể làm gì khác khi mọi thứ trở nên phức tạp? Ví dụ: bạn làm gì nếu đối số được truyền vào có thể là nhiều loại khác nhau? Đối với trường hợp sử dụng cụ thể đó, bạn có thể sử dụng Union: 1 >>> từ việc nhập nhập Liên minh 2 >>> Z: Union [str, int]

Gợi ý loại này có nghĩa là biến, z, có thể là một chuỗi hoặc một số nguyên. Cũng có những trường hợp một chức năng có thể lấy trong một đối tượng. Nếu đối tượng đó có thể là một trong một số đối tượng khác nhau, thì bạn có thể sử dụng bất kỳ đối tượng nào. 1 x: any = some_function []

Sử dụng bất kỳ sự thận trọng nào bởi vì bạn có thể thực sự nói những gì bạn đang trở lại. Vì nó có thể là bất kỳ loại nào, nên nó giống như bắt được tất cả các ngoại lệ với một cái trần ngoại trừ. Bạn không biết bạn đang bắt gặp ngoại lệ nào và bạn cũng không biết bạn đang gợi ý loại nào khi bạn sử dụng.

Các lớp nếu bạn có một lớp mà bạn đã viết, bạn cũng có thể tạo một chú thích cho nó. 1 2 3 4

>>> Bài kiểm tra lớp: ... vượt qua ... >>> T: test = test []

Điều này có thể thực sự hữu ích nếu bạn đang vượt qua các trường hợp của lớp giữa các chức năng hoặc phương pháp.

Trang trí trang trí là một con thú đặc biệt. Chúng là các chức năng có các chức năng khác và sửa đổi chúng. Bạn sẽ tìm hiểu về trang trí sau này trong cuốn sách này. Thêm gợi ý loại vào trang trí là loại xấu xí. Chúng ta hãy xem: 1 từ nhập nhập bất kỳ, Callable, typevar, cast 2 f = typevar ['f', bound = callable [..., any]] 3 4 5 def my_decorator [func: f] -> f: 6 Def Wrapper [*args, ** kwds]: 7 in ["gọi", func] 8 func return [*args, ** kwds] 9 return cast [f, wrapper]

Typevar là một cách để chỉ định một loại tùy chỉnh. Bạn đang tạo một loại có thể gọi tùy chỉnh có thể có bất kỳ số lượng đối số nào và trả về bất kỳ. Sau đó, bạn tạo một trình trang trí và thêm loại mới làm gợi ý loại cho đối số đầu tiên cũng như loại trả về. Hàm Cast được sử dụng bởi MyPy, tiện ích kiểm tra mã tĩnh. Nó được sử dụng để đúc một giá trị cho loại được chỉ định. Trong trường hợp này, bạn đang đúc chức năng trình bao bọc dưới dạng loại F.

Bí quyết Bạn có thể tạo một tên mới cho một loại. Ví dụ, hãy để đổi tên loại danh sách thành vector: 1 2 3 4

>>> Từ việc nhập danh sách nhập >>> vector = Danh sách [int] >>> def some_function [a: vector] -> none: ... in [a]

Bây giờ vector và danh sách [int] đề cập đến cùng một gợi ý loại. Bí quyết Một gợi ý loại là hữu ích cho các loại phức tạp. Tài liệu đánh máy có một ví dụ tốt được sao chép dưới đây: 1 2 3 4 5

Từ gõ Nhập DicT, Tuple ConnectionOptions = Dict [str, str] address = tuple [str, int] server = tuple [địa chỉ, kết nối]

Mã này cho phép bạn làm tổ các loại bên trong các loại khác trong khi vẫn có thể viết các gợi ý loại thích hợp.

Gợi ý loại khác Có một số gợi ý loại khác mà bạn cũng có thể sử dụng. Ví dụ, có những loại có thể thay đổi chung như đột biến mà bạn có thể sử dụng cho một từ điển có thể thay đổi tùy chỉnh. Ngoài ra còn có một loại bối cảnh mà bạn sẽ sử dụng cho các nhà quản lý ngữ cảnh. Kiểm tra tài liệu đầy đủ cho tất cả các chi tiết của tất cả các loại khác nhau: //docs.python.org/3/l Library/typing.html

Loại bình luận Python 2.7 Phát triển kết thúc vào ngày 1 tháng 1 năm 2020. Tuy nhiên, sẽ có nhiều dòng mã Legacy Python 2 mà mọi người sẽ phải làm việc trong nhiều năm tới. Loại gợi ý không bao giờ được thêm vào Python 2. Nhưng bạn có thể sử dụng cú pháp tương tự như nhận xét. Đây là một ví dụ: 1 def some_function [a]: 2 # loại: str -> none 3 in [a]

Để thực hiện công việc này, bạn cần bắt đầu bình luận với loại:. Dòng này phải nằm trên cùng một dòng hoặc sau của mã mà nó đang gợi ý. Nếu hàm có nhiều đối số, thì bạn sẽ phân tách các gợi ý bằng dấu phẩy: 1 def some_function [a, b, c]: 2 # loại: [str, int, int] -> none 3 in [a]

Thay vào đó, một số ides python có thể hỗ trợ loại gợi ý trong tài liệu. Pycharm cho phép bạn làm như sau ví dụ: 1 def some_function [a, b]: 2 "" "3 @type A: int 4 @type b: float 5" ""

Mypy sẽ làm việc trên các bình luận khác, nhưng không phải về những điều này. Nếu bạn đang sử dụng pycharm, bạn có thể sử dụng một trong hai dạng gợi ý loại. Nếu công ty của bạn muốn sử dụng gợi ý loại, bạn nên ủng hộ nâng cấp lên Python 3 để tận dụng tối đa nó.

Kiểm tra loại tĩnh bạn đã thấy mypy đã đề cập nhiều lần rồi. Bạn có thể đọc tất cả về nó ở đây: //mypy-lang.org/ Nếu bạn muốn chạy MyPy trên mã của riêng mình, bạn sẽ cần cài đặt nó bằng PIP: 1 $ PIP Cài đặt MyPy

Khi bạn đã cài đặt mypy, bạn có thể chạy công cụ như thế này: 1 $ mypy my_program.py

MyPy sẽ phân tích mã của bạn và in ra bất kỳ loại lỗi nào mà nó tìm thấy. MyPy thực hiện điều này bằng cách đọc và phân tích các tệp nguồn của bạn mà không thực sự chạy mã của bạn. Quá trình phân tích này mà không chạy được gọi là kiểm tra tĩnh. Nhiều lớp lót cũng sử dụng kiểm tra tĩnh, nhưng chúng thường tìm kiếm các lỗi cú pháp, các biến không sử dụng hoặc thiếu và các vấn đề khác sẽ ngăn mã của bạn chạy. Nếu không có loại gợi ý nào trong chương trình của bạn, MyPy sẽ không báo cáo bất kỳ lỗi nào cả. Chúng ta hãy viết một chức năng gợi ý loại xấu và lưu nó vào một tệp có tên BAD_TYPE_HIGRE.PY: 1 # BAD_TYPE_HIGLE.PY 2 3 def my_function [A: str, b: str] -> none: 4 return a.Keys [] + b. Chìa khóa []

Bây giờ bạn có một số mã, bạn có thể chạy mypy chống lại nó: 1 $ mypy bad_type_hinting.py 2 bad_type_hinting.py:4: Lỗi: "str" ​​không có thuộc tính "phím" 3 Tìm thấy 1 lỗi trong 1 tệp [đã kiểm tra 1 tệp nguồn ]

Đầu ra này cho bạn biết rằng có một vấn đề trên dòng 4. Chuỗi không có thuộc tính khóa []. Hãy để cập nhật mã để xóa các cuộc gọi đến phương thức khóa không tồn tại []. Bạn có thể lưu các thay đổi này vào một tệp mới có tên BAD_TYPE_HInt

Bây giờ bạn nên chạy mypy so với thay đổi của bạn và xem bạn có sửa nó không: 1 $ mypy bad_type_hinting2.py 2 bad_type_hinting2.py:4: Lỗi: Không có giá trị trả về dự kiến ​​3 Tìm thấy 1 lỗi trong 1 tệp [đã kiểm tra 1 tệp nguồn]

Rất tiếc! Vẫn còn một lỗi. Lần này bạn biết rằng bạn không mong đợi chức năng này sẽ trả về bất cứ điều gì. Bạn có thể sửa mã để nó không trả lại bất cứ điều gì hoặc bạn có thể sửa lỗi loại để nó trả về STR. Bạn nên thử thực hiện sau này và lưu mã sau vào good_type_hinting.py: 1 # good_type_hinting.py 2 3 def my_function [A: str, b: str] -> str: 4 Trả về A + B

Bây giờ hãy chạy mypy so với tệp mới này: 1 $ mypy good_type_hinto.py 2 Thành công: Không có vấn đề nào được tìm thấy trong 1 tệp nguồn

Lần này mã của bạn không có vấn đề! Bạn có thể chạy MyPy với nhiều tệp hoặc thậm chí toàn bộ thư mục. Nếu bạn được dành riêng để sử dụng kiểu gợi ý loại trong mã của mình, thì bạn nên chạy MyPy trên mã của mình thường xuyên để đảm bảo mã của bạn không có lỗi.

Kết thúc bạn bây giờ biết loại gợi ý hoặc chú thích loại nào và làm thế nào để làm điều đó. Trong thực tế, bạn đã học được tất cả những điều cơ bản mà bạn cần thực hiện gợi ý loại một cách hiệu quả. Trong chương này, bạn đã tìm hiểu về: Ưu và nhược điểm của loại gợi ý loại gợi ý loại / biến đổi biến đổi loại các giá trị gợi ý không thể là loại gợi ý loại phải làm gì khi mọi thứ trở nên phức tạp Nhập kiểm tra nếu bạn bị kẹt, bạn nên kiểm tra các tài nguyên sau để được trợ giúp: //mypy.readthedocs.io/en/stable/cheat_sheet_py3.html typeshed - //github.com/python/typeshed / /docs.python.org/3/l Library/typing.html Loại gợi ý loại là không cần thiết trong Python. Bạn có thể viết tất cả mã của mình mà không bao giờ thêm bất kỳ chú thích nào vào mã của bạn. Nhưng loại gợi ý là tốt để hiểu và có thể chứng minh tiện dụng trong hộp công cụ của bạn.

Xem lại câu hỏi 1. Loại gợi ý trong từ của bạn là gì? 2. Tại sao bạn sẽ sử dụng loại gợi ý loại? 3. Thể hiện sự hiểu biết của bạn về kiểu gợi ý bằng cách thêm các chú thích loại vào các biến cũng như hàm. Đừng quên loại trở lại! 1 a = 1 2 b = 3.14 3 4 def my_function [x = [], y = none]: 5 nếu y không phải là không: 6 kết quả = [i * y cho i trong x] 7 khác: 8 kết quả = x 9 Kết quả trả lại

Chương 23 - Tạo nhiều chủ đề đồng thời là một chủ đề lớn trong lập trình. Khái niệm đồng thời là chạy nhiều đoạn mã cùng một lúc. Python có một vài giải pháp khác nhau được tích hợp cho thư viện tiêu chuẩn của nó. Bạn có thể sử dụng các chủ đề hoặc quy trình. Trong chương này, bạn sẽ tìm hiểu về việc sử dụng các chủ đề. Khi bạn chạy mã của riêng mình, bạn đang sử dụng một luồng duy nhất. Nếu bạn muốn chạy một cái gì đó khác trong nền, bạn có thể sử dụng mô -đun luồng Python. Trong chương này, bạn sẽ tìm hiểu những điều sau đây: Ưu điểm của việc sử dụng các chủ đề Nhược điểm sử dụng các luồng tạo các luồng phân lớp phân nhóm Viết nhiều tệp với luồng Lưu ý: Chương này không có nghĩa là toàn diện trong phạm vi bảo hiểm của các luồng. Nhưng bạn sẽ học đủ để bắt đầu sử dụng các chủ đề trong ứng dụng của mình. Hãy để bắt đầu bằng cách vượt qua những ưu và nhược điểm của việc sử dụng chủ đề!

Ưu điểm của việc sử dụng các luồng chủ đề rất hữu ích theo các cách sau: chúng có dấu chân bộ nhớ nhỏ, điều đó có nghĩa là chúng rất nhẹ để sử dụng bộ nhớ được chia sẻ giữa các luồng - giúp dễ dàng chia sẻ trạng thái trên các luồng cho phép bạn dễ dàng làm cho giao diện người dùng phản hồi tuyệt vời Tùy chọn cho các ứng dụng bị ràng buộc I/O [chẳng hạn như đọc và ghi tệp, cơ sở dữ liệu, v.v.] Bây giờ chúng ta hãy xem xét các nhược điểm!

Nhược điểm của việc sử dụng các luồng chủ đề không hữu ích theo các cách sau: Tùy chọn kém cho mã ràng buộc CPU do khóa phiên dịch toàn cầu [GIL] - xem bên dưới chúng không bị gián đoạn / có thể bị giết mã với các luồng khó hiểu hơn và viết chính xác Dễ dàng tạo điều kiện chủng tộc Khóa phiên dịch toàn cầu là một mutex bảo vệ các đối tượng Python. Điều này có nghĩa là nó ngăn chặn nhiều luồng thực thi mã byte Python cùng một lúc. Vì vậy, khi bạn sử dụng các luồng, chúng không chạy trên tất cả các CPU trên máy của bạn. Các chủ đề là tuyệt vời để chạy các ứng dụng nặng I/O, xử lý hình ảnh và số lượng Numpy, vì họ không làm bất cứ điều gì với GIL. Nếu bạn có nhu cầu chạy các quy trình đồng thời trên nhiều CPU, hãy sử dụng mô -đun đa xử lý. Bạn sẽ tìm hiểu về mô -đun đa xử lý trong chương tiếp theo. Một điều kiện cuộc đua xảy ra khi bạn có một chương trình máy tính phụ thuộc vào một thứ tự một số sự kiện nhất định xảy ra để nó thực hiện chính xác. Nếu các chủ đề của bạn thực hiện một cái gì đó theo thứ tự, thì luồng tiếp theo có thể không hoạt động và ứng dụng của bạn có thể bị sập hoặc hoạt động theo những cách không mong muốn.

Tạo chủ đề là khó hiểu nếu tất cả những gì bạn làm là nói về chúng. Nó luôn luôn tốt để làm quen với cách viết mã thực tế. Đối với chương này, bạn sẽ sử dụng mô -đun luồng sử dụng mô -đun _Thread bên dưới. Có thể tìm thấy tài liệu đầy đủ cho mô -đun luồng tại đây: //docs.python.org/3/l Library/Threading.html Hãy viết một ví dụ đơn giản cho thấy cách tạo nhiều luồng. Đặt mã sau vào một tệp có tên worker_threads.py: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

# worker_threads.py Nhập ngẫu nhiên Nhập luồng Nhập thời gian Def Worker [Tên: Str] -> Không . i} ',],] Chủ đề.start []

Ba lần nhập đầu tiên cho phép bạn truy cập vào các mô -đun ngẫu nhiên, luồng và thời gian. Bạn có thể sử dụng ngẫu nhiên để tạo số giả ngẫu nhiên hoặc chọn từ một chuỗi một cách ngẫu nhiên. Mô -đun luồng là những gì bạn sử dụng để tạo các luồng và mô -đun thời gian có thể được sử dụng cho nhiều thứ liên quan đến thời gian. Trong mã này, bạn sử dụng thời gian để chờ một khoảng thời gian ngẫu nhiên để mô phỏng mã công nhân của bạn hoạt động.

Tiếp theo bạn tạo một hàm nhân viên [] có tên của công nhân. Khi chức năng này được gọi, nó sẽ in ra công nhân nào đã bắt đầu hoạt động. Sau đó, nó sẽ chọn một số ngẫu nhiên trong khoảng từ 1 đến 5. Bạn sử dụng số này để mô phỏng lượng thời gian công nhân làm việc bằng thời gian.s ngủ []. Cuối cùng, bạn in ra một tin nhắn cho bạn biết một công nhân đã hoàn thành và thời gian công việc mất bao lâu trong vài giây. Khối mã cuối cùng tạo ra 5 luồng công nhân. Để tạo một luồng, bạn chuyển chức năng nhân viên của mình [] là hàm đích để luồng gọi. Đối số khác mà bạn chuyển sang luồng là một bộ lý số mà luồng sẽ chuyển đến hàm đích. Sau đó, bạn gọi Thread.start [] để bắt đầu chạy luồng đó. Khi chức năng ngừng thực thi, Python sẽ xóa luồng của bạn. Hãy thử chạy mã và bạn sẽ thấy rằng đầu ra sẽ trông tương tự như sau: 1 2 3 4 5 6 7 8 9 10

Started worker computer_0 Started worker computer_1 Started worker computer_2 Started worker computer_3 Started worker computer_4 computer_0 worker finished computer_3 worker finished computer_4 worker finished computer_2 worker finished computer_1 worker finished

in in in in in

1 1 3 3 4

seconds seconds seconds seconds seconds

Your output will differ from the above because the workers sleep[] for random amounts of time. In fact, if you run the code multiple times, each invocation of the script will probably have a different result. threading.Thread

is a class. Here is its full definition:

1 threading.Thread[ 2 group=None, target=None, name=None, 3 args=[], kwargs={}, 4 *, 5 daemon=None, 6 ]

You could have named the threads when you created the thread rather than inside of the worker[] function. The args and kwargs are for the target

function. You can also tell Python to make the thread into a daemon. “Daemon threads” have no claim on the Python interpreter, which has two main consequences: 1] if only daemon threads are left, Python will shut down, and 2] when Python shuts down, daemon threads are abruptly stopped with no notification. The group parameter should be left alone as it was added for future extension when a ThreadGroup is added to the Python language.

Subclassing Thread The Thread class from the threading module can also be subclassed. This allows you more fine-grained control over your thread’s creation, execution and eventual deletion. You will encounter subclassed threads often. Let’s rewrite the previous example using a subclass of Thread. Put the following code into a file named worker_thread_subclass.py. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

# worker_thread_subclass.py import random import threading import time class WorkerThread[threading.Thread]: def __init__[self, name]: threading.Thread.__init__[self] self.name = name self.id = id[self] def run[self]: """ Run the thread """ worker[self.name, self.id] def worker[name: str, instance_id: int] -> None: print[f'Started worker {name} - {instance_id}'] worker_time = random.choice[range[1, 5]] time.sleep[worker_time] print[f'{name} - {instance_id} worker finished in ' f'{worker_time} seconds'] if __name__ == '__main__': for i in range[5]: thread = WorkerThread[name=f'computer_{i}'] thread.start[]

In this example, you create the WorkerThread class. The constructor of the class, __init__[], accepts a single argument, the name to be given to thread. This is stored off in an instance attribute, self.name. Then you override the run[] method. The run[] method is already defined in the Thread class. It controls how the thread will run. It will call or invoke the function that you passed into the class when you created it. When you create your own run[] method in

your subclass, it is known as overriding the original. This allows you to add custom behavior such as logging to your thread that isn’t there if you were to use the base class’s run[] method. You call the worker[] function in the run[] method of your WorkerThread. The worker[] function itself has a minor change in that it now accepts the instance_id argument which represents the class instance’s unique id. You also need to update the print[] functions so that they print out the instance_id. The other change you need to do is in the __main__ conditional statement where you call WorkerThread and pass in the name rather than calling threading.Thread[] directly as you did in the previous section. When you call start[] in the last line of the code snippet, it will call run[] for you itself. The start[] method is a method that is a part of the threading.Thread class and you did not override it in your code. The output when you run this code should be similar to the original version of the code, except that now you are also including the instance id in the output. Give it a try and see for yourself!

Writing Multiple Files with Threads There are several common use cases for using threads. One of those use cases is writing multiple files at once. It’s always nice to see how you would approach a real-world problem, so that’s what you will be doing here. To get started, you can create a file named writing_thread.py. Then add the following code to your file: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

# writing_thread.py import random import time from threading import Thread class WritingThread[Thread]: def __init__[self, filename: str, number_of_lines: int, work_time: int = 1] -> None: Thread.__init__[self] self.filename = filename self.number_of_lines = number_of_lines self.work_time = work_time def run[self] -> None: """ Run the thread """ print[f'Writing {self.number_of_lines} lines of text to ' f'{self.filename}'] with open[self.filename, 'w'] as f: for line in range[self.number_of_lines]: text = f'This is line {line+1}\n' f.write[text] time.sleep[self.work_time] print[f'Finished writing {self.filename}'] if __name__ == '__main__': files = [f'test{x}.txt' for x in range[1, 6]] for filename in files: work_time = random.choice[range[1, 3]] number_of_lines = random.choice[range[5, 20]] thread = WritingThread[filename, number_of_lines, work_time] thread.start[]

Hãy cùng phá vỡ điều này một chút và đi qua từng phần của mã riêng lẻ: 1 Nhập ngẫu nhiên 2 Thời gian nhập khẩu

3 Từ luồng nhập luồng 4 5 6 Viết lớp [Chủ đề]: 7 8 def __init __ [self, 9 fileName: str, 10 number_of_lines: int, 11 work_time: int = 1] -> none: 12 Chủ đề .__ init __ [self] 13 self.filename = fileName 14 self.number_of_lines = number_of_lines 15 self.work_time = work_time

Ở đây bạn đã tạo lớp viết. Nó chấp nhận một tên tệp, một số_of_lines và work_time. Điều này cho phép bạn tạo một tệp văn bản với một số dòng cụ thể. Work_time là để ngủ giữa việc viết từng dòng để mô phỏng việc viết một tệp lớn hoặc nhỏ. Hãy nhìn vào những gì diễn ra trong Run []: 1 2 3 4 5 6 7 8 9 10 11 12 12

def chạy [self] -> none: "" "Chạy chuỗi" "" in [f'Writing {self.number_of_lines} dòng văn bản thành 'f' {self.filename} '] với open [self.filename,' w '] như f: cho dòng trong phạm vi [self.number_of_lines]: text = f'this là dòng {line+1} \ n' f.write [text] thời gian.s ngủ [self.work_time] Viết {self.filename} ']

Mã này là nơi tất cả các phép thuật xảy ra. Bạn in ra có bao nhiêu dòng văn bản bạn sẽ viết vào một tệp. Sau đó, bạn thực hiện chứng thư và tạo tệp và thêm văn bản. Trong quá trình, bạn ngủ [] để thêm một số thời gian nhân tạo để viết các tệp vào đĩa. Phần cuối cùng của mã xem là như sau: 1 nếu __name__ == '__main__': 2 tệp = [f'test {x} .txt 'cho x trong phạm vi [1, 6]] 3 cho tên tệp trong các tệp: 4 work_time = Random.choice [phạm vi [1, 3]] 5 Number_of_lines = Random.choice [phạm vi [5, 20]] 6 Thread = writeThread [fileName, number_of_lines, work_time] 7 thread.start []

Trong đoạn mã cuối cùng này, bạn sử dụng danh sách hiểu để tạo 5 tên tệp. Sau đó, bạn lặp qua các tập tin và tạo chúng. Bạn sử dụng mô -đun ngẫu nhiên Python, để chọn số lượng Work_time ngẫu nhiên và số ngẫu nhiên_of_lines để ghi vào tệp. Cuối cùng, bạn tạo bản viết và bắt đầu [] nó. Khi bạn chạy mã này, bạn sẽ thấy một cái gì đó như thế này nhận được đầu ra: 1 2 3 4 5 6 7 8 9 10

Viết 5 dòng văn bản để test1.txt Viết 18 dòng văn bản thành test2.txt Viết 7 dòng văn bản thành test3 Hoàn thành bài Test.TXT Viết hoàn thành Test4.txtfinished Writing Test5.TXT Viết xong Test2.txt

Bạn có thể nhận thấy một số đầu ra kỳ lạ như dòng một vài dòng từ dưới cùng. Điều này đã xảy ra vì nhiều chủ đề đã xảy ra để viết cho stdout cùng một lúc. Bạn có thể sử dụng mã này cùng với Python từ Urllib.Request để tạo một ứng dụng để tải xuống các tệp từ Internet. Hãy tự mình thử dự án đó.

Kết thúc bạn đã học được những điều cơ bản về việc xâu chuỗi trong Python. Trong chương này, bạn đã tìm hiểu về những điều sau: Ưu điểm của việc sử dụng các chủ đề truy cập sử dụng các luồng tạo các luồng phân lớp phân nhóm Viết nhiều tệp với các chủ đề có nhiều hơn cho các chủ đề và đồng thời so với những gì được đề cập ở đây. Bạn đã không tìm hiểu về giao tiếp chủ đề, nhóm chủ đề hoặc khóa chẳng hạn. Tuy nhiên, bạn có biết những điều cơ bản của việc tạo chủ đề và bạn sẽ có thể sử dụng chúng thành công. Trong chương tiếp theo, bạn sẽ tiếp tục tìm hiểu về sự đồng thời trong Python thông qua việc khám phá cách thức hoạt động của nhiều bộ xử lý trong Python!

Xem lại câu hỏi 1. Chủ đề tốt cho cái gì? 2. Bạn sử dụng mô -đun nào để tạo một luồng trong Python? 3. Khóa phiên dịch toàn cầu là gì?

Chương 24 - Tạo nhiều quy trình Hầu hết các nhà sản xuất CPU đang tạo CPU đa lõi ngay bây giờ. Ngay cả điện thoại di động cũng đi kèm với nhiều lõi! Các chủ đề Python có thể sử dụng các lõi đó vì khóa phiên dịch toàn cầu. Bắt đầu từ Python 2.6, mô -đun đa xử lý đã được thêm vào cho phép bạn tận dụng tối đa tất cả các lõi trên máy của bạn. Trong chương này, bạn sẽ tìm hiểu về các chủ đề sau: Ưu điểm của việc sử dụng các quy trình sử dụng các quy trình tạo quy trình với quy trình phân lớp đa xử lý tạo ra một nhóm quy trình Chương này không phải là một tổng quan toàn diện về đa xử lý. Chủ đề đa xử lý và đồng thời nói chung sẽ phù hợp hơn trong một cuốn sách của riêng nó. Bạn luôn có thể kiểm tra tài liệu cho mô -đun đa xử lý nếu bạn cần ở đây: //docs.python.org/2/l Library/multiprocessing.html Bây giờ, hãy bắt đầu!

Việc sử dụng các quy trình Có một số ưu điểm để sử dụng các quy trình: Các quy trình sử dụng mã không gian bộ nhớ riêng biệt có thể đơn giản hơn so với các luồng sử dụng nhiều CPU / lõi tránh các quy trình con của Intergenters Lock [GiL] toàn cầu [không giống như các luồng] có một giao diện tương tự như luồng.thread

Tốt cho xử lý liên kết CPU [mã hóa, tìm kiếm nhị phân, phép nhân ma trận] Bây giờ, hãy để xem xét một số nhược điểm của các quy trình!

Nhược điểm của việc sử dụng các quy trình cũng có một vài khuyết điểm để sử dụng các quy trình: giao tiếp giữa các phương tiện là dấu chân bộ nhớ phức tạp hơn lớn hơn các chủ đề Bây giờ, hãy để học cách tạo ra một quy trình với Python!

Tạo các quy trình với đa bộ xử lý mô -đun đa xử lý được thiết kế để mô phỏng cách lớp phân luồng hoạt động. Với ý nghĩ đó, bạn có thể lấy mã từ chương trước và sửa đổi nó để sử dụng các quy trình thay vì các luồng. Tại đây, cách bạn sẽ sửa đổi ví dụ đầu tiên: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

Nhập đa xử lý Nhập ngẫu nhiên Thời gian DEF Công nhân [Tên: Str] -> Không '{name} Công nhân đã hoàn thành trong {worker_time} giây'] nếu __name__ == '__main__': processes = [] cho i trong phạm vi [5] i} ',]]

Thay đổi đầu tiên ở đây là bạn đang nhập mô -đun đa xử lý. Hai lần nhập khác là cho các mô -đun ngẫu nhiên và thời gian tương ứng. Sau đó, bạn có chức năng Công nhân ngớ ngẩn [] giả vờ làm một số công việc. Nó lấy một cái tên và không trả lại gì. Bên trong hàm của công nhân [], nó sẽ in ra tên của người lao động, sau đó nó sẽ sử dụng thời gian.s ngủ [] để mô phỏng thực hiện một số quy trình chạy dài. Cuối cùng, nó sẽ in ra rằng nó đã hoàn thành. Phần cuối cùng của đoạn mã là nơi bạn tạo 5 quy trình công nhân. Bạn sử dụng Multiprocessing.Process [], hoạt động khá giống như cách Threading.Thread [] đã làm. Bạn cho quá trình sử dụng chức năng mục tiêu nào và

Những lý lẽ để truyền lại cho nó. Sự khác biệt chính là lần này bạn đang tạo một danh sách các quy trình. Đối với mỗi quy trình, bạn gọi phương thức START [] của nó để bắt đầu quá trình. Sau đó, cuối cùng, bạn lặp qua danh sách các quy trình và gọi phương thức tham gia [] của nó, cho biết Python chờ quá trình chấm dứt. Khi bạn chạy mã này, bạn sẽ thấy đầu ra tương tự như sau: 1 2 3 4 5 6 7 8 9 10

Công nhân khởi động Máy tính_0 Bắt đầu công nhân máy tính_1 Công nhân đã bắt đầu máy tính_2 bắt đầu công nhân máy tính_3 Công nhân đã bắt đầu máy tính_4 Máy tính_2 Công nhân đã hoàn thành máy tính_1 Công nhân đã hoàn thành máy tính_3 Công nhân đã hoàn thành máy tính_0 Công nhân đã hoàn thành máy tính

trong trong trong trong

2 3 3 4 4

giây giây giây giây giây giây

Mỗi lần bạn chạy tập lệnh của mình, đầu ra sẽ khác một chút vì mô -đun ngẫu nhiên. Hãy thử và xem cho chính mình!

Quá trình phân lớp Lớp quy trình từ mô -đun đa xử lý cũng có thể được phân lớp. Nó hoạt động theo cách tương tự như lớp luồng. Hãy để một cái nhìn: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

# worker_thread_subclass.py Nhập ngẫu nhiên Nhập đa xử lý Nhập thời gian Lớp thời gian Công nhân [Multiprocessing. Chủ đề "" "Công nhân [self.name] def worker [name: str] -> none: print [f'started worker {name} '] worker_time = ngẫu nhiên.choice [phạm vi [1, 5]] thời gian.sle . ] quy trình.Append [Process] Process.start [] cho quy trình trong quy trình: Process.join []

Mã này sẽ trông quen thuộc. Lớp Công nhân chính xác giống như lớp WorkerThread từ chương trước ngoại trừ việc nó là quy trình phân lớp thay vì luồng. Sự khác biệt duy nhất trong mã này là trên dòng 28 nơi bạn khởi tạo lớp. Tại đây bạn phải tạo một quy trình và thêm nó vào một danh sách quy trình. Sau đó để nó hoạt động đúng, bạn cần phải lặp qua danh sách các quy trình và gọi

trên mỗi người trong số họ. Điều này hoạt động chính xác như nó đã làm trong ví dụ quy trình trước từ phần cuối. tham gia[]

Đầu ra từ lớp này cũng phải khá giống với đầu ra từ phần trước.

Tạo một nhóm quy trình Nếu bạn có nhiều quy trình để chạy, đôi khi bạn sẽ muốn giới hạn số lượng quy trình có thể chạy cùng một lúc. Ví dụ, hãy để nói rằng bạn cần phải chạy 20 quy trình nhưng bạn có bộ xử lý chỉ có 4 lõi. Bạn có thể sử dụng mô -đun đa xử lý để tạo nhóm quy trình sẽ giới hạn số lượng quy trình chỉ chạy đến 4 cùng một lúc. Đây là cách bạn có thể làm điều đó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17

Nhập thời gian nhập ngẫu nhiên từ nhân viên nhập khẩu nhập khẩu nhân công [tên: str] -> none: print [f'started worker {name} '] worker_time = ngẫu nhiên.choice [phạm vi [1, 5]] thời gian.s ngủ [worker_time] in . .Map [công nhân, process_names] pool.terminate []

Trong ví dụ này, bạn có cùng hàm công nhân []. Thịt thật của mã là ở cuối nơi bạn tạo 15 tên quy trình bằng cách hiểu danh sách. Sau đó, bạn tạo một nhóm và đặt tổng số quy trình để chạy cùng một lúc thành 5. Để sử dụng nhóm, bạn cần gọi phương thức bản đồ [] và truyền nó là chức năng bạn muốn gọi cùng với các đối số để chuyển đến hàm số. Python bây giờ sẽ chạy 5 quy trình [hoặc ít hơn] tại một thời điểm cho đến khi tất cả các quy trình kết thúc. Bạn cần gọi chấm dứt [] trên nhóm ở cuối hoặc bạn sẽ thấy một thông báo như thế này: 1 /l Library : 216: 3 userWarning: resource_tracker: Dường như có 6 đối tượng semaphore bị rò rỉ để clea \ 4 n khi tắt

Bây giờ bạn đã biết làm thế nào để tạo ra một nhóm quy trình với Python!

Gói lên bây giờ bạn đã học được những điều cơ bản của việc sử dụng mô -đun đa xử lý. Bạn đã học được những điều sau: Ưu điểm của việc sử dụng các quy trình sử dụng các quy trình tạo quy trình với quy trình phân lớp đa xử lý tạo ra một nhóm quy trình, có nhiều điều để đa xử lý hơn những gì được đề cập ở đây. Bạn có thể tìm hiểu cách sử dụng mô -đun hàng đợi Python để có được đầu ra từ các quy trình. Có chủ đề giao tiếp giữa các chuyên gia. Và cũng có nhiều hơn nữa. Tuy nhiên, mục tiêu là học cách tạo các quá trình, không tìm hiểu mọi sắc thái của mô -đun đa xử lý. Đồng thời là một chủ đề lớn sẽ cần bảo hiểm chuyên sâu hơn nhiều so với những gì có thể được đề cập trong cuốn sách này.

Xem lại câu hỏi 1. Các quy trình tốt cho điều gì? 2. Làm thế nào để bạn tạo ra một quá trình trong Python? 3. Bạn có thể tạo một nhóm quy trình trong Python không? Làm sao? 4. Hiệu ứng nào, nếu có, khóa phiên dịch toàn cầu có trong các quy trình? 5. Điều gì xảy ra nếu bạn không sử dụng Process.join []?

Chương 25 - Ra mắt các quy trình con với Python Có những lúc bạn đang viết một ứng dụng và bạn cần chạy một ứng dụng khác. Ví dụ: bạn có thể cần mở Microsoft Notepad trên Windows vì một số lý do. Hoặc nếu bạn đang ở trên Linux, bạn có thể muốn chạy grep. Python có hỗ trợ để khởi chạy các ứng dụng bên ngoài thông qua mô -đun phụ. Mô -đun phụ đã là một phần của Python kể từ Python 2.4. Trước đó, bạn cần sử dụng mô -đun HĐH. Bạn sẽ thấy rằng mô -đun phụ hoàn toàn có khả năng và đơn giản để sử dụng. Trong chương này, bạn sẽ tìm hiểu cách sử dụng: Chức năng SubProcess.Run [] Chức năng Sub thế giới.Popen [] Lớp SubProcess.Popen.Croccilate [] Chức năng Đọc và viết với stdin và stdout Hãy bắt đầu!

Hàm sub -crocess.run [] hàm Run [] được thêm vào trong Python 3.5. Hàm chạy [] là phương pháp sử dụng quy trình con được đề xuất. Nói chung thường có thể hữu ích khi xem xét định nghĩa của một hàm, để hiểu rõ hơn về cách thức hoạt động: 1 quy trình con. Sai

Bạn không cần phải biết tất cả các đối số này làm gì để sử dụng Run [] một cách hiệu quả. Trên thực tế, hầu hết thời gian bạn có thể thoát khỏi chỉ biết những gì diễn ra như là đối số đầu tiên và có thể kích hoạt shell hay không. Phần còn lại của các đối số là hữu ích cho các trường hợp sử dụng rất cụ thể. Hãy để thử chạy một lệnh linux / mac phổ biến, ls. Lệnh LS được sử dụng để liệt kê các tệp trong một thư mục. Theo mặc định, nó sẽ liệt kê các tệp trong thư mục bạn hiện đang ở. Để chạy nó với quy trình con, bạn sẽ làm như sau: 1 2 3 4

>>> Nhập quy trình phụ >>> SubProcess.Run [['ls']] FileName đã hoàn thành

Bạn cũng có thể đặt shell = true, sẽ chạy lệnh thông qua chính shell. Hầu hết thời gian, bạn sẽ không cần phải làm điều này, nhưng nó có thể hữu ích nếu bạn cần kiểm soát nhiều hơn trong quá trình và muốn truy cập vào các ống dẫn và ký tự đại diện. Nhưng điều gì sẽ xảy ra nếu bạn muốn giữ đầu ra từ một lệnh để bạn có thể sử dụng nó sau? Hãy để tìm hiểu làm thế nào bạn sẽ làm điều đó tiếp theo!

Nhận đầu ra khá thường xuyên, bạn sẽ muốn lấy đầu ra từ một quy trình bên ngoài và sau đó làm một cái gì đó với dữ liệu đó. Để nhận đầu ra từ Run [], bạn có thể đặt đối số Capture_output thành true:

1 >>> subprocess.run[['ls', '-l'], capture_output=True] 2 CompletedProcess[args=['ls', '-l'], returncode=0, 3 stdout=b'total 40\[email protected] 1 michael staff some_file\n', 4 stderr=b'']

17083 Apr 15 13:17

Now this isn’t too helpful as you didn’t save the returned output to a variable. Go ahead and update the code so that you do and then you’ll be able to access stdout. 1 >>> output = subprocess.run[['ls', '-l'], capture_output=True] 2 >>> output.stdout 3 b'total 40\[email protected] 1 michael staff 17083 Apr 15 13:17 some_file\n'

The output is a CompletedProcess class instance, which lets you access the args that you passed in, the returncode of the subprocess, as well as the subprocess’ stdout and stderr. You will learn about the returncode in a moment. The stderr is where most programs print their error messages to, while stdout is for ordinary program output. If you are interested, you can play around with this code and discover what is currently in those attributes, if anything: 1 2 3 4

output = subprocess.run[['ls', '-l'], capture_output=True] print[output.returncode] print[output.stdout] print[output.stderr]

Let’s move on and learn about Popen next.

The subprocess.Popen[] Class The subprocess.Popen[] class has been around since the subprocess module itself was added. It has been updated several times in Python 3. If you are interested in learning about some of those changes, you can read about them here: //docs.python.org/3/library/subprocess.html#popen-constructor You can think of Popen as the low-level version of run[]. If you have an unusual use-case that run[] cannot handle, then you should be using Popen instead. For now, let’s look at how you would run the command in the previous section with Popen: 1 2 3 4 5 6 7

>>> import subprocess >>> subprocess.Popen[['ls', '-l']]

>>> total 40 [email protected] 1 michael staff 17083 Apr 15 13:17 some_file >>>

The syntax is almost identical except that you are using Popen instead of run[]. Here is how you might get the return code from the external process: 1 2 3 4 5 6 7 8

>>> process = subprocess.Popen[['ls', '-l']] >>> total 40 [email protected] 1 michael staff 17083 Apr 15 13:17 some_file >>> return_code = process.wait[] >>> return_code 0 >>>

A return_code of 0 means that the program finished successfully. If you open up a program with a user interface, such as Microsoft Notepad, you will need to switch back to your REPL or IDLE session to add the process.wait[] line. The reason for this is that Notepad will appear over the top of your program. If you do not add the process.wait[] call to your script, then you won’t be able to catch the return code after manually closing any user interface program you may have started up via subprocess.

You can use your process handle to access the process id via the pid attribute. You can also kill [SIGKILL] the process by calling process.kill[] or terminate [SIGTERM] it via process.terminate[].

What is SIGKILL / SIGTERM? If you are not familiar with the terms “SIGKILL” and “SIGTERM”, just note that these are standard commands related to interacting with processes in UNIX systems. The subprocess.Popen[] class provides a convenient interface to interact with these commands. If you’re interested, you can read more on Wikipedia about Signal Handling: //en.wikipedia.org/wiki/Signal_[IPC]

The subprocess.Popen.communicate[] Function There are times when you need to communicate with the process that you have spawned. You can use the Popen.communicate[] method to send data to the process as well as extract data. For this section, you will only use communicate[] to extract data. Let’s use communicate[] to get information using the ifconfig command, which you can use to get information about your computer’s network card on Linux or Mac. On Windows, you would use ipconfig. Note that there is a one-letter difference in this command, depending on your Operating System. Here’s the code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

>>> import subprocess >>> cmd = ['ifconfig'] >>> process = subprocess.Popen[ cmd, stdout=subprocess.PIPE, encoding='utf-8', ] >>> data = process.communicate[] >>> print[data[0]] lo0: flags=8049 mtu 16384 options=1203 inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 nd6 options=201 gif0: flags=8010 mtu 1280 stf0: flags=0 mtu 1280 XHC20: flags=0 mtu 0 # -------- truncated --------

This code is set up a little differently than the last one. Let’s go over each piece in more detail. The first thing to note is that you set the stdout parameter to a subprocess.PIPE. That allows you to capture anything that the process sends to stdout. You also set the encoding to utf-8. The reason you do that is to make the output a little easier to read, since the subprocess.Popen call returns bytes by default rather than strings. The next step is to call communicate[] which will capture the data from the process and return it. The communicate[] method returns both stdout and

Stderr, không có.

Vì vậy, bạn sẽ nhận được một tuple. Bạn đã bắt giữ Stderr ở đây, vì vậy điều đó sẽ

Cuối cùng, bạn in ra dữ liệu. Chuỗi khá dài, vì vậy đầu ra bị cắt ở đây. Hãy để tiếp tục và tìm hiểu cách bạn có thể đọc và viết với quy trình con!

Đọc và viết với Stdin và Stdout, hãy giả vờ rằng nhiệm vụ của bạn cho ngày hôm nay là viết một chương trình Python kiểm tra các quy trình đang chạy hiện đang chạy trên máy chủ Linux của bạn và in ra những quy trình đang chạy với Python. Bạn có thể nhận được một danh sách các quy trình đang chạy hiện đang chạy bằng PS -EF. Thông thường, bạn sẽ sử dụng lệnh đó và dòng ống của nó để grep, một tiện ích dòng lệnh Linux khác được sử dụng để tìm kiếm các chuỗi trong các tệp. Dưới đây là lệnh hoàn chỉnh Linux bạn có thể sử dụng: 1 ps -ef | Grep Python

Tuy nhiên, bạn muốn dịch lệnh đó thành Python bằng mô -đun phụ. Đây là một cách bạn có thể làm điều đó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17

Nhập quá trình phụ CMD = ['PS', '-EF'] .Stdout, stdout = sub crocess.pipe, expoding = 'utf-8',] ps.stdout.close [] aput

Mã này tái tạo lệnh ps -ef và sử dụng quy trình con.popen để gọi nó. Bạn nắm bắt đầu ra từ lệnh bằng cách sử dụng quy trình con.pipe. Đối với lệnh grep, bạn đặt stdin của nó là đầu ra của lệnh PS. Bạn cũng nắm bắt được stdout của lệnh grep và đặt mã hóa thành UTF8 như trước đây. Điều này có hiệu quả nhận được đầu ra từ lệnh PS và các đường ống trực tuyến hoặc cung cấp nó vào lệnh grep. Tiếp theo, bạn đóng [] lệnh ps stdout và sử dụng

Phương thức GREP Lệnh giao tiếp [] để có được đầu ra từ grep. Để hoàn thành nó, bạn chia đầu ra trên dòng mới [\ n], cung cấp cho bạn một danh sách các chuỗi sẽ là danh sách tất cả các quy trình Python hoạt động của bạn. Nếu bạn không có bất kỳ quy trình Python hoạt động nào chạy ngay bây giờ, đầu ra sẽ là một danh sách trống. Bạn luôn có thể tự mình chạy PS -EF và tìm một cái gì đó khác để tìm kiếm ngoài Python và thử thay thế.

Kết thúc mô -đun phụ khá linh hoạt và cung cấp cho bạn một giao diện phong phú để làm việc với các quy trình bên ngoài. Trong chương này, bạn đã tìm hiểu về: Chức năng của quy trình con. . Tuy nhiên, bây giờ bạn có thể sử dụng quy trình phụ chính xác. Hãy tiếp tục và thử nó!

Xem lại câu hỏi 1. Làm thế nào bạn sẽ khởi chạy Microsoft Notepad hoặc trình soạn thảo văn bản yêu thích của bạn với Python? 2. Bạn sử dụng phương pháp nào để có được kết quả từ một quá trình? 3. Làm thế nào để bạn có được quy trình phụ để trả lại chuỗi thay vì byte?

Chương 26 - Gỡ lỗi mã của bạn với các lỗi PDB trong mã của bạn được gọi là Bugs lỗi. Bạn sẽ phạm sai lầm. Bạn sẽ phạm nhiều sai lầm, và điều đó hoàn toàn ổn. Hầu hết thời gian, chúng sẽ là những sai lầm đơn giản như lỗi chính tả. Nhưng vì máy tính rất theo nghĩa đen, ngay cả lỗi chính tả cũng ngăn mã của bạn hoạt động như dự định. Vì vậy, họ cần phải được sửa chữa. Quá trình sửa lỗi của bạn trong lập trình được gọi là gỡ lỗi. Ngôn ngữ lập trình Python đi kèm với trình gỡ lỗi tích hợp của riêng nó có tên là PDB. Bạn có thể sử dụng PDB trên dòng lệnh hoặc nhập nó dưới dạng mô -đun. Tên, PDB, viết tắt của trình gỡ lỗi Python. Dưới đây là một liên kết đến tài liệu đầy đủ cho PDB: //docs.python.org/3/l Library/pdb.html Trong chương này, bạn sẽ làm quen với những điều cơ bản của việc sử dụng PDB. Cụ thể, bạn sẽ tìm hiểu những điều sau: Bắt đầu PDB trong bản bắt đầu PDB bắt đầu trên dòng lệnh bước qua mã thêm điểm dừng trong PDB tạo điểm dừng với set_trace [] Các biên tập viên Python có trình gỡ lỗi với nhiều tính năng hơn. Bạn sẽ tìm thấy trình gỡ lỗi trong pycharm hoặc wingide để có nhiều tính năng hơn, chẳng hạn như tự động hoàn thành, tô sáng cú pháp và ngăn xếp cuộc gọi đồ họa. Một ngăn xếp cuộc gọi là những gì trình gỡ lỗi của bạn sẽ sử dụng để theo dõi các cuộc gọi chức năng và phương thức. Khi có thể, bạn nên sử dụng trình gỡ lỗi được bao gồm

Với ide python của bạn vì nó có xu hướng dễ hiểu hơn một chút. Tuy nhiên, có những lúc bạn có thể không có Python IDE của mình, ví dụ khi bạn đang gỡ lỗi từ xa trên máy chủ. Đó là những lúc bạn sẽ thấy PDB đặc biệt hữu ích. Bắt đầu nào!

Bắt đầu PDB theo cách tốt nhất để bắt đầu là có một số mã mà bạn muốn chạy PDB. Vui lòng sử dụng mã của riêng bạn hoặc một ví dụ về mã từ một chương khác của cuốn sách này. Hoặc bạn có thể tạo mã sau trong một tệp có tên DEBUG_CODE.PY: 1 2 3 4 5 6 7 8 9 10 11 12 13

# DEBUG_CODE.PY DEF LOG [Number]: PRIN log [i] nếu __name__ == '__main__': looper [5]

Có một số cách để bắt đầu PDB và sử dụng nó với mã của bạn. Trong ví dụ này, bạn sẽ cần mở một thiết bị đầu cuối [hoặc cmd.exe nếu bạn là người dùng Windows]. Sau đó điều hướng đến thư mục nơi bạn đã lưu mã của mình. Bây giờ hãy bắt đầu Python trong thiết bị đầu cuối của bạn. Điều này sẽ cung cấp cho bạn Python REP nơi bạn có thể nhập mã của mình và chạy trình gỡ lỗi, PDB. Ở đây, cách thức: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

>>> Nhập DEBUG_CODE >>> Nhập PDB >>> pdb.run ['Debug_code.looper [5]'] : 3 Xử lý 2 Thêm 2 vào số: 4 Xử lý 3 Thêm 2 vào số: 5 Xử lý 4 Thêm 2 vào số: 6

Hai dòng mã đầu tiên nhập mã của bạn và PDB. Để chạy PDB so với mã của bạn, bạn cần sử dụng pdb.run [] và cho nó biết phải làm gì. Trong trường hợp này, bạn vượt qua trong DEBUG_CODE.Looper [5] dưới dạng chuỗi. Khi bạn làm điều này, PDB

Mô -đun sẽ chuyển đổi chuỗi thành một cuộc gọi chức năng thực tế của DEBUG_CODE.Looper [5]. Dòng tiếp theo được tiền tố với [PDB]. Điều đó có nghĩa là bạn đang ở trong trình gỡ lỗi. Thành công! Để chạy mã của bạn trong trình gỡ lỗi, hãy gõ tiếp tục hoặc C viết tắt. Điều này sẽ chạy mã của bạn cho đến khi một trong những điều sau đây xảy ra: mã tăng một ngoại lệ mà bạn có được một điểm dừng [được giải thích sau trong chương này], mã hoàn thành trong trường hợp này, không có trường hợp ngoại lệ hoặc điểm nào được đặt, vì vậy mã hoạt động hoàn hảo và hoàn thành thực thi!

Bắt đầu PDB trên dòng lệnh Một cách khác để bắt đầu PDB là thông qua dòng lệnh. Quá trình bắt đầu PDB theo cách này tương tự như phương thức trước đó. Bạn vẫn cần mở thiết bị đầu cuối của mình và điều hướng đến thư mục nơi bạn đã lưu mã của mình. Nhưng thay vì mở Python, bạn sẽ chạy lệnh này: 1 python -m pdb debug_code.py

Khi bạn chạy PDB theo cách này, đầu ra sẽ hơi khác nhau: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17

> /python101code/ch CHƯƠNG26_debugging/debug_code.py [1] [] -> def log [số]: [pdb] Tiếp tục xử lý 0 Thêm 2 vào số: 2 Xử lý 1 Thêm 2 vào số: 3 Xử lý 3 Thêm 2 vào số: 5 Xử lý 4 Thêm 2 vào số: 6 Chương trình đã hoàn thành và sẽ được khởi động lại> /python101code/chapter26_debugging/debug_code.py [1] []

Dòng thứ 3 của đầu ra ở trên có cùng một lời nhắc [PDB] mà bạn đã thấy trong phần trước. Khi bạn thấy lời nhắc đó, bạn biết rằng bạn hiện đang chạy trong trình gỡ lỗi. Để bắt đầu gỡ lỗi, hãy nhập lệnh tiếp tục. Mã sẽ chạy thành công như trước, nhưng sau đó bạn sẽ thấy một thông báo mới: 1 chương trình đã hoàn thành và sẽ được khởi động lại

Trình gỡ lỗi đã hoàn thành việc chạy qua tất cả các mã của bạn và sau đó bắt đầu lại từ đầu! Đó là tiện dụng để chạy mã của bạn nhiều lần! Nếu bạn không muốn chạy lại mã, bạn có thể nhập thoát để thoát trình gỡ lỗi.

Bước qua mã bước qua mã của bạn là khi bạn sử dụng trình gỡ lỗi của mình để chạy một dòng mã tại một thời điểm. Bạn có thể sử dụng PDB để bước qua mã của mình bằng cách sử dụng lệnh Bước hoặc S. Sau đây là một vài dòng đầu ra đầu tiên mà bạn sẽ thấy nếu bạn bước qua mã của mình với PDB: 1 2 3 4 5 6 7 8 9 10 11 12 13

$ python -m pdb debug_code.py> /python101code/ch CHƯƠNG26_debugging/debug_code.py [3] [] def looper [số]: [pdb] s> /python101code/chapter26_debugging/debug_code.py [12] [] -> if [] -> looper [5] [PDB]

Lệnh đầu tiên mà bạn chuyển sang PDB là bước. Sau đó, bạn sử dụng S để bước qua hai dòng sau. Bạn có thể thấy rằng cả hai lệnh đều làm chính xác giống nhau, vì S S S S S S S S S S S S S S S S S S S S S S S Sh Sh là một phím tắt. Bạn có thể sử dụng lệnh [hoặc n] tiếp theo để tiếp tục thực thi cho đến khi dòng tiếp theo trong hàm. Nếu có một cuộc gọi chức năng trong chức năng của bạn, tiếp theo sẽ bước qua nó. Điều đó có nghĩa là nó sẽ gọi hàm, thực hiện nội dung của nó và sau đó tiếp tục đến dòng tiếp theo trong hàm hiện tại. Điều này, trong thực tế, các bước trên chức năng. Bạn có thể sử dụng bước và bên cạnh điều hướng mã của bạn và chạy các phần khác nhau một cách hiệu quả. Nếu bạn muốn bước vào hàm looper [], tiếp tục sử dụng bước. Mặt khác, nếu bạn không muốn chạy từng dòng mã trong hàm looper [], thì bạn có thể sử dụng tiếp theo. Bạn nên tiếp tục phiên của mình trong PDB bằng cách gọi bước để bạn bước vào looper []:

1 2 3 4 5 6

.

Khi bạn bước vào looper [], pdb sẽ in ra-gọi-- để cho bạn biết rằng bạn đã gọi là hàm. Tiếp theo, bạn đã sử dụng lệnh Args để in ra tất cả các arg hiện tại trong không gian tên của bạn. Trong trường hợp này, looper [] có một đối số, số, được hiển thị trong dòng đầu ra cuối cùng ở trên. Bạn có thể thay thế ARG bằng cách ngắn hơn a. Lệnh cuối cùng mà bạn nên biết là Jump hoặc J. Bạn có thể sử dụng lệnh này để nhảy vào một số dòng cụ thể trong mã của mình bằng cách nhập bước nhảy theo sau là một không gian và sau đó là số dòng mà bạn muốn đi. Bây giờ, hãy để tìm hiểu làm thế nào bạn có thể thêm một điểm dừng!

Thêm các điểm dừng trong PDB Một điểm dừng là một vị trí trong mã của bạn, nơi bạn muốn trình gỡ lỗi của bạn dừng để bạn có thể kiểm tra trạng thái biến. Điều này cho phép bạn làm là kiểm tra CallStack, đây là một thuật ngữ lạ mắt cho tất cả các biến và các đối số chức năng hiện đang có trong bộ nhớ. Nếu bạn có pycharm hoặc wingide, thì họ sẽ có một cách đồ họa để cho bạn kiểm tra callstack. Bạn có thể sẽ có thể chuột qua các biến để xem những gì chúng được đặt thành hiện tại. Hoặc họ có thể có một công cụ liệt kê tất cả các biến trong một thanh bên. Hãy để thêm một điểm dừng vào dòng cuối cùng trong hàm looper [] là dòng 10. Đây là mã của bạn một lần nữa: 1 2 3 4 5 6 7 8 9 10 11 12 13

# DEBUG_CODE.PY DEF LOG [Number]: PRIN log [i] nếu __name__ == '__main__': looper [5]

Để đặt điểm dừng trong trình gỡ lỗi PDB, bạn có thể sử dụng lệnh break hoặc b theo sau là số dòng bạn muốn phá vỡ: 1 2 3 4 5 6 7 8 9

$ python3.8 -m pdb debug_code.py> /python101code/ch CHƯƠNG26_debugging/debug_code.py [3] [] .

Bây giờ bạn có thể sử dụng lệnh Args ở đây để tìm hiểu những gì các đối số hiện tại được đặt thành. Bạn cũng có thể in ra giá trị của các biến, chẳng hạn như giá trị của i, sử dụng lệnh in [hoặc p viết tắt]: 1 [pdb] in [i] 2 0

Bây giờ, hãy để tìm ra cách thêm điểm dừng vào mã của bạn!

Tạo điểm dừng bằng trình gỡ lỗi python cho phép bạn nhập mô -đun PDB và thêm điểm dừng vào mã của bạn trực tiếp, như thế này: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

# DEBUG_CODE_WITH_SETTRACE.PY DEF Nhật ký [Number]: In [F'Processing {number} '] in [f'Adding 2 đến số: {số + 2}'] def looper [số]: cho i trong phạm vi [số]: Nhập PDB; pdb.set_trace [] log [i] nếu __name__ == '__main__': looper [5]

Bây giờ khi bạn chạy mã này trong thiết bị đầu cuối của mình, nó sẽ tự động khởi chạy vào PDB khi nó đạt đến chức năng set_trace [] CALL: 1 2 3 4

$ Python3.8 DEBUG_CODE_WITH_SETTRACE.PY> /PYTHON101CODE/CHƯƠNG26_DEBUGGE

Điều này đòi hỏi bạn phải thêm một lượng mã bổ sung mà bạn sẽ cần phải xóa sau này. Bạn cũng có thể gặp sự cố nếu bạn quên thêm phần bán kết giữa cuộc gọi nhập và pdb.set_trace []. Để làm cho mọi thứ dễ dàng hơn, các nhà phát triển lõi Python đã thêm điểm dừng [] tương đương với việc viết pdb nhập khẩu; pdb.set_trace []. Hãy để khám phá cách sử dụng tiếp theo!

Sử dụng hàm BreakPoint [] tích hợp bắt đầu từ Python 3.7, hàm BreakPoint [] đã được thêm vào ngôn ngữ để giúp gỡ lỗi dễ dàng hơn. Bạn có thể đọc tất cả về sự thay đổi ở đây: //www.python.org/dev/peps/pep-0553/ đi trước và cập nhật mã của bạn từ phần trước để sử dụng điểm dừng [] thay vào đó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

# DEBUG_CODE_WITH_BELKPOINT.PY DEF LOG [Number]: In [F'Processing {number} '] in [f'adding 2 đến số: {number + 2}'] def looper [số]: cho i trong phạm vi [số]: điểm dừng [] log [i] nếu __name__ == '__main__': looper [5]

Bây giờ khi bạn chạy điều này trong thiết bị đầu cuối, PDB sẽ được ra mắt chính xác như trước. Một lợi ích khác của việc sử dụng breakpoint [] là nhiều ides python sẽ nhận ra chức năng đó và tự động tạm dừng thực thi. Điều này có nghĩa là bạn có thể sử dụng trình gỡ lỗi tích hợp IDE tại thời điểm đó để gỡ lỗi của bạn. Đây không phải là trường hợp nếu bạn sử dụng phương thức Set_Trace [] cũ hơn.

Nhận trợ giúp Chương này không bao gồm tất cả các lệnh có sẵn cho bạn trong PDB. Vì vậy, để tìm hiểu thêm về cách sử dụng trình gỡ lỗi, bạn có thể sử dụng lệnh trợ giúp trong PDB. Nó sẽ in ra như sau: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

. = EOF C D H Danh sách A Cl Debug Trợ giúp LL Bí danh Xóa Tắt bỏ qua Longlist Args Lệnh hiển thị tương tác N B Điều kiện xuống J break break enable jump p bt tiếp tục thoát l pp

q thoát khỏi r khởi động lại chạy retval chạy

RV S Nguồn bước Tbreak U unalias

Undisplay cho đến khi lên w whatis ở đâu

Chủ đề trợ giúp linh tinh: ========================== Exec PDB

Nếu bạn muốn tìm hiểu những gì một lệnh cụ thể làm, bạn có thể nhập trợ giúp theo lệnh. Dưới đây là một ví dụ: 1 [PDB] Trợ giúp trong đó 2 W [ở đây] 3 In dấu vết ngăn xếp, với khung gần đây nhất ở phía dưới. 4 Mũi tên chỉ ra "khung hiện tại", xác định bối cảnh 5 của hầu hết các lệnh. 'BT' là một bí danh cho lệnh này.

Hãy thử nó một mình!

Kết thúc việc có thể gỡ lỗi mã của bạn thành công thực hành. Thật tuyệt khi Python cung cấp cho bạn một cách để gỡ lỗi mã của bạn mà không cần cài đặt bất cứ thứ gì khác. Bạn sẽ thấy rằng sử dụng BreakPoint [] để bật các điểm dừng trong IDE của bạn cũng khá tiện dụng. Trong chương này, bạn đã tìm hiểu về những điều sau: Bắt đầu PDB trong bản bắt đầu PDB trên dòng lệnh bước qua mã tạo điểm dừng với set_trace [] thêm điểm dừng trong PDB bằng cách sử dụng chức năng Breakpoint [] tích hợp, bạn nên thử và thử Để sử dụng những gì bạn đã học được ở đây trong mã của riêng bạn. Thêm lỗi cố ý vào mã của bạn và sau đó chạy chúng thông qua trình gỡ lỗi của bạn là một cách tuyệt vời để tìm hiểu cách mọi thứ hoạt động!

Xem lại câu hỏi 1. PDB là gì? 2. Làm thế nào để bạn sử dụng PDB để đến một vị trí cụ thể trong mã của bạn? 3. Điểm dừng là gì? 4. Callstack là gì?

Chương 27 - Tìm hiểu về các nhà trang trí Python có rất nhiều tính năng gọn gàng được tích hợp trong nó, một số trong số họ dễ hiểu hơn những người khác. Một tính năng dường như để bắt đầu bắt đầu là khái niệm trang trí. Một người trang trí là một chức năng chấp nhận một chức năng khác như lập luận của nó. Bộ trang trí được sử dụng để thêm một cái gì đó mới vào chức năng được chuyển vào bộ trang trí nhưng thường không sửa đổi chức năng ban đầu. Trong chương này, bạn sẽ đề cập đến những điều sau: Tạo một chức năng tạo ra một người trang trí áp dụng một bộ trang trí với @ Tạo một bộ trang trí để ghi nhật ký các nhà trang trí chuyển các đối số cho các nhà trang trí bằng cách sử dụng một lớp học như một người trang trí trang trí của Python Python Properties trước khi đào sâu vào các nhà trang trí sâu , Đó là một ý tưởng tốt để xem xét các chức năng một cách ngắn gọn. Bắt đầu nào!

Tạo một chức năng chức năng là một trong các khối xây dựng của mã của bạn. Họ cho phép bạn tạo các thành phần có thể tái sử dụng trong ứng dụng của bạn. Bạn bắt đầu tạo một chức năng bằng cách sử dụng từ khóa def theo sau là tên của chức năng của bạn. Tiếp theo, bạn thêm một số dấu ngoặc đơn và tùy chọn, thêm các tham số bên trong chúng. Cuối cùng, bạn thêm một đại tràng vào cuối. Sau đó, bạn sẽ thêm một khối mã được thụt vào bên dưới tên hàm. Trong ví dụ này, bạn sẽ sử dụng từ khóa Pass để chỉ ra rằng chức năng không làm gì cả. Nếu bạn muốn thêm chức năng, mã sẽ sống trong cơ thể chức năng thụt lề thay vì câu lệnh PASS. 1 def some_function [arg_one, arg_two]: 2 pass

Hàm này có hai đối số. Các chức năng có thể không có bằng 0 để thực tế bất kỳ số lượng đối số. Những đối số này có thể thuộc bất kỳ loại dữ liệu. Từ chuỗi đến danh sách đến từ điển. Điều không được biết đến là bạn cũng có thể vượt qua trong một chức năng khác! Tất cả mọi thứ trong Python là một đối tượng. Điều đó bao gồm các chức năng. Do thực tế này, bạn có thể chuyển một hàm, một lớp hoặc bất kỳ loại dữ liệu Python nào khác vào các chức năng và lớp khác. Bạn có thể xác minh rằng một hàm là một đối tượng bằng cách thực hiện như sau: 1 2 3 4 5

>>> def some_function [arg_one, arg_two]: ... vượt qua ... >>> gõ [some_function]

Điều này cho thấy rằng chức năng của bạn trên thực tế là một thể hiện của chức năng lớp. Điều đó có nghĩa là chức năng của bạn có thể có các phương thức và thuộc tính. Hãy xem xét: 1 2 3 4 5

>>> some_function .__ name__ 'some_function' >>> some_function .__ doc__ >>> in [some_function .__ doc__] none

6 7 8 9 10

>>> def some_function [arg_one, arg_two]: ... ""

Bây giờ bạn đã biết rằng các chức năng là đối tượng, hãy để cố gắng tạo ra một người trang trí!

Tạo một bộ trang trí Một người trang trí về cơ bản là một hàm lồng nhau chấp nhận một chức năng như đối số duy nhất của nó. Đi trước và tạo một hàm có tên func_info [] trông như thế này: 1 def func_info [func]: 2 def wrapper []: 3 in ['tên chức năng:' + func .__ name__] 4 in ['chức năng docstring:' + str [func .__ doc__]] 5 result = func [] 6 Kết quả trả về 7 trình bao

Hàm này có chức năng khác như đối số của nó. Bên trong func_info [], bạn tạo một hàm khác có tên Wrapper []. Hàm bên trong này sẽ in ra tên của hàm được chuyển cho người trang trí cũng như tài liệu của nó. Sau đó, nó sẽ chạy chức năng và trả về kết quả của nó. Cuối cùng, hàm func_info [] sẽ trả về hàm wash []. Hãy để tạo ra một hàm mới gọi là treble [] và sử dụng trình trang trí của bạn trên đó: 1 def treble []: 2 return 3 * 3 3 4 new_teble = func_info [treble] 5 in [new_teble []]

Ở đây bạn chuyển chức năng treble [] của bạn cho chức năng trang trí của bạn, func_info []. Sau đó, bạn gán kết quả cho biến new_teble. Tiếp theo, bạn gọi New_teble sẽ gọi trình bao bọc. Điều này sẽ in một vài dòng và sau đó [cuối cùng!] Gọi func_info và trả về kết quả func_info. Khi kết quả đã được trả về, bạn sử dụng hàm python từ [] để in nó ra. Khi bạn chạy mã này, bạn sẽ thấy như sau: 1 Tên chức năng: Treble 2 Function DocString: none 3 9

Bộ trang trí func_info của bạn đã xác định thành công chức năng được truyền cho nó. Bạn cũng có thể thấy rằng treble [] không có tài liệu, và nó không có bất kỳ lý lẽ nào.

Nhiệm vụ tiếp theo là cập nhật hàm treble [] để nó có một đối số và có một tài liệu. Bạn cũng sẽ cập nhật bộ trang trí để nó chấp nhận các đối số cho chức năng mà nó đang trang trí: 1 # first_decorator_updated.py 2 3 def func_info [func]: 4 def trình bao .__ name__] 6 in ['chức năng DocString:' + str [func .__ doc__]] 7 result

Bước đầu tiên là thêm *args vào chức năng trình bao bọc. Bước thứ hai là thêm *args vào cuộc gọi func []. Điều này cho phép người trang trí chấp nhận bất kỳ số lượng đối số nào, và chuyển các lập luận đó cho chức năng được trang trí. Lưu ý rằng *args được chuyển đến chức năng lồng nhau và không phải chính func_info, vẫn chỉ chấp nhận một hàm. Tiếp theo bạn cập nhật Treble [] để chấp nhận một đối số duy nhất mà bạn muốn tăng gấp ba. 1 Def Treble [A]: 2 "" "Một hàm tăng gấp ba lần đầu vào" "" 3 trả lại a * 3 4 5 6 my_teble = func_info [treble] 7 in [my_teble [5]]

Bây giờ khi bạn gọi hàm được trang trí, my_teble, bạn vượt qua giá trị, 5. Đây là đầu ra: 1 Tên chức năng: Treble 2 Function DocString: một hàm tăng gấp ba lần đầu vào của nó 3 15

Python thực sự có một cách ngắn hơn để trang trí một chức năng. Hãy để tìm hiểu làm thế nào!

Áp dụng một bộ trang trí với @ Bạn có thể trang trí một chức năng bằng cách sử dụng cú pháp đặc biệt. Cú pháp đặc biệt là dấu @ theo sau với tên của người trang trí. Dòng mã này được đặt trước định nghĩa hàm mà bạn đang trang trí. Hãy để cập nhật mã để tận dụng cú pháp này: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

# Decorator_syntax.py def func_info [func]: def trình bao ] Trả về kết quả trả về trình bao bọc @func_info def treble [A]: ""

Lần này, bạn viết lại mã để sử dụng @func_info để trang trí hàm treble []. Điều này tương đương với func_info = func_info [treble]. Sử dụng @-syntax là cách phổ biến bạn sẽ gặp các nhà trang trí được sử dụng trong mã Python. Hãy nhớ rằng nó chỉ là một cú pháp thuận tiện hơn để vượt qua đối tượng chức năng mà bạn đang trang trí cho chức năng trang trí của mình. Bởi vì nó làm cho mã của bạn ngọt ngào hơn để đọc nhưng không phải là điều cần thiết, những loại cải tiến cú pháp này đôi khi được gọi là đường cú pháp. Bây giờ, hãy để đi trước và viết một nhà trang trí hữu ích!

Tạo một bộ trang trí cho các trình trang trí ghi nhật ký có thể được sử dụng cho một loạt các mục đích, từ việc thêm xác thực trong các khung web như django hoặc bình, để ghi nhật ký thông tin hữu ích về các cuộc gọi chức năng. Python có một mô-đun ghi nhật ký an toàn, mạnh mẽ mà bạn có thể sử dụng. Bạn có thể muốn đăng nhập chức năng và các đối số của nó vào một tệp để giúp bạn gỡ lỗi các vấn đề khi mã không thành công. Ví dụ: nếu bạn đã viết một ứng dụng tài chính, bạn sẽ muốn một số cách để theo dõi các giao dịch. Mặc dù ghi nhật ký không phải là một phương pháp an toàn cho loại điều đó, bạn có thể tạo một trình trang trí sẽ viết dữ liệu vào cơ sở dữ liệu an toàn thay thế. Tuy nhiên, để giữ mọi thứ đơn giản hơn một chút, bạn sẽ đăng nhập vào một tệp trong ví dụ sau. Dưới đây là chức năng đầu tiên bạn cần tạo trong một tệp mới có tên là logging_decorator.py: 1 # logging_decorator.py 2 3 Nhập nhật ký 4 5 DEF Nhật ký [Func]: 6 "" " Def Wrapper [*args, ** kwargs]: 10 name = func .__ name__ 11 logger = logging.getLogger [name] 12 logger.setlevel [logging.info] 13 14 ] 16 17 logger.info [f "Chức năng chạy: {name}"] 18 logger.info [f "{args =}, {kwargs =}"] 19 result = func [*args, ** kwargs] 20 logger. Thông tin ["Kết quả: % s" % kết quả] 21 Kết quả trả về 22 Trao tải trở lại

Lưu ý: Bạn không cần hiểu mọi thứ đang diễn ra trong mã này hoặc hàm logging_formatter [] bên dưới. Ví dụ này được sử dụng bởi vì nó là một trường hợp sử dụng phổ biến cho các nhà trang trí.

Bộ trang trí này hoạt động giống như trước đây: nó có một chức năng để xử lý và tạo chức năng trình bao bọc để xử lý việc xử lý [bao gồm cả việc chuyển tiếp bất kỳ đối số vị trí và từ khóa nào]. Sự khác biệt ở đây là bạn sẽ sử dụng mô -đun đăng nhập Python, để ghi vào tệp nhật ký thay vì in lên màn hình. Để làm điều đó, bạn nhập nhật ký, tạo một logger thông qua logging.getLogger [] và đặt mức ghi nhật ký lên cấp thông tin.

Có những cấp độ đăng nhập khác mà bạn cũng có thể sử dụng. Tuy nhiên, bạn không cần phải lo lắng về điều đó ngay bây giờ. Nếu bạn thực sự quan tâm, thì bạn nên xem tài liệu ở đây: //docs.python.org/3/l Library/logging.html

Tiếp theo, bạn gọi logging_formatter [] để định dạng nhật ký của bạn và cho nó biết nơi lưu nhật ký của bạn. Cuối cùng, bạn đăng nhập một số thông tin về chức năng bạn đang trang trí. Bây giờ bạn có thể thêm logging_formatter []: 1 def logging_formatter [logger, tên]: 2 "" "3 logger định dạng và thêm trình xử lý tệp 4" "" 5 fh = logging.fileHandler [f "{name} .log"] = ' %[ASCTIME] S - %[Tên] S - %[Lòng

Mã này sẽ lấy tên của hàm đang được trang trí và tạo tệp nhật ký dựa trên tên đó. Sau đó, bạn tạo một chuỗi định dạng. Điều này được sử dụng trong nhật ký để thêm dấu thời gian, tên của hàm, tên cấp độ đăng nhập và thông báo ghi nhật ký. Cuối cùng, bạn đặt định dạng ghi nhật ký để sử dụng chuỗi định dạng mà bạn đã xác định và thêm trình xử lý tệp vào chính bộ ghi để nó ghi vào đĩa. Bước cuối cùng là thêm mã sau vào cuối tập lệnh của bạn: 1 @Log 2 def Treble [A]: 3 Trả lại a * 3 4 5 nếu __name__ == '__main__': 6 treble [5]

Điều này cho thấy cách trang trí treble [] với bộ trang trí nhật ký của bạn. Khi bạn chạy mã, bạn nên lấy một tệp có tên treble.log trong cùng thư mục với chương trình của bạn chứa một cái gì đó tương tự như sau: 1 2020-05-04 16: 15: 19.980 - Treble - Info - Chức năng chạy: Treble 2 2020-05-04 16: 15: 19.980 - Treble - Info - Args = [5,], Kwargs = {} 3 2020-05-04 16: 15: 19.980 - Treble - Info - Kết quả: 15

Điều này cho bạn thấy dấu thời gian của khi dòng nhật ký được viết. Nó cũng hiển thị tên của hàm, cấp độ nhật ký và các thông báo mà chức năng ghi nhật ký của bạn tạo.

Xếp chồng trang trí hầu hết thời gian, bạn sẽ chỉ sử dụng một bộ trang trí cho mỗi chức năng. Nhưng đó không phải là một yêu cầu. Bạn có thể áp dụng nhiều người trang trí cho một chức năng duy nhất. Hãy nhìn vào một ví dụ: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

def bold [func]: def wrapper []: return "" + func [] + "" return trình bao def định dạng_text []: Trả về 'Python Rocks!' in [formated_text []]

Các nhà trang trí in đậm [] và in nghiêng [] sẽ thêm và các thẻ HTML vào giá trị trả về của hàm mà họ đang trang trí. Thứ tự của các nhà trang trí rất quan trọng: Python áp dụng các bộ trang trí dưới cùng [nghĩa là gần nhất với hàm trước], nhưng gọi hàm được trang trí từ trên xuống [nghĩa là khi nó xuất hiện trong nguồn]. Vì vậy, trong ví dụ này, định dạng_text sẽ được xác định, sau đó bộ trang trí in nghiêng sẽ được áp dụng, và sau đó, bộ trang trí đậm [] sẽ được áp dụng; Khi chức năng định dạng_text được trang trí được gọi, in đậm sẽ chạy, thì chữ in nghiêng sẽ chạy và cuối cùng là định dạng gốc_text sẽ chạy. Khi bạn chạy mã ở trên, bạn sẽ thấy đầu ra sau: 1 Python Rocks!

Để cung cấp cho bạn một bức tranh rõ ràng hơn về những gì đang xảy ra khi bạn xếp nhiều nhà trang trí, hãy viết lại ví dụ này để nó in tên của hàm mà mỗi người trang trí đang được áp dụng cho: 1 def Bold [func]: 2 in [F ' Bạn đang gói {func .__ name__} in đậm '] 3 def bold_wrapper []: 4 return "" + func [] + "" 5 return bold_wrapper

6 7 8 9 10 11 12 13 14 15 16 17 18

def italic [func]: in [f'you đang gói {func .__ name__} in italic '] def italic_wrapper []: return "" + func [] Đá Python! ' in [formated_text []]

Khi bạn chạy mã này, bạn sẽ thấy đầu ra này: 1 bạn đang gói Formated_Text in Italic 2 Bạn đang gói Italic_Wrapper trong Bold 3 Python Rocks!

Điều này chứng minh rằng định dạng_text [] đang được bao bọc bởi người trang trí intalic []. Sau đó, người trang trí intalic [] Italic_wrapper [] đang được trang trí bởi người trang trí đậm []. Bây giờ, hãy để học cách vượt qua một cuộc tranh luận cho một người trang trí!

Vượt qua các đối số cho các nhà trang trí Có những lúc bạn có thể muốn chuyển một hoặc nhiều đối số cho chính người trang trí. Hãy cùng lấy nhà trang trí func_info [] từ trước đó và thử cho nó một cuộc tranh luận để xem nó có hoạt động không: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

# Decorator_syntax_with_argument.py def func_info [func]: def wrapper [*args]: in ['tên chức năng:' + func .__ name__] ] Trả về kết quả trả về trình bao bọc @func_info [2] def treble [A: int] -> int: ""

Nếu bạn cố gắng chạy mã này, cuối cùng bạn sẽ nhận được lỗi: 1 buildins.attributionError: 'int' Object không có thuộc tính '__name__'

Đó có thể là một chút khó hiểu. Lý do bạn đang nhìn thấy ngoại lệ này là bạn đã chuyển một số nguyên cho người trang trí. Vì vậy, người trang trí của bạn đang cố gắng trang trí số nguyên thay vì hàm. Hãy để viết lại mã để trông như thế này: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

# Decor_syntax_with_argument.py def func_info [arg1, arg2]: print ['decorator arg1 =' + str [arg1]] in ** kwargs]: print ['function {} args: {} kwargs: {}' .format [function .__ name__, str [args], str [kwargs]]] trả về_real_decorator @func_info [3, 'python'] def treble [số]:

22 Số trả về * 3 23 24 in [treble [5]]

Lần này khi bạn viết bộ trang trí của mình, bạn sẽ cần phải có một hàm bên trong một hàm bên trong một hàm. Bạn đã đọc đúng! Bạn có chức năng lồng nhau! Func_info [] của bạn hiện có các đối số và các đối số đó có thể được sử dụng bởi_real_decorator [] cũng như bằng trình bao bọc. Hàm trình bao bọc [] được viết lại để in ra tên hàm, args và kwargs tất cả trên một dòng. Phần còn lại của mã khá giống như trước đây ngoại trừ việc bạn đang trả lại_real_decorator, sẽ trả về trình bao bọc. Khi bạn chạy mã này, bạn sẽ thấy đầu ra sau: 1 2 3 4

Người trang trí arg1 = 3 người trang trí arg2 = chức năng python treble args: [5,] kwargs: {} 15

Bạn có thể thấy rằng việc sử dụng các chức năng lồng nhau rất khó để bao bọc tâm trí của bạn. May mắn thay, có một cách khác để tạo ra một người trang trí có lập luận. Hãy để tìm hiểu làm thế nào!

Sử dụng một lớp học như một người trang trí, có một cách đẹp hơn để tạo ra một người trang trí có thể tranh luận. Phương pháp đó là bằng cách tạo ra một lớp đặc biệt. Đi trước và tạo một tệp mới có tên Decorator_Class.py và thêm mã sau vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 25

# Decorator_Class.Py Class Info: def __init __ [self, arg1, arg2]: in ['chạy __init__'] self.arg1 = arg1 self.arg2 = arg2 in [' , arg2]] def __call __ [self, function]: print ['in __call__'] def wrapper [*args, ** kwargs] Wrapper @info [3, 'Python'] def Treble [số]: Số trả về * 3 in [] in [treble [5]]

Nó không bình thường để tạo một lớp có tên hoàn toàn viết thường. Bạn thường sẽ tạo một lớp với trường hợp tiêu đề. Nhưng để phù hợp với các ví dụ khác, bạn sẽ đặt tên cho nó bằng chữ thường. Lớp này chỉ mất hai đối số. Bạn cũng có thể sử dụng *args và ** kwargs, nhưng nó sẽ mất nhiều công việc hơn. Ví dụ này có nghĩa là đơn giản và dễ theo dõi. Khi lớp này được khởi tạo, nó sẽ tiết kiệm hai đối số cho các biến thể hiện và in ra một thông báo để cho bạn biết chúng là gì. Bước tiếp theo là tạo phương thức __call __ []. Phương pháp đặc biệt này làm cho lớp có thể gọi được. Nó mất trong chức năng mà bạn đang trang trí như lập luận của nó. Sau đó, bên trong phương thức đặc biệt này, bạn làm tổ hàm bao bọc []. Lưu ý rằng chức năng này không có tự truyền cho nó. Thay vào đó, nó nhận được các đối số và các đối số từ khóa cho chức năng đang được trang trí.

Phần còn lại của mã khá giống với những gì bạn đã thấy trong ví dụ trước. Khi bạn chạy mã này, bạn sẽ thấy đầu ra này: 1 2 3 4 5 6

Trong __init__ người trang trí tranh luận: 3, python trong __call__ trong wrapper [] 15

Bây giờ bạn đã biết cách tạo ra một người trang trí có thể lấy các đối số cả như là một chức năng lồng nhau và như một lớp học, bạn đã sẵn sàng để tìm hiểu về một số nhà trang trí tích hợp Python,!

Các nhà trang trí tích hợp Python sườn Python đi kèm với một số nhà trang trí tích hợp. Có ba mà bạn có thể sử dụng mà không cần nhập bất cứ thứ gì. Chúng rất hữu ích khi xác định các lớp học. Ba người đó như sau: Thuộc tính StaticMethod ClassMethod

Có những người trang trí khác trong Python. Một ví dụ phổ biến là trong mô -đun functools. Nó được gọi là Wraps, là một nhà trang trí đẹp để sử dụng để duy trì chức năng ban đầu tên và tài liệu. Khi bạn tạo một bộ trang trí, về cơ bản nó là thay thế chức năng ban đầu bằng một hàm mới, vì vậy tên và tài liệu của nó có thể bị che khuất. Bạn có thể sử dụng functools.wraps để khắc phục sự cố đó. Các nhà trang trí phổ biến khác là functools.lru_cache và một số người thú vị trong bối cảnh. Nếu bạn có thời gian, bạn chắc chắn nên tìm kiếm cả hai thư viện này trong tài liệu. Bộ trang trí lớp học được sử dụng trên phương thức lớp không cần bất kỳ dữ liệu thể hiện nào để thực hiện công việc của mình; Bởi vì các phương pháp đó không cần dữ liệu cá thể đối số đầu tiên của chúng không phải là bản thân, nên đó là lớp [thường được viết tắt là CLS, vì lớp là từ khóa]. Một cách sử dụng phổ biến cho ClassMethods là các hàm tạo thay thế. Tạo một tệp mới có tên classmethod_example.py và thêm mục sau: 1 # classMethod_example.py 2 3 Lớp Thời gian: 4 "" self.Hour = giờ 8 self.minute = phút 9 10 def __repr __ [self]: 11 return "thời gian [ %d, %d]" %[self.hour, self.minute] 12 13 @classmethod 14 def from , khoảnh khắc]: 15 "" "2.5 == 2 giờ, 30 phút, 0 giây, 0 micro giây" "" 16 giờ = int [khoảnh khắc]

17 18 19 20 21 22 23 24 25 26 27 28 29

if giờ: moment = moment % giờ phút = int [khoảnh khắc * 60] trả về cls [giờ, phút] def to_float [self]: "" / 60 Thời gian [7, 30] Thời gian.From_Float [5.75] T = Thời gian [10, 15] T.TO_FLOAT []

Khi bạn chạy mã này, bạn sẽ thấy đầu ra này: 1 lần [7, 30] 2 lần [5, 45] 3 10.25

Bộ trang trí StaticMethod nói với Python rằng phương thức không cần bất kỳ loại dữ liệu nào cũng như dữ liệu thể hiện; Do đó, bạn không cần chỉ định bản thân và CLS là tham số đầu tiên. Bạn vẫn có thể gọi staticMethods theo cả hai cách mà bạn đã thấy trong ví dụ trên: bạn có thể sử dụng lớp trực tiếp hoặc trước tiên bạn có thể tạo một thể hiện. Hữu ích nhất trong ba nhà trang trí này là tài sản. Hãy cùng tìm hiểu lý do tại sao trong phần tiếp theo!

Thuộc tính Python Thuộc tính Python là một cách để tạo chức năng lớp thành một thuộc tính. Họ cũng cho phép bạn tạo một loại thuộc tính riêng tư trong Python bằng cách sử dụng một getter và một setter. Python không thực sự có các phương thức và thuộc tính riêng tư vì bạn vẫn có thể truy cập các mục bắt đầu bằng một hoặc hai dấu gạch dưới. Tuy nhiên, theo quy ước, khi bạn bắt đầu một biến thể hiện hoặc phương thức với một hoặc hai dấu gạch dưới, nó được coi là riêng tư. Nếu bạn sử dụng các loại biến và phương thức đó thì mã của bạn có thể bị hỏng khi các biến/phương thức đó thay đổi hoặc biến mất trong các bản phát hành mới hơn. Một Getter Getter đề cập đến một chức năng mà bạn sử dụng để truy cập gián tiếp một thuộc tính riêng tư trong khi một bộ setter của Hồi là một hàm mà bạn sẽ sử dụng để đặt thuộc tính riêng tư. Python không thực sự có khái niệm này bởi vì bạn có thể truy cập và thay đổi một thuộc tính trực tiếp trong hầu hết các trường hợp. Hãy bắt đầu bằng cách viết một lớp trong đó bạn thực hiện các phương thức setter và getter của riêng mình: 1 Lớp số lượng: 2 3 def __init __ [self]: 4 # thuộc tính riêng 5 ._Amount 9 10 def set_amount [self, value]: 11 nếu isinstance [value, int] 12 self._amount = value 13 other: 14 in [f'value phải là 15 16 nếu __name__ == '__main__': 17 amt = Số lượng [] 18 in [số lượng hiện tại là 19 amt.set_amount ['the'] 20 in [số lượng hiện tại là 21 amt.set_amount [5.5] 22 in [số lượng hiện tại là

hoặc isinstance [giá trị, float]: int hoặc float ']

{amt.get_amount []} '] {amt.get_amount []}'] {amt.get_amount []} ']

Trong ví dụ này, bạn tạo thuộc tính cá thể riêng tư và đặt nó thành không. Để truy cập giá trị này, bạn tạo một phương thức getter có tên get_amount []. Sau đó, bạn tạo một phương thức setter có tên set_amount [] có giá trị để đặt số tiền thành. Phương thức Setter cũng sẽ thực hiện một số kiểm tra lỗi cơ bản cho bạn.

Phần cuối cùng của mã kiểm tra ra khỏi setter và getter. Khi bạn chạy mã này, bạn sẽ kết thúc với đầu ra sau: 1 2 3 4

Số tiền hiện tại là không có giá trị phải là một int hoặc float số lượng hiện tại không có số tiền hiện tại là 5,5

Python làm cho điều này dễ dàng hơn bằng cách cung cấp cho bạn khả năng biến các phương thức getter và setter thành một thuộc tính. Chúng ta hãy cập nhật mã bằng cách thêm một dòng duy nhất ở cuối lớp: 1 Lớp số lượng: 2 3 def __init __ [self]: 4 # thuộc tính riêng 5 self._amount = none 6 7 def get_amount [self]: 8 tự trả lại. _Amount 9 10 def set_amount [self, value]: 11 nếu isinstance [value, int] 12 self._amount = value 13 other: 14 in [f'value phải là 15 16 số lượng = thuộc tính [get_amount, 17 18 nếu __name__ == '__main__': 19 amt = số [] 20 in [số lượng hiện tại là 21 amt.amount = 'The' 22 in [số lượng hiện tại là 23 amt.Amount = 5,5 24 in [số lượng hiện tại Là

hoặc isinstance [giá trị, float]: int hoặc float '] set_amount]

{amt.amount} '] {amt.amount}'] {amt.amount} ']]

Ở đây bạn nói với Python rằng bạn muốn thêm một thuộc tính hoặc thuộc tính mới vào lớp số tiền được gọi là số tiền. Bạn tạo nó bằng cách sử dụng chức năng thuộc tính, chấp nhận một setter, getter và phương thức xóa mà bạn có thể bỏ qua cho trường hợp này. Thay đổi khác ở đây là bây giờ bạn có thể truy cập và đặt số tiền trực tiếp thay vì gọi các phương thức get_amount [] và set_amount []. Bạn có thể đơn giản hóa điều này thậm chí nhiều hơn bằng cách sử dụng thuộc tính như một người trang trí. Hãy để cập nhật lớp một lần nữa để sử dụng cú pháp trang trí: 1 Lớp số lượng: 2 3 def __init __ [self]:

4. self._amount = giá trị 15 khác: 16 in [f'value phải là 17 18 19 nếu __name__ == '__main__': 20 amt = số [] 21 in [số lượng hiện tại là 22 amt.amount = 'the' 23 in [số lượng hiện tại là 24 amt.amount = 5,5 25 in [số lượng hiện tại là

hoặc isinstance [giá trị, float]: int hoặc float ']

{amt.amount} '] {amt.amount}'] {amt.amount} ']]

Ở đây bạn nói với Python rằng bạn muốn thêm một thuộc tính hoặc thuộc tính mới vào lớp số tiền được gọi là số tiền. Bạn tạo nó bằng cách sử dụng chức năng thuộc tính, chấp nhận một setter, getter và phương thức xóa mà bạn có thể bỏ qua cho trường hợp này. Thay đổi khác ở đây là bây giờ bạn có thể truy cập và đặt số tiền trực tiếp thay vì gọi các phương thức get_amount [] và set_amount []. Bạn có thể đơn giản hóa điều này thậm chí nhiều hơn bằng cách sử dụng thuộc tính như một người trang trí. Hãy để cập nhật lớp một lần nữa để sử dụng cú pháp trang trí: 1 Lớp số lượng: 2 3 def __init __ [self]:

4. self._amount = giá trị 15 khác: 16 in [f'value phải là 17 18 19 nếu __name__ == '__main__': 20 amt = số [] 21 in [số lượng hiện tại là 22 amt.amount = 'the' 23 in [số lượng hiện tại là 24 amt.amount = 5,5 25 in [số lượng hiện tại là

hoặc isinstance [giá trị, float]: int hoặc float ']

Lần này, bạn thay đổi phương thức get_amount [] thành phương thức số lượng [] và trang trí nó với @property. Sau đó, bạn tạo một setter cho nó bằng cách tạo một phương thức số lượng [] thứ hai nhưng bạn trang trí với số lượng.setter. Mã trông hơi kỳ lạ, nhưng nó hoạt động. Hãy thử và xem cho chính mình! Một lợi ích thực sự tốt của tài sản là bạn có thể tạo lớp của mình bằng các thuộc tính đơn giản và sau đó biến chúng thành thuộc tính nếu bạn phát hiện ra bạn cần xử lý thêm khi nhận hoặc đặt các biến đó.

Kết thúc trang trí là một công cụ mạnh mẽ có thể hơi khó hiểu để thực hiện. Một khi bạn có được sự trang trí của các nhà trang trí, bạn sẽ thấy chúng khá hữu ích trong nhiều trường hợp sử dụng khác nhau. Trong chương này, bạn đã tìm hiểu về những điều sau: Tạo một chức năng tạo một bộ trang trí áp dụng một bộ trang trí với @ Tạo một bộ trang trí để ghi nhật ký các nhà trang trí chuyển các đối số cho các nhà trang trí bằng cách sử dụng một lớp như một bộ trang trí trang trí của Python Python để thực hành tạo và sử dụng các bộ trang trí , bạn có thể tạo một số nhà trang trí cho mã của riêng bạn hoặc chơi xung quanh với các nhà trang trí trong chương này. Bạn có thể viết một người trang trí theo thời gian thực hiện mã của bạn chẳng hạn. Chúc vui vẻ!

Xem lại câu hỏi 1. Người trang trí là gì? 2. Bạn sử dụng cú pháp đặc biệt nào để áp dụng bộ trang trí? 3. Đặt tên cho ít nhất hai trong số các nhà trang trí tích hợp Python, 4. Tài sản Python là gì? Tại sao nó lại hữu ích?

Chương 28 - Biểu thức biểu thức bài tập đã được thêm vào Python trong 3,8. Ý tưởng chung là biểu thức gán cho phép bạn gán cho các biến trong một biểu thức. Cú pháp để làm điều này là: 1 Tên: = expr

Nhà điều hành này đã được gọi là nhà điều hành Walrus, mặc dù tên thật của họ là biểu thức gán gán. Thật thú vị, CPYThon Internals cũng gọi chúng là những biểu thức được đặt tên là. Bạn có thể đọc tất cả về các biểu thức gán trong PEP 572: //www.python.org/dev/peps/pep-0572/ Hãy để tìm ra cách sử dụng các biểu thức gán!

Mã này sẽ mở ra một tệp có kích thước không xác định và xử lý nó 1024 byte cùng một lúc. Bạn sẽ thấy điều này hữu ích khi làm việc với các tệp rất lớn vì nó ngăn bạn tải toàn bộ tệp vào bộ nhớ. Nếu bạn làm như vậy, bạn có thể hết bộ nhớ và khiến ứng dụng của bạn hoặc thậm chí máy tính bị sập.

Bạn có thể rút ngắn mã này lên một chút bằng cách sử dụng biểu thức gán: 1 với Open [some_file] là file_obj: 2 chunk_size = 1024 3 trong khi dữ liệu: = file_obj.read [Chunk_size]: 4 nếu 'cái gì đó' trong dữ liệu: 5 # dữ liệu bằng cách nào đó ở đây

Ở đây bạn chỉ định kết quả của dữ liệu đọc [] cho dữ liệu trong khi biểu thức vòng lặp. Điều này cho phép bạn sau đó sử dụng biến đó bên trong khối mã vòng lặp. Nó cũng kiểm tra xem một số dữ liệu đã được trả về để bạn không phải có dữ liệu nếu không phải là Stanza. Một ví dụ điển hình khác được đề cập trong PEP 572 được lấy từ trang web của riêng Python. Ở đây, cách thức mã ban đầu: 1 env_base = os.environ.get ["Pythonuserbase", none] 2 nếu env_base: 3 return env_base

Và đây là cách nó có thể được đơn giản hóa bằng cách sử dụng biểu thức gán: 1 nếu env_base: = os.environ.get ["pythonuserbase", none]: 2 return env_base

Bạn di chuyển bài tập vào biểu thức câu lệnh có điều kiện, điều này rút ngắn mã lên độc đáo. Bây giờ, hãy để khám phá ra một số tình huống mà các biểu thức chuyển nhượng có thể được sử dụng.

Những gì bạn không thể làm với các biểu thức gán Có một số trường hợp không thể sử dụng biểu thức gán. Một trong những tính năng thú vị nhất của các biểu thức gán là chúng có thể được sử dụng trong các ngữ cảnh mà một câu lệnh gán không thể, chẳng hạn như trong Lambda hoặc sự hiểu biết được đề cập trước đó. Tuy nhiên, họ không hỗ trợ một số điều mà các tuyên bố chuyển nhượng có thể làm. Ví dụ: bạn không thể thực hiện nhiều gán mục tiêu: 1 x = y = z = 0

# Tương đương, nhưng không làm việc: [x: = [y: = [z: = 0]]]]

Một trường hợp sử dụng bị cấm khác là sử dụng biểu thức gán ở cấp cao nhất của câu lệnh biểu thức. Đây là một ví dụ từ PEP 572: 1 y: = f [x] # không hợp lệ 2 [y: = f [x]] # hợp lệ, mặc dù không được khuyến nghị

Có một danh sách chi tiết các trường hợp khác trong đó các biểu thức gán bị cấm hoặc không được khuyến khích trong PEP. Bạn nên kiểm tra tài liệu đó nếu bạn có kế hoạch sử dụng biểu thức gán thường xuyên.

Kết thúc các biểu thức gán là một cách thanh lịch để làm sạch một số phần của mã của bạn. Tính năng Cú pháp có tính năng tương tự như loại gợi ý một biến. Một khi bạn đã có một cái, cái kia cũng sẽ trở nên dễ dàng hơn để làm. Trong chương này, bạn đã thấy một số ví dụ trong thế giới thực về việc sử dụng nhà điều hành Walrus Walrus. Bạn cũng đã học được khi các biểu thức bài tập nên được sử dụng. Cú pháp này chỉ có sẵn trong Python 3,8 hoặc mới hơn, vì vậy nếu bạn bị buộc phải sử dụng một phiên bản Python cũ hơn, tính năng này sẽ giành được nhiều điều cho bạn.

Xem lại câu hỏi 1. Biểu thức bài tập là gì? 2. Làm thế nào để bạn tạo một biểu thức gán? 3. Tại sao bạn sẽ sử dụng các biểu thức gán?

Chương 29 - Hồ sơ mã mã của bạn không bao giờ hoàn hảo. Bạn sẽ thấy rằng khi bạn viết nhiều mã, bạn sẽ thường cần quay lại để cải thiện nó. Ví dụ: hãy để nói rằng bạn tạo một ứng dụng web và nó trở nên phổ biến một vài tháng sau khi ra mắt. Bây giờ, nó phổ biến và xử lý nhiều yêu cầu hơn, ứng dụng đang chạy chậm hơn nhiều khi tải. Làm thế nào để bạn tìm ra những gì làm cho ứng dụng web quá chậm? Một cách để tìm ra vấn đề là lập cấu hình mã của bạn. Mã hồ sơ xác định vị trí của các tắc nghẽn trong mã của bạn. Sau đó, bạn phải tìm ra cách khắc phục [các] vấn đề. Đôi khi bản sửa lỗi là viết lại mã. Những lần khác bạn cần nâng cấp phần cứng. Python đi kèm với các mô -đun hồ sơ riêng được gọi là hồ sơ và cprofile. Cả hai mô -đun này đều có giao diện giống nhau với CPROFILE được viết bằng C. Bạn sẽ tìm hiểu về CPROFILE vì nó không có chi phí lớn hơn đáng kể mà hồ sơ bổ sung. Trong chương này, bạn sẽ tìm hiểu về những điều sau đây: Hồ sơ với CPROFILE làm việc với dữ liệu hồ sơ bằng cách sử dụng các PSTATS khác cho phép bắt đầu!

Học cách lập hồ sơ với CPROFILE Bước đầu tiên là tìm một cái gì đó để hồ sơ. May mắn thay, nó khá dễ dàng để bắt đầu. Bạn có thể nhập khá nhiều bất kỳ mô -đun nào trong Python và hồ sơ với CPROFILE. Hãy thử sử dụng mô -đun bí mật của Python, mà bạn có thể sử dụng để tạo số ngẫu nhiên mạnh về mặt mật mã: 1 >>> Nhập bí mật 2 >>> Nhập CPROFILE 3 >>> Cuộc gọi trong 0,000 giây 5 6 Đặt hàng theo: Tên tiêu chuẩn 7 8 Ncalls Tottime Percall Cumtime Percall 9 1 0,000 0,000 0,000 0,000 10 1 0,000 0,000 0,000 0,000 11 1 0,000 0,000 0,000 0,000. 13 1 0,000 0,000 0,000 0,000 '_lsprof.profiler \ 14' đối tượng}

Tên tệp: Lineno [hàm]: 1 [] Bí mật.py:35[Token_Bytes] {Phương thức tích hợp {Phương thức tích hợp {Phương thức 'vô hiệu hóa' của

Ở đây bạn nhập bí mật và cprofile. Sau đó, bạn hồ sơ bí mật. Bạn có thể thấy đầu ra từ cuộc gọi ở trên. Chúng ta hãy xem qua từng phần dữ liệu trong đầu ra: NCALLS - Số lượng cuộc gọi hoặc số lần một cái gì đó được gọi là Tottime - tổng thời gian dành cho chức năng đã cho chi tiêu trong chức năng và tất cả các phụ của nó-

chức năng. Percall - Percall thứ hai là thương số của giờ được chia cho số lượng các cuộc gọi nguyên thủy tên tệp: lineno [hàm] - cung cấp thông tin số lượng tệp và số lượng cho mỗi cuộc gọi

Đối với những người đang tự hỏi, một cuộc gọi nguyên thủy của người Viking là một cuộc gọi là kết quả của đệ quy. Ví dụ đặc biệt này rất thú vị vì mọi thứ chỉ được gọi là một lần và không có tắc nghẽn rõ ràng ở đây. Hãy để viết một số mã mà bạn có thể hồ sơ để xem cách hồ sơ thực sự có thể hữu ích như thế nào!

Hồ sơ một tập lệnh Python với CPROFILE Khi bạn viết mã, bạn sẽ luôn có một số chức năng chậm hơn các chức năng khác. Một cách để mô phỏng các hàm chậm là sử dụng mô -đun thời gian Python, có hàm Sleep []. Hãy để viết một chương trình có một số chức năng mà Sleep [] Lượng thời gian khác nhau được gọi là hồ sơ_test.py: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

# accord_test.py nhập thời gian def nhanh []: in ['chạy nhanh'] trả về 1 + 1 def trung bình []: in ['chạy trung bình'] thời gian.s ngủ [0.5] def super_slow [] Dần dần '] Thời gian

Ở đây bạn có bốn hàm: nhanh [] - không ngủ [] ở mức trung bình [] - ngủ trong nửa super_slow [] - ngủ trong 2 giây Main [] - đó là điểm nhập chính của bạn

chương trình

Hàm chính [] chạy tất cả các chức năng khác trong chương trình của bạn. Nó cũng chạy nhanh [] hai lần. Bạn có thể lập cấu hình mã này giống như cách bạn đã làm trong phần trước:

1. Được đặt hàng bởi: Tên tiêu chuẩn 11 12 ncalls Tottime percall cumtime percall 13 1 0.000 0.000 2,505 2,505 14 1 0,000 0.000 2,003 2,003 15 1 0,000 0.000 0,505 2,505 16 2 0,000 0,000 0,000. EXEC} 19 4 0,000 0,000 0,000 0,000.

Tên tệp: lineno [hàm]: 1 [] confile_test.py:13[super_slow] confile_test.py:17[main] trong phương thức {phương thức tích hợp thời gian.sle ngủ} {phương thức 'vô hiệu hóa' của

Đầu ra này cho thấy hàm nhanh [] được gọi là hai lần. Bạn cũng có thể thấy rằng bản in [] được gọi là bốn lần và thời gian.s ngủ [] được gọi là hai lần. Mọi thứ khác được gọi là một lần. Lưu ý rằng tùy thuộc vào vỏ bạn sử dụng để chạy mã này, bạn có thể nhận được nhiều đầu ra hơn. Tuy nhiên, bạn sẽ thấy đầu ra tương tự như ở trên nếu bạn đang chạy bằng bảng điều khiển Python mặc định với cài đặt Python tiêu chuẩn. Hàm Super_Slow [] mất hai giây để chạy trong khi hàm trung bình [] mất nửa giây để chạy. Bạn có thể thấy rằng hàm chính [] mất hơn 2,5 giây để chạy vì nó gọi tất cả các hàm khác. Bằng cách phân tích dữ liệu này, bạn có thể thấy rằng các hàm trung bình [] và super_slow [] là các hàm mà bạn nên tập trung vào để cải thiện hiệu suất của chương trình. Bạn cũng có thể lập cấu hình mã của mình trên dòng lệnh như thế này: 1 2 3 4 5 6 7

$ Python -M CPROFILE ARCORE

8 Được đặt hàng bởi: Tên tiêu chuẩn 9 10 Ncalls Tottime Percall Cumtime 11 1 0.000 0.000 2.000 12 1 0.000 0.000 2,505 13 1 0,000 0.000 2,505 14 2 0,000 0.000 0.000 15 1 0,000 0.000 0.000. 0,000 xây dựng

Percall 2.000 2,505 2.505 0,000 0,504 2,505

Tên tệp: lineno [chức năng] acc nhau_test.py:13[super_slow] accord_test.py:17[main]

0,000 {Phương pháp tích hợp 1.252 {Phương thức tích hợp thời gian.Sle ngủ} 0,000 {Phương thức 'vô hiệu hóa' của

Ở đây bạn gọi Python bằng cờ -M, nói với Python tải mô -đun theo cờ. Sau đó, bạn vượt qua CPROFILE chương trình bạn muốn nó để lập hồ sơ. Đầu ra từ lệnh này gần giống với đầu ra mà bạn đã thấy trước đó. Nếu bạn muốn, bạn có thể nói với CPROFILE để lưu đầu ra vào một tệp thay thế. Khi bạn làm điều này, bạn sẽ có thêm dữ liệu không được hiển thị trong đầu ra thông thường. Để lưu vào một tệp, bạn có thể sử dụng cờ -o, như thế này: 1 $ python -m cprofile -o accord_output.txt accord_test.py

Tại đây, bạn lưu đầu ra hồ sơ vào một tệp có tên Aclection_output.txt. Nếu bạn cố gắng mở tệp này trong trình soạn thảo văn bản, bạn sẽ thấy rằng nó không thể đọc được con người. Để tạo các đầu hoặc đuôi của dữ liệu trong tệp mới của bạn, bạn sẽ cần sử dụng mô -đun Python Python PSTATS. Hãy cùng tìm hiểu làm thế nào để làm điều đó tiếp theo!

Làm việc với dữ liệu hồ sơ bằng PSTATS Python có thư viện riêng mà bạn có thể sử dụng để phân tích đầu ra từ CPROFILE được gọi là PSTATS. Bạn có thể sử dụng PSTAT để sắp xếp và lọc dữ liệu hồ sơ mà bạn đã thu thập được. Chúng ta hãy cố gắng tạo lại đầu ra thông thường mà bạn nhận được từ CPROFILE bằng cách sử dụng mô -đun PSTAT bằng cách tạo một tệp có tên formated_output.py: 1 Nhập PSTATS 2 3 DEF FORMATTED_STATS_OUTPUT [PATH] Strip_dirs [] 6 Sắp xếp_stats = Striped_dirs.sort_stats ['Tên tệp'] 7 Sắp xếp_stats.print_stats [] 8 9 nếu __name__ == '__ Main__'

Trong ví dụ này, bạn nhập PSTATS và tải tệp, hồ sơ_output.txt, mà bạn đã tạo trong phần cuối cùng vào số liệu thống kê []. Sau đó, bạn sử dụng Striped_dirs [] để xóa các đường dẫn đến các tệp vì bạn không muốn các đường dẫn đủ điều kiện trong đầu ra. Lưu ý rằng khi bạn làm điều này, bạn sửa đổi đối tượng số liệu thống kê và thông tin bị loại bỏ bị mất. Tiếp theo, bạn sử dụng sort_stats ['tên tệp'] để sắp xếp các số liệu thống kê hồ sơ theo tên tệp. Bạn có thể sắp xếp các số liệu thống kê cấu hình bằng cách sử dụng bất kỳ chuỗi nào sau đây: 'cuộc gọi' - gọi đếm 'tích lũy' - thời gian tích lũy 'cumtime' - thời gian tích lũy 'tệp' - tên tệp 'tên tệp' - tên tệp 'mô -đun' - tên tệp 'NCALLS' - CALL Count 'PCAlls' - Số lượng cuộc gọi nguyên thủy 'dòng' - Số dòng 'Tên' - Tên chức năng 'NFL' - Tên/Tệp/Line

'Stdname' - Tên tiêu chuẩn 'Thời gian' - Thời gian nội bộ 'Tottime' - Thời gian nội bộ

Ngoài ra còn có sortkey enums cho hầu hết những thứ này mà bạn có thể sử dụng thay vì các chuỗi. Bây giờ bạn đã sẵn sàng để in nó ra thông qua print_stats []. Đây là đầu ra: 1 Tue ngày 19 tháng 5 21:00:38 2020 hồ sơ 0,000 0,000 hồ sơ_test. chính] 12 1 0.000 0.000 2.502 2.502 hồ sơ_test.py:3 [] 13 1 0,000 0.000 2.502 2.502 {Phương pháp tích hợp tích hợp.exec} 14 4 0,000 0.000 0.000 {Phương pháp tích hợp tích hợp. 1.251 {Phương thức tích hợp thời gian.Sle ngủ} 16 1 0,000 0.000 0,000 0,000 {Phương thức 'vô hiệu hóa' của '_lsprof.profiler \ 17' đối tượng} đối tượng}

Nó không hoàn toàn giống nhau, nhưng nó thực sự gần gũi! Bạn nên thử sử dụng một số chuỗi được đề cập ở trên để sắp xếp đầu ra theo những cách khác. Nếu bạn muốn lọc đầu ra, bạn có thể chuyển một biểu thức thông thường cho print_stats [] thay vì để trống. Một biểu thức chính quy là một chuỗi các ký tự có thể được sử dụng để tìm kiếm một cái gì đó. Họ theo nhiều cách ngôn ngữ của chính họ. Python có hỗ trợ cho các biểu thức thường xuyên trong mô -đun RE. Để lọc đầu ra của các số liệu thống kê hồ sơ đến chỉ tham chiếu đến main [], bạn sẽ thực hiện như sau: 1 sort_stats.print_stats ['\ [chính']

Biểu thức chính quy ở đây bao gồm các dấu ngoặc đơn bên trái nói với Python phù hợp với phần tên hàm của các số liệu thống kê. Nếu bạn chạy lại ví dụ bằng mã đã thay đổi, bạn sẽ thấy như sau: 1 Tue ngày 19 tháng 5 năm 19 21:00:38 2020 hồ sơ 9 đến 1 do hạn chế 7 8 NCALLS TOTTIME PERCALL CUMTIME PERCALL FILENAME: LINENO [Hàm] 9 1 0,000 0.000 2,502 2.502 hồ sơ_test.py:17[main]

Bạn cũng có thể bảo PSTATS in ra thông tin người gọi và callee cho các chức năng cụ thể trong các số liệu thống kê mà bạn đã thu thập được. Ví dụ: chúng ta hãy viết một số mã để in ra ai gọi Main [] và cả chính Main [] sẽ gọi bằng cách sửa đổi tệp mã từ trước: 1 ] ': 11 path =' accord_output.txt '12 formated_stats_output [path]

Một lần nữa bạn sử dụng biểu thức chính quy '\ [chính' để giới hạn đầu ra cho hàm chính [] 5 6 hồ sơ_test.py:17[main] confile_test.py:3 [] 7 8 9 Đặt hàng bởi: Tên tệp 10 Danh sách giảm từ 9 xuống 11 12 Chức năng 13 14 hồ sơ_test.py:17[main] hồ sơ_test.py:5 [ nhanh chóng] 15 hồ sơ_test.py:9[average]

1 Do hạn chế được gọi bởi ... Ncalls Tottime

2

Tottime 0,000

Cumtime 0,000

1

0.000

0.501

16 hồ sơ_test.py:13 [Super_slo \ 17 W]

1

0.000

2.000

Khối callees cho thấy main [] được gọi là nhanh [], trung bình [] và super_slow [], điều này chứng tỏ rằng bạn có thể theo dõi thành công các callees.

Các cấu hình khác Có một số gói hồ sơ khác cho Python mà bạn có thể sử dụng bên cạnh CPROFILE tích hợp. Dưới đây là một vài trong số những cái phổ biến hơn: line_profiler - //pypi.org/project/line-prof org/project/hồ sơhooks/scalene - //github.com/emeryberger/scalene snakeviz - //pypi.org/project/snakeviz/ Cuốn sách này sẽ không đào sâu vào tất cả các hồ sơ khác nhau này; Tuy nhiên, bạn có thể tìm hiểu về một số trong số này trong phần tiếp theo của cuốn sách này, Python 201: Python trung gian. Để cung cấp cho bạn một cái nhìn tổng quan nhanh chóng, hãy để Lôi đi qua cách mỗi gói này khác với CPROFILE.

Line_Profiler Gói line_profiler được thiết kế để định hình thời gian mà mỗi dòng riêng lẻ thực hiện. Nó đi kèm với một công cụ dòng lệnh có tên KernProf mà bạn có thể sử dụng ngoài việc thêm line_profiler vào mã của bạn. Đầu ra mà nó tạo ra nhiều thông tin hơn một chút so với những gì bạn nhận được với CPROFILE bởi vì nó sẽ xuất mã của bạn cùng với thời gian để chạy từng dòng, có thể thực sự hữu ích trong việc xác định chính xác phần nào gây ra nút thắt trong các] ma cua ban.

Memory_Profiler Trong khi line_profiler và cprofile rất tốt để tìm ra các vấn đề với mã chậm, họ không thể tìm thấy sự cố bộ nhớ. Cho rằng bạn có thể sử dụng Memory_Profiler. Gói Memory_Profiler đi theo từng dòng thông qua mã của bạn và tìm dòng hoặc dòng nào là bộ nhớ nhất.

Đầu ra và API của nó rất giống với Line_Profiler, vì vậy nếu bạn định sử dụng Memory_Profiler, bạn cũng có thể muốn kiểm tra line_profiler. Cả hai đều thực sự tiện dụng để tìm ra vấn đề với mã của bạn!

Hồ sơ Gói Hồ sơ cung cấp cho bạn một bộ trang trí để sử dụng trên mã của bạn để giúp bạn lập cấu hình mã. Đầu ra từ việc sử dụng gói này gần giống với những gì bạn nhận được từ CPROFILE.

Gói Scalene là cả CPU vừa là bộ nhớ cho Python. Nó tuyên bố sẽ chạy nhanh hơn nhiều so với bất kỳ trình hồ sơ Python nào khác và có chi phí từ 10-20% hoặc ít hơn khi so sánh với các gói hồ sơ khác. Bạn có thể nghĩ về scalene như là sự kết hợp của line_profiler và memory_profiler, nhưng nhanh hơn. Nó thực hiện hồ sơ theo từng dòng cho CPU và bộ nhớ, giống như các gói khác. Đầu ra của dự án này tương tự như line_profiler và memory_profiler, nhưng có thể bao gồm các cột thông tin bổ sung.

Snakeviz Dự án Snakeviz là trình xem đồ họa dựa trên trình duyệt cho đầu ra của mô -đun CPROFILE Python và là một giải pháp thay thế cho việc sử dụng mô -đun PSTAT của Thư viện tiêu chuẩn. Nó sẽ cho phép bạn trực quan hóa đầu ra số liệu thống kê mà bạn tạo bằng cách sử dụng CPROFILE trong các biểu đồ đẹp hoặc các loại trực quan hóa khác. Điều này có thể giúp bạn tìm thấy mã được viết kém nhanh hơn nếu bạn là một người trực quan.

Kết thúc hồ sơ mã của bạn là một cách tốt để tìm hiểu lý do tại sao mã của bạn không chạy tốt như bạn muốn. Một khi bạn biết vấn đề là gì, bạn có thể tìm thấy một giải pháp cho vấn đề này. Trong chương này, bạn đã tìm hiểu về: Hồ sơ với CPROFILE làm việc với dữ liệu hồ sơ bằng cách sử dụng PSTATS Các trình cấu hình khác Hãy nhớ rằng, mã của bạn luôn luôn là vấn đề. Bản thân máy tính có thể là vấn đề hoặc kết nối internet, hoặc một cái gì đó hoàn toàn khác. Các nút thắt trong lập trình có thể khá đa dạng.

Xem lại câu hỏi 1. Hồ sơ của người Viking có nghĩa là gì trong bối cảnh lập trình? 2. Bạn sử dụng thư viện Python nào để lập cấu hình mã của mình? 3. Làm thế nào để bạn trích xuất dữ liệu từ số liệu thống kê hồ sơ đã lưu?

Chương 30 - Giới thiệu về thử nghiệm Có rất nhiều điều mà một lập trình viên giỏi cần biết cách làm. Bên cạnh việc biết cú pháp cơ bản của ngôn ngữ mà bạn sử dụng và tuân theo các quy ước mã hóa thích hợp, kiểm tra mã của bạn là một trong những điều quan trọng nhất để học để trở thành một lập trình viên giỏi. Kiểm tra mã của bạn cho phép bạn biết rằng mã của bạn hoạt động theo cách mà bạn dự định. Kiểm tra tốt sẽ cho phép bạn sửa đổi mã của mình trong tương lai mà không phá vỡ chức năng hiện có. Python có hai thư viện thử nghiệm tích hợp mà bạn sẽ tìm hiểu trong chương này: Doctest Unittest

Python cũng bao gồm một thư viện phụ giả cho Unittest. Bạn đã giành chiến thắng khi tìm hiểu về cái đó ở đây vì nó vượt ra ngoài phạm vi của cuốn sách này. Bạn có thể sử dụng Mock để thay thế các phần của hệ thống đang được thử nghiệm. Ví dụ: bạn có thể sử dụng Mock để mô phỏng kết nối cơ sở dữ liệu để bạn vẫn có thể kiểm tra kết nối giả thay vì truy cập vào cơ sở dữ liệu và có thể gây ra sự cố. Trong chương này, bạn sẽ tìm hiểu về những điều sau: Sử dụng DocTest trong thiết bị đầu cuối bằng cách sử dụng tài liệu trong mã của bạn bằng cách sử dụng DocTest từ một tệp riêng biệt bằng cách sử dụng Unittest để phát triển theo hướng thử nghiệm Hãy bắt đầu!

Sử dụng DocTest trong thiết bị đầu cuối theo tài liệu của Python, mô -đun DocTest sẽ tìm kiếm mã của bạn cho các đoạn văn bản trông giống như các phiên Python tương tác và sau đó thực hiện các phiên đó để xác minh rằng chúng hoạt động chính xác như được hiển thị. Bạn có thể sử dụng DocTest cho các mục sau: Để kiểm tra xem DocStrings có chính xác hay không và cập nhật tài liệu hướng dẫn cho gói để thực hiện kiểm tra hồi quy hồi quy là một thuật ngữ được sử dụng để mô tả các thử nghiệm chạy sau khi bạn thay đổi để xác minh rằng Những thay đổi của bạn không phá vỡ chức năng hiện có. Nếu bạn muốn kiểm tra tài liệu DocTest, bạn sẽ tìm thấy nó bên dưới: //docs.python.org/3/l Library/doctest.html để bắt đầu, bạn sẽ cần một số mã để sử dụng tài liệu. Bạn có thể tạo một tệp có tên add_doctest.py và thêm mã sau vào nó: 1 # add_doctest.py 2 3 def ADD [A: int, b: int] -> int: 4 "" "5 >>> Thêm [1 , 2] 6 3 7 >>> Thêm [4, 5] 8 9 9 "" "10 A + B

Hàm ADD [] của bạn chấp nhận hai số nguyên và nó sẽ trả về một số nguyên. Bạn cũng đã thêm hai bài kiểm tra trong tài liệu. DocString cho thấy những đối số đã được chuyển vào hàm ADD [] cũng như những gì nên được trả về.

Tuy nhiên, có một vấn đề với mã của bạn. Bạn có thấy nó là gì không? Nếu bạn don lồng, thì đó là ổn. Bạn sẽ chạy Doctest trên mã này và nó sẽ cho bạn biết những gì sai. Để chạy DocTest, hãy mở một thiết bị đầu cuối và điều hướng đến nơi bạn đã lưu tệp Python của mình. Sau đó chạy lệnh sau: python3 -m doctest add_doctest.py

Bạn sẽ thấy đầu ra sau: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 20

Máy tính: Chương30_Testing $ Python3 -M Doctest add_doctest.py ****** / TÌM HIỂU ***************************************** : Thêm [1, 2] Dự kiến: 3 không có gì ****** / TÌM HIỂU ******/TÌM HIỂU Ví dụ: Thêm [4, 5] Dự kiến: 9 không có gì ****** / TÌM HIỂU ********************************************* *** 2 thất bại. Máy tính: Chương30_Testing $

Cả hai bài kiểm tra của bạn đều thất bại. Đầu ra cho bạn biết rằng lý do các thử nghiệm thất bại là vì họ mong đợi một giá trị trả lại, nhưng không có gì khác. Bạn nên cập nhật mã của mình để nó trả về việc bổ sung hai đối số: 1 # add_doctest_works.py 2 3 def ADD [A: int, b: int] -> int: 4 "" 5 >>> Thêm [1, 2] 6 3 7 >>> Thêm [4, 5] 8 9 9 "" "10 Trả về A + B

Bây giờ nếu bạn chạy lại lệnh DocTest, bạn sẽ không thấy đầu ra nào. Điều đó có nghĩa là tất cả các bài kiểm tra của bạn đã qua. Nếu bạn muốn xem

Đầu ra ngay cả khi các bài kiểm tra của bạn thành công, bạn có thể chuyển cờ -V cho tài liệu, như thế này: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Máy tính: Chương30_Testing $ python3 -m doctest -v add_doctest_works.py cố gắng: Thêm [1, 2] mong đợi: 3 OK Thử: Thêm [4, 5] 2 Thử nghiệm trong ADD_DOCTEST_WORKKING.ADD 2 Thử nghiệm trong 2 mục. 2 đã qua và 0 thất bại. Bài kiểm tra đã qua. Máy tính: Chương30_Testing $

Bây giờ bạn có thể thấy rằng các bài kiểm tra đã qua! Bây giờ bạn đã sẵn sàng để tìm hiểu cách sử dụng tài liệu trong mã của bạn!

Sử dụng DocTest trong mã của bạn, bạn có thể chạy mô -đun tài liệu trực tiếp trong mã của bạn ngoài thiết bị đầu cuối. Hãy sao chép mã từ ví dụ trước vào một tệp mới có tên là add_test_in_code.py và thêm 3 dòng mã mới vào cuối: 1 # add_test_in_code.py 2 3 def add [A: int, b: int] -> int: 4 "" "5 >>> Thêm [1, 2] 6 3 7 >>> Thêm [4, 5] 8 9 9" "" 10 Trả về A + B 11 12 nếu __name__ == '__main__': 13 Nhập tài liệu 14 doctest.testmod [verbose = true]

3 dòng mã cuối cùng sẽ chỉ chạy nếu bạn chạy add_test_in_code.py, không phải nếu bạn nhập nó. Bên trong câu lệnh IF, bạn nhập tài liệu và gọi hàm testMod [] của nó với verbose được đặt thành true. Bây giờ bạn có thể chạy mã của mình bằng Python3 sẽ dẫn đến đầu ra sau: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 17 17 17 17

add_test_in_code.py,

which

Trying: add[1, 2] Expecting: 3 ok Trying: add[4, 5] Expecting: 9 ok 1 items had no tests: __main__ 1 items passed all tests: 2 tests in __main__.add 2 tests in 2 items. 2 passed and 0 failed. Test passed.

If you want to thoroughly test your code, you may find that putting all the tests in docstrings makes the code harder to read. To avoid this problem but

keep testing your code, you can move your tests to another file. Let’s find out how!

Using doctest From a Separate File When you notice that your doctest docstrings are getting too verbose, it’s a good idea to move them into a separate file. Let’s create a new file named doctest_external.py and simplify the code into the following: 1 # doctest_external.py 2 3 def add[a: int, b: int] -> int: 4 return a + b

Now, let’s take the tests that you put in the docstring and save them in a file named test.txt: 1 2 3 4 5 6 7

The following are tests for doctest_external >>> from doctest_external import add >>> add[1, 2] 3 >>> add[4, 5] 9

You can add some helpful information to your text file that explains what the test file is for. The helpful information are the lines that appear before the >>>. This is what allowed you to remove the docstring from your add[] function. To run doctest against this code, you will execute doctest using the test file instead of the Python file. Here’s an example: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Computer:chapter30_testing$ python3 -m doctest -v test.txt Trying: from doctest_external import add Expecting nothing ok Trying: add[1, 2] Expecting: 3 ok Trying: add[4, 5] Expecting: 9 ok 1 items passed all tests: 3 tests in test.txt 3 tests in 1 items.

19 3 passed and 0 failed. 20 Test passed.

This code shows 3 tests passing instead of 2 because you need to import doctest_external before you can really test it. doctest will treat the import as a test too! The doctest module can be used directly to execute the text file via the testfile[] function. Here is an example that demonstrates how you could do that: 1 2 3 4

>>> import doctest >>> doctest.testfile['test.txt'] TestResults[failed=0, attempted=3] >>>

When you run doctest in this manner, it will return a TestResults object that shows you the number of attempted tests and the number of failures. You can see that it attempted to do 3 tests and none of them failed, which indicates that they passed successfully. Apart from doctest, there are other ways that you can create tests in Python. You will learn about using a different module called unittest in the next section.

Using unittest For Test Driven Development Python has the unittest module that allows you to write unit tests for your code. A unit test is a way to test the smallest piece of code that can be isolated from the rest. Considering the add[] function from the previous section, you might write a test that adds two positive numbers, or a test that adds a negative and a positive number. However, you wouldn’t test both of those scenarios in the same unit test. A popular concept in programming in something called Test-Driven Development or TDD. The idea behind TDD that is that you will write a failing test BEFORE you write any code. The basic concept is that you will spend time thinking about the implementation of your program and how you would test it before you start coding. Here’s an overview of the TDD process: Fail: First, you write a simple test and run it. It should fail right away since you haven’t written any functional code yet. Pass: The next step is to write some code that passes the test. Then you start the process from the top by writing a new test that should also fail initially. And so you iterate writing tests and writing code to pass the tests. You can practice TDD by doing a code kata. Code katas are coding challenges that are designed to practice a specific programming concept in depth. One of the popular programming katas is called FizzBuzz. This is also a popular interview question for computer programmers. The concept behind FizzBuzz is as follows: Write a program that prints the numbers 1-100, each on a new line For each number that is a multiple of 3, print “Fizz” instead of the number

For each number that is a multiple of 5, print “Buzz” instead of the number For each number that is a multiple of both 3 and 5, print “FizzBuzz” instead of the number Let’s take this popular challenge and write a solution and some tests for it using Test-Driven Development.

The Fizz Test The first step is to create a folder to hold your test. You can create a fizzbuzz folder for this purpose. Then add your code to that folder. A lot of people will save their tests in sub-folder called test or tests and tell their test runner to add the top level folder to sys.path so that the tests can import it. A test runner is a separate program that you could use to run your tests continuously for you. You can skip that in this case. Instead, let’s go ahead and create a test file called test_fizzbuzz.py inside your fizzbuzz folder. Now enter the following into your Python file: 1 2 3 4 5 6 7 8 9 10

Nhập fizzbuzz nhập lớp Unittest testfizzbuzz [unittest.testcase]: duch test_multiple_of_three [self]: self.assertequal [fizzbuzz.process [6], 'fizz'] nếu __name__ == '__main__':

Ở đây bạn nhập mô -đun FizzBuzz, đó là mã mà bạn sẽ thử nghiệm. Sau đó, bạn nhập mô -đun Unittest Python. Để sử dụng Unittest, bạn sẽ cần phải phân lớp unittest.testcase []. Sau đó, bạn có thể tạo một loạt các chức năng đại diện cho các thử nghiệm mà bạn muốn chạy. Trong trường hợp này, bạn tạo test_multiple_of_three [] và sử dụng assertequal [] để kiểm tra rằng fizzbuzz.process [6] sẽ trả về chuỗi, 'fizz'.

Nếu bạn chạy bài kiểm tra này ngay bây giờ, bạn sẽ nhận được ModulenotFounderRor vì FizzBuzz không tồn tại. Bản sửa lỗi là tạo tệp fizzbuzz.py trống trong cùng thư mục với tệp thử nghiệm của bạn. Điều này sẽ chỉ sửa chữa ModulenotFounderRor, nhưng nó sẽ cho phép bạn chạy thử nghiệm và xem đầu ra của nó. Bạn có thể chạy bài kiểm tra như thế này: 1 Python test_fizzbuzz.py

Khi bạn chạy mã này, bạn sẽ thấy đầu ra sau: 1 2 3 4 5 6 7 8 9 10 11 12 13

E ================================================= ===================== Lỗi: test_multiple_of_three [__main __. TestFizzBuzz] -------------------------------------- ------------------------------------------------Tìm lại [ Cuộc gọi gần đây nhất cuối cùng] ---------------------------------------------------------- -------------- Chạy 1 Bài kiểm tra trong 0,000s không thành công [Lỗi = 1]

Điều này cho bạn biết rằng mô -đun FizzBuzz của bạn bị thiếu một thuộc tính gọi là Process []. Bạn có thể cố gắng khắc phục điều đó bằng cách thêm hàm [] hàm vào tệp fizzbuzz.py của bạn: 1 quá trình def [số]: 2 Pass

Chức năng này chấp nhận một số, nhưng không làm gì khác. Điều đó sẽ giải quyết thuộc tính mà bạn nhận được. Hãy thử chạy lại bài kiểm tra và bạn nên nhận đầu ra sau: 1 2 3 4 5 6 7 8

F ================================================== ===================== FAIL: TEST_MULTIPLE_OF_THREE [__MAIN __. TESTFIZZBUZZ] --------------------------------- ------------------------------------------------Tìm lại [ Cuộc gọi gần đây nhất cuối cùng]

9 10 -------------------------------------------------------- --------------------- 11 Chạy 1 Bài kiểm tra trong 0,000S 12 13 thất bại [thất bại = 1]

Ối! Python trả về không có mặc định. Đó không phải là những gì chức năng này sẽ trở lại mặc dù. Hãy để cập nhật lại mã: 1 Quy trình def [số]: 2 nếu số % 3 == 0: 3 Trả về 'Fizz'

Lần này hàm lấy số và sử dụng toán tử mô đun để chia số cho 3 và kiểm tra xem có còn lại không. Nếu không có phần còn lại, thì bạn biết rằng số này chia hết cho 3 để bạn có thể trả lại chuỗi "fizz". Bây giờ khi bạn chạy thử nghiệm, đầu ra sẽ trông như thế này: 1 2 3 4 5

. ---------------------------------------------------------- ------------------- Chạy 1 Bài kiểm tra trong 0,000s OK

Khoảng thời gian trên dòng đầu tiên trên có nghĩa là bạn đã chạy một bài kiểm tra và nó đã qua. Hãy để Lùi lại một bước ở đây và thảo luận về những gì bạn vừa chứng kiến ​​từ góc độ TDD. Khi một bài kiểm tra thất bại, nó được coi là ở trạng thái màu đỏ. Khi một bài kiểm tra đang trôi qua, đó là một trạng thái màu xanh lá cây của người Viking. Điều này đề cập đến câu thần chú phát triển theo hướng thử nghiệm [TDD] của Red/Green/Refactor. Hầu hết các nhà phát triển sẽ bắt đầu một dự án mới bằng cách tạo một thử nghiệm thất bại [màu đỏ]. Sau đó, họ sẽ viết mã để thực hiện vượt qua bài kiểm tra, thường là theo cách đơn giản nhất có thể [màu xanh lá cây]. Nếu bạn đang sử dụng kiểm soát nguồn, bạn sẽ cam kết mã của mình ngay bây giờ vì nó đang được chuyển. Điều này cho phép bạn chuyển mã của mình sang trạng thái chức năng nếu thay đổi tiếp theo của bạn phá vỡ một cái gì đó. Bạn sẽ tìm hiểu thêm về kiểm soát nguồn sau này trong cuốn sách này. Bây giờ bạn đã sẵn sàng để viết một bài kiểm tra khác!

Bài kiểm tra buzz Thử nghiệm thứ hai cho mã FizzBuzz của bạn sẽ kiểm tra phản hồi chính xác cho bội số của năm. Để thêm một bài kiểm tra mới, bạn có thể tạo một phương thức khác trong lớp testfizzbuzz []: 1 2 3 4 5 6 7 8 9 10 11 12 13

Nhập fizzbuzz nhập lớp Unittest testfizzbuzz [unittest.testcase]: duch test_multiple_of_three [self]: self.assertequal [fizzbuzz.process [6], 'fizz'] 'Buzz'] nếu __name__ == '__main__': unittest.main []

Lần này, bài kiểm tra của bạn sẽ cần sử dụng một số chỉ chia hết cho 5, nhưng không phải là 3. Ở trạng thái hoạt động, fizzbuzz.process [] sẽ trả về Buzz Buzz. Tuy nhiên, khi bạn chạy bài kiểm tra ngay bây giờ, bạn sẽ nhận được điều này: 1 2 3 4 5 6 7 8 9 10 11 12 13

F. ================================================ ====================== FAIL: test_multiple_of_five [__main __. Testfizzbuzz] ------------------------------ -------------------------------------------------Tìm lại . ---------------------------------------------------------- ----------- Chạy 2 bài kiểm tra trong 0,000s thất bại [thất bại = 1]

Ối! Ngay bây giờ mã của bạn sử dụng toán tử mô đun để kiểm tra phần còn lại sau khi chia cho 3. Nếu số 20 có phần còn lại, câu lệnh đó đã giành được chạy. Giá trị trả về mặc định của một hàm là không có, vì vậy đó là lý do tại sao bạn cuối cùng nhận được thông báo lỗi trên. Đi trước và cập nhật hàm Quy trình [] trong tệp fizzbuzz.py của bạn để có vẻ như thế này: 1 def quy trình [số]: 2 nếu số % 3 == 0: 3 Trả về 'fizz'

4 5

Số Elif % 5 == 0: Trả về 'Buzz'

Bây giờ bạn có thể kiểm tra phần còn lại với cả 3 và 5. Khi bạn chạy các bài kiểm tra lần này, đầu ra sẽ trông như thế này: 1 2 3 4 5

.. ---------------------------------------------------- --------------------- Chạy 2 Bài kiểm tra trong 0,000s OK

Yay! Các bài kiểm tra của bạn đã qua và bây giờ là màu xanh lá cây! Điều đó có nghĩa là bạn có thể cam kết những thay đổi này đối với kho lưu trữ Git của bạn. Bây giờ bạn đã sẵn sàng để thêm một bài kiểm tra cho Fizzbuzz!

Bài kiểm tra FizzBuzz Bài kiểm tra tiếp theo mà bạn có thể viết sẽ là khi bạn muốn lấy lại "FizzBuzz". Như bạn có thể nhớ lại, bạn sẽ nhận được fizzbuzz bất cứ khi nào con số chia hết cho cả 3 và 5. Đi trước và thêm một bài kiểm tra thứ ba chỉ có điều đó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Nhập fizzbuzz nhập lớp Unittest testfizzbuzz [unittest.testcase]: duch test_multiple_of_three [self]: self.assertequal [fizzbuzz.process [6], 'fizz'] 'Buzz'] def test_fizzbuzz [self]: self.assertequal [fizzbuzz.process [15], 'fizzBuzz'] nếu __name__ == '__main__': unittest.main []

Đối với thử nghiệm này, Test_FizzBuzz [], bạn yêu cầu chương trình của bạn xử lý số 15. Điều này không hoạt động đúng, nhưng hãy tiếp tục và chạy mã thử nghiệm để kiểm tra: 1 F .. 2 ========================= ================================================== ============ 3 FAIL: TEST_FIZZBUZZ [__MAIN __.

4 5 6 7 8 9 10 11 12 13 14 15 16

---------------------------------------------------------- ------------------- Traceback [cuộc gọi gần đây nhất] 'FizzBuzz'] AssitSerRor: 'Fizz'! = 'FizzBuzz'-Fizz + FizzBuzz ---------------------------------------------- ----------------------------------------- Chạy 3 Bài kiểm tra trong 0,001s thất bại [thất bại = 1]

Ba bài kiểm tra đã được chạy với một thất bại. Bây giờ bạn đã trở lại màu đỏ. Lần này lỗi là 'fizz'! = 'Fizzbuzz' thay vì so sánh không có gì với fizzbuzz. Lý do cho điều đó là do mã của bạn kiểm tra xem 15 có chia hết cho 3 và vì thực tế là, mã của bạn trả về "fizz". Vì đó không phải là những gì bạn muốn xảy ra, bạn sẽ cần cập nhật mã của mình để kiểm tra xem số này có chia hết cho cả 3 và 5 trước khi kiểm tra chỉ 3: 1 def [số]: 2 nếu số % 3 == 0 và số % 5 == 0: 3 Trả về 'FizzBuzz' 4 ELIF Số % 3 == 0: 5 Trả về 'Fizz' 6 Elif Số % 5 == 0: 7 Trả về 'Buzz'

Ở đây bạn thực hiện kiểm tra tính phân chia cho 3 và 5 trước. Sau đó, bạn kiểm tra hai cái kia như trước đây. Bây giờ nếu bạn chạy thử nghiệm của mình, bạn sẽ nhận được đầu ra sau: 1 2 3 4 5

... --------------------------------------------------- ---------------------- chạy 3 bài kiểm tra trong 0,000s ok

Càng xa càng tốt. Tuy nhiên, bạn không có mã hoạt động để trả về các số mà aren chia hết cho 3 hoặc 5. Thời gian cho một bài kiểm tra khác!

Bài kiểm tra cuối cùng

Điều cuối cùng mà mã của bạn cần làm là trả về số khi nó có phần còn lại khi chia cho 3 và 5. Hãy kiểm tra nó theo một vài cách khác nhau: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 20

Nhập fizzbuzz nhập lớp Unittest testfizzbuzz [unittest.testcase]: duch test_multiple_of_three [self]: self.assertequal [fizzbuzz.process [6], 'fizz'] 'Buzz'] def test_fizzbuzz [self]: self.assertequal [fizzbuzz.process [15], 'fizzbuzz'] duch test_regular_numbers [self]: self.assertequal [fizzbuzz.process [2] Quy trình [98], 98] nếu __name__ == '__main__': unittest.main []

Đối với thử nghiệm này, bạn kiểm tra số bình thường 2 và 98 với kiểm tra test_regular_numbers []. Những con số này sẽ luôn có phần còn lại khi chia cho 3 hoặc 5, vì vậy chúng chỉ nên được trả lại dưới dạng số gốc. Khi bạn chạy các bài kiểm tra ngay bây giờ, bạn sẽ nhận được một cái gì đó như thế này: 1 2 3 4 5 6 7 8 9 10 11 12 13

... f ============================================== ======================== FAIL: TEST_REGULAR_NUMBERS [__Main __. ---------------------------------------------------------- -TraceBack [cuộc gọi gần đây nhất cuối cùng]: Tệp "test_fizzbuzz.py", dòng 16, trong test_regular_numbers self.assertequal [fizzbuzz.process [2], 2] assertyerror: none! = 2 ---------- ---------------------------------------------------------- --------- Chạy 4 Bài kiểm tra trong 0,001S không thành công [thất bại = 1]

Lần này bạn trở lại so sánh không có gì với số, đó là những gì bạn có thể nghi ngờ sẽ là đầu ra.

Đi trước và cập nhật hàm Quy trình [] trong mô -đun FizzBuzz của bạn như sau: 1 Quy trình def [số]: 2 nếu số % 3 == 0 và số % 5 == 0: 3 Trả về 'FizzBuzz' 4 Elif Số % 3 = = 0: 5 Trả về 'Fizz' 6 ELIF Số % 5 == 0: 7 Trả về 'Buzz' 8 khác: 9 Số trả về

Điều đó thật dễ dàng! Tất cả những gì bạn cần làm tại thời điểm này là thêm một tuyên bố khác trả về số. Khi bạn chạy các bài kiểm tra, tất cả chúng nên vượt qua: 1 2 3 4 5

.... ------------------------------------------------------ ----------------------- Chạy 4 bài kiểm tra trong 0,000s ok

Làm tốt lắm! Mã của bạn hoạt động. Bạn có thể xác minh rằng nó hoạt động cho tất cả các số, 1-100, bằng cách thêm phần sau vào mô-đun fizzbuzz.py của bạn: 1 nếu __name__ == '__main__': 2 cho i trong phạm vi [1, 101]: 3 [tôi]]

Khi bạn tự chạy FizzBuzz bằng cách sử dụng Python fizzbuzz.py, bạn sẽ thấy đầu ra thích hợp được chỉ định ở đầu phần này.

Kết thúc bạn chỉ bị trầy xước bề mặt khi thử nghiệm ở Python. Trong thực tế, có toàn bộ sách viết về chủ đề và nhiều hướng dẫn và video là tốt. Trong chương này, bạn đã tìm hiểu về: Sử dụng DocTest trong thiết bị đầu cuối sử dụng tài liệu trong mã của bạn bằng cách sử dụng DocTest từ một tệp riêng biệt bằng cách sử dụng Unittest để phát triển điều khiển thử nghiệm, mô -đun tài liệu là khá gọn gàng, nhưng không được sử dụng thường xuyên. Trong hai thư viện, Unittest là người được sử dụng nhiều nhất vì nó mang lại sự linh hoạt cao hơn. Ngoài ra còn có các gói thử nghiệm của bên thứ ba. Một trong những phổ biến nhất được gọi là pytest. Mặc dù nó không được đề cập trong cuốn sách này, bạn nên kiểm tra xem bạn có muốn thử nghiệm ở Python không. Bạn nên luôn luôn kiểm tra mã của bạn. Nó giúp bạn tự tin rằng mã của bạn đang hoạt động theo cách nó cần. Kiểm tra sẽ giúp bạn tiết kiệm nhiều cơn đau đầu sau khi bạn cập nhật mã của mình.

Xem lại câu hỏi 1. Làm thế nào để bạn thêm các bài kiểm tra được sử dụng với DocTest? 2. Các bài kiểm tra cho Doctest có bắt buộc phải ở trong DocString không? Nếu không, bạn sẽ thực hiện nó như thế nào? 3. Bài kiểm tra đơn vị là gì? 4. Phát triển theo hướng kiểm tra là gì?

Chương 31 - Tìm hiểu về Notebook Jupyter Máy tính xách tay Jupyter là một ứng dụng web nguồn mở cho phép bạn tạo và chia sẻ các tài liệu có chứa mã, phương trình, trực quan hóa và văn bản được định dạng. Theo mặc định, Notebook Jupyter chạy Python ra khỏi hộp. Ngoài ra, Notebook Jupyter hỗ trợ nhiều ngôn ngữ lập trình khác thông qua các tiện ích mở rộng. Bạn có thể sử dụng sổ ghi chép Jupyter để làm sạch và chuyển đổi dữ liệu, mô phỏng số, mô hình thống kê, trực quan hóa dữ liệu, học máy, và nhiều hơn nữa! Trong chương này, bạn sẽ tìm hiểu về những điều sau: Cài đặt sổ ghi chép Jupyter Tạo một cuốn sổ tay Thêm nội dung Thêm nội dung Markdown Thêm một cuốn sổ xuất bản mở rộng vào các định dạng khác Chương này không có nghĩa là hướng dẫn toàn diện trên sổ ghi chép Jupyter. Thay vào đó, nó sẽ chỉ cho bạn những điều cơ bản về cách sử dụng một cuốn sổ tay và lý do tại sao nó có thể hữu ích. Nếu bạn bị thu hút bởi công nghệ này, bạn có thể muốn xem cuốn sách của tôi về chủ đề này, Jupyter Notebook 101. Hãy bắt đầu!

Cài đặt Notebook Jupyter Jupyter Notebook không đi kèm với Python. Bạn sẽ cần cài đặt nó bằng PIP. Nếu bạn đang sử dụng Anaconda thay vì Python chính thức, thì Jupyter Notebook đi kèm với Anaconda, được cài đặt sẵn. Đây là cách bạn sẽ cài đặt Jupyter Notebook với PIP: 1 Python3 -M Pip Cài đặt Jupyter

Khi bạn cài đặt Notebook Jupyter, nó sẽ cài đặt rất nhiều phụ thuộc khác. Bạn có thể muốn cài đặt Notebook Jupyter vào môi trường ảo Python. Xem Chương 21 để biết thêm thông tin. Sau khi cài đặt xong, bạn đã sẵn sàng để tạo một cuốn sổ Jupyter!

Tạo một cuốn sổ Tạo một cuốn sổ là một khái niệm cơ bản. Jupyter Notebook hoạt động thông qua máy chủ riêng của nó, đi kèm với cài đặt của bạn. Để có thể làm bất cứ điều gì với Jupyter, trước tiên bạn phải khởi chạy máy chủ Jupyter này bằng cách chạy lệnh sau: 1 Notebook Jupyter

Lệnh này sẽ khởi chạy trình duyệt mặc định của bạn hoặc mở một tab mới, tùy thuộc vào việc trình duyệt của bạn có chạy hay không. Trong cả hai trường hợp, bạn sẽ sớm thấy một tab mới trỏ đến URL sau: // localhost: 8888/cây. Trình duyệt của bạn nên tải lên một trang trông như thế này:

Hình 31-1: Máy chủ Notebook Jupyter

Tại đây bạn có thể tạo một cuốn sổ tay bằng cách nhấp vào nút mới ở bên phải:

Hình 31-2: Tạo một cuốn sổ Jupyter

Bạn có thể tạo một sổ ghi chép với menu này cũng như tệp văn bản, thư mục và phiên thiết bị đầu cuối trong trình duyệt. Hiện tại, bạn nên chọn tùy chọn Python 3. Đã hoàn thành điều đó, một tab mới sẽ mở với máy tính xách tay mới của bạn được tải:

Hình 31-3: Một cuốn sổ tay Jupyter mới

Bây giờ, hãy để tìm hiểu về cách tương tác với Notebook!

Đặt tên cho sổ ghi chép của bạn trên cùng của sổ ghi chép nói rằng nó không có tiêu đề. Để khắc phục điều đó, tất cả những gì bạn cần làm là nhấp vào từ không có tiêu đề và hộp thoại trong trình duyệt sẽ xuất hiện:

Hình 31-4: Đổi tên sổ ghi chép

Khi bạn đổi tên máy tính xách tay, nó cũng sẽ đổi tên tệp mà sổ ghi chép được lưu để nó phù hợp với tên bạn đã đặt. Bạn có thể đặt tên cho cuốn sổ tay này là Hello Hello World.

Chạy các tế bào Jupyter Notebook Tế bào là nơi xảy ra phép thuật. Đây là nơi bạn có thể tạo nội dung và mã tương tác. Theo mặc định, máy tính xách tay sẽ tạo các ô ở chế độ mã. Điều đó có nghĩa là nó sẽ cho phép bạn viết mã vào bất kỳ kernel nào bạn chọn khi bạn tạo sổ ghi chép. Một kernel đề cập đến ngôn ngữ lập trình mà bạn đã chọn khi tạo sổ ghi chép Jupyter của mình. Bạn đã chọn Python 3 khi bạn tạo sổ ghi chép này, vì vậy bạn có thể viết mã Python 3 trong ô. Ngay bây giờ tế bào trống, vì vậy nó không làm gì cả. Hãy để thêm một số mã để thay đổi điều đó: 1 in ['Xin chào từ Python!']

Để thực hiện nội dung của một ô, bạn cần chạy ô đó. Sau khi chọn ô, có ba cách chạy nó: Nhấp vào nút chạy ở hàng nút dọc theo điều hướng trên cùng đến ô -> Chạy các ô từ menu Notebook bằng cách sử dụng phím tắt: Shift+Enter khi bạn chạy ô này, Đầu ra sẽ trông như thế này:

Hình 31-5: Chạy một ô

Các ô Notebook Jupyter Ghi nhớ thứ tự mà chúng đang chạy. Nếu bạn chạy các ô theo thứ tự, bạn có thể bị lỗi vì bạn đã nhập một thứ gì đó theo đúng thứ tự. Tuy nhiên, khi bạn chạy các ô theo thứ tự, bạn có thể viết nhập khẩu vào một ô và vẫn sử dụng các nhập khẩu đó trong các ô sau này. Notebook làm cho nó đơn giản để giữ các phần logic của mã với nhau. Trên thực tế, bạn có thể đặt các ô, đồ thị giải thích và nhiều hơn nữa giữa các ô mã và các ô mã vẫn sẽ chia sẻ với nhau. Khi bạn chạy một ô, có một số dấu ngoặc bên cạnh ô sẽ lấp đầy với một số. Điều này chỉ ra thứ tự các tế bào được chạy. Trong ví dụ này, khi bạn chạy ô đầu tiên, các dấu ngoặc được điền vào số một. Bởi vì tất cả các ô mã trong một sổ ghi chép hoạt động trên cùng một không gian tên toàn cầu, điều quan trọng là có thể theo dõi thứ tự thực hiện các ô mã của bạn.

Tìm hiểu về các menu Có một menu trong sổ ghi chép Jupyter mà bạn có thể sử dụng để làm việc với sổ ghi chép của mình. Menu chạy dọc theo đầu của máy tính xách tay. Dưới đây là các tùy chọn menu của bạn: Chỉnh sửa tệp Chèn Kernel Cell

Các vật dụng giúp cho phép đi qua từng thực đơn này. Bạn không cần phải biết về mọi lựa chọn duy nhất trong các menu này để bắt đầu làm việc với Jupyter, vì vậy đây sẽ là một tổng quan cấp cao. Menu Tệp được sử dụng để mở sổ ghi chép hoặc tạo một máy tính xách tay mới. Bạn cũng có thể đổi tên máy tính xách tay ở đây. Một trong những tính năng đẹp của máy tính xách tay là bạn có thể tạo các điểm kiểm tra. Các điểm kiểm tra cho phép bạn rollback đến trạng thái trước đó. Để tạo một điểm kiểm tra, hãy vào menu tệp và chọn tùy chọn Lưu và Checkpoint. Menu Chỉnh sửa chứa các lệnh cắt, sao chép và dán thông thường của bạn, bạn có thể sử dụng ở cấp độ ô. Bạn cũng có thể xóa, chia hoặc hợp nhất các ô từ đây. Cuối cùng, bạn có thể sử dụng menu này để sắp xếp lại các ô. Bạn sẽ thấy rằng một số tùy chọn ở đây có màu xám. Lý do một mặt hàng được đưa ra màu xám là vì tùy chọn đó không áp dụng cho ô hiện đang được chọn trong sổ ghi chép của bạn. Ví dụ: nếu bạn đã chọn một ô mã, bạn đã giành được một hình ảnh. Hãy thử thay đổi loại ô thành Markdown để xem các tùy chọn thay đổi như thế nào. Menu chế độ xem được sử dụng để chuyển đổi khả năng hiển thị của tiêu đề và thanh công cụ. Đây cũng là nơi bạn sẽ chuyển sang số chuyển số trên hoặc tắt. Menu chèn được sử dụng để chèn các ô ở trên hoặc dưới ô hiện được chọn. Menu ô rất hữu ích để chạy một ô, một nhóm ô hoặc mọi thứ trong sổ ghi chép! Bạn có thể thay đổi loại ô ở đây, nhưng có lẽ bạn sẽ thấy rằng thanh công cụ có tính trực quan hơn khi sử dụng sau đó là menu cho loại điều đó. Một tính năng hữu ích khác của menu ô là bạn có thể sử dụng nó để xóa đầu ra của ô. Rất nhiều người chia sẻ sổ ghi chép của họ với những người khác. Nếu bạn muốn làm điều đó, có thể hữu ích để xóa các đầu ra của các ô để

Bạn bè hoặc đồng nghiệp có thể tự mình điều hành các tế bào và khám phá cách chúng hoạt động. Menu kernel là để làm việc với chính hạt nhân. Hạt nhân đề cập đến plugin ngôn ngữ lập trình. Thỉnh thoảng bạn sẽ cần phải khởi động lại, kết nối lại hoặc tắt hạt nhân của bạn. Bạn cũng có thể thay đổi hạt nhân nào đang chạy trong sổ ghi chép của bạn. Bạn đã giành chiến thắng sử dụng menu kernel thường xuyên. Tuy nhiên, khi bạn cần thực hiện một số gỡ lỗi trong Notebook Jupyter, có thể rất hữu ích để khởi động lại kernel thay vì khởi động lại toàn bộ máy chủ. Menu Widgets là để xóa và lưu trạng thái widget. Tiện ích là một cách để thêm nội dung động vào sổ ghi chép của bạn, như một nút hoặc thanh trượt. Chúng được viết bằng JavaScript dưới bìa. Menu cuối cùng là menu trợ giúp. Đây là nơi bạn sẽ tìm hiểu về các phím tắt bàn phím đặc biệt cho máy tính xách tay của bạn. Nó cũng cung cấp một tour du lịch giao diện người dùng và nhiều tài liệu tham khảo mà bạn có thể sử dụng để tìm hiểu cách tương tác tốt hơn với máy tính xách tay của mình. Bây giờ, hãy để học cách tạo nội dung trong sổ ghi chép của bạn!

Thêm nội dung Bạn có thể chọn giữa hai loại nội dung chính cho máy tính xách tay của mình: Code Markdown có hai loại ô khác mà bạn có thể chọn. Một là RAW NBCONVERT, chỉ dành cho các trường hợp sử dụng đặc biệt khi sử dụng công cụ dòng lệnh NBConvert. Công cụ này được sử dụng để chuyển đổi sổ ghi chép của bạn sang các định dạng khác, chẳng hạn như PDF. Các loại khác là tiêu đề, thực sự không phải là người được sử dụng nữa. Nếu bạn chọn loại ô này, bạn sẽ nhận được hộp thoại sau:

Hình 31-6: Loại tế bào tiêu đề

Bạn đã thấy cách sử dụng loại ô mặc định, mã. Vì vậy, phần tiếp theo sẽ tập trung vào Markdown.

Tạo nội dung Markdown Loại ô Markdown cho phép bạn định dạng văn bản của mình. Bạn có thể tạo các tiêu đề, thêm hình ảnh và liên kết và định dạng văn bản của bạn bằng chữ nghiêng, táo bạo, v.v ... Chương này đã giành được mọi thứ bạn có thể làm với Markdown, nhưng nó sẽ dạy cho bạn những điều cơ bản. Hãy cùng xem cách làm một vài điều khác nhau!

Định dạng văn bản của bạn

Nếu bạn muốn thêm in nghiêng vào văn bản của mình, bạn có thể sử dụng dấu gạch dưới hoặc dấu hoa thị đơn. Nếu bạn muốn in đậm văn bản của mình, thì bạn tăng gấp đôi số lượng dấu hoa thị hoặc nhấn mạnh. Dưới đây là một vài ví dụ: 1 bạn có thể in nghiêng như*cái này*hoặc _this_ 2 3 hoặc in đậm như ** cái này ** hoặc __this__

Hãy thử đặt ô Notebook của bạn thành Markdown và thêm văn bản ở trên vào nó. Sau đó, bạn sẽ thấy rằng máy tính xách tay được tự động định dạng văn bản cho bạn:

Hình 31-7: Định dạng văn bản với Markdown

Khi bạn chạy ô, nó sẽ định dạng văn bản độc đáo:

Hình 31-8: Tế bào đánh dấu khi chạy

Nếu bạn cần chỉnh sửa lại ô, bạn có thể nhấp đúp vào ô và nó sẽ quay lại chế độ chỉnh sửa. Bây giờ, hãy để tìm hiểu làm thế nào để thêm cấp độ tiêu đề!

Sử dụng các tiêu đề là tốt để tạo các phần trong sổ ghi chép của bạn, giống như khi bạn đang tạo một trang web hoặc một tài liệu trong Microsoft Word. Để tạo các tiêu đề trong Markdown, bạn có thể sử dụng một hoặc nhiều dấu hiệu #. Dưới đây là một số ví dụ: 1 2 3 4

#Heading 1 ## Heading 2 ### Heading 3 #### Đứng đầu 4

Nếu bạn thêm mã ở trên vào ô Markdown trong sổ ghi chép của bạn, nó sẽ trông như thế này:

Hình 31-9: Tiêu đề Markdown

Bạn có thể thấy rằng sổ ghi chép đã tạo ra một loại xem trước cho bạn ở đây bằng cách thu hẹp văn bản cho mỗi cấp độ tiêu đề. Khi bạn chạy di động, bạn sẽ thấy một cái gì đó như sau:

Hình 31-10: Tiêu đề đánh dấu khi chạy

Như bạn có thể thấy, Jupyter định dạng độc đáo văn bản của bạn dưới dạng các tiêu đề cấp độ khác nhau có thể hữu ích để cấu trúc văn bản của bạn.

Thêm một danh sách tạo ra một danh sách hoặc điểm đạn khá đơn giản trong Markdown. Để tạo danh sách, bạn thêm dấu hoa thị [*] hoặc dấu gạch ngang [-] vào đầu dòng. Dưới đây là một ví dụ: 1 * Danh sách mục 1 2 * Mục phụ 1 3 * Sub Item 2 4 * Liệt kê mục 2 5 * Danh sách mục 3

Hãy để thêm mã này vào sổ ghi chép của bạn:

Hình 31-11: Danh sách đánh dấu

Bạn không thực sự nhận được một bản xem trước các danh sách lần này, vì vậy, hãy để chạy di động để xem những gì bạn nhận được:

Hình 31-12: Danh sách đánh dấu khi chạy

Trông có vẻ khá tốt! Bây giờ, hãy để tìm hiểu làm thế nào để có được cú pháp làm nổi bật cho mã của bạn!

Làm nổi bật mã số Cú pháp đã cho phép bạn hiển thị và chạy mã và họ thậm chí còn hiển thị cú pháp làm nổi bật. Tuy nhiên, điều này chỉ hoạt động cho các hạt nhân hoặc ngôn ngữ được cài đặt trong Notebook Jupyter. Nếu bạn muốn hiển thị mã cho một ngôn ngữ khác chưa được cài đặt hoặc nếu bạn muốn hiển thị cú pháp làm nổi bật mà không cung cấp cho người dùng khả năng chạy mã, thì bạn có thể sử dụng Markdown cho điều đó. Để tạo một khối mã trong Markdown, bạn sẽ cần sử dụng 3 backticks theo sau là ngôn ngữ mà bạn muốn hiển thị. Nếu bạn muốn làm tô sáng mã nội tuyến, thì hãy bao quanh đoạn mã với các backticks đơn. Tuy nhiên, hãy nhớ rằng mã nội tuyến không hỗ trợ làm nổi bật cú pháp. Dưới đây là hai ví dụ trong sổ ghi chép:

Hình 31-13: Các ví dụ làm nổi bật cú pháp

Khi bạn chạy di động, máy tính xách tay sẽ chuyển đổi thành phần sau:

Hình 31-14: Các ví dụ làm nổi bật cú pháp chạy

Ở đây bạn có thể thấy cách mã bây giờ có cú pháp làm nổi bật. Bây giờ, hãy để học cách tạo ra một siêu liên kết!

Tạo một siêu liên kết tạo siêu liên kết trong Markdown là khá dễ dàng. Cú pháp như sau: 1 [Text] [URL]

Vì vậy, nếu bạn muốn liên kết với Google, bạn sẽ làm điều này: 1 [Google] [//www.google.com]

Đây là những gì mã trông như thế nào trong sổ ghi chép:

Hình 31-15: Cú pháp siêu liên kết

Khi bạn chạy di động, bạn sẽ thấy Markdown biến thành một siêu liên kết thông thường:

Hình 31-16: Cú pháp siêu liên kết khi chạy

Như bạn có thể thấy, Markdown đã được chuyển thành một siêu liên kết truyền thống. Hãy cùng tìm hiểu về các phần mở rộng Jupyter tiếp theo!

Thêm một máy tính xách tay Jupyter mở rộng có rất nhiều chức năng ngay lập tức. Nếu bạn cần bất cứ điều gì ngoài điều đó, bạn cũng có thể thêm các tính năng mới thông qua các tiện ích mở rộng từ một hệ sinh thái mở rộng lớn. Có bốn loại tiện ích mở rộng khác nhau có sẵn: Kernel Ipython Kernel Notebook Server Máy chủ sổ ghi chép hầu hết thời gian, bạn sẽ muốn cài đặt tiện ích mở rộng máy tính xách tay. Một tiện ích mở rộng cho Jupyter Notebook về mặt kỹ thuật là một mô-đun JavaScript sẽ được tải trong đầu máy tính xách tay để thêm chức năng mới hoặc làm cho máy tính xách tay trông khác biệt. Nếu bạn biết JavaScript, bạn có thể viết phần mở rộng của riêng bạn! Nếu bạn cần thêm một cái gì đó mới vào Jupyter Notebook, bạn nên sử dụng Google để xem ai đó đã viết một cái gì đó sẽ phù hợp với bạn. Phần mở rộng phổ biến nhất thực sự là một tập hợp lớn các phần mở rộng được gọi là jupyter_contrib_nbextensions mà bạn có thể nhận được ở đây: //github.com/ipython-contrib/jupyter_contrib_nbextensions hầu hết các phần mở rộng tốt nhất có thể được cài đặt bằng PIP. Ví dụ: để cài đặt một cái được đề cập ở trên, bạn có thể chạy lệnh này: 1 $ pip cài đặt jupyter_contrib_nbextensions

Có một số ít không tương thích với PIP. Trong những trường hợp đó, bạn có thể sử dụng Jupyter để cài đặt tiện ích mở rộng: 1 $ Jupyter nbextension Cài đặt tên_of_extension

Mặc dù điều này cài đặt tiện ích mở rộng cho Jupyter sử dụng, nhưng nó chưa làm cho phần mở rộng hoạt động. Bạn sẽ cần bật tiện ích mở rộng nếu bạn cài đặt nó

Sử dụng phương pháp này trước khi bạn có thể sử dụng nó. Để kích hoạt tiện ích mở rộng, bạn cần chạy lệnh sau: 1 $ Jupyter nbextension Bật name_of_extension

Nếu bạn đã cài đặt tiện ích mở rộng trong khi bạn đang chạy Notebook Jupyter, bạn có thể cần khởi động lại kernel hoặc toàn bộ máy chủ để có thể sử dụng tiện ích mở rộng mới. Bạn có thể muốn nhận tiện ích mở rộng cấu hình NbExtensions Jupyter để giúp bạn quản lý các tiện ích mở rộng của mình. Nó là một tiện ích mở rộng được thiết kế để cho phép và vô hiệu hóa các tiện ích mở rộng khác trong giao diện người dùng Notebook của bạn. Nó cũng hiển thị các tiện ích mở rộng mà bạn hiện đã cài đặt.

Xuất máy tính xách tay sang các định dạng khác sau khi bạn đã tạo một cuốn sổ tuyệt vời, bạn có thể muốn chia sẻ nó với những người khác không hiểu biết máy tính như bạn. Jupyter Notebook hỗ trợ chuyển đổi sổ ghi chép sang các định dạng khác: HTML latex pdf tiết lộ Markdown Resformed Resfriend có thể thực thi tập lệnh thực thi Bạn có thể chuyển đổi một cuốn sổ tay bằng công cụ NBConvert đã được cài đặt khi bạn cài đặt Jupyter Notebook ban đầu. Để sử dụng NBConvert, bạn có thể làm như sau: 1 $ Jupyter NBConvert -đến

Hãy nói rằng bạn muốn chuyển đổi sổ ghi chép của mình thành PDF. Để làm điều đó, bạn sẽ làm điều này: 1 $ Jupyter NBConvert my_noteBook.ipynb -TO PDF

Bạn sẽ thấy một số đầu ra khi nó chuyển đổi sổ ghi chép thành PDF. Công cụ NBConvert cũng sẽ hiển thị mọi cảnh báo hoặc lỗi mà nó gặp phải trong quá trình chuyển đổi. Nếu quá trình kết thúc thành công, bạn sẽ có tệp My_NoteBook.pdf trong cùng thư mục với tệp Notebook, máy tính xách tay Jupyter cũng cung cấp một cách đơn giản hơn để chuyển đổi sổ ghi chép của bạn. Bạn có thể làm như vậy từ menu tệp trong chính máy tính xách tay. Bạn có thể chọn tùy chọn tải xuống để thực hiện chuyển đổi. Tùy thuộc vào nền tảng mà bạn đang bật, bạn có thể cần cài đặt latex hoặc các phụ thuộc khác để có được các định dạng xuất nhất định hoạt động đúng.

Gói lại sổ ghi chép Jupyter là một cách thú vị để học cách sử dụng python hoặc học máy. Đó là một cách tuyệt vời để tổ chức dữ liệu của bạn để bạn có thể chia sẻ nó với người khác. Bạn có thể sử dụng nó để tạo các bài thuyết trình, hiển thị công việc của bạn và chạy mã của bạn. Trong chương này, bạn đã tìm hiểu về những điều sau: Cài đặt sổ ghi chép Jupyter Tạo một cuốn sổ tay thêm nội dung Thêm nội dung Markdown Thêm một máy tính xách tay xuất mở rộng vào các định dạng khác, bạn nên dùng thử Jupyter Notebook. Nó là một môi trường mã hóa hữu ích và cũng đáng để bạn dành thời gian.

Review Questions 1. What is Jupyter Notebook? 2. Name two Notebook cell types 3. What markup language do you use to format text in Jupyter Notebook? 4. How do you export a Notebook to another format?

Part III - Practical Python It’s always helpful to learn how to create real world applications. In this section of the book, you will learn how to use Python to create small applications or useful snippets that you can use in your own code. Here is what you will be learning about: Chapter 32 - How to Create a Command Line Application with argparse

Chapter 33 - How to Parse XML Chapter 34 - How to Parse JSON Chapter 35 - How to Scrape a Website Chapter 36 - How to Work with CSV files Chapter 37 - How to Work with a Database Using sqlite3 Chapter 38 - How to Create an Excel Document Chapter 39 - How to Generate a PDF Chapter 40 - How to Create Graphs Chapter 41 - How to Work with Images in Python Chapter 42 - How to Create a GUI Once you’re done reading this section of the book, you will be able to tackle many different problems. This section of the book will give you a taste of the many things you can do with Python. It’s time to get started!

Chapter 32 - How to Create a Command-line Application with argparse When you are creating an application, you will usually want to be able to tell your application how to do something. There are two popular methods for accomplishing this task. You can make your application accept command-line arguments or you can create a graphical user interface. Some applications support both. Command-line interfaces are helpful when you need to run your code on a server. Most servers do not have a monitor hooked up, especially if they are Linux servers. In those cases, you might not be able to run a graphical user interface even if you wanted to. Python comes with a built-in library called argparse that you can use to create a command-line interface. In this chapter, you will learn about the following: Parsing Arguments Creating Helpful Messages Adding Aliases Using Mutually Exclusive Arguments Creating a Simple Search Utility There is a lot more to the argparse module than what will be covered in this chapter. If you would like to know more about it, you can check out the documentation here: //docs.python.org/3/library/argparse.html Now it’s time to get started with parsing arguments from the command-line!

Parsing Arguments Before you learn how to use argparse, it’s good to know that there is another way to pass arguments to a Python script. You can pass any arguments to a Python script and access those arguments by using the sys module. To see how that works, create a file named sys_args.py and enter the following code into it: 1 2 3 4 5 6 7 8 9 10

# sys_args.py import sys def main[]: print['You passed the following arguments:'] print[sys.argv] if __name__ == '__main__': main[]

This code imports sys and prints out whatever is in sys.argv. The argv attribute contains a list of everything that was passed to the script with the first item being the script itself. Here’s an example of what happens when you run this code along with a couple of sample arguments: 1 $ python3 sys_args.py --s 45 2 You passed the following arguments: 3 ['sys_args.py', '--s', '45']

The problem with using sys.argv is that you have no control over the arguments that can be passed to your application: You can’t ignore arguments You can’t create default arguments You can’t really tell what is a valid argument at all This is why using argparse is the way to go when working with Python’s standard library. The argparse module is very powerful and useful. Let’s think about a common process that a command line application follows:

pass in a file do something to that file in your program output the result Here is a generic example of how that might work. Go ahead and create file_parser.py and add the following code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

# file_parser.py import argparse def file_parser[input_file, output_file='']: print[f'Processing {input_file}'] print['Finished processing'] if output_file: print[f'Creating {output_file}'] def main[]: parser = argparse.ArgumentParser['File parser'] parser.add_argument['--infile', help='Input file'] parser.add_argument['--out', help='Output file'] args = parser.parse_args[] if args.infile: file_parser[args.infile, args.out] if __name__ == '__main__': main[]

The file_parser[] function is where the logic for the parsing would go. For this example, it only takes in a file name and prints it back out. The output_file argument defaults to an empty string. The meat of the program is in main[] though. Here you create an instance of argparse.ArgumentParser[] and give your parser a name. Then you add two arguments, --infile and --out. To use the parser, you need to call parse_args[], which will return whatever valid arguments were passed to your program. Finally, you check to see if the user used the --infile flag. If they did, then you run file_parser[]. Here is how you might run the code in your terminal: 1 $ python file_parser.py --infile something.txt 2 Processing something.txt 3 Finished processing

Tại đây, bạn chạy tập lệnh của mình bằng cờ - -infile cùng với tên tệp. Điều này sẽ chạy main [] lần lượt gọi file_parser []. Bước tiếp theo là thử ứng dụng của bạn bằng cả hai đối số dòng lệnh mà bạn đã khai báo trong mã của mình: 1 2 3 4

$ python file_parser.py -infile something.txt -output.txt xử lý một cái gì đó.txt hoàn thành xử lý Tạo đầu ra.txt

Lần này, bạn nhận được một dòng đầu ra bổ sung đề cập đến tên tệp đầu ra. Điều này đại diện cho một nhánh trong logic mã của bạn. Khi bạn chỉ định một tệp đầu ra, bạn có thể yêu cầu mã của mình trong quá trình tạo tệp đó bằng một khối mã mới hoặc một hàm. Nếu bạn không chỉ định một tệp đầu ra, thì khối mã đó sẽ không chạy. Khi bạn tạo công cụ dòng lệnh của mình bằng ArgParse, bạn có thể dễ dàng thêm các tin nhắn giúp người dùng của bạn khi họ không chắc chắn cách tương tác chính xác với chương trình của bạn. Bây giờ, thời gian để tìm hiểu làm thế nào để nhận trợ giúp từ ứng dụng của bạn!

Tạo các thông báo hữu ích Thư viện Argparse sẽ tự động tạo một thông báo hữu ích cho ứng dụng của bạn bằng cách sử dụng thông tin bạn cung cấp khi bạn tạo từng đối số. Đây là mã của bạn một lần nữa: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 20

# file_parser.py nhập argparse def file_parser [input_file, output_file = '']: print [f'processing {input_file} '] print [' hoàn thành xử lý '] nếu output_file: in [f'Creating {output_file ]: Parser = argparse.argumentparser ['file phân tích cú pháp'] pal .parse_args [] nếu args.infile: file_parser [args.infile, args.out] nếu __name__ == '__main__': main []

Bây giờ hãy thử chạy mã này bằng cờ -H và bạn sẽ thấy những điều sau: 1 $ file_parser.py -h 2 Sử dụng: Trình phân tích cú pháp tệp [-h] [ 5 -h, - -Help Hiển thị thông báo trợ giúp này và thoát 6 -tệp đầu vào Infile 7 -ra tệp đầu ra

Tham số trợ giúp cho add_argument [] được sử dụng để tạo thông báo trợ giúp ở trên. Các tùy chọn -H và -Help được ARGPARSE thêm tự động. Bạn có thể làm cho sự giúp đỡ của bạn nhiều thông tin hơn bằng cách cho nó một mô tả và một epilog. Hãy để sử dụng chúng để cải thiện thông điệp trợ giúp của bạn. Bắt đầu bằng cách sao chép mã từ phía trên vào một tệp mới có tên File_Parser_With_Descrip.py, sau đó sửa đổi nó để trông như thế này:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

# file_parser_with_descrip.py nhập argparse def file_parser [input_file, output_file = '']: in [f'processing {input_file} '] ]] Để chuyển đổi '] Parser.add_argument ['-out ', help =' Tệp đầu ra được chuyển đổi '] args = palser.parse_args [] nếu args.infile: file_parser [arg.infile, args.out] nếu __name__ ==' __main__ ': chính[]

Ở đây bạn vượt qua trong phần mô tả và đối số Epilog cho ArgentSparser. Bạn cũng cập nhật các đối số trợ giúp lên add_argument [] để mô tả hơn. Khi bạn chạy tập lệnh này bằng -h hoặc - -Help Sau khi thực hiện các thay đổi này, bạn sẽ thấy đầu ra sau: 1 2 3 4 5 6 7 8 9 10 11

$ python file_parser_with_descrip.py -h sử dụng: trình phân tích cú pháp tệp [-h] [--infile infile] [ Tệp đầu vào Infile để chuyển đổi -ra khỏi tệp đầu ra được chuyển đổi Cảm ơn bạn đã chọn Pyparse!

Bây giờ bạn có thể thấy mô tả mới và epilog trong đầu ra trợ giúp của bạn. Điều này cung cấp cho ứng dụng dòng lệnh của bạn một số đánh bóng thêm. Bạn cũng có thể vô hiệu hóa trợ giúp hoàn toàn trong ứng dụng của mình thông qua đối số add_help cho armentsparser. Nếu bạn nghĩ rằng văn bản trợ giúp của bạn quá dài, bạn có thể vô hiệu hóa nó như thế này:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 25

# file_parser_no_help.py nhập argparse def file_parser [input_file, output_file = '']: in [f'processing {input_file} '] ]: Parser = argparse.argumentparser ['trình phân tích cú pháp tệp', descript = 'Tệp đầu vào để chuyển đổi'] Parser.add_argument ['-out', help = 'Tệp đầu ra được chuyển đổi'] args = pARSER.PARSE_ARGS [] nếu arg.infile: file_parser [args.infile, arg.out] nếu __name__ == '__main__': main []

By setting add_help to False, you are disabling the -h and --help flags. You can see this demonstrated below: 1 $ python file_parser_no_help.py --help 2 usage: File parser [--infile INFILE] [--out OUT] 3 File parser: error: unrecognized arguments: --help

In the next section, you’ll learn about adding aliases to your arguments!

Adding Aliases An alias is a fancy word for using an alternate flag that does the same thing. For example, you learned that you can use both -h and --help to access your program’s help message. -h is an alias for --help, and vice-versa Look for the changes in the parser.add_argument[] methods inside of main[]: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

# file_parser_aliases.py import argparse def file_parser[input_file, output_file='']: print[f'Processing {input_file}'] print['Finished processing'] if output_file: print[f'Creating {output_file}'] def main[]: parser = argparse.ArgumentParser[ 'File parser', description='PyParse - The File Processor', epilog='Thank you for choosing PyParse!', add_help=False, ] parser.add_argument['-i', '--infile', help='Input file for conversion'] parser.add_argument['-o', '--out', help='Converted output file'] args = parser.parse_args[] if args.infile: file_parser[args.infile, args.out] if __name__ == '__main__': main[]

Here you change the first add_argument[] to accept -i in addition to -infile and you also added -o to the second add_argument[]. This allows you to run your code using two new shortcut flags. Here’s an example: 1 2 3 4

$ python3 file_parser_aliases.py -i something.txt -o output.txt Processing something.txt Finished processing Creating output.txt

If you go looking through the argparse documentation, you will find that you can add aliases to subparsers too. A subparser is a way to create sub-

commands in your application so that it can do other things. A good example is Docker, a virtualization or container application. It has a series of commands that you can run under docker as well as docker compose and more. Each of these commands has separate sub-commands that you can use. Here is a typical docker command to run a container: 1 docker exec -it container_name bash

This will launch a container with docker. Whereas if you were to use docker compose, you would use a different set of commands. The exec and compose are examples of subparsers. The topic of subparsers are outside the scope of this chapter. If you are interested in more details dive right into the documentation: //docs.python.org/3/library/argparse.html#sub-commands

Using Mutually Exclusive Arguments Sometimes you need to have your application accept some arguments but not others. For example, you might want to limit your application so that it can only create or delete files, but not both at once. The argparse module provides the add_mutually_exclusive_group[] method that does just that! Change your two arguments to be mutually exclusive by adding them to a group object like in the example below: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

# file_parser_exclusive.py import argparse def file_parser[input_file, output_file='']: print[f'Processing {input_file}'] print['Finished processing'] if output_file: print[f'Creating {output_file}'] def main[]: parser = argparse.ArgumentParser[ 'File parser', description='PyParse - The File Processor', epilog='Thank you for choosing PyParse!', add_help=False, ] group = parser.add_mutually_exclusive_group[] group.add_argument['-i', '--infile', help='Input file for conversion'] group.add_argument['-o', '--out', help='Converted output file'] args = parser.parse_args[] if args.infile: file_parser[args.infile, args.out] if __name__ == '__main__': main[]

First, you created a mutually exclusive group. Then, you added the -i and o arguments to the group instead of to the parser object. Now these two arguments are mutually exclusive. Here is what happens when you try to run your code with both arguments: 1 $ python3 file_parser_exclusive.py -i something.txt -o output.txt 2 usage: File parser [-i INFILE | -o OUT] 3 File parser: error: argument -o/--out: not allowed with argument -i/--infile

Running your code with both arguments causes your parser to show the user an error message that explains what they did wrong. After covering all this information related to using argparse, you are ready to apply your new skills to create a simple search tool!

Creating a Simple Search Utility Before starting to create an application, it is always good to figure out what you are trying to accomplish. The application you want to build in this section should be able to search for files of a specific file type. To make it more interesting, you can add an additional argument that allows you to optionally search for specific file sizes as well. You can use Python’s glob module for searching for file types. You can read all about this module here: //docs.python.org/3/library/glob.html There is also the fnmatch module, which glob itself uses. You should use glob for now as it is easier to use, but if you’re interested in writing something more specialized, then fnmatch may be what you are looking for. However, since you want to be able to optionally filter the files returned by the file size, you can use pathlib which includes a glob-like interface. The glob module itself does not provide file size information. You can start by creating a file named pysearch.py and entering the following code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

# pysearch.py ​​Nhập argparse Nhập pathlib def search_folder [đường dẫn, mở rộng, file_size = none]: " ul

23 24 25 26 27

] print [f '{len [files]} *.

Bạn bắt đầu đoạn mã ở trên bằng cách nhập ArgParse và Pathlib. Tiếp theo, bạn tạo hàm search_folder [] có trong ba đối số: đường dẫn - thư mục để tìm kiếm trong phần mở rộng - phần mở rộng tệp để tìm File_Size - kích thước tệp nào để lọc trong byte

Bạn biến đường dẫn thành một đối tượng pathlib.Path và sau đó sử dụng phương thức rglob [] của nó để tìm kiếm trong thư mục cho phần mở rộng mà người dùng đã truyền vào. Nếu không tìm thấy tệp nào, bạn sẽ in ra một thông báo có ý nghĩa cho người dùng và thoát. Nếu bất kỳ tệp nào được tìm thấy, bạn sẽ kiểm tra xem liệu File_Size có được đặt hay không. Nếu nó được đặt, bạn sử dụng khả năng hiểu danh sách để lọc các tệp nhỏ hơn file_size được chỉ định. Tiếp theo, bạn in ra số lượng tệp được tìm thấy và cuối cùng lặp qua các tệp này để in tên của chúng. Để làm cho tất cả hoạt động chính xác, bạn cần tạo giao diện dòng lệnh. Bạn có thể làm điều đó bằng cách thêm hàm Main [] có chứa mã Argparse của bạn như thế này: 1 def main []: 2 phân tích cú pháp = argparse.argumentpud 5] 6 trình phân tích cú pháp.add_argument ['-p', '-path', 7 trợ giúp = 'Đường dẫn tìm kiếm cho các tệp', 8 yêu cầu = true, 9 Dest = 'path'] 10 phân tích cú pháp. ','-ext ', 11 trợ giúp =' phần mở rộng để tìm kiếm ', 12 yêu cầu = true, 13 Dest =' Exteness '] 14 phân tích cú pháp.add_argument ['-s ','-kích thước ', 15 trợ giúp = 'Kích thước tệp để lọc trong byte', 16 type = int, 17 Dest = 'kích thước', 18 mặc định = Không] 19

20 args = Parser.parse_args [] 21 search_folder [args.path, args.extension, args.size] 22 23 nếu __name__ == '__main__': 24 main []

ArmentsParser [] này có ba đối số được thêm vào nó tương ứng với các đối số mà bạn chuyển sang search_folder []. Bạn thực hiện các đối số -đường và -Extext cần thiết trong khi để lại đối số kích thước tùy chọn. Lưu ý rằng đối số kích thước được đặt thành type = int, có nghĩa là bạn không thể chuyển nó một chuỗi. Có một đối số mới cho hàm add_argument []. Đó là đối số Dest mà bạn sử dụng để nói với trình phân tích cú pháp đối số của bạn nơi để lưu các đối số được truyền cho họ. Dưới đây là một ví dụ chạy tập lệnh: 1 $ python3 pysearch.py ​​-p/user/michael/dropbox/python101code/chit 101code/ch CHƯ3 file_parser_with_descri ption \ 8 .py 9/users/michael/r

Điều đó đã làm việc khá tốt! Bây giờ hãy thử chạy nó với -s và một chuỗi: 1 $ python3 pysearch.py ​​-p/user/Michael/dropbox/python101code/chit Tiện ích mở rộng [-S Kích thước] 4 PySearch: Lỗi: Đối số -S/-Kích thước: Giá trị int không hợp lệ: 'Python'

Lần này, bạn đã nhận được một lỗi vì -s và -kích thước chỉ chấp nhận số nguyên. Đi thử mã này trên máy của riêng bạn và xem nó có hoạt động theo cách bạn muốn khi bạn sử dụng -s với số nguyên không.

Dưới đây là một số ý tưởng bạn có thể sử dụng để cải thiện phiên bản mã của mình: xử lý các tiện ích mở rộng tốt hơn. Ngay bây giờ nó sẽ chấp nhận *.Py sẽ không hoạt động theo cách bạn có thể mong đợi cập nhật mã để bạn có thể tìm kiếm nhiều tiện ích mở rộng cùng một lúc cập nhật mã để lọc trên một loạt các kích thước tệp [Xh 1 MB - 5MB] ở đó Có rất nhiều tính năng và cải tiến khác mà bạn có thể thêm vào mã này, chẳng hạn như thêm xử lý lỗi hoặc Unittests.

Kết thúc mô-đun Argparse đầy đủ và có thể được sử dụng để tạo các ứng dụng dòng lệnh tuyệt vời, linh hoạt. Trong chương này, bạn đã tìm hiểu về những điều sau đây: Các đối số phân tích cú pháp tạo các thông điệp hữu ích thêm các bí danh bằng cách sử dụng các đối số loại trừ lẫn nhau tạo ra một tiện ích tìm kiếm đơn giản, bạn có thể làm nhiều hơn với mô -đun Argparse so với những gì được đề cập trong chương này. Hãy chắc chắn kiểm tra tài liệu để biết chi tiết đầy đủ. Bây giờ hãy tiếp tục và cho nó thử một mình. Bạn sẽ thấy rằng một khi bạn hiểu được Argparse, bạn có thể tạo một số ứng dụng thực sự gọn gàng!

Xem lại câu hỏi 1. Mô-đun nào trong thư viện tiêu chuẩn Bạn có thể sử dụng để tạo ứng dụng dòng lệnh? 2. Làm thế nào để bạn thêm đối số vào armentParSer []? 3. Làm thế nào để bạn tạo tin nhắn hữu ích cho người dùng của bạn? 4. Bạn sử dụng phương pháp nào để tạo ra một nhóm lệnh loại trừ lẫn nhau?

Chương 33 - Cách phân tích XML Ngôn ngữ đánh dấu có thể mở rộng, thường được gọi là XML, là ngôn ngữ đánh dấu cả con người và người có thể đọc được. XML vẫn là một định dạng phổ biến để chia sẻ dữ liệu. Ngôn ngữ lập trình Python có thư viện XML tích hợp mà bạn có thể sử dụng để tạo, chỉnh sửa hoặc phân tích XML. Có nhiều mô-đun phụ trong thư viện XML. Dưới đây là danh sách các mô-đun phụ hiện tại từ tài liệu Python: xml.etree.elementtree:

API ElementTree, Bộ xử lý XML đơn giản và nhẹ XML.DOM: DOM API Định nghĩa XML.DOM.Minidom: Một triển khai DOM tối thiểu XML.DOM.Pulldom: Hỗ trợ xây dựng các cây DOM một phần XML.SAX: Các lớp cơ sở Sax2 và các chức năng thuận tiện xml.parsers.expat: Trình phân tích cú pháp người nước ngoài liên kết mô hình đối tượng tài liệu [DOM] là một cách mô tả hệ thống phân cấp của các nút tạo thành XML. Bạn có thể đọc về cách Python hoạt động với nó ở đây: //docs.python.org/3/l Library/xml.dom.html API đơn giản cho XML [SAX] là một cách khác để giao tiếp với XML từ Python. Trình phân tích cú pháp SAX sẽ cho phép bạn đi từng bước thông qua tài liệu XML và phát ra các sự kiện khi nó đi. Ngược lại, trình phân tích cú pháp Minidom sẽ đọc toàn bộ tệp XML vào bộ nhớ trước khi bạn có thể bắt đầu làm việc với nó. Trình phân tích cú pháp người nước ngoài là trình phân tích cú pháp XML không có giá trị và thường được sử dụng cùng với trình phân tích cú pháp SAX. Tuy nhiên, nếu bạn muốn có hiệu suất cao hơn, bạn có thể sử dụng Trình phân tích cú pháp người nước ngoài trực tiếp.

Chương này sẽ tập trung vào xml.etree.elementtree. Đây là trình phân tích cú pháp XML dễ dàng nhất để sử dụng và hiểu trong các mô-đun phụ. Bạn sẽ học cách thực hiện như sau: Phân tích XML với ElementTree tạo XML với EementTree Chỉnh sửa XML với phần tử điều khiển XML với LXML Hãy bắt đầu!

Phân tích XML với ElementTree, bạn có thể sẽ dành nhiều thời gian để phân tích XML hơn bạn sẽ tạo hoặc chỉnh sửa nó. Để bắt đầu, bạn sẽ cần một số XML để phân tích cú pháp. Dưới đây, một phần của XML đơn giản mà bạn nên lưu trong một tệp có tên Note.xml: 1 2

3 mike 4 nadine 5 nhắc nhở 6 Đừng quên sữa 7

8

9 Nicole 10 Nadine 11 Cuộc hẹn 12 Bác sĩ mắt 13

14

XML này đại diện cho một người ghi chú mà họ đã tự lưu cho mình. Họ có thể là lời nhắc nhở, hoặc ghi chú cho nghiên cứu về một số loại. Công việc của bạn là tìm ra cách phân tích XML này với Python bằng ElementTree. Để bắt đầu trích xuất thông tin có liên quan, hãy tạo một tệp có tên parse_xml.py và thêm mã sau: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 18

# parse_xml.py từ xml.etree.elementtree nhập ElementTree def parse_xml [xml_file]: tree = ElementTree [file = xml_file] root_element = tree.getroot [] ] cho trẻ em trong root_element: print [f '{child_element.tag =}, {Child_element.text =}'] nếu child_element.tag == 'Lưu ý': để ghi chú_element in km_element: in [f '{note_element.tag =} , {note_element.text =} '] nếu __name__ ==' __main__ ': parse_xml [' note.xml ']

Tại đây, bạn nhập ElementTree từ xml.etree.elementtree và sau đó tạo parse_xml [], đưa vào một đường dẫn tệp đến tệp XML. Để mở

Tệp, bạn sử dụng ElementTree [] trực tiếp. Điều này trả về một xml.etree.elementtree.elementtree đối tượng, mà bạn có thể trích xuất một phần tử gốc từ. XML được chuyển đổi thành cấu trúc giống như cây bởi ElementTree. Root là phần tử gốc trong XML, trong trường hợp này là note_taken. XML rất giống với HTLM. Nếu bạn đã biết HTML, thì bạn sẽ có thể PCK lên XML khá nhanh. Một thẻ trong XML được tạo bằng cú pháp sau: TAG_TEXT. Là sự khởi đầu của thẻ, trong khi TAG_TEXT là giá trị của thẻ. Để cho XML biết nơi kết thúc thẻ, bạn sử dụng một bản tóm tắt phía trước với tên của thẻ bên trong:. Vòng lặp cho ở trên sẽ lặp lại trên các phần tử XML nằm trong root_element. Đối với mỗi phần tử, bạn sẽ in ra thẻ và giá trị của thẻ. Nếu thẻ bằng với ghi chú, thì bạn sẽ lặp qua phần tử đó trẻ em đó để in ra tất cả các thẻ và giá trị trong phần tử đó. Nói cách khác, khi bạn phân tích XML, hầu hết các trình phân tích cú pháp mà bạn viết sẽ được gắn khá chặt chẽ với cấu trúc XML. Thay vì lặp trực tiếp qua root_element, bạn cũng có thể sử dụng root.getChildren [] để đưa trẻ em từ root_element. Hãy thử thử nếu bạn cảm thấy thích phiêu lưu. Khi bạn chạy mã này, bạn sẽ thấy đầu ra sau: 1 2 3 4 5 6 7 8 9 10 11

Thẻ của phần tử gốc là 'note_taker' Child_element.tag = 'note', child_element.text = '\ n' note_element.tag = 'to', note_element.text = 'mike' note_element.tag = 'từ' = 'Nadine' note_element.tag = 'Heading', note_element.text = 'Reminder' note_element.tag = 'body', note_element.text = "Đừng quên sữa" trẻ em = '\ n' note_element.tag = 'to', note_element.text = 'nicole' note_element.tag = 'từ' note_element.tag = 'body', note_element.text = 'bác sĩ mắt'

Nếu bạn có các tệp XML hoặc XML lớn phức tạp, thì bạn nên sử dụng xml.etree.celementtree thay vì xml.etree.elementtree. Lưu ý các C C ở phía trước của ElementTree. Phiên bản celementtree được viết trong c

Ngôn ngữ lập trình, làm cho nó trở thành một trình phân tích cú pháp XML nhanh hơn nhiều so với ElementTree thông thường. Cú pháp cũng giống nhau! Bạn có thể lặp lại trên chính đối tượng cây thay vì lặp lại trên gốc. Đây là một ví dụ: 1 2 3 4 5 6 7 8 9 10 11 12 13

# xml_tree_iterator.py từ xml.etree.celementtree nhập ElementTree def parse_xml [xml_file]: cây = ElementTree [file = xml_file] elem.tag =}, {elem.text =} '] nếu __name__ ==' __main__ ': parse_xml [' note.xml ']

Trong trường hợp này, bạn sử dụng phương thức iter [], cho phép bạn lặp lại tất cả các yếu tố trong XML. Lợi ích của việc lặp lại trên chính cây là bạn có thể buộc nó phải lọc dựa trên thẻ, mặc dù ở đây bạn không đặt ra đối số đó. Mã đầu ra này rất giống với đầu ra từ ví dụ trước của bạn: 1 2 3 4 5 6 7 8 9 10 11 12

Lặp lại bằng cách sử dụng một cây lặp elem.tag = 'note_taker', elem.text = '\ n' elem.tag = 'note', elem.text = '\ n' elem.tag = 'to', elem.text = ' Mike 'elem.tag =' từ ', elem.text =' nadine 'elem.tag =' Heading ', elem.text =' Reminder 'elem.tag =' body ', elem.text = "Đừng quên The sữa "elem.tag = 'note', elem.text = '\ n' elem.tag = 'to', elem.text = 'nicole' elem.tag = 'từ', elem.text = 'nadine' elem. Tag = 'Heading', elem.text = 'Et

Điều này có vẻ như một khởi đầu tốt. Bây giờ bạn đã biết cách trích xuất cả các thẻ cũng như giá trị của chúng từ bất kỳ yếu tố nào trong XML của bạn. Bây giờ, thời gian để học cách tạo XML bằng ElementTree!

Tạo XML với ElementTree Tạo XML bằng ElementTree là đơn giản, nhưng hơi tẻ nhạt. Lý do là bạn phải tạo thẻ và văn bản riêng biệt. Hãy để tạo ra XML của riêng bạn với Python. Bắt đầu bằng cách tạo một tệp mới có tên created_xml.py và thêm mã sau: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

# created_xml.py nhập xml.etree.elementtree as et def create_xml [xml_file]: root_element = et.element ['note_taker'] note_element = et.element ['note'] to_element = et.subelement [note_element, 'to'] to_element.text = 'mike' from_element = et.subelement [note_element, 'from'] from_element.text = 'nick' heading_element = et.subelement [note_element Heading_element.Text = 'Cuộc hẹn' Body_element = et.subelement [note_element, 'body'] body_element.text = 'blah blah' tree = et.elementtree [root_element] với open [xml_file, "wb"] .

Để tạo thẻ, bạn có thể sử dụng phần tử [] hoặc subelement []. Lớp phần tử [] là để tạo các phần tử cha. Ví dụ: bạn sẽ sử dụng nó để tạo phần tử gốc của mình và sau đó nối phần tử ghi chú vào nó. Sau đó, để thêm các phần mềm vào phần tử ghi chú, bạn có thể sử dụng hàm subelement [], có trong phần tử cha [] và chuỗi văn bản của phần tử phụ. Nếu một phần tử [] hoặc subelement [] có giá trị, bạn có thể đặt nó thông qua thuộc tính văn bản [xem các ví dụ ở trên]. Khi bạn hoàn thành việc tạo XML, bạn có thể biến nó thành cấu trúc cây XML bằng cách sử dụng ElementTree []. Sau đó, bạn có thể viết nó ra đĩa qua cây.write [] và chuyển nó cho trình xử lý tệp mở. Lưu ý rằng khi bạn viết tệp ra, XML sẽ nằm trên một dòng.

Mô-đun ElementTree không hỗ trợ xuất ra XML in khá đẹp. Để làm điều đó, bạn sẽ cần sử dụng một thư viện XML khác, chẳng hạn như mô-đun LXML của bên thứ ba. Sau khi học cách phân tích và tạo XML, giờ đây bạn sẽ học cách chỉnh sửa một phần XML có sẵn!

Chỉnh sửa XML với EementTree Chỉnh sửa XML với Python là tốt. Tất nhiên, bạn cần một số XML để chỉnh sửa trước. Bạn có thể sử dụng tệp note.xml gốc từ trước đó. Đây là một lần nữa để bạn thuận tiện: 1 2 3

4 mike 5 nadine 6 nhắc nhở 7 Đừng quên sữa 8

9

10 Nicole 11 Nadine 12 Cuộc hẹn 13 Bác sĩ mắt 14

15

Hãy cùng viết một số mã để chỉnh sửa thẻ từ từ từ XML này và thay đổi nó thành người khác trong tất cả các trường hợp của thẻ đó. Hãy tiếp tục và tạo một tệp Python có tên EDIT_XML.PY. Bây giờ nhập mã sau trong đó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17

# edit_xml.py nhập xml.etree.celementtree as et def edit_xml [xml_file, output_file, from_person]: cây = et.elementtree [file = xml_file] root = tree.getroot [] không 'output.xml', 'guido']]

Tại đây, bạn tạo hàm edit_xml [] có trong XML_FILE đầu vào, tên OUTPUT_FILE và những gì cần thay đổi từ_person thành. Tiếp theo, bạn mở tệp và biến nó thành một đối tượng cây. Sau đó, bạn trích xuất gốc

của XML. Sau đó, bạn sử dụng hàm iter [] của cây để lặp lại trên mọi thẻ được đặt tên là từ từ. Đối với mỗi yếu tố đó, bạn thay đổi giá trị văn bản của nó thành từ_person. Cuối cùng, bạn viết XML vào đĩa bằng cách sử dụng tên tệp, Output_File. Nội dung của tệp XML bây giờ sẽ trông như thế này: 1 2

3 Mike 4 Guido 5 Nhắc nhở 6 Đừng quên sữa 7

8

9 Nicole 10 Guido 11 Cuộc hẹn 12 Bác sĩ mắt 13

14

Bây giờ bạn đã biết những điều cơ bản của việc chỉnh sửa tệp XML với mô -đun ElementTree của Python. Hãy cùng xem xét bằng cách sử dụng gói XML thay thế từ bên ngoài thư viện tiêu chuẩn tiếp theo!

Thao tác XML với LXML Có các thư viện phân tích cú pháp XML khác cho Python. Một trong những gói phổ biến nhất là LXML, đó là một python liên kết với hai thư viện C: libxml2 và libxslt. Nó có một triển khai ElementTree có tên ETREE có API gần như giống hệt như phiên bản Python. Gói LXML cũng có mô hình phụ đối tượng hóa cho phép bạn biến XML thành đối tượng Python. Điều này có thể rất thuận tiện khi làm việc với XML. Bạn có thể cài đặt LXML bằng PIP: 1 $ Python -M

PIP Cài đặt LXML

Bây giờ bạn đã cài đặt LXML, bạn có thể bắt đầu sử dụng nó. Để xem một chút sức mạnh của gói này, bạn có thể tạo một tệp có tên parse_xml_with_lxml.py và nhập mã sau: 1 # parse_xml_with_lxml.py 2 3 từ lxml nhập ETREE, objectify 4 5 def parse_xml [xml_file] . 14 15 # In ra tất cả các thẻ và giá trị văn bản của phần tử ghi chú 16 để ghi chú trong root.getChildren []: 17 cho note_element in note.getChildren []: 18 in [f '{note_element.tag =}, {note_element.text = } '] 19 in [] 20 21 # sửa đổi giá trị văn bản 22 in [f'original: {root.note.to =}'] .note.to =} '] 25 26 # Thêm phần tử mới 27 root.note.new_element = "Tôi mới!" 28 29 # Dọn dẹp XML trước khi ghi vào đĩa 30 Objectify.DeanNotate [Root] 31 etree.cleanup_namespaces [root]

32 obj_xml = etree.toString [root, đẹp_print = true] 33 34 # Lưu XML 35 của bạn với Open ["lxml_output.xml", "wb"] __main__ ': 39 parse_xml [' note.xml ']

Mã này dài một chút, vì vậy hãy đi qua từng mảnh, bắt đầu bằng cách nhìn vào đầu hàm parse_xml [] Năm

Bước đầu tiên là nhập ETREE và phản đối từ LXML. Sau đó, bạn tạo hàm parse_xml []. Tiếp theo, bạn sẽ mở XML_FILE và đọc nội dung của nó. Sau đó, bạn chuyển đổi XML thành một đối tượng Python bằng cách sử dụng objectify.fromString [xml]. Bây giờ bạn có thể truy cập các phần tử trực tiếp giống như bạn với bất kỳ đối tượng Python nào khác: 1 # Nhận phần tử 2 đến = root.note.to 3 in [f'the {to =} ']

Trong ví dụ trên, bạn trích xuất các đối tượng đầu tiên của Ghi chú trên mạng. Bây giờ chúng ta hãy xem cách lặp lại các yếu tố Tiếp theo: 1 # in ra tất cả các thẻ và giá trị văn bản của phần tử ghi chú 2 để ghi chú trong root.getChildren []: 3 cho note_element in note.getChildren []: 4 in [f '{{ note_element.tag =}, {note_element.text =} '] 5 print []

Khi bạn sử dụng LXML, phương pháp lặp chính là bằng cách sử dụng phương thức getChildren []. Mã này sẽ lặp lại các yếu tố ghi chú và

Sau đó, các yếu tố phụ của trẻ em của yếu tố ghi chú. Đoạn trích tiếp theo sẽ chỉ cho bạn cách thay đổi phần tử XML bằng LXML: 1 2 3 4

# Sửa đổi một giá trị văn bản in [f'original: {root.note.to =} '] root.note.to =' guido 'print [f'modified: {root.note.to =}']

Because objectify turns the XML into an object, you can assign a new value to a tag directly, as you do in the above example. This simplifies accessing and modifying the tags considerably. If you would like to add a new element to the XML, you can do so like this: 1 # add a new element 2 root.note.new_element = "I'm new!"

This will add a new tag to the first note XML element named new_element and set its text value to “I’m new!”. Finally, last few lines of code demonstrate how to write the new XML to disk: 1 2 3 4 5 6 7 8

# cleanup the XML before writing to disk objectify.deannotate[root] etree.cleanup_namespaces[root] obj_xml = etree.tostring[root, pretty_print=True] # save your xml with open["lxml_output.xml", "wb"] as f: f.write[obj_xml]

The deannotate[] and cleanup_namespaces[] functions will remove some extra lines of output from the XML that lxml adds. To make the XML output look nice and not all on one line, you will use etree.tostring[root, pretty_print=True], which indents the XML elements in a nice manner. Finally you write the XML to disk by using the file object’s write[] method. In the previous example, you used the tree object’s write[] method, but here you used objectify to create a Python object, which means you have to write the XML to disk differently.

When you run this code, you will see the following output to stdout: 1 2 3 4 5 6 7 8 9 10 11 12 13

The to='Mike' note_element.tag='to', note_element.text='Mike' note_element.tag='from', note_element.text='Nadine' note_element.tag='heading', note_element.text='Reminder' note_element.tag='body', note_element.text="Don't forget the milk" note_element.tag='to', note_element.text='Nicole' note_element.tag='from', note_element.text='Nadine' note_element.tag='heading', note_element.text='Appointment' note_element.tag='body', note_element.text='Eye doctor' Original: root.note.to='Mike' Modified: root.note.to='Guido'

The XML that your code generates will look like this: 1 2

3 Guido 4 Nadine 5 Reminder 6 Don't forget the milk 7 I'm new! 8

9

10 Nicole 11 Nadine 12 Appointment 13 Eye doctor 14

15

The lxml library is quite nice overall and well worth your time to learn. It’s also very fast and efficient to use.

Wrapping Up Python comes with several different XML parsers in its standard library. One of the easiest to use is the ElementTree API. In this chapter, you learned how to do the following: Parsing XML with ElementTree Creating XML with ElementTree Editing XML with ElementTree Manipulating XML with lxml In addition to the built-in XML parsers, there are many different 3rd party Python packages for working with XML. One of the most popular is the lxml package. Regardless of which XML parsing library you end up using, Python can be used effectively for all your XML needs.

Review Questions 1. What XML modules are available in Python’s standard library? 2. How do you access an XML tag using ElementTree? 3. How do you get the root element using the ElementTree API?

Chapter 34 - How to Parse JSON JavaScript Object Notation, more commonly known as JSON, is a lightweight data interchange format inspired by JavaScript object literal syntax. JSON is easy for humans to read and write. It is also easy for computers to parse and generate. JSON is used for storing and exchanging data in much the same way that XML is used. Python has a built-in library called json that you can use for creating, editing and parsing JSON. You can read all about this library here: //docs.python.org/3/library/json.html It would probably be helpful to know what JSON looks like. Here is an example of JSON from //json.org: 1 {"menu": { 2 "id": "file", 3 "value": "File", 4 "popup": { 5 "menuitem": [ 6 {"value": "New", " title": "CreateNewDoc[]"}, 7 {"value": "Open", " title": "OpenDoc[]"}, 8 {"value": "Close", " title": "CloseDoc[]"} 9 ] 10 } 11 }}

From Python’s point of view, this JSON is a nested Python dictionary. You will find that JSON is always translated into some kind of native Python data type. In this chapter, you will learn about the following: Encoding a JSON String Decoding a JSON String Saving JSON to Disk Loading JSON from Disk Validating JSON with json.tool

JSON is a very popular format that is often used in web applications. You will find that knowing how to interact with JSON using Python is useful in your own work. Let’s get started!

Encoding a JSON String Python’s json module uses dumps[] to serialize an object to a string. The “s” in dumps[] stands for “string”. It’s easier to see how this works by using the json module in some code: 1 >>> import json 2 >>> j = {"menu": { 3 ... "id": "file", 4 ... "value": "File", 5 ... "popup": { 6 ... "menuitem": [ 7 ... {"value": "New", " title": "CreateNewDoc[]"}, 8 ... {"value": "Open", " title": "OpenDoc[]"}, 9 ... {"value": "Close", " title": "CloseDoc[]"} 10 ... ] 11 ... } 12 ... }} 13 >>> json.dumps[j] 14 '{"menu": {"id": "file", "value": "File", "popup": {"menuitem": [{"value": "New", ' 15 '" title": "CreateNewDoc[]"}, {"value": "Open", " title": "OpenDoc[]"}, ' 16 '{"value": "Close", " title": "CloseDoc[]"}]}}}'

Ở đây bạn sử dụng json.dumps [], biến từ điển Python thành chuỗi JSON. Đầu ra ví dụ đã được sửa đổi để bọc chuỗi để in. Nếu không, chuỗi sẽ nằm trên một dòng. Bây giờ bạn đã sẵn sàng để học cách viết một đối tượng vào đĩa!

Lưu JSON vào mô-đun JSON Python Python sử dụng hàm Dump [] để tuần tự hóa hoặc mã hóa một đối tượng dưới dạng luồng được định dạng JSON thành một đối tượng giống như tệp. Các đối tượng giống như tệp trong Python là những thứ như trình xử lý tệp hoặc các đối tượng mà bạn tạo bằng mô-đun IO Python. Đi trước và tạo một tệp có tên created_json_file.py và thêm mã sau vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

# created_json_file.py Nhập JSON def create_json_file [đường dẫn, obj]: với Open [đường dẫn, 'w'] như fh: json.dump [obj, fh] nếu __name__ == '__main__': j = {" "id": "file", "value": "file", "popup": {"menuitem": [{"value": "new", " title": "createdEnewDoc []"}, {"value" : "Mở", " title": "opendoc []"}, {"value": "đóng", " title": "rortoC []"}]}}} created_json_file ['test.json', j]

Trong ví dụ này, bạn sử dụng json.dump [], để ghi vào một tệp hoặc đối tượng filelike. Nó sẽ viết cho người điều khiển tập tin, FH. Bây giờ bạn có thể tìm hiểu về việc giải mã chuỗi JSON!

Việc giải mã một chuỗi JSON Giải mã hoặc giải mã chuỗi JSON được thực hiện thông qua phương thức Loads []. Tải [] là hàm đồng hành với Dumps []. Đây là một ví dụ về việc sử dụng nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

>>> Nhập JSON >>> j_Str = "" "{" menu ": {..." id ":" file ", ..." value ":" file ", ..." popup ": {. .. "menuitem": [... {"value": "new", " title": "createdEnewDoc []"}, ... {"value": "open", " title": "opendoc [] "}, ... ác .Loads [j_str] >>> gõ [j_obj]

Ở đây bạn tạo lại mã JSON từ trước đó dưới dạng chuỗi đa dòng Python. Sau đó, bạn tải chuỗi JSON bằng json.loads [], chuyển đổi nó thành đối tượng Python. Trong trường hợp này, nó chuyển đổi JSON thành từ điển Python. Bây giờ bạn đã sẵn sàng để tìm hiểu cách tải JSON từ một tập tin!

Đang tải JSON từ đĩa tải JSON từ một tệp được thực hiện bằng json.load []. Đây là một ví dụ: 1 2 3 4 5 6 7 8 9 10 11 12

# load_json_file.py Nhập json def_json_file [đường dẫn]: với open [đường dẫn] dưới dạng fh: j_obj = json.load [fh] in [type [j_obj]] nếu __name__ == '__main__': load_json_file ['ví dụ.json' ]

Trong mã này, bạn mở tệp được thông qua như bạn đã thấy trước đây. Sau đó, bạn chuyển trình điều khiển tệp, fh, sang json.load [], sẽ biến JSON thành một đối tượng Python. Bạn cũng có thể sử dụng mô -đun Python từ JSON để xác thực JSON. Bạn sẽ tìm hiểu làm thế nào để làm điều đó tiếp theo.

Xác thực JSON với mô -đun JSON.Tool Python, JSON cung cấp một công cụ bạn có thể chạy trên dòng lệnh để kiểm tra và xem JSON có cú pháp chính xác không. Dưới đây là một vài ví dụ: 1 2 3 4 5 6

$ echo '{1.2: 3.4}' | python -m json.tool Tên thuộc tính mong đợi được đặt trong các trích dẫn kép: dòng 1 cột 2 [char 1] $ echo '{"1.2": 3.4}' | python -m json.tool {"1.2": 3.4}

Cuộc gọi đầu tiên truyền chuỗi, '{1.2: 3.4}' cho json.tool, cho bạn biết rằng có điều gì đó không ổn với mã JSON. Ví dụ thứ hai cho bạn biết cách khắc phục sự cố. Khi chuỗi cố định được chuyển đến json.tool, nó sẽ xuất bản khá đẹp, JSON đã rút lại thay vì phát ra lỗi.

Kết thúc định dạng JSON được sử dụng rất thường xuyên khi làm việc với các API web và khung web. Ngôn ngữ Python cung cấp một công cụ tốt để bạn sử dụng để chuyển đổi JSON sang các đối tượng Python và quay lại thư viện JSON. Trong chương này, bạn đã tìm hiểu về những điều sau đây: mã hóa chuỗi JSON giải mã chuỗi JSON lưu JSON để tải JSON từ đĩa xác thực JSON với JSON. Bây giờ bạn có một công cụ hữu ích khác mà bạn có thể sử dụng Python. Với một chút luyện tập, bạn sẽ làm việc với JSON ngay lập tức!

Xem lại câu hỏi 1. JSON là gì? 2. Làm thế nào để bạn giải mã một chuỗi JSON trong Python? 3. Làm thế nào để bạn lưu JSON vào đĩa với Python?

Chương 35 - Làm thế nào để cạo một trang web Internet là chủ nhà của phần lớn thông tin thế giới, cả quá khứ và hiện tại. Bạn có thể tìm thấy lịch sử, tin tức, truyện tranh và nhiều hơn nữa trên internet. Là một nhà phát triển phần mềm, bạn có thể muốn có quyền truy cập vào các dữ liệu tồn tại trên internet. Một số trang web cung cấp giao diện lập trình ứng dụng miễn phí hoặc trả phí [API] mà bạn có thể sử dụng để truy cập dữ liệu của họ. Tuy nhiên, hầu hết các trang web không cung cấp API, vì vậy bạn phải dùng đến việc cạo chúng để có quyền truy cập chương trình vào thông tin họ cung cấp. Việc lấy một trang web đề cập đến việc tìm nạp nội dung HTML của một trang từ Internet, phân tích nội dung HTML và trích xuất các bit và các mảnh mà bạn quan tâm. Trong chương này, bạn sẽ tìm hiểu về những điều sau: Các quy tắc để loại bỏ web Chuẩn bị để cạo một trang web cạo một trang web tải xuống một tệp Có một số gói quét web cho Python. Phổ biến nhất là súp và phế liệu đẹp. Chương này sẽ tập trung vào súp đẹp. Bắt đầu nào!

Các quy tắc cho web Scraping hầu hết các trang web đều có các quy tắc liên quan đến nội dung của chúng. Đôi khi, nó chỉ là thông tin bản quyền mà bạn sẽ cần phải tuân thủ, nhưng đây là một số mẹo cần ghi nhớ: luôn luôn kiểm tra các điều khoản và điều kiện trên một trang web trước khi bạn cạo từ chúng. Vi phạm các điều khoản có thể khiến bạn gặp rắc rối pháp lý! Các trang web thương mại thường có giới hạn về tần suất bạn có thể cạo và những gì bạn có thể cạo ứng dụng của bạn có thể truy cập một trang web nhanh hơn nhiều so với người có thể, vì vậy don don truy cập một trang web quá thường xuyên trong một khoảng thời gian ngắn. Điều này có thể khiến một trang web chậm lại hoặc thất bại và có thể là các trang web bất hợp pháp thay đổi liên tục, vì vậy bạn có thể mong đợi cào của mình bị hỏng một ngày nào đó khi lấy dữ liệu, bạn cần nhận ra rằng bạn sẽ nhận được nhiều dữ liệu mà bạn không quan tâm Về. Hãy chuẩn bị để thực hiện nhiều dữ liệu để trích xuất thông tin có liên quan đến bạn. Bây giờ, hãy để được thiết lập để bạn có thể bắt đầu cạo!

Chuẩn bị để cạo một trang web súp đẹp là gói cào web phổ biến nhất. Nó không được bao gồm với Python, vì vậy bạn sẽ cần cài đặt nó với PIP: 1 PIP Cài đặt BeautifulSoup4

Súp đẹp cần một cái gì đó để phân tích, điều đó có nghĩa là bạn cần có cách tải xuống một trang web. Bạn có thể làm điều đó bằng cách sử dụng bất kỳ điều nào sau đây: Urllib - đi kèm với các yêu cầu Python - Gói Python của bên thứ 3 nổi tiếng

Hai cái sau dễ sử dụng hơn so với thư viện riêng của Python, nhưng điều đó cũng có nghĩa là bạn phải trải qua một bước bổ sung để cài đặt một hoặc nhiều gói mới. Đối với các mục đích của chương này, bạn sẽ sử dụng urllib. Tuy nhiên, nếu bạn cần sử dụng xác thực với một trang web trước khi bạn có thể tải xuống, thì bạn nên xem xét một trong những gói khác vì chúng sẽ làm cho điều đó dễ dàng hơn nhiều. Có một mẹo quan trọng cần ghi nhớ khi nói đến việc cạo một trang web: trình duyệt web của bạn có thể giúp bạn. Hầu hết các trình duyệt web đi kèm với các công cụ phát triển được tích hợp sẵn mà bạn có thể sử dụng để kiểm tra các trang web. Tuy nhiên, con đường mở ra các công cụ đó hơi khác nhau trên các trình duyệt. Hãy cùng xem cách hoạt động của nó bằng cách mở blog của tôi trong Google Chrome: //www.blog.pythonl Library.org Sau đó nhấp chuột phải vào bất cứ nơi nào trên trang web và chọn tùy chọn kiểm tra:

Hình 35-1: Kiểm tra với Google Chrome

Ngoài ra, bạn cũng có thể mở các công cụ nhà phát triển thông qua chế độ xem menu → Nhà phát triển → Công cụ nhà phát triển. Sau khi chọn kiểm tra một mục trên trang web, Google Chrome sẽ mở một thanh bên ở bên phải trình duyệt của bạn sẽ trông giống như thế này:

Hình 35-2: Kiểm tra thanh bên với Google Chrome

Bây giờ bạn có thể chọn các phần tử trong thanh bên và trình duyệt của bạn sẽ làm nổi bật các phần có liên quan của trang web của bạn ở bên trái. Mozilla Firefox có một giao diện rất giống nhau ngoại trừ thay vì thanh bên, nó xuất hiện dọc theo dưới cùng của trình duyệt của bạn. Hãy thử cả hai công cụ này và làm quen với các chức năng của chúng. Bạn sẽ thấy rằng các công cụ nhà phát triển rất giống nhau, bất kể bạn đang làm việc với trình duyệt hiện đại nào. Khi bạn đã đạt được một số hiểu biết về cách các công cụ phát triển trình duyệt của bạn hoạt động và những gì họ cung cấp, bạn sẽ có thể sử dụng chúng để cạo một trang web hiệu quả hơn nhiều. Sau khi hiểu những công cụ bạn có thể sử dụng để kiểm tra và tìm hiểu về cấu trúc trang web của bạn, bạn đã sẵn sàng để bắt đầu cạo nó.

Quét một trang web Hãy để giả vờ rằng bạn đã được giao nhiệm vụ nhận được tất cả các tiêu đề và liên kết hiện tại đến blog của tôi. Đây là một nhiệm vụ phổ biến khi bạn đang xây dựng một trang web tổng hợp dữ liệu từ các trang web khác. Bước đầu tiên trong quy trình là tìm ra cách tải xuống trang chính HT HTML. Dưới đây là một số ví dụ Mã: 1 Nhập urllib.Request 2 3 url = '//www.blog.pythonl Library.org' 4 với urllib.request.urropen [url] là phản hồi: 5 html = respons.read []

Đoạn mã ngắn này sẽ đưa ra yêu cầu cho máy chủ của tôi, lấy trang web HT HTML và lưu trữ nó trong biến, HTML. Đây là một kịch bản nhỏ đẹp, nhưng không thể tái sử dụng lắm. Bạn có thể lấy đoạn mã này và biến nó thành một hàm. Mở một tệp mới có tên Scraper.py và thêm các mục sau: 1 2 3 4 5 6 7 8 9 10 11 12

# Scraper.py Nhập urllib.Request def download_html [url]: với urllib.request.urlopen [url] như phản hồi: html = retew.read [] return html if __name__ == '__main__': url = ' // www.blog.pythonl Library.org 'html = download_html [url]

Khi bạn chạy mã này, nó sẽ trả về HTML của trang chính của blog của tôi. Nếu bạn nhận được SSL: Certicate_verify_failed trên MacOS, thì bạn sẽ cần phải đến nơi bạn đã cài đặt Python và chạy Chứng chỉ Cài đặt.Command để khắc phục sự cố đó. Bạn có thể đọc thêm về việc giải quyết vấn đề này tại liên kết sau: //stackoverflow.com/q/42098126 Nếu bạn sử dụng các kỹ thuật từ phần trước để kiểm tra tiêu đề của một bài viết từ blog của tôi, bạn sẽ thấy rằng chúng chứa trong các thẻ H2 H2. Với

that in mind, you can update the scraper.py program to import BeautifulSoup and search for all the “h2” tags: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

# scraper.py import urllib.request from bs4 import BeautifulSoup def download_html[url]: with urllib.request.urlopen[url] as response: html = response.read[] return html def scraper[url]: html = download_html[url] soup = BeautifulSoup[html, 'html.parser'] title_links = soup.findAll['h2'] articles = {} for link in title_links: if link.a: articles[link.a['href']] = link.text.strip[] for article in articles: print[f'{articles[article]} - {article}'] if __name__ == '__main__': url = '//www.blog.pythonlibrary.org' scraper[url]

In this code, you add a new import for BeautifulSoup and a new function: scraper[]. You use scraper[] to call download_html[] and then parse the HTML with BeautifulSoup[]. Next, you use findAll[] to search for all the “h2” tags. This returns a ResultSet object, which you can iterate over. If an item in the result set has the attribute “a”, this means that the “h2” title element contains a HTML link element, which looks similar to this: Link Name. Open up your browser’s developer tools and verify that you can see these link elements nested in some of the titles. If your code discovers an “a” element in your title, this also means that this HTML element has an HTML attribute called href. This is the HTML attribute on a link element that contains the URL value that you are interested in. You can use that information to grab the hyperlink itself and make it into a key for your articles dictionary. Then set the value to the title of the

article. Finally, you loop over the articles and print out the title and corresponding link. Give it a try and see what the output is. If you would like a challenge, try to figure out how to scrape all the links on the page instead of only the hyperlinks that are nested in “h2” headings. Now let’s move on and learn how to download a file from the Internet!

Downloading a File In the previous section you learned how to download the HTML of a web page. However, web pages host much more than HTML. They can also contain other types of content. For example, they can contain images, PDFs, Excel documents, and much more. If your browser can download a file, then there is some way for Python to do so too! As you know, the Python programming language comes with a module named urllib. You can use urllib for downloading files. If you need to login to a website before downloading a file, it may be worth looking at a 3rd party module such as requests or httpx because they make working with credentials much easier. The urllib library works for these too, but it takes significantly more code. Let’s find out how you can use the urllib module to download a binary file: 1 import urllib.request 2 3 def download_file[url]: 4 urllib.request.urlretrieve[url, "code.zip"] 5 6 if __name__ == '__main__': 7 url = '//www.blog.pythonlibrary.org/wpcontent/uploads/2012/06/wxDbViewer.z\ 8 ip' 9 download_file[url]

In this example, you use urllib.request.urlretrieve[] to download the specified URL. This function takes as input the URL to download, as well as the path to save the content. You use code.zip as the name of the output file here. There is yet another way to download a file using urllib.request.urlopen[]. Here’s an example: 1 import urllib.request 2 3 def alternate_download[url]: 4 with urllib.request.urlopen[url] as response: 5 data = response.read[] 6 with open["code2.zip", "wb"] as code: 7 code.write[data]

8 9 if __name__ == '__main__': 10 url = '//www.blog.pythonlibrary.org/wpcontent/uploads/2012/06/wxDbViewer.z\ 11 ip' 12 alternate_download[url]

When you open a URL using urllib.request.urlopen[], it returns a filelike object that you can use to read[] the file. Then you can create a file on your computer using Python’s open[] function and write that file out. Since this is a binary file, you will need to open the file for writing in binary mode [i.e. wb]. You can use this method of downloading a file when you want to let the user know the progress of the download. If you are feeling adventurous, you should try using Beautiful Soup to parse a web page for images or some other binary file type and try downloading one or more of those. Just be careful that you don’t overwhelm the target website.

Wrapping Up Web scraping is a bit of an art. You will need to learn how to navigate a website programmatically to succeed. You will also need to realize up-front that your code will not work forever as websites change often. As with any skill, it comes down to putting in the time and training your web scraping skills in order to get good at it. In this chapter, you learned about the following: Rules for Web Scraping Preparing to Scrape a Website Scraping a Website Downloading a File When you venture deeper into web scraping, you will encounter websites that make scraping more difficult than others. Most websites today contain JavaScript code that dynamically generates the website content through code execution in your browser. This means that straight-up HTTP requests with Python, as you were using above, won’t be enough to get the content that you are interested in. In these scenarios you will need to use other tools than the ones mentioned here. For example, you might find Selenium useful for automating interactions on a website, and phantomJS for scraping a site that gets dynamically generated with JavaScript. Selenium itself can be used for web scraping too. This chapter only scratches the surface of what you can do with web scraping and Python. Go out and start practicing some scraping on your own!

Đánh giá câu hỏi 1. Một số gói cào web Python phổ biến là gì? 2. Làm thế nào để bạn kiểm tra một trang web với trình duyệt của bạn? 3. Bạn sử dụng mô -đun Python nào từ thư viện tiêu chuẩn để tải xuống một tệp?

Chương 36 - Cách làm việc với các tệp CSV Có nhiều loại tệp phổ biến mà bạn sẽ cần phải làm việc với tư cách là nhà phát triển phần mềm. Một định dạng như vậy là tệp CSV. CSV là viết tắt của các giá trị được phân tách bằng dấu phẩy và là định dạng tệp văn bản sử dụng dấu phẩy như một dấu phân cách để tách các giá trị với nhau. Mỗi hàng là bản ghi riêng của nó và mỗi giá trị là trường riêng của nó. Hầu hết các tệp CSV đều có các bản ghi có cùng độ dài. Thật không may, CSV không phải là một định dạng tệp được tiêu chuẩn hóa, giúp sử dụng chúng trực tiếp hơn, đặc biệt là khi dữ liệu của một trường riêng lẻ chứa dấu phẩy hoặc ngắt dòng. Một số tổ chức sử dụng dấu ngoặc kép như một nỗ lực để giải quyết vấn đề này, nhưng sau đó vấn đề được chuyển sang những gì xảy ra khi bạn cần dấu ngoặc kép trong lĩnh vực đó? Một vài lợi ích của các tệp CSV là chúng có thể đọc được con người và hầu hết phần mềm bảng tính có thể sử dụng chúng. Ví dụ, Microsoft Excel và Libre Office sẽ vui vẻ mở các tệp CSV cho bạn và định dạng chúng thành các hàng và cột. Python đã làm cho việc tạo và đọc các tệp CSV dễ dàng hơn nhiều thông qua thư viện CSV của nó. Nó hoạt động với hầu hết các tệp CSV ra khỏi hộp và cho phép một số tùy chỉnh của độc giả và nhà văn của nó. Trình đọc là những gì mô -đun CSV sử dụng để phân tích tệp CSV, trong khi người viết được sử dụng để tạo/cập nhật các tệp CSV. Trong chương này, bạn sẽ tìm hiểu về những điều sau: Đọc tệp CSV đọc tệp CSV với DicTreader viết tệp CSV viết tệp CSV với Dictwriter Nếu bạn cần thêm thông tin về mô -đun CSV, hãy chắc chắn kiểm tra tài liệu tại đây:

//docs.python.org/3/l Library/csv.html Hãy bắt đầu học cách làm việc với các tệp CSV!

Đọc tệp CSV Đọc các tệp CSV với Python khá đơn giản khi bạn biết cách làm như vậy. Phần đầu tiên của câu đố là có một tệp CSV mà bạn muốn đọc. Đối với mục đích của phần này, bạn có thể tạo một cuốn sách có tên.CSV và sao chép văn bản sau vào nó: 1 2 3 4

Book_Title, Tác giả, Nhà xuất bản, Pub_Date, ISBN Python 101, Mike Driscoll, Mike Driscoll, 2020,123456789 Wxpython công thức , 9781788399081

Hàng dữ liệu đầu tiên được gọi là bản ghi tiêu đề. Nó giải thích những gì mỗi trường dữ liệu đại diện. Hãy để viết một số mã để đọc tệp CSV này vào Python để bạn có thể làm việc với nội dung của nó. Đi trước và tạo một tệp có tên csv_reader.py và nhập mã sau vào nó: 1 2 3 4 5 6 7 8 9 10 11 12

# csv_reader.py nhập CSV def Process_csv [đường dẫn]: Với Open [đường dẫn] dưới dạng csvfile: reader = csv.reader [csvfile] cho hàng trong reader: in [hàng] nếu __name__ == '__main__': quy trình_csv [' CSV ']

Tại đây, bạn nhập CSV và tạo một hàm gọi là process_csv [], chấp nhận đường dẫn đến tệp CSV làm đối số duy nhất của nó. Sau đó, bạn mở tệp đó và chuyển nó cho csv.Reader [] để tạo đối tượng đầu đọc. Sau đó, bạn có thể lặp lại từng dòng đối tượng này và in nó ra. Đây là đầu ra bạn sẽ nhận được khi bạn chạy mã: 1 ['book_title', 'tác giả', 'nhà xuất bản', 'pub_date', 'isbn'] 2 ['Python 101', 'Mike Driscoll', 'Mike Driscoll ',' 2020 ',' 123456789 '] 3 [' Công thức nấu ăn Wxpython ',' Mike Driscoll ',' Apress ',' 2018 ',' 978-1-4842-3237-8 '] 4 [' Phỏng vấn Python ',' Mike Driscoll ',' Packt Publishing ',' 2018 ',' 9781788399081 ']]]

Hầu hết thời gian, có lẽ bạn đã thắng được cần phải xử lý hàng tiêu đề. Bạn có thể bỏ qua hàng đó bằng cách cập nhật mã của bạn như thế này:

1 2 3 4 5 6 7 8 9 10 11 12 13 14

# csv_reader_no_header.py nhập CSV def process_csv [đường dẫn]: với open [đường dẫn] dưới dạng csvfile: reader = csv.reader [csvfile] # bỏ qua tiêu đề tiếp theo [trình đọc, không có] = '__main__': process_csv ['books.csv']

Chức năng Python sườn tiếp theo [] sẽ có một điều đáng tin cậy, chẳng hạn như Reader và trả lại mục tiếp theo từ Itable. Điều này sẽ, trong thực tế, bỏ qua hàng đầu tiên. Nếu bạn chạy mã này, bạn sẽ thấy rằng đầu ra hiện đang thiếu hàng tiêu đề: 1 ['Python 101', 'Mike Driscoll', 'Mike Driscoll', '2020', '123456789'] 2 ['Wxpython công thức ' ]

Hàm csv.Reader [] có một số đối số tùy chọn khác khá hữu ích. Ví dụ: bạn có thể có một tệp sử dụng dấu phân cách khác với dấu phẩy. Bạn có thể sử dụng đối số Delimiter để nói với mô -đun CSV để phân tích tệp dựa trên thông tin đó. Dưới đây là một ví dụ về cách bạn có thể phân tích một tệp sử dụng dấu hai chấm làm dấu phân cách của nó: 1 Reader = csv.Reader [csvfile, delimiter = ':']

You should try creating a few variations of the original data file and then read them in using the delimiter argument. Let’s learn about another way to read CSV files!

Reading a CSV File with DictReader The csv module provides a second “reader” object you can use called the DictReader class. The nice thing about the DictReader is that when you iterate over it, each row is returned as a Python dictionary. Go ahead and create a new file named csv_dict_reader.py and enter the following code: 1 2 3 4 5 6 7 8 9 10 11 12

# csv_dict_reader.py import csv def process_csv_dict_reader[file_obj]: reader = csv.DictReader[file_obj] for line in reader: print[f'{line["book_title"]} by {line["author"]}'] if __name__ == '__main__': with open['books.csv'] as csvfile: process_csv_dict_reader[csvfile]

In this code you create a process_csv_dict_reader[] function that takes in a file object rather than a file path. Then you convert the file object into a Python dictionary using DictReader[]. Next, you loop over the reader object and print out a couple fields from each record using Python’s dictionary access syntax. You can see the output from running this code below: 1 Python 101 by Mike Driscoll 2 wxPython Recipes by Mike Driscoll 3 Python Interviews by Mike Driscoll

makes accessing fields within records much more intuitive than the regular csv.reader object. Try using it on one of your own CSV files to gain additional practice. csv.DictReader[]

Now, you will learn how to write a CSV file using Python’s csv module!

Writing a CSV File Python’s csv module wouldn’t be complete without some way to create a CSV file. In fact, Python has two ways. Let’s start by looking at the first method below. Go ahead and create a new file named csv_writer.py and enter the following code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

# csv_writer.py import csv def csv_writer[path, data]: with open[path, 'w'] as csvfile: writer = csv.writer[csvfile, delimiter=','] for row in data: writer.writerow[row] if __name__ == '__main__': data = '''book_title,author,publisher,pub_date,isbn Python 101,Mike Driscoll, Mike Driscoll,2020,123456789 wxPython Recipes,Mike Driscoll,Apress,2018,978-1-4842-3237-8 Python Interviews,Mike Driscoll,Packt Publishing,2018,9781788399081''' records = [] for line in data.splitlines[]: records.append[line.strip[].split[',']] csv_writer['output.csv', records]

In this code, you create a csv_writer[] function that takes two arguments: The path to the CSV file that you want to create The data that you want to write to the file To write data to a file, you need to create a writer[] object. You can set the delimiter to something other than commas if you want to, but to keep things consistent, this example explicitly sets it to a comma. When you are ready to write data to the writer[], you will use writerow[], which takes in a list of strings. The code that is outside of the csv_writer[] function takes a multiline string and transforms it into a list of lists for you. If you would like to write all the rows in the list at once, you can use the writerows[] function. Here is an example for that:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

# csv_writer_rows.py import csv def csv_writer[path, data]: with open[path, 'w'] as csvfile: writer = csv.writer[csvfile, delimiter=','] writer.writerows[data] if __name__ == '__main__': data = '''book_title,author,publisher,pub_date,isbn Python 101,Mike Driscoll, Mike Driscoll,2020,123456789 wxPython Recipes,Mike Driscoll,Apress,2018,978-1-4842-3237-8 Python Interviews,Mike Driscoll,Packt Publishing,2018,9781788399081''' records = [] for line in data.splitlines[]: records.append[line.strip[].split[',']] csv_writer['output2.csv', records]

Instead of looping over the data row by row, you can write the entire list of lists to the file all at once. This was the first method of creating a CSV file. Now let’s learn about the second method: the DictWriter!

Writing a CSV File with DictWriter The DictWriter is the complement class of the DictReader. It works in a similar manner as well. To learn how to use it, create a file named csv_dict_writer.py and enter the following: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

# csv_dict_writer.py import csv def csv_dict_writer[path, headers, data]: with open[path, 'w'] as csvfile: writer = csv.DictWriter[ csvfile, delimiter=',', fieldnames=headers, ] writer.writeheader[] for record in data: writer.writerow[record] if __name__ == '__main__': data = '''book_title,author,publisher,pub_date,isbn Python 101,Mike Driscoll, Mike Driscoll,2020,123456789 wxPython Recipes,Mike Driscoll,Apress,2018,978-1-4842-3237-8 Python Interviews,Mike Driscoll,Packt Publishing,2018,9781788399081''' records = [] for line in data.splitlines[]: records.append[line.strip[].split[',']] headers = records.pop[0] list_of_dicts = [] for row in records: my_dict = dict[zip[headers, row]] list_of_dicts.append[my_dict] csv_dict_writer['output_dict.csv', headers, list_of_dicts]

Trong ví dụ này, bạn chuyển ba đối số cho csv_dict_writer []: đường dẫn đến tệp mà bạn đang tạo hàng tiêu đề [một danh sách các chuỗi] đối số dữ liệu như một danh sách python từ điển khi bạn khởi động [], bạn đưa ra Nó là một đối tượng tệp, đặt dấu phân cách và sử dụng tham số tiêu đề, cho nó biết các tên trường là gì. Tiếp theo, bạn gọi writeHeader [] để viết tiêu đề đó vào tệp. Cuối cùng, bạn lặp qua dữ liệu như bạn đã làm trước đây và sử dụng writerow [] để ghi từng bản ghi vào tệp. Tuy nhiên, bản ghi bây giờ là một từ điển thay vì một danh sách.

Mã bên ngoài hàm csv_dict_writer [] được sử dụng để tạo các phần bạn cần để cung cấp cho hàm. Một lần nữa, bạn tạo một danh sách các danh sách, nhưng lần này bạn trích xuất hàng đầu tiên và lưu nó trong các tiêu đề. Sau đó, bạn lặp lại phần còn lại của các bản ghi và biến chúng thành một danh sách các từ điển.

Kết thúc mô -đun CSV Python là tuyệt vời! Bạn có thể đọc và viết các tệp CSV với rất ít dòng mã. Trong chương này, bạn đã học cách thực hiện điều đó trong các phần sau: Đọc tệp CSV đọc tệp CSV với DicTreader viết tệp CSV viết tệp CSV với Dictwriter Có những cách khác để làm việc với các tệp CSV trong Python. Một phương pháp phổ biến là sử dụng gói Pandas. Pandas chủ yếu được sử dụng để phân tích dữ liệu và khoa học dữ liệu, vì vậy sử dụng nó để làm việc với CSV có vẻ như sử dụng búa tạ trên đinh. Mô -đun CSV Python sườn hoàn toàn có khả năng. Nhưng bạn có thể kiểm tra gấu trúc và xem nó có thể hoạt động như thế nào cho trường hợp sử dụng này. Bạn có thể đọc thêm về dự án đó tại đây: //pandas.pydata.org/ Nếu bạn không làm việc với tư cách là một nhà khoa học dữ liệu, có lẽ bạn đã thắng được sử dụng gấu trúc. Trong trường hợp đó, mô -đun CSV của Python, hoạt động tốt. Hãy tiếp tục và thực hiện thêm một số thực hành với mô -đun CSV Python, để xem làm việc với nó tốt như thế nào!

Xem lại câu hỏi 1. Làm thế nào để bạn đọc tệp CSV với thư viện tiêu chuẩn Python? 2. Nếu tệp CSV của bạn không sử dụng dấu phẩy làm dấu phân cách, làm thế nào để bạn sử dụng mô -đun CSV để đọc nó? 3. Làm thế nào để bạn viết một hàng dữ liệu CSV bằng mô -đun CSV?

Chương 37 - Cách làm việc với cơ sở dữ liệu sử dụng các nhà phát triển phần mềm SQLite3 phải làm việc với dữ liệu. Thường xuyên hơn không, dữ liệu mà bạn làm việc sẽ cần phải có sẵn cho nhiều nhà phát triển cũng như nhiều người dùng cùng một lúc. Giải pháp điển hình cho loại tình huống này là sử dụng cơ sở dữ liệu. Cơ sở dữ liệu giữ dữ liệu theo định dạng bảng, có nghĩa là chúng đã dán nhãn các cột và hàng dữ liệu. Hầu hết các phần mềm cơ sở dữ liệu đều yêu cầu bạn cài đặt phần mềm phức tạp trên máy cục bộ hoặc trên máy chủ mà bạn có quyền truy cập. Phần mềm cơ sở dữ liệu phổ biến bao gồm Microsoft SQL Server, PostgreSQL và MySQL, trong số những người khác. Đối với các mục đích của chương này, bạn sẽ tập trung vào một mục tiêu rất đơn giản được gọi là SQLite. Lý do bạn sẽ sử dụng SQLite là đó là một hệ thống cơ sở dữ liệu dựa trên tệp được bao gồm trong Python. Bạn đã thắng cần phải thực hiện bất kỳ cấu hình hoặc cài đặt bổ sung. Điều này cho phép bạn tập trung vào các yếu tố cần thiết của cơ sở dữ liệu là gì và cách thức hoạt động của nó, đồng thời tránh nguy cơ bị lạc trong việc cài đặt và thiết lập chi tiết. Trong chương này, bạn sẽ tìm hiểu về những điều sau: Tạo cơ sở dữ liệu SQLite Thêm dữ liệu vào cơ sở dữ liệu của bạn Tìm kiếm dữ liệu chỉnh sửa cơ sở dữ liệu của bạn trong cơ sở dữ liệu của bạn xóa dữ liệu khỏi cơ sở dữ liệu của bạn, hãy bắt đầu tìm hiểu về cách sử dụng Python với cơ sở dữ liệu ngay bây giờ!

Tạo cơ sở dữ liệu SQLite Có các gói đầu nối SQL của bên thứ 3 để giúp bạn kết nối mã Python của mình với tất cả các cơ sở dữ liệu chính. Thư viện tiêu chuẩn Python đã đi kèm với thư viện SQLite3 tích hợp, đó là những gì bạn sẽ sử dụng. Điều này có nghĩa là bạn đã giành chiến thắng phải cài đặt bất cứ điều gì thêm để làm việc trong chương này. Bạn có thể đọc tài liệu cho thư viện SQLite3 tại đây: //docs.python.org/3/l Library/sqlite3.html để bắt đầu làm việc với cơ sở dữ liệu, bạn cần kết nối với một bản một. Đối với các mục đích của chương này, bạn sẽ tạo một cơ sở dữ liệu. Tuy nhiên, bạn sẽ tìm hiểu đủ trong chương này để tải và tương tác với cơ sở dữ liệu có sẵn nếu bạn muốn. SQLite hỗ trợ các loại dữ liệu sau: Null Integer Real Text Blob

Đây là những loại dữ liệu mà bạn có thể lưu trữ trong loại cơ sở dữ liệu này. Nếu bạn muốn đọc thêm về cách các loại dữ liệu Python dịch sang các loại dữ liệu sqlite và ngược lại, hãy xem liên kết sau: //docs.python.org/3/l Library/sqlite3.html#sqlite-and-python- Các loại bây giờ là lúc để bạn tạo cơ sở dữ liệu! Dưới đây là cách bạn sẽ tạo cơ sở dữ liệu SQLite với Python: 1 Nhập SQLite3 2 3 SQLite3.Connect ["Thư viện.DB"]

Đầu tiên, bạn nhập sqlite3 và sau đó bạn sử dụng hàm Connect [], đưa đường dẫn đến tệp cơ sở dữ liệu làm đối số. Nếu tệp không tồn tại, mô -đun SQLite3 sẽ tạo cơ sở dữ liệu trống. Khi tệp cơ sở dữ liệu đã được

Được tạo, bạn cần thêm một bảng để có thể làm việc với nó. Lệnh SQL cơ bản bạn sử dụng để thực hiện điều này như sau: 1 Tạo bảng bảng_name 2 [Cột_one văn bản, Cột_TWO Text, Cột_Three Text]

Các từ khóa trong SQL không nhạy cảm trường hợp-vì vậy hãy tạo == created == created. Tuy nhiên, các định danh có thể nhạy cảm trường hợp-nó phụ thuộc vào động cơ SQL đang được sử dụng và có thể những cài đặt cấu hình nào đang được sử dụng bởi cơ sở dữ liệu đó. Nếu sử dụng cơ sở dữ liệu có sẵn, hãy kiểm tra tài liệu của nó hoặc chỉ sử dụng cùng một trường hợp như sử dụng cho tên bảng và trường. Bạn sẽ tuân theo quy ước của các từ khóa trong trường hợp trên và các số nhận dạng trong trường hợp hỗn hợp hoặc thấp hơn.

Lệnh tạo bảng sẽ tạo một bảng bằng tên được chỉ định. Bạn làm theo lệnh đó với tên của mỗi cột cũng như loại cột. Các cột cũng có thể được coi là các trường và loại cột dưới dạng các loại trường. Đoạn mã SQL ở trên tạo ra một bảng ba cột trong đó tất cả các cột chứa văn bản. Nếu bạn gọi lệnh này và bảng đã tồn tại trong cơ sở dữ liệu, bạn sẽ nhận được lỗi. Bạn có thể tạo nhiều bảng như cơ sở dữ liệu cho phép. Số lượng hàng và cột có thể có giới hạn từ phần mềm cơ sở dữ liệu, nhưng hầu hết thời gian bạn đã giành chiến thắng trong giới hạn này. Nếu bạn kết hợp thông tin bạn đã học trong hai ví dụ cuối cùng, bạn có thể tạo cơ sở dữ liệu để lưu trữ thông tin về sách. Tạo một tệp mới có tên created_database.py và nhập mã sau: 1 2 3 4 5 6 7 8 9 10 11 12 13

# created_database.py Nhập SQLite3 Conn = SQLite3.connect ["Thư viện.DB"] con trỏ = Conn.Cursor [] # Tạo bảng con trỏ.Execute ["" " Văn bản, book_type văn bản] "" "]

Để làm việc với cơ sở dữ liệu sqlite, bạn cần kết nối [] với nó và sau đó tạo một đối tượng con trỏ [] từ kết nối đó. Con trỏ là những gì bạn sử dụng để gửi các lệnh SQL đến cơ sở dữ liệu của bạn thông qua hàm EXECUTE [] của nó. Dòng mã cuối cùng ở trên sẽ sử dụng cú pháp SQL mà bạn đã thấy trước đó để tạo bảng sách với năm trường: Tiêu đề - Tiêu đề của cuốn sách là tác giả văn bản - tác giả của cuốn sách là Text REURFT_DATE - ngày cuốn sách được phát hành dưới dạng Nhà xuất bản văn bản - Nhà xuất bản của cuốn sách dưới dạng văn bản book_type - loại sách [in, epub, pdf, v.v.]

Bây giờ bạn có một cơ sở dữ liệu mà bạn có thể sử dụng, nhưng nó không có dữ liệu. Bạn sẽ khám phá cách thêm dữ liệu vào bảng của bạn trong phần tiếp theo!

Việc thêm dữ liệu vào cơ sở dữ liệu của bạn Việc thêm dữ liệu vào cơ sở dữ liệu được thực hiện bằng cách sử dụng các lệnh chèn vào các lệnh SQL. Bạn sử dụng lệnh này kết hợp với tên của bảng mà bạn muốn chèn dữ liệu vào. Quá trình này sẽ trở nên rõ ràng hơn bằng cách xem xét một số mã, vì vậy hãy tiếp tục và tạo một tệp có tên add_data.py. Sau đó thêm mã này vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

# add_data.py nhập sqlite3 Conn = sqlite3.connect ["thư viện.db"] con trỏ = Conn.cursor [] # Chèn một bản ghi vào bảng sách trong cơ sở dữ liệu thư viện con trỏ. Python 101 ',' Mike Driscoll ',' 9/01/2020 ',' Chuột vs Python ',' epub '] "" " Phương thức Sách = [['Phỏng vấn Python', 'Mike Driscoll', '2/1/2018', 'Packt Publishing', 'SoftCover'], ['Tự động hóa những thứ nhàm chán với Python', 'Al Sweigart', '' . ?,?,?,?,?] ", sách] Conn.Commit []

Sáu dòng đầu tiên cho thấy cách kết nối với cơ sở dữ liệu và tạo con trỏ như trước. Sau đó, bạn sử dụng Execute [] để gọi chèn vào và chuyển nó một loạt năm giá trị. Để lưu bản ghi đó vào bảng cơ sở dữ liệu, bạn cần gọi cam kết []. Một vài dòng mã cuối cùng cho thấy cách thực hiện nhiều bản ghi vào cơ sở dữ liệu ngay lập tức bằng ExecuteMany []. Bạn vượt qua Executemany [] một câu lệnh SQL và danh sách các mục sẽ sử dụng với câu lệnh SQL đó. Trong khi có những cách khác để chèn dữ liệu, sử dụng các trò chơi? Cú pháp như bạn đã làm trong ví dụ trên là cách ưa thích để chuyển các giá trị cho con trỏ vì nó ngăn chặn các cuộc tấn công tiêm SQL. Nếu bạn muốn tìm hiểu thêm về tiêm SQL, Wikipedia là một nơi tốt để bắt đầu: //en.wikipedia.org/wiki/sql_injection

Bây giờ bạn có dữ liệu trong bảng của mình, nhưng bạn không có cách nào để xem dữ liệu đó. Bạn sẽ tìm hiểu làm thế nào để làm điều đó tiếp theo!

Tìm kiếm dữ liệu cơ sở dữ liệu của bạn từ cơ sở dữ liệu được thực hiện chủ yếu với các từ khóa chọn, từ và nơi. Bạn sẽ thấy rằng các lệnh này không quá khó sử dụng. Bạn nên tạo một tệp mới có tên Queries.py và nhập mã sau vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 27

Nhập sqlite3 def get_cursor []: Conn = sqlite3.connect ["thư viện.db"] return Conn.cursor [] def select_all_records_by_author [con trỏ, tác giả]: sql = "Chọn * từ sách trong đó tác giả =?" con trỏ.execute [sql, [tác giả]] in [con trỏ.fetchall []] # hoặc sử dụng fetchone [] in ["\ nere là một danh sách các hàng trong bảng \ n"] cho hàng trong con trỏ.execute [" Chọn ROWID, * Từ Sách đơn đặt hàng của tác giả "]: In [hàng] def select_using_like [con trỏ, văn bản]: in [" \ n like kết quả truy vấn: \ n "] sql = f" "" chọn * Từ những cuốn sách trong đó tiêu đề như ' {text}%'"" "con trỏ.execute [sql] in [con trỏ.fetchall []] nếu __name__ ==' __main__ ': con trỏ = get_cursor [] select_all_records_by_author [con trỏ, tác giả Text = 'Python']

Mã này hơi dài, vì vậy chúng tôi sẽ đi qua từng chức năng riêng lẻ. Đây là bit đầu tiên của mã: 1 Nhập SQLite3 2 3 Def get_cursor []: 4 Conn = sqlite3.connect ["thư viện.db"] 5 return Conn.cursor []

Hàm get_cursor [] là một hàm hữu ích để kết nối với cơ sở dữ liệu và trả về đối tượng con trỏ. Bạn có thể làm cho nó chung chung hơn bằng cách chuyển nó tên của cơ sở dữ liệu bạn muốn mở. Chức năng tiếp theo sẽ chỉ cho bạn cách lấy tất cả các bản ghi cho một tác giả cụ thể trong bảng cơ sở dữ liệu:

1 def select_all_records_by_author [con trỏ, tác giả]: 2 sql = "Chọn * từ sách trong đó tác giả =?" 3 con trỏ.execute [sql, [tác giả]] 4 in [con trỏ.fetchall []] # hoặc sử dụng fetchone [] 5 in ["\ nere là một danh sách các hàng trong bảng \ n"] 6 .Execute ["Chọn ROWID, * Từ Sách đặt hàng của tác giả"]: 7 in [hàng]

Để nhận tất cả các bản ghi từ cơ sở dữ liệu, bạn sẽ sử dụng lệnh SQL sau: Chọn * từ sách. Chọn, theo mặc định, trả về các trường được yêu cầu từ mỗi bản ghi trong bảng cơ sở dữ liệu. Dấu hoa thị là một nhân vật ký tự đại diện có nghĩa là tôi muốn tất cả các trường. Vì vậy, chọn và * kết hợp sẽ trả về tất cả các dữ liệu hiện tại trong một bảng. Bạn thường không muốn làm điều đó! Các bảng có thể trở nên khá lớn và cố gắng kéo mọi thứ từ nó cùng một lúc có thể ảnh hưởng xấu đến cơ sở dữ liệu của bạn, hoặc hiệu suất của máy tính. Thay vào đó, bạn có thể sử dụng mệnh đề WHERE để lọc chọn một cái gì đó cụ thể hơn và/hoặc chỉ chọn các trường bạn quan tâm. Trong ví dụ này, bạn lọc chọn một tác giả cụ thể. Bạn vẫn đang chọn tất cả các bản ghi, nhưng không có khả năng một tác giả nào đã đóng góp quá nhiều hàng để ảnh hưởng tiêu cực đến hiệu suất. Sau đó, bạn nói với con trỏ Fetchall [], sẽ tìm nạp tất cả các kết quả từ cuộc gọi chọn bạn đã thực hiện. Bạn có thể sử dụng fetchone [] để chỉ tìm nạp kết quả đầu tiên từ lựa chọn. Hai dòng mã cuối cùng lấy tất cả các mục trong bảng sách cùng với các Rowids của chúng và đặt hàng kết quả theo tên tác giả. Đầu ra từ chức năng này trông như thế này: 1 Đây là danh sách các hàng trong Bảng 2 3 [3, 'Tự động hóa những thứ nhàm chán với Python', 'Al Sweigart', '' 4 PDF '] 5 [4,' Nhà phát triển Python có căn cứ ',' Doug Farrell ',' 2020 ',' Manning ',' Kindle \ 6 '] 7 [1,' Python 101 ',' Mike Driscoll ', '9/01/2020', 'Chuột vs Python', 'Epub'] 8 [2, 'Cuộc phỏng vấn Python', 'Mike Driscoll', '2/1/2018', 'Packt Publishing', 'Softcover \ 9' ]

Bạn có thể thấy rằng khi bạn sắp xếp theo tác giả, nó sắp xếp bằng toàn bộ chuỗi thay vì tên cuối cùng. Nếu bạn đang tìm kiếm một thử thách, bạn có thể cố gắng tìm ra cách bạn có thể lưu trữ dữ liệu để có thể sắp xếp theo họ. Ngoài ra, bạn có thể viết các truy vấn SQL phức tạp hơn hoặc xử lý kết quả trong Python để sắp xếp nó theo cách đẹp hơn.

Hàm cuối cùng nhìn vào là select_using_like []: 1 def select_using_like [con trỏ, văn bản]: 2 in ["\ n like kết quả truy vấn: \ n"] 3 sql = f "" " {text}%'"" "6 con trỏ.execute [sql] 7 in [con trỏ.fetchall []]

Hàm này trình bày cách sử dụng lệnh SQL như, đây là loại tìm kiếm thẻ đại diện được lọc. Trong ví dụ này, bạn bảo nó tìm kiếm một chuỗi cụ thể với dấu phần trăm theo nó. Dấu phần trăm là một ký tự đại diện, vì vậy nó sẽ tìm kiếm bất kỳ bản ghi nào có tiêu đề bắt đầu bằng chuỗi được truyền. Khi bạn chạy chức năng này với văn bản được đặt thành Hồi Python, bạn sẽ thấy đầu ra sau: 1 như kết quả truy vấn: 2 3 [['Python 101', 'Mike Driscoll', '9/01/2020', ' Vs Python ',' epub '], 4 [' Python phỏng vấn ',' Mike Driscoll ',' 2/1/2018 ',' Packt Publishing ',' SoftCover ']]]

Một vài dòng mã cuối cùng ở đây để chứng minh những chức năng làm gì: 1 nếu __name__ == '__main__': 2 con trỏ = get_cursor [] 3 select_all_records_by_author 'Python']

Ở đây bạn lấy đối tượng con trỏ và chuyển nó vào các chức năng khác. Hãy nhớ rằng, bạn sử dụng con trỏ để gửi các lệnh đến cơ sở dữ liệu của bạn. Trong ví dụ này, bạn đặt tác giả cho select_all_records_by_author [] và văn bản cho select_using_like []. Các chức năng này là một cách tốt để làm cho mã của bạn có thể tái sử dụng. Bây giờ bạn đã sẵn sàng để tìm hiểu cách cập nhật dữ liệu trong cơ sở dữ liệu của mình!

Chỉnh sửa dữ liệu trong cơ sở dữ liệu của bạn khi chỉnh sửa dữ liệu trong cơ sở dữ liệu, bạn hầu như sẽ luôn sử dụng các lệnh SQL sau: Cập nhật - được sử dụng để cập nhật một bộ bảng cơ sở dữ liệu cụ thể - được sử dụng để cập nhật một trường cụ thể trong bảng cơ sở dữ liệu

CẬP NHẬT,

Giống như chọn, hoạt động trên tất cả các bản ghi trong một bảng theo mặc định. Hãy nhớ sử dụng nơi để giới hạn phạm vi của lệnh!

Để xem cách thức hoạt động của nó, hãy tạo một tệp có tên update_record.py và thêm mã này: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

# update_record.py Nhập sqlite3 def update_Author [old_name, new_name]: Conn = sqlite3.connect ["thư viện.db"] con trỏ = Conn.Cursor [] sql = f "" " tác giả = '{old_name}' "" "con trỏ.execute [sql] Conn.Commit [] nếu __name__ == '__main__': update_author [old_name = 'Mike Driscoll', new_name = 'Michael Driscoll',]

Trong ví dụ này, bạn tạo update_Author [] lấy tên tác giả cũ để tìm kiếm và tên tác giả mới để thay đổi nó thành. Sau đó, bạn kết nối với cơ sở dữ liệu và tạo con trỏ như bạn có trong các ví dụ trước. Mã SQL ở đây cho cơ sở dữ liệu của bạn rằng bạn muốn cập nhật bảng Sách và đặt trường tác giả thành tên mới nơi tên tác giả hiện bằng tên cũ. Cuối cùng, bạn thực thi [] và cam kết [] các thay đổi. Để kiểm tra mã này có hoạt động không, bạn có thể chạy lại mã truy vấn từ phần trước và kiểm tra đầu ra.

Bây giờ bạn đã sẵn sàng để tìm hiểu cách xóa dữ liệu khỏi cơ sở dữ liệu của bạn!

Xóa dữ liệu khỏi cơ sở dữ liệu của bạn Đôi khi dữ liệu phải được xóa khỏi cơ sở dữ liệu. Ví dụ: nếu bạn quyết định ngừng làm khách hàng tại ngân hàng, bạn sẽ mong họ thanh lọc thông tin của bạn khỏi cơ sở dữ liệu của họ sau một khoảng thời gian nhất định đã trôi qua. Để xóa khỏi cơ sở dữ liệu, bạn có thể sử dụng lệnh xóa. Đi trước và tạo một tệp mới có tên là Delete_Record.py và thêm mã sau để xem cách xóa dữ liệu hoạt động: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17

# Delete_Record.Py Nhập SQLite3 def Delete_Author [tác giả]: Conn = SQLite3.connect ["Thư viện.DB"] con trỏ = Conn.Cursor [] "con trỏ.execute [SQL] Conn.Commit [] nếu __name__ == '__main__': Delete_Author [Author = 'Al Sweigart']

Tại đây bạn tạo Delete_Author [] có tên của tác giả mà bạn muốn xóa khỏi cơ sở dữ liệu. Mã trong ví dụ này gần giống với ví dụ trước ngoại trừ chính câu lệnh SQL. Trong truy vấn SQL, bạn sử dụng xóa từ để nói cho cơ sở dữ liệu nào để xóa dữ liệu. Sau đó, bạn sử dụng mệnh đề WHERE để cho nó biết trường nào sẽ sử dụng để chọn các bản ghi đích. Trong trường hợp này, bạn nói với cơ sở dữ liệu của bạn để xóa bất kỳ bản ghi nào khỏi bảng sách phù hợp với tên tác giả. Bạn có thể xác minh rằng mã này đã hoạt động bằng mã truy vấn SQL từ trước đó trong chương này.

Kết thúc việc làm việc với cơ sở dữ liệu có thể là rất nhiều công việc. Chương này chỉ bao gồm những điều cơ bản của việc làm việc với cơ sở dữ liệu. Ở đây bạn đã học cách thực hiện như sau: Tạo cơ sở dữ liệu SQLite Thêm dữ liệu vào cơ sở dữ liệu của bạn Tìm kiếm dữ liệu chỉnh sửa cơ sở dữ liệu của bạn trong cơ sở dữ liệu của bạn xóa dữ liệu khỏi cơ sở dữ liệu nếu bạn thấy mã SQL hơi khó hiểu, bạn có thể muốn kiểm tra một bản Gói Mapper Mapper đối tượng, chẳng hạn như SQLalchemy hoặc SQLOBject. Một bản đồ liên quan đến đối tượng [ORM] biến các câu lệnh Python thành mã SQL cho bạn để bạn chỉ viết mã Python. Đôi khi bạn vẫn có thể cần phải thả xuống SQL trần để có được hiệu quả bạn cần từ cơ sở dữ liệu, nhưng các ORM này có thể giúp tăng tốc độ phát triển và làm cho mọi thứ dễ dàng hơn. Dưới đây là một số liên kết cho hai dự án đó: sqlalchemy - //www.sqlalchemy.org/ sqlobject - //sqlobject.org/

Xem lại câu hỏi 1. Làm thế nào để bạn tạo cơ sở dữ liệu với thư viện SQLite3? 2. Lệnh SQL nào được sử dụng để thêm dữ liệu vào bảng? 3. Làm thế nào để bạn thay đổi một trường trong cơ sở dữ liệu với SQL? 4. Các truy vấn SQL được sử dụng để làm gì? 5. Theo mặc định, có bao nhiêu bản ghi trong bảng sẽ xóa ảnh hưởng? Làm thế nào về cập nhật và chọn? 6. Hàm xóa_Author ở trên dễ bị tấn công tiêm SQL. Tại sao, và làm thế nào bạn sẽ sửa nó?

Chương 38 - Làm việc với một tài liệu Excel trong Python Thế giới kinh doanh sử dụng Microsoft Office. Giải pháp phần mềm bảng tính của họ, Microsoft Excel, đặc biệt phổ biến. Excel được sử dụng để lưu trữ dữ liệu bảng, tạo báo cáo, xu hướng đồ thị và nhiều hơn nữa. Trước khi đi vào làm việc với Excel với Python, hãy để Lừa làm rõ một số thuật ngữ đặc biệt: bảng tính hoặc sổ làm việc - chính tệp [.xls hoặc .xlsx]. Bảng tính hoặc tờ - Một trang nội dung duy nhất trong sổ làm việc. Bảng tính có thể chứa nhiều bảng tính. Cột - Một dòng dữ liệu thẳng đứng được dán nhãn bằng các chữ cái, bắt đầu bằng cách A A. Hàng - Một dòng dữ liệu nằm ngang được dán nhãn các số, bắt đầu bằng 1. ô - một kết hợp của cột và hàng, như là A1 A1. Trong chương này, bạn sẽ sử dụng Python để làm việc với bảng tính Excel. Bạn sẽ tìm hiểu về những điều sau: Các gói Python Excel nhận được các tờ từ một cuốn sách đọc dữ liệu di động lặp lại trên các hàng và cột Viết bảng tính Excel thêm và xóa các tờ thêm và xóa các hàng và cột Excel được sử dụng bởi hầu hết các công ty và trường đại học. Nó có thể được sử dụng theo nhiều cách khác nhau và được tăng cường bằng cách sử dụng Visual Basic cho các ứng dụng [VBA]. Tuy nhiên, VBA là một loại người khó tính - đó là lý do tại sao nó tốt để học cách sử dụng Excel với Python.

Hãy cùng tìm hiểu cách làm việc với bảng tính Microsoft Excel bằng ngôn ngữ lập trình Python ngay bây giờ!

Các gói Python Excel Bạn có thể sử dụng Python để tạo, đọc và viết bảng tính Excel. Tuy nhiên, thư viện tiêu chuẩn Python không có hỗ trợ làm việc với Excel; Để làm như vậy, bạn sẽ cần cài đặt gói bên thứ 3. Một trong những phổ biến nhất là openpyxl. Bạn có thể đọc tài liệu của nó tại đây: //openpyxl.readthedocs.io/en/stable/ openpyxl không phải là lựa chọn duy nhất của bạn. Có một số gói khác hỗ trợ Microsoft Excel: XLRD - để đọc tài liệu Excel [.xls] cũ hơn XLWT - để viết tài liệu Excel [.xls] cũ hơn Hai người từng là thư viện phổ biến nhất để sử dụng với các tài liệu Excel. Tuy nhiên, tác giả của các gói đó đã ngừng hỗ trợ họ. Gói XLWings có rất nhiều lời hứa, nhưng không hoạt động trên tất cả các nền tảng và yêu cầu Microsoft Excel được cài đặt. Bạn sẽ sử dụng OpenPyXL trong chương này vì nó được tích cực phát triển và hỗ trợ. OpenPyXL không yêu cầu Microsoft Excel được cài đặt và nó hoạt động trên tất cả các nền tảng. Bạn có thể cài đặt OpenPyXL bằng PIP: 1 $ Python -M Pip Cài đặt OpenPyXL

Sau khi cài đặt đã hoàn tất, hãy để tìm ra cách sử dụng OpenPyXL để đọc bảng tính Excel!

Nhận các tờ từ sổ làm việc Bước đầu tiên là tìm tệp Excel để sử dụng với OpenPyXL. Có một tệp sách.xlsx được cung cấp cho bạn trong cuốn sách này của kho lưu trữ GitHub. Bạn có thể tải xuống bằng cách truy cập URL này: //github.com/driscollis/python101code/tree/master/chapter38_exc EL cảm thấy thoải mái khi sử dụng tệp của riêng bạn, mặc dù đầu ra từ tệp của bạn sẽ không khớp với đầu ra mẫu đầu ra mẫu đầu ra mẫu trong cuốn sách này. Bước tiếp theo là viết một số mã để mở bảng tính. Để làm điều đó, hãy tạo một tệp mới có tên open_workbook.py và thêm mã này vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13

# open_workbook.py từ openpyxl nhập load_workbook def open_workbook [path]: workbook = load_workbook [filename = path] in [f'workSheet tên: {workbook.sheetnames} '] Tiêu đề của bảng tính là: {sheet.title} '] nếu __name__ ==' __main__ ': open_workbook [' books.xlsx ']

Trong ví dụ này, bạn nhập load_workbook [] từ openpyxl và sau đó tạo open_workbook [] đi vào đường dẫn đến bảng tính excel của bạn. Tiếp theo, bạn sử dụng load_workbook [] để tạo openpyxl.workbook.workbook.workbook đối tượng. Đối tượng này cho phép bạn truy cập các tấm và ô trong bảng tính của bạn. Và vâng, nó thực sự có sổ làm việc kép trong tên của nó. Đó không phải là một lỗi đánh máy! Phần còn lại của hàm open_workbook [] trình bày cách in ra tất cả các bảng hiện được xác định trong bảng tính của bạn, lấy tờ hiện đang hoạt động và in ra tiêu đề của tờ đó. Khi bạn chạy mã này, bạn sẽ thấy đầu ra sau:

1 Tên bảng tính: ['Tờ 1 - Sách'] 2 3 Tiêu đề của bảng tính là: Tờ 1 - Sách

Bây giờ bạn đã biết cách truy cập các tờ trong bảng tính, bạn đã sẵn sàng để chuyển sang truy cập dữ liệu ô!

Đọc dữ liệu ô khi bạn đang làm việc với Microsoft Excel, dữ liệu được lưu trữ trong các ô. Bạn cần một cách để truy cập các ô đó từ Python để có thể trích xuất dữ liệu đó. OpenPyXL làm cho quá trình này thẳng. Tạo một tệp mới có tên Workbook_cells.py và thêm mã này vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

# workbook_cells.py từ openpyxl nhập load_workbook def get_cell_info [path]: workbook = load_workbook [fileName = path] sheet = workbook.active in [trang tính] . '{cell.value =}'] nếu __name__ == '__main__': get_cell_info ['books.xlsx']

Mã này sẽ tải lên tệp Excel trong sổ làm việc OpenPyXL. Bạn sẽ lấy tờ hoạt động và sau đó in ra tiêu đề của nó và một vài giá trị ô khác nhau. Bạn có thể truy cập một ô bằng cách sử dụng đối tượng tấm theo sau là dấu ngoặc vuông với tên cột và số hàng bên trong của nó. Ví dụ: trang tính ["A2"] sẽ giúp bạn có được ô tại cột A A, hàng 2. Để nhận giá trị của ô đó, bạn sử dụng thuộc tính giá trị. Lưu ý: Mã này đang sử dụng một tính năng mới đã được thêm vào F-Strings trong Python 3.8. Nếu bạn chạy điều này với một phiên bản sớm hơn, bạn sẽ nhận được lỗi. Khi bạn chạy mã này, bạn sẽ nhận được đầu ra này: 1 2 3 4 5

Tiêu đề của bảng tính là: Tờ 1 - Sách giá trị của tờ ["A2"]. Giá trị = 'Tiêu đề' Giá trị của tờ ["A3"]. Value = 'Python 101' Cell.Value = 'Mike Driscoll'

Bạn có thể nhận thêm thông tin về một ô bằng một số thuộc tính khác của nó. Thêm chức năng sau vào tệp của bạn và cập nhật

Tuyên bố có điều kiện ở cuối để chạy nó: 1 def get_info_by_coord [đường dẫn]: 2 workbook = load_workbook [filename = path] 3 sheet = workbook.active 4 cell = sheet ['a2'] 5 in [f'row {cell.row }, Col {cell.column} = {cell.value} '] 6 in [f' {cell.value =} là {cell.coordinate =} '] 7 8 nếu __name__ ==' __main__ ': 9 get_info_by_coord [ 'Books.xlsx']

Trong ví dụ này, bạn sử dụng các thuộc tính hàng và cột của đối tượng ô để lấy thông tin hàng và cột. Lưu ý rằng cột của một người khác, một bản đồ của một người khác, một người khác, một người khác. Nếu bạn lặp lại tài liệu Excel, bạn có thể sử dụng thuộc tính tọa độ để lấy tên ô. Khi bạn chạy mã này, đầu ra sẽ trông như thế này: 1 hàng 2, col 1 = tiêu đề 2 cell.Value = 'title' là tại cell.coordinate = 'A2'

Nói về việc lặp lại, hãy để Lừa tìm hiểu làm thế nào để làm điều đó tiếp theo!

Lặp lại trên các hàng và cột Đôi khi bạn sẽ cần lặp lại trên toàn bộ bảng tính Excel hoặc các phần của bảng tính. OpenPyXL cho phép bạn làm điều đó theo một vài cách khác nhau. Tạo một tệp mới có tên iterating_over_cells.py và thêm mã sau vào nó: 1 2 3 4 5 6 7 8 9 10 11 12

# iterating_over_cells.py từ openpyxl nhập load_workbook def iterating_range [path]: workbook = load_workbook [fileName = path] sheet = workbook.active for di động trong trang tính ['a']: in [cell] nếu __name__ == ' ['Books.xlsx']

Ở đây bạn tải lên bảng tính và sau đó lặp qua tất cả các ô trong cột. Đối với mỗi ô, bạn in ra đối tượng ô. Bạn có thể sử dụng một số thuộc tính ô mà bạn đã học trong phần trước nếu bạn muốn định dạng đầu ra chi tiết hơn. Đây là những gì bạn nhận được từ việc chạy mã này: 1 2 3 4 5 6 7 8 9 10 11

# đầu ra bị cắt ngắn cho sự ngắn gọn

Đầu ra bị cắt ngắn vì nó sẽ in ra khá nhiều ô theo mặc định. OpenPyXL cung cấp các cách khác để lặp qua các hàng và cột bằng cách sử dụng các hàm iter_rows [] và iter_cols []. Các phương thức này chấp nhận một số đối số: MIN_ROW MAX_ROW

MIN_COL MAX_COL

Bạn cũng có thể thêm vào đối số giá trị_only cho OpenPyXL trả về giá trị của ô thay vì đối tượng ô. Đi trước và tạo một tệp mới có tên ITERATION_OVER_CELL_VALUES.PY và thêm mã này vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

# iterating_over_cell_values.py từ openpyxl nhập load_workbook def iterating_over_values ​​[path]: workbook = load_workbook [filename = path] sheet = workbook.active cho giá trị trong bảng.ITER_ROWS [MIN_ROW = 1, MAX_ROW = 3 value_only = true,]: in [giá trị] nếu __name__ == '__main__': iterating_over_values ​​['books.xlsx']

Mã này cho thấy cách bạn có thể sử dụng iter_rows [] để lặp lại trên các hàng trong bảng tính excel và in ra các giá trị của các hàng đó. Khi bạn chạy mã này, bạn sẽ nhận được đầu ra sau: 1 ['Sách', Không, Không có] 2 ['Tiêu đề', 'Tác giả', 'Nhà xuất bản'] 3 ['Python 101', 'Mike Driscoll', ' Chuột vs Python ']

Đầu ra là một tuple Python chứa dữ liệu trong mỗi cột. Tại thời điểm này, bạn đã học được cách mở bảng tính và đọc dữ liệu - cả từ các ô cụ thể, cũng như thông qua lặp lại. Bây giờ bạn đã sẵn sàng để tìm hiểu cách sử dụng openpyxl để tạo bảng tính excel!

Viết bảng tính Excel Tạo bảng tính Excel bằng OpenPyXL không có nhiều mã. Bạn có thể tạo một bảng tính bằng cách sử dụng lớp Workbook []. Đi trước và tạo một tệp mới có tên là write_hello.py và thêm mã này vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

# write_hello.py từ OpenPyxl Nhập Workbook def create_workbook [Path]: Workbook = Workbook [] Sheet = Workbook.Active Sheet ['A1'] = = 'Openpyxl' Workbook.save [đường dẫn] nếu __name__ == '__main__': create_workbook ['hello.xlsx']

Ở đây bạn khởi tạo sổ làm việc [] và nhận bảng hoạt động. Sau đó, bạn đặt ba hàng đầu tiên trong cột Một A thành các chuỗi khác nhau. Cuối cùng, bạn gọi Save [] và chuyển nó đường dẫn để lưu tài liệu mới cho. Xin chúc mừng! Bạn vừa tạo ra một bảng tính Excel với Python. Hãy để khám phá cách thêm và xóa các tờ trong sổ làm việc của bạn tiếp theo!

Thêm và xóa các tờ nhiều người muốn tổ chức dữ liệu của họ trên nhiều bảng tính trong sổ làm việc. OpenPyXL hỗ trợ khả năng thêm các tờ mới vào đối tượng Sổ làm việc [] thông qua phương thức create_Sheet [] của nó. Tạo một tệp mới có tên created_sheets.py và thêm mã này vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 18

# created_sheets.py Nhập OpenPyxl def create_workSheets [path]: workbook = openpyxl.workbook [] in [workbook.sheetnames] # thêm một bảng tính mới. = 1, Tiêu đề = 'Tờ thứ hai'] In [Workbook.SheetNames] Workbook.Save [đường dẫn] Nếu __name__ == '__main__': created_workSheets ['Sheet.xlsx']

Tại đây bạn sử dụng created_sheet [] hai lần để thêm hai bảng tính mới vào sổ làm việc. Ví dụ thứ hai chỉ cho bạn cách đặt tiêu đề của một tờ và tại đó chỉ mục để chèn trang tính. Chỉ số đối số = 1 có nghĩa là bảng tính sẽ được thêm vào sau bảng tính hiện có đầu tiên, vì chúng được lập chỉ mục bắt đầu từ 0. Khi bạn chạy mã này, bạn sẽ thấy đầu ra sau: 1 ['Sheet'] 2 ['Sheet' , 'Sheet1'] 3 ['Sheet', 'Tờ thứ hai', 'Sheet1']]

Bạn có thể thấy rằng các tờ mới đã được thêm từng bước vào sổ làm việc của bạn. Sau khi lưu tệp, bạn có thể xác minh rằng có nhiều bảng tính bằng cách mở Excel hoặc một ứng dụng tương thích Excel khác. Sau quá trình tạo bảng tính tự động này, bạn đã đột nhiên nhận được quá nhiều tờ, vì vậy hãy để loại bỏ một số. Có hai cách để loại bỏ một tờ.

Đi trước và tạo Delete_Sheets.py để xem cách sử dụng từ khóa Python từ Del để xóa bảng tính: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17

# Delete_Sheets.Py Nhập OpenPyxl def create_workSheets [đường dẫn]: Workbook = openpyxl.workbook [] workbook.create_sheet [] Sổ làm việc ['Tờ thứ hai'] In [Workbook.SheetNames] Work

Mã này sẽ tạo ra một sổ làm việc mới và sau đó thêm hai bảng tính mới vào nó. Sau đó, nó sử dụng từ khóa Python sườn del để xóa sổ làm việc ['tờ thứ hai']. Bạn có thể xác minh rằng nó hoạt động như mong đợi bằng cách xem bản in của danh sách trang tính trước và sau lệnh del: 1 ['tờ', 'bảng thứ hai', 'sheet1'] 2 ['sheet', 'sheet1']]

Cách khác để xóa một tờ khỏi sổ làm việc là sử dụng phương thức Remove []. Tạo một tệp mới có tên remove_sheets.py và nhập mã này để tìm hiểu cách hoạt động: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 17 17 17

# remove_sheet.py Nhập OpenPyxl def create_workSheets [đường dẫn]: Workbook = openPyxl.workbook [] sheet1 = workbook.create_sheet [] ] Workbook.Remove [Sheet1] In [Workbook.SheetNames] Workbook.Save [đường dẫn] Nếu __name__ == '__main__': create_workSheets ['remove_sheet.xlsx']

Lần này, bạn giữ một tham chiếu đến bảng tính đầu tiên mà bạn tạo bằng cách gán kết quả cho Sheet1. Sau đó, bạn xóa nó sau trong mã. Ngoài ra, bạn cũng có thể xóa bảng đó bằng cách sử dụng cùng một cú pháp như trước đây, như thế này: 1 Workbook.Remove [Workbook ['Sheet1']]]

Bất kể bạn chọn phương pháp nào để xóa bảng tính, đầu ra sẽ giống nhau: 1 ['tờ', 'Bảng thứ hai', 'Sheet1'] 2 ['Sheet', 'Tờ thứ hai']]

Bây giờ, hãy để di chuyển và tìm hiểu làm thế nào bạn có thể thêm và xóa các hàng và cột.

Thêm và xóa các hàng và cột OpenPyXL có một số phương thức hữu ích mà bạn có thể sử dụng để thêm và loại bỏ các hàng và cột trong bảng tính của bạn. Dưới đây là danh sách bốn phương thức bạn sẽ tìm hiểu trong phần này: .Insert_Rows [] .delete_rows [] .Insert_cols [] .delete_cols []

Mỗi phương thức này có thể lấy hai đối số: IDX - chỉ mục để chèn lượng hàng hoặc số cột - số lượng hàng hoặc cột vào

cộng

Để xem cách thức hoạt động của nó, hãy tạo một tệp có tên là insert_demo.py và thêm mã sau vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 18

# insert_demo.py từ OpenPyxl Nhập sổ bài tập Def InserTing_cols_Rows [Path]: Workbook = Workbook [] Sheet = Workbook.Active Sheet ['A1'] = 'Hello' Sheet ['A2'] = 'OpenPyxl' # Chèn một cột trước một tờ.Insert_cols [idx = 1] # Chèn 2 hàng bắt đầu trên bảng thứ hai. __main__ ': chèn_cols_rows [' chèn.xlsx ']

Tại đây, bạn tạo một bảng tính và chèn một cột mới trước cột. Các cột được lập chỉ mục bắt đầu lúc 1 trong khi ngược lại, bảng tính bắt đầu từ 0. Điều này di chuyển hiệu quả tất cả các ô trong cột A đến cột B. Sau đó, bạn chèn hai hàng mới bắt đầu trên hàng 2.

Bây giờ bạn đã biết cách chèn các cột và hàng, đã đến lúc bạn khám phá cách loại bỏ chúng. Để tìm hiểu cách xóa các cột hoặc hàng, hãy tạo một tệp mới có tên Delete_demo.py và thêm mã này: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

# Delete_Demo.py từ OpenPyxl Nhập Workbook def Deleting_cols_rows [Path]: Workbook = Workbook [] Sheet = Workbook.Active Sheet ['A1'] = 'Hello' Sheet ['B1'] = 'từ' Sheet ['C1'] = 'OpenPyxl' Sheet ['A2'] = 'Row 2' Sheet ['A3'] = 'Row 3' Sheet ['A4'] = 'Row 4' # Delete Cột a Sheet.Delete_cols [idx = 1] # Xóa 2 hàng bắt đầu trên bảng thứ hai.Delete_Rows [idx = 2, số lượng = 2] sổ làm việc.save [đường dẫn] nếu __name__ == '__main__': xóa_cols_rows ['Xóa.xlsx']

Mã này tạo văn bản trong một số ô và sau đó xóa cột A bằng cách sử dụng Delete_cols []. Nó cũng loại bỏ hai hàng bắt đầu từ hàng thứ 2 thông qua Delete_Rows []. Có thể thêm và xóa các cột và hàng có thể khá hữu ích khi tổ chức dữ liệu của bạn.

Kết thúc do việc sử dụng Excel rộng rãi trong nhiều ngành công nghiệp, đây là một kỹ năng cực kỳ hữu ích để có thể tương tác với các tệp Excel bằng Python. Trong chương này, bạn đã tìm hiểu về những điều sau đây: các gói Python Excel nhận được các tờ từ một sổ làm việc đọc dữ liệu di động lặp lại trên các hàng và cột viết bảng tính Excel thêm và xóa các tờ thêm và xóa các hàng và cột Openpyxl có thể làm nhiều hơn những gì được đề cập ở đây. Ví dụ: bạn có thể thêm các công thức vào các ô, thay đổi phông chữ và áp dụng các loại kiểu dáng khác cho các ô sử dụng openpyxl. Đọc tài liệu và thử sử dụng OpenPyXL trên một số bảng tính của riêng bạn để bạn có thể khám phá toàn bộ sức mạnh của nó.

Xem lại câu hỏi 1. Gói Python nào bạn có thể sử dụng để làm việc với bảng tính Microsoft Excel? 2. Làm thế nào để bạn mở một bảng tính excel với Python? 3. Bạn sử dụng lớp nào để tạo bảng tính Excel với OpenPyXL?

Chương 39 - Cách tạo PDF Định dạng tài liệu di động [PDF] là một cách rất phổ biến để chia sẻ tài liệu trên nhiều nền tảng. Mục tiêu của PDF là tạo ra một tài liệu sẽ trông giống nhau trên nhiều nền tảng và sẽ in giống nhau [hoặc rất giống nhau] trên các máy in khác nhau. Định dạng ban đầu được phát triển bởi Adobe nhưng đã được tạo ra nguồn mở. Python có nhiều thư viện mà bạn có thể sử dụng để tạo các tệp PDF mới hoặc các phần xuất khẩu của các tệp PDF có sẵn. Hiện tại không có thư viện Python có sẵn để chỉnh sửa PDF tại chỗ. Dưới đây là một vài trong số các gói bạn có thể sử dụng: Báo cáo - được sử dụng để tạo PDFS PDFRW - được sử dụng để phân tách, hợp nhất, đánh dấu hình mờ và xoay PYPDF2 / PYPDF4 PDF - được sử dụng để phân tách, hợp nhất, đánh dấu và xoay PDF PDFMiner - được sử dụng để trích xuất để trích xuất để trích xuất Văn bản từ PDF có nhiều gói PDF khác cho Python. Trong chương này, bạn sẽ tìm hiểu cách tạo PDF bằng báo cáo. Gói báo cáo đã xuất hiện từ năm 2000. Nó có phiên bản nguồn mở cũng như phiên bản thương mại trả phí có một số tính năng bổ sung trong đó. Bạn sẽ tìm hiểu về phiên bản nguồn mở ở đây. Trong chương này, bạn sẽ tìm hiểu về những điều sau: Cài đặt Báo cáo tạo một tệp PDF đơn giản với Canvas tạo bản vẽ và thêm hình ảnh bằng cách sử dụng Canvas tạo tài liệu nhiều trang với thú mỏ vịt tạo báo cáo bảng có thể tạo ra hầu hết mọi loại báo cáo bạn có thể tưởng tượng. Chương này sẽ không bao gồm mọi tính năng mà Báo cáo mà bạn cung cấp, nhưng bạn

Sẽ tìm hiểu đủ về nó để xem báo cáo hữu ích có thể như thế nào. Bắt đầu nào!

Cài đặt Báo cáo Bạn có thể cài đặt Báo cáo bằng cách sử dụng PIP: 1 Python -M PIP Cài đặt Báo cáo

Báo cáo phụ thuộc vào gói gối, đây là thư viện thao tác hình ảnh cho Python. Nó cũng sẽ được cài đặt nếu bạn chưa có nó trên hệ thống của mình. Bây giờ bạn đã cài đặt Báo cáo, bạn đã sẵn sàng để tìm hiểu cách tạo PDF đơn giản!

Creating a Simple PDF with the Canvas There are two ways to create PDFs using the ReportLab package. The lowlevel method is drawing on the “canvas”. This allows you to draw at specific locations on the page. PDFs measure their size in points internally. There are 72 points per inch. A letter-size page is 612 x 792 points. However, the default page size is A4. There are several default page sizes that you can set or you can create your own page size. It’s always easier to see some code so that you can understand how this will work. Create a new file named hello_reportlab.py and add this code: 1 2 3 4 5 6 7

# hello_reportlab.py from reportlab.pdfgen import canvas my_canvas = canvas.Canvas["hello.pdf"] my_canvas.drawString[100, 750, "Welcome to Reportlab!"] my_canvas.save[]

This will create a PDF that is A4 sized. You create a Canvas[] object that takes in the path to the PDF that you want to create. To add some text to the PDF, you use drawString[]. This code tells ReportLab to start drawing the text 100 points from the left and 750 from the bottom of the page. If you were to start drawing at [0, 0], your text would appear at the bottom left of the page. You can change the location you start drawing by setting the bottomup canvas argument to 0. The last line saves the PDF to disk. Don’t forget to do that or you won’t get to see your new creation! The PDF should look something like this when you open it:

Fig. 39-1: Hello World on the Canvas

While this demonstrates how easy it is to create a PDF with ReportLab, it’s kind of a boring example. You can use the canvas to draw lines, shapes and different fonts too. To learn how create a new file named canvas_form.py and enter this code in it: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

# canvas_form.py from reportlab.lib.pagesizes import letter from reportlab.pdfgen import canvas def form[path]: my_canvas = canvas.Canvas[path, pagesize=letter] my_canvas.setLineWidth[.3] my_canvas.setFont['Helvetica', 12] my_canvas.drawString[30, 750, 'OFFICIAL COMMUNIQUE'] my_canvas.drawString[30, 735, 'OF ACME INDUSTRIES'] my_canvas.drawString[500, 750, "12/12/2010"] my_canvas.line[480, 747, 580, 747] my_canvas.drawString[275, 725, 'AMOUNT OWED:'] my_canvas.drawString[500, 725, "$1,000.00"] my_canvas.line[378, 723, 580, 723] my_canvas.drawString[30, 703, 'RECEIVED BY:'] my_canvas.line[120, 700, 580, 700] my_canvas.drawString[120, 703, "JOHN DOE"] my_canvas.save[] if __name__ == '__main__': form['canvas_form.pdf']

Here you import the letter size from reportlab.lib.pagesizes which has several other sizes you could use. Then in the form[] function, you set the pagesize when you instantiate Canvas[]. Next, you use

to set the line width, which is used when you draw lines. Then you change the font to Helvetica with the font size at 12 points. setLineWidth[]

The rest of the code is a series of drawing strings at various locations with lines being drawn here and there. When you draw a line[], you pass in the starting coordinate [x/y positions] and the end coordinate [x/y position] and ReportLab will draw the line for you using the line width you set. When you open the PDF, you will see the following:

Fig. 39-2: Creating a form with ReportLab’s Canvas

That looks pretty good. But what if you wanted to draw something or add a logo or some other photo to your report? Let’s find out how to do that next!

Creating Drawings and Adding Images Using the Canvas The ReportLab Canvas[] is very flexible. It allows you to draw different shapes, use different colors, change the line widths, and more. To demonstrate some of these features, create a new file named drawing_polygons.py and add this code to it: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

# drawing_polygons.py from reportlab.lib.pagesizes import letter from reportlab.pdfgen import canvas def draw_shapes[]: my_canvas = canvas.Canvas["drawing_polygons.pdf"] my_canvas.setStrokeColorRGB[0.2, 0.5, 0.3] my_canvas.rect[10, 740, 100, 80, stroke=1, fill=0] my_canvas.ellipse[10, 680, 100, 630, stroke=1, fill=1] my_canvas.wedge[10, 600, 100, 550, 45, 90, stroke=1, fill=0] my_canvas.circle[300, 600, 50] my_canvas.save[] if __name__ == '__main__': draw_shapes[]

Here you create a Canvas[] object as you have before. You can use setStrokeColorRGB[] to change the border color using RGB values between zero and one. The next few lines of code create different shapes. For the rect[] function, you specify the x and y start position which is the lower left-hand coordinate of the rectangle. Then you specify the width and height of the shape. The stroke parameter tells ReportLab whether or not to draw the border while the fill parameter tells ReportLab whether or not to fill the shape with a color. All of the shapes support these two parameters. According to the documentation for the ellipse[], it takes in the starting [x,y] and ending [x,y] coordinates for the enclosing rectangle for the ellipse shape. The wedge[] shape is similar in that you are once again specifying a series of points for an invisible rectangle that encloses the wedge shape. What you need to do is imagine that there is a circle inside of a rectangle and you are describing the size of the rectangle. The 5th argument is startAng, which is

Góc bắt đầu của nêm. Đối số thứ 6 là trong phạm vi, cho biết nêm bao xa vòng cung có thể mở rộng. Cuối cùng, bạn tạo một vòng tròn [], có tọa độ [x, y] của trung tâm của nó và sau đó là bán kính của nó. Bạn bỏ qua cài đặt các tham số đột quỵ và điền vào. Khi bạn chạy mã này, bạn sẽ kết thúc với PDF trông như thế này:

Hình 39-3: Tạo đa giác với Canvas báo cáo

Trông trông khá đẹp. Bạn có thể tự mình chơi với các giá trị và xem liệu bạn có thể tìm ra cách thay đổi hình dạng theo những cách khác nhau không. Mặc dù những hình dạng mà bạn đã vẽ trông thú vị, nhưng chúng sẽ thực sự trông tuyệt vời trên bất kỳ tài liệu công ty chuyên nghiệp nào. Điều gì sẽ xảy ra nếu bạn muốn thêm logo công ty vào báo cáo PDF của bạn? Bạn có thể làm điều này với Báo cáo bằng cách thêm một hình ảnh vào tài liệu của bạn. Để khám phá cách thực hiện điều đó, hãy tạo một tệp có tên Image_on_canvas.py và thêm mã này vào nó: 1 2 3 4 5 6 7

# Image_on_canvas.py từ reportlab.lib.pages hóa thư nhập từ reportlab.pdfgen nhập canvas def add_image [Image_path]:

8 my_canvas = canvas.canvas ["canvas_image.pdf", page ': 13 Image_path =' snakehead.jpg '14 add_image [Image_path]

Để vẽ một hình ảnh trên khung vẽ của bạn, bạn sử dụng phương thức DrawImage []. Nó có trong đường dẫn hình ảnh, các vị trí bắt đầu X và Y, và chiều rộng và chiều cao bạn muốn sử dụng cho hình ảnh. Phương pháp này không duy trì tỷ lệ khung hình của hình ảnh bạn đi vào. Nếu bạn đặt chiều rộng và chiều cao không chính xác, hình ảnh sẽ được kéo dài. Khi bạn chạy mã này, bạn sẽ kết thúc với PDF trông giống như thế này:

Hình 39-4: Thêm một hình ảnh vào báo cáo Canvas

Lớp Canvas [] khá mạnh mẽ. Tuy nhiên, bạn cần theo dõi nơi bạn đang ở trên một trang và nói với khung vẽ khi tạo một trang mới. Điều này có thể khó thực hiện mà không làm cho mã khá phức tạp. May mắn thay, có một cách tốt hơn và bạn sẽ tìm ra những gì trong phần tiếp theo!

Tạo các tài liệu nhiều trang với Pletypus ReportLab có một khái niệm gọn gàng mà họ gọi là thú mỏ vịt, viết tắt của bố cục trang và kiểu chữ bằng cách sử dụng các tập lệnh. Đây là một thư viện bố cục cấp cao mà ReportLab cung cấp giúp dễ dàng tạo ra các bố cục phức tạp với tối thiểu mã. Platypus về cơ bản quan tâm đến việc phá vỡ trang, bố cục và kiểu dáng cho bạn. Có một số lớp mà bạn có thể sử dụng trong thú mỏ vịt. Các lớp này được gọi là dòng chảy. Một dòng chảy có khả năng được thêm vào một tài liệu và có thể tự phá vỡ thông minh trên nhiều trang. Các dòng chảy mà bạn sẽ sử dụng nhiều nhất là: đoạn [] - để thêm văn bản GetSamplestyLesheet [] - để áp dụng các kiểu vào bảng đoạn [] - cho dữ liệu bảng đơn giản

Dòng chảy để xem cách các lớp này có thể được sử dụng, tạo một tệp có tên hello_platypus.py và thêm mã sau: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

# hello_platypus.py từ reportlab.lib.pages hóa thư nhập từ reportlab.platypus nhập đơn giản . .Append [para] doc.build [lưu lượng] nếu __name__ == '__main__': xin chào []

Trong mã này, bạn nhập hai lớp mới từ reportlab.platypus: SimpleDoctemplate [] và đoạn []. Bạn cũng nhập GetSamplestyLesheet [] từ Báo cáo.lib.styles. Sau đó, trong hàm hello [], bạn tạo một đối tượng mẫu tài liệu. Đây là nơi bạn chuyển đường dẫn tệp đến PDF mà bạn muốn tạo. Nó tương tự như lớp canvas [], nhưng đối với thú mỏ vịt. Bạn cũng đặt các trang ở đây và bạn cũng chỉ định lề. Bạn không cần thiết để thiết lập lề, nhưng bạn nên biết rằng bạn có thể, đó là lý do tại sao nó được hiển thị ở đây. Sau đó, bạn nhận được bảng kiểu mẫu. Biến kiểu là một báo cáo.lib.styles.StyleSheet1 Loại đối tượng. Bạn có thể truy cập một số phong cách khác nhau trong bảng kiểu đó. Đối với các mục đích của ví dụ này, bạn sử dụng bảng kiểu thông thường. Mã này tạo ra một luồng duy nhất bằng cách sử dụng đoạn []. Đoạn [] có thể lấy một số đối số khác nhau. Trong trường hợp này, bạn vượt qua một số văn bản và phong cách bạn muốn áp dụng cho văn bản. Nếu bạn nhìn vào mã cho biểu định kiểu, bạn sẽ thấy rằng bạn có thể áp dụng các kiểu tiêu đề khác nhau của các kiểu chữ trên văn bản cũng như phong cách mã mã và kiểu chữ in italic, trong số những kiểu khác. Để làm cho tài liệu tạo ra đúng cách, bạn giữ một danh sách trăn của các dòng chảy. Trong ví dụ này, bạn có một danh sách chỉ có một yếu tố trong đó: một đoạn []. Thay vì gọi Save [] để tạo PDF, bạn gọi Build [] và chuyển trong danh sách các dòng chảy. PDF hiện được tạo ra. Nó sẽ trông giống thế này:

Hình 39-5: Thêm văn bản bằng thú mỏ vịt

Đó là gọn gàng! Nhưng nó vẫn còn nhàm chán vì nó chỉ có một yếu tố trong đó. Để xem mức độ hữu ích khi sử dụng Khung Platypus, bạn sẽ tạo một tài liệu với hàng tá lưu lượng. Hãy tiếp tục và tạo một tệp mới có tên pletypus_multipage.py và thêm mã này: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 28

# Platypus_multipage.py từ từ từ

Báo cáo.lib.Pagesize Nhập thư Báo cáo.lib.styles Nhập GetMplestyleSheet Báo cáo.

def created_document []: doc = SimpleDoctemplate ["Platypus_multipage.pdf", page Đối với i trong phạm vi [50]: text = 'đoạn #{}'. Định dạng [i] para = đoạn [văn bản, styles ["bình thường"]] Flowables.append [para] Flowables.append [spacer] doc.build [ Dòng chảy] Nếu __name__ == '__main__': create_document []

Trong ví dụ này, bạn tạo 50 đối tượng đoạn []. Bạn cũng tạo một miếng đệm [], mà bạn sử dụng để thêm không gian giữa các dòng chảy. Khi bạn tạo một đoạn [], bạn thêm nó và một miếng đệm [] vào danh sách các dòng chảy. Bạn kết thúc với 100 lưu lượng trong danh sách. Khi bạn chạy mã này, bạn sẽ tạo một tài liệu 3 trang. Trang đầu tiên sẽ bắt đầu như ảnh chụp màn hình sau:

Hình 39-6: Tài liệu nhân với thú mỏ vịt

Đó là quá khó! Bây giờ, hãy để tìm hiểu làm thế nào bạn có thể thêm một bảng vào PDF của bạn!

Tạo một bảng một trong những luồng phức tạp nhất trong Báo cáo là bảng []. Nó cho phép bạn hiển thị dữ liệu bảng với các cột và hàng. Các bảng cho phép bạn đặt các loại có thể chảy khác trong mỗi ô của bảng. Điều này cho phép bạn tạo các tài liệu phức tạp. Để bắt đầu, hãy tạo một tệp mới có tên Simple_table.py và thêm mã này vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

# simple_table.py từ reportlab.lib.pages hóa thư nhập từ reportlab.platypus nhập đơn giản, bảng def simple_table [] } '. Định dạng [x] cho x trong phạm vi [1, 6]], [str [x] cho x trong phạm vi [1, 6]], [' a ',' b ',' c ',' d ' hay

Lần này bạn nhập bảng [] thay vì đoạn []. Phần còn lại của nhập khẩu sẽ trông quen thuộc. Để thêm một số dữ liệu vào bảng, bạn cần có một danh sách danh sách Python. Các mục bên trong danh sách phải là chuỗi hoặc lưu lượng. Đối với ví dụ này, bạn tạo ba hàng chuỗi. Hàng đầu tiên là hàng cột, dán nhãn những gì sẽ có trong các hàng sau. Tiếp theo, bạn tạo bảng [] và truyền dữ liệu, đó là danh sách danh sách của bạn. Cuối cùng, bạn xây dựng [] tài liệu như bạn đã làm trước đây. PDF của bạn bây giờ sẽ có một bảng trong đó trông như thế này:

Hình 39-7: Tạo một bảng đơn giản với thú mỏ vịt

Bảng [] không có đường viền hoặc đường viền ô được bật theo mặc định. Bảng này [] không có kiểu dáng áp dụng cho nó. Các bảng có thể có các kiểu được áp dụng cho chúng bằng cách sử dụng bảng tính []. Kiểu bảng giống như các bảng kiểu bạn có thể áp dụng cho một đoạn []. Để xem chúng hoạt động như thế nào, bạn cần tạo một tệp mới có tên Simple_Table_with_style.py và thêm mã sau vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

# simple_table_with_style.py từ reportlab.lib nhập màu từ reportlab.lib.pages hóa thư nhập từ reportlab.platypus Nhập SimpleDoctemplate, Bảng, TableStyle def đơn giản_table_with_style [] . ',' c ',' d ',' e '],] tblstyle = tablestyle [[[' nền ', [0, 0], [-1, 0], colors.red], [' textColor ', [ 0, 1], [-1, 1], colors.blue],]]

31 nếu __name__ == '__main__': 32 Simple_table_with_style []

Lần này bạn thêm một bảng tính [], đây là danh sách python của các bộ dữ liệu. Các bộ dữ liệu chứa loại kiểu dáng bạn muốn áp dụng và các ô nào để áp dụng kiểu dáng. Tuple đầu tiên mà bạn muốn áp dụng màu nền màu đỏ bắt đầu trên cột 0, hàng 0. Kiểu này nên được áp dụng cho cột cuối cùng, được chỉ định là -1. Bộ thứ hai áp dụng màu xanh cho văn bản, bắt đầu trong cột 0, hàng 1 mặc dù tất cả các cột trên hàng 1. Để thêm kiểu vào bảng, bạn gọi setStyle [] và chuyển nó là thể hiện bảng tính [] mà bạn đã tạo. Lưu ý rằng bạn cần nhập màu từ Báo cáo.Lib để có được hai màu mà bạn đã áp dụng. Khi bạn chạy mã này, bạn sẽ kết thúc với bảng sau:

Hình 39-8: Tạo một bảng đơn giản với một bảng tính bảng

Nếu bạn muốn áp dụng một đường viền cho bảng và ô, bạn sẽ thêm một bộ phận bằng cách sử dụng lưới lưới điện tử làm lệnh style và sau đó cho nó biết các ô nào sẽ áp dụng nó.

Gói lại báo cáo là gói toàn diện nhất có sẵn để tạo PDFS với Python. Trong chương này, bạn đã tìm hiểu về các chủ đề sau: Cài đặt báo cáo tạo ra một tệp PDF đơn giản với khung vẽ tạo bản vẽ và thêm hình ảnh bằng cách tạo ra các tài liệu nhiều trang với thú mỏ vịt tạo ra một bảng Chương này chỉ làm trầy xước bề mặt của những gì bạn có thể làm với Báo cáo. Bạn có thể sử dụng báo cáo với các loại phông chữ khác nhau, thêm tiêu đề và chân trang, chèn mã vạch và nhiều, nhiều hơn nữa. Bạn có thể tìm hiểu về các chủ đề này cũng như các gói PDF Python khác trong cuốn sách của tôi, Báo cáo: Xử lý PDF với Python: //leanpub.com/reportlab

Xem lại câu hỏi 1. Bạn sử dụng lớp nào trong Báo cáo báo cáo để vẽ trực tiếp trên PDF ở cấp thấp? 2. Platypus là viết tắt của gì? 3. Làm thế nào để bạn áp dụng một biểu định kiểu cho một đoạn văn? 4. Bạn sử dụng phương pháp nào để áp dụng bảng tính?

Chương 40 - Cách tạo trực quan hóa dữ liệu đồ thị là một phương pháp quan trọng để chia sẻ dữ liệu của bạn với những người khác. Một số người gọi trực quan hóa là sơ đồ, biểu đồ hoặc đồ thị. Những cái tên này đồng nghĩa trong chương này. Python có nhiều gói bên thứ 3 thực hiện trực quan hóa dữ liệu. Trong thực tế, có rất nhiều điều mà nó có thể có phần áp đảo. Một trong những lâu đời nhất và phổ biến nhất là matplotlib. Matplotlib được biết đến với việc tạo ra các hình ảnh tĩnh, hoạt hình và tương tác trong Python. Bạn có thể tạo ra nhiều loại lô và biểu đồ khác nhau với matplotlib. Nó cũng tích hợp tốt với các thư viện khoa học dữ liệu và toán học khác như Numpy và Pandas. Bạn cũng sẽ thấy rằng Matplotlib hoạt động với hầu hết các bộ công cụ GUI Python, như Tkinter, Wxpython và PyQT. Bởi vì matplotlib rất nổi tiếng, nó sẽ là gói đồ thị được đề cập trong chương này. Bạn sẽ tìm hiểu về các chủ đề sau: Tạo biểu đồ dòng đơn giản với Pyplot tạo biểu đồ thanh tạo biểu đồ hình tròn thêm nhãn thêm tiêu đề để tạo ra một huyền thoại hiển thị nhiều hình cho phép bắt đầu âm mưu với matplotlib!

Cài đặt matplotlib, bạn sẽ cần cài đặt matplotlib để có thể sử dụng nó. May mắn thay, điều đó rất dễ thực hiện với PIP: 1 python -M pip cài đặt matplotlib

Điều này sẽ cài đặt matplotlib cũng như bất kỳ sự phụ thuộc nào mà nó yêu cầu. Bây giờ bạn đã sẵn sàng để bắt đầu vẽ đồ thị!

Tạo một biểu đồ dòng đơn giản với PYPLOT tạo biểu đồ [hoặc sơ đồ] là mục đích chính của việc sử dụng gói âm mưu. Matplotlib có mô-đun phụ gọi là pyplot mà bạn sẽ sử dụng để tạo biểu đồ. Để bắt đầu, hãy tiếp tục và tạo một tệp mới có tên line_plot.py và thêm mã sau: 1 2 3 4 5 6 7 8 9 10 11 12

# line_plot.py nhập matplotlib.pyplot như plt def line_plot [số]: plt.plot [số] plt.ylabel ['số ngẫu nhiên'] plt.show [] nếu __name__ == '__main__': số = [2, 4, 4 , 1, 6] line_plot [số]

Ở đây bạn nhập matplotlib.pyplot như plt. Sau đó, bạn tạo một line_plot [] có trong danh sách các số python. Để vẽ các số, bạn sử dụng hàm cốt truyện []. Bạn cũng thêm một nhãn vào trục y. Cuối cùng, bạn gọi show [] để hiển thị cốt truyện. Bây giờ bạn sẽ thấy một cửa sổ trông như thế này:

Hình 40-1: Biểu đồ dòng matplotlib

Bây giờ bạn đã biết cách tạo một biểu đồ dòng đơn giản bằng matplotlib! Bây giờ bạn sẽ tìm ra cách tạo biểu đồ thanh trong phần tiếp theo.

Tạo biểu đồ thanh tạo biểu đồ thanh với matplotlib rất giống với cách bạn tạo ra một biểu đồ dòng. Nó chỉ cần một vài lập luận bổ sung. Đi trước và tạo một tệp mới có tên Bar_chart.py và nhập mã sau vào đó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

# Bar_Chart.Py Nhập matplotlib.pyplot dưới dạng plt def bar_chart [số, nhãn, pos]: plt.bar [pos, số, color = 'blue'] plt.xticks [ticks = pos, nhãn = nhãn] plt.show [ năm Số, nhãn, POS]

Khi bạn tạo biểu đồ thanh bằng thanh [], bạn sẽ chuyển trong danh sách các giá trị cho trục x. Sau đó, bạn vượt qua một danh sách độ cao cho các thanh. Bạn cũng có thể tùy chọn đặt màu cho các thanh. Trong trường hợp này, bạn đặt chúng thành màu xanh da trời. Tiếp theo, bạn đặt Xticks [], là các dấu hiệu đánh dấu sẽ xuất hiện dọc theo trục x. Bạn cũng vượt qua trong một danh sách các nhãn tương ứng với ve. Hãy tiếp tục và chạy mã này và bạn sẽ xem biểu đồ sau:

Hình 40-2: Biểu đồ thanh matplotlib

Bạn cũng có thể tạo biểu đồ thanh ngang với matplotlib. Tất cả những gì bạn cần làm là thay đổi thanh [] thành Barh []. Tạo một tệp mới có tên Bar_chartsh.py và thêm mã này: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

# barb_charth.py nhập matplotlib.pyplot dưới dạng plt def bar_charth [số, nhãn, pos]: plt.barh [pos, số, color = 'blue'] plt.yticks [ticks = pos, nhãn = nhãn] plt.show [ ] nếu __name__ == '__main__': số = [2, 1, 4, 6] nhãn = ['điện', 'mặt trời', 'diesel', 'không chì'] pos = list [phạm vi [4]] barb_charth [ Số, nhãn, POS]

Có một sự thay đổi lén lút khác ở đây. Bạn có thể phát hiện ra nó? Sự thay đổi là vì bây giờ nó là một biểu đồ thanh ngang, bạn sẽ muốn đặt yticks [] thay vì xticks [] hoặc nó đã giành chiến thắng.

Khi bạn đã sẵn sàng, hãy chạy mã và bạn sẽ thấy như sau:

Hình 40-3: Biểu đồ thanh ngang Matplotlib

Điều đó trông rất tuyệt và nó đã không mất nhiều mã! Bây giờ, hãy để tìm ra cách tạo ra một biểu đồ hình tròn với matplotlib.

Tạo ra một biểu đồ biểu đồ hình tròn là một chút của một con thú khác. Để tạo biểu đồ hình tròn, bạn sẽ sử dụng hàm Subplotlib, Subplots [], trả về một hình và đối tượng trục. Để xem cách hoạt động, hãy tạo một tệp mới có tên Pie_chart_plain.py và đặt mã này vào đó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

# pie_chart_plain.py nhập matplotlib.pyplot như plt def pie_chart []: số = [40, 35, 15, 10] nhãn = ['python', 'ruby', 'c ++', 'php'] fig1, ax1 = plt .subplots [] ax1.pie [số, nhãn = nhãn] plt.show [] nếu __name__ == '__main__': pie_chart []

Trong mã này, bạn tạo các ô con [] và sau đó sử dụng phương thức pie [] của đối tượng trục. Bạn chuyển trong một danh sách các số như bạn đã làm trước đây, cũng như một danh sách các nhãn. Sau đó, khi bạn chạy mã, bạn sẽ thấy biểu đồ hình tròn của mình:

Hình 40-4: Biểu đồ hình tròn matplotlib

Điều đó khá hay cho một đoạn mã ngắn như vậy. Nhưng bạn có thể làm cho biểu đồ hình tròn của bạn trông thậm chí còn tốt hơn. Tạo một tệp mới có tên Pie_chart_fancy.py và thêm mã này để xem cách: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

# pie_chart_fancy.py nhập matplotlib.pyplot dưới dạng plt def pie_chart []: number = [40, 35, 15, 10] nhãn = ['python', 'ruby', 'c ++', 'php'] # . f %% '] ax1.axis [' bằng '] plt.show [] nếu __name__ ==' __main__ ': pie_chart []

Đối với ví dụ này, bạn sử dụng tham số nổ để nói với biểu đồ hình tròn để khám phá ra hoặc loại bỏ một lát ra khỏi chiếc bánh. Trong trường hợp này, bạn loại bỏ lát cắt đầu tiên, tương ứng với Py Python. Bạn cũng thêm một cái bóng vào biểu đồ hình tròn. Bạn có thể nói với biểu đồ hình tròn của bạn để xoay một số độ nhất định ngược chiều kim đồng hồ bằng cách đặt startangle. Nếu bạn muốn hiển thị tỷ lệ phần trăm lát cắt, bạn có thể sử dụng AutoPCT, sẽ sử dụng cú pháp nội suy chuỗi Python. Khi bạn chạy mã này, biểu đồ hình tròn của bạn sẽ trông như thế này:

Hình 40-5: Biểu đồ hình tròn ưa thích của matplotlib

Có phải là gọn gàng không? Biểu đồ hình tròn của bạn bây giờ trông bóng bẩy hơn nhiều! Bây giờ, thời gian để học cách thêm nhãn vào các biểu đồ khác của bạn!

Thêm nhãn khi bạn đang vẽ dữ liệu, bạn thường muốn dán nhãn các trục. Bạn có thể gắn nhãn trục X bằng cách sử dụng hàm XLabel [] và bạn có thể dán nhãn Yaxis bằng cách sử dụng hàm YLabel [] tương ứng. Để xem cách thức hoạt động của nó, hãy tạo một tệp có tên Bar_chart_labels.py và thêm mã này vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

# Bar_chart_labels.py Nhập matplotlib.pyplot dưới dạng plt def bar_chart [số, nhãn, pos]: plt.bar [pos, số, color = 'blue'] plt.xticks [ticks = pos, nhãn = nhãn] plt.xlabel [ 'Loại xe'] plt.ylabel ['số lượng xe'] plt.show [] nếu __name__ == '__main__': số = [2, 1, 4, 6] nhãn = ['điện', 'năng lượng mặt trời', 'Diesel', 'Unleaded'] pos = list [phạm vi [4]] barb_chart [số, nhãn, pos]

Ở đây bạn gọi cả xlabel [] và ylabel [] và đặt chúng thành các chuỗi khác nhau. Điều này thêm một số văn bản giải thích bên dưới biểu đồ và bên trái của biểu đồ, tương ứng. Đây là kết quả trông như thế nào:

Hình 40-6: Biểu đồ thanh matplotlib với nhãn

Trông khá đẹp. Biểu đồ của bạn dễ hiểu hơn, nhưng nó thiếu một tiêu đề. Bạn sẽ học cách làm điều đó trong phần tiếp theo!

Thêm tiêu đề vào các lô thêm tiêu đề vào biểu đồ của bạn với matplotlib khá đơn giản. Trong thực tế, tất cả những gì bạn cần làm là sử dụng hàm Tiêu đề [] để thêm một. Để tìm hiểu làm thế nào, hãy tạo một tệp mới có tên Bar_chart_title.py và thêm mã này vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 18

# Bar_chart_title.py Nhập matplotlib.pyplot dưới dạng plt def bar_chart [số, nhãn, pos]: plt.bar [pos, [4, 5, 6, 3], color = 'green'] plt.bar [pos, số, color = 'blue'] plt.xticks [ticks = pos, nhãn = nhãn] plt.title ['gas được sử dụng trong các phương tiện khác nhau'] plt.xlabel ['loại xe'] plt.ylabel ['số lượng xe'] plt .show [] nếu __name__ == '__main__': số = [2, 1, 4, 6] nhãn = ['điện', 'năng lượng mặt trời', 'diesel', 'không chì'] pos = list [phạm vi [4] ] Bar_chart [số, nhãn, POS]

Thay đổi chính ở đây là trên dòng 9 nơi bạn gọi tiêu đề [] và chuyển trong một chuỗi. Điều này đặt tiêu đề cho biểu đồ và tập trung nó dọc theo đầu trang. Bạn có thể thay đổi vị trí một chút bằng cách đặt tham số LỘC thành bên trái, hoặc bên phải, nhưng bạn có thể chỉ định rằng tiêu đề ở bất cứ đâu trừ đầu. Ngoài ra còn có một tham số fontdict mà bạn có thể sử dụng để kiểm soát sự xuất hiện của phông chữ tiêu đề. Bạn cũng thêm một biểu đồ thanh mới vào biểu đồ. Điều này giúp bạn thấy một cốt truyện xếp chồng lên nhau trông như thế nào và cũng chuẩn bị cho bạn phần tiếp theo. Đây là những gì biểu đồ của bạn trông như bây giờ:

Hình 40-7: Biểu đồ thanh matplotlib có tiêu đề

Biểu đồ này trông thậm chí còn tốt hơn, nhưng nó vẫn thiếu một cái gì đó. Ồ! Bạn cần một huyền thoại! Hãy cùng tìm hiểu làm thế nào để làm điều đó tiếp theo.

Tạo một truyền thuyết Việc thêm một huyền thoại vào biểu đồ matplotlib của bạn cũng rất đơn giản. Bạn sẽ sử dụng hàm Legend [] để thêm một. Tạo một tệp mới có tên Bar_chart_legend.py. Sau đó, thêm mã này vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 18

# Bar_chart_legend.py Nhập matplotlib.pyplot dưới dạng plt def bar_chart [số, nhãn, pos]: plt.bar [pos, [4, 5, 6, 3], color = 'green'] plt.bar [pos, số, color = 'blue'] plt.xticks [ticks = pos, nhãn = nhãn] plt.xlabel ['loại xe'] plt.ylabel ['số lượng xe'] plt.legend [['nhãn thứ nhất', 'nhãn thứ hai '], loc =' phía trên bên trái '] plt.show [] nếu __name__ ==' __main__ ': số = [2, 1, 4, 6] nhãn = [' điện ',' mặt trời ',' diesel ',' Không chì '] pos = list [phạm vi [4]] barb_chart [số, nhãn, pos]

Ở đây bạn thêm một Legend [] ngay trước khi bạn hiển thị [] biểu đồ. Khi bạn tạo một huyền thoại, bạn có thể đặt nhãn bằng cách truyền trong danh sách các chuỗi. Danh sách sẽ phù hợp với số lượng lô trong biểu đồ của bạn. Bạn cũng có thể đặt vị trí của truyền thuyết bằng cách sử dụng tham số LỘC. Khi bạn chạy mã này, bạn sẽ thấy biểu đồ của mình được cập nhật để trông như thế này:

Hình 40-8: Biểu đồ thanh matplotlib với huyền thoại

Bây giờ biểu đồ của bạn có tất cả các thành phần bình thường mà bạn mong đợi có trong một biểu đồ. Tại thời điểm này, bạn đã thấy rất nhiều nhiệm vụ bạn có thể hoàn thành bằng cách sử dụng matplotlib. Chủ đề cuối cùng để tìm hiểu là làm thế nào để thêm nhiều hình với matplotlib.

Hiển thị nhiều hình Matplotlib cho phép bạn tạo một số lô trước khi bạn hiển thị chúng. Điều này cho phép bạn làm việc với nhiều bộ dữ liệu cùng một lúc. Có một số cách khác nhau bạn có thể làm điều này. Bạn sẽ xem xét một trong những cách đơn giản nhất để làm như vậy. Tạo một tệp mới có tên nhiều_figures.py và thêm mã này: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

# nhiều_figures.py Nhập matplotlib.pyplot dưới dạng plt def line_plot [số, số2]: first_plot = plt.figure [1] plt.plot [số] second_plot = plt.figure [2] plt.plot [số2] plt.show [ ] nếu __name__ == '__main__': number = [2, 4, 1, 6] more_numbers = [5, 1, 10, 3] line_plot [số, more_numbers]

Ở đây bạn tạo hai lô dòng. Trước khi bạn vẽ, bạn gọi Hình [], tạo ra một thùng chứa cấp cao nhất cho các lô theo sau nó được gọi. Do đó, biểu đồ thứ nhất được thêm vào Hình một và biểu đồ thứ hai mà nó được thêm vào Hình 2. Khi bạn gọi cho Show [] ở cuối, Matplotlib sẽ mở hai cửa sổ với mỗi biểu đồ được hiển thị riêng. Chạy mã và bạn sẽ thấy hai cửa sổ sau trên máy của bạn:

Hình 40-10: Matplotlib nhiều hình

Matplotlib cũng hỗ trợ thêm hai hoặc nhiều lô vào một cửa sổ. Để xem cách thức hoạt động, hãy tạo một tệp mới khác và đặt tên cho cái này multo_plots.py. Để làm cho mọi thứ thú vị hơn, bạn sẽ sử dụng Numpy trong ví dụ này để tạo ra hai lô. Lưu ý: Nếu bạn đã trú ẩn, bạn sẽ cần cài đặt Numpy để làm cho ví dụ này hoạt động. Ví dụ này dựa trên một từ tài liệu Matplotlib: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 18

# nhiều_plots.py Nhập matplotlib.pyplot dưới dạng nhập PLT Numpy như NP def nhiều_plots []: # Một số dữ liệu ví dụ để hiển thị x = np.linspace [0, 2 * np.pi, 400] y = np.sin [x ** 2] Hình, axs = plt.subplots [2] fig.suptitle ['Subplots được xếp theo chiều dọc'] AXS [0] .plot [X, Y] Nếu __name__ == '__main__': nhiều_plots []

Ở đây bạn tạo ra số tiền cho hai biểu đồ sóng hình sin riêng biệt. Để làm cho cả hai hiển thị trong cùng một cửa sổ, bạn sử dụng một cuộc gọi đến Subplots [], đây là một tiện ích tiện dụng để tạo nhiều hình trong một cuộc gọi. Bạn

Sau đó, có thể sử dụng đối tượng trục mà nó trả về để vẽ dữ liệu bạn đã tạo bằng Numpy. Kết quả kết thúc trông như thế này:

Hình 40-10: Sơ đồ xếp chồng lên chồng Matplotlib

Nếu bạn không muốn sử dụng Numpy, bạn có thể vẽ hai bộ số từ ví dụ trước. Trong thực tế, bạn nên thử điều đó. Đi trước và tạo một tệp mới có tên là nhiều_plots2.py và thêm mã này: 1 # multo_plots2.py 2 3 Nhập matplotlib.pyplot như PLT 4 5 def đa =. More_numbers] 12 plt.show [] 13

14 Nếu __name__ == '__main__': 15 multo_plots []

Trong mã này, bạn xóa hoàn toàn mã Numpy và thêm hai danh sách các số khỏi ví dụ trước. Sau đó, bạn vẽ chúng bằng cách sử dụng đối tượng trục. Điều này dẫn đến cốt truyện xếp chồng sau:

Hình 40-11: Các âm mưu xếp chồng lên nhau mà không bị numpy

Tại thời điểm này, bạn nên có một xử lý khá tốt về cách tạo ra nhiều hình và các lô xếp chồng với matplotlib.

Kết thúc matplotlib là một gói tuyệt vời mà bạn có thể sử dụng để tạo ra tất cả các loại đồ thị gọn gàng. Thật tuyệt vời khi bạn cần viết một vài dòng mã để tạo ra một cốt truyện hữu ích từ dữ liệu của bạn. Trong chương này, bạn đã tìm hiểu về các chủ đề sau: Tạo biểu đồ dòng đơn giản với Pyplot tạo biểu đồ thanh tạo biểu đồ hình tròn thêm nhãn thêm tiêu đề để tạo ra một huyền thoại hiển thị nhiều hình nơi đây. Bạn có thể tạo nhiều loại trực quan khác với matplotlib. Có một gói mới hơn được gọi là Seaborn được xây dựng trên đỉnh của matplotlib và làm cho đồ thị của nó trông thậm chí còn đẹp hơn. Ngoài ra còn có nhiều gói đồ thị hoàn toàn riêng biệt khác cho Python. Bạn sẽ thấy rằng Python có hỗ trợ cho hầu hết mọi loại đồ thị mà bạn có thể nghĩ ra và có lẽ nhiều người bạn không biết đã tồn tại.

Xem lại câu hỏi 1. Bạn sử dụng mô -đun nào trong matplotlib để tạo lô? 2. Làm thế nào để bạn thêm một nhãn vào trục x của âm mưu? 3. Bạn sử dụng chức năng nào để tạo tiêu đề và truyền thuyết cho các lô?

Chương 41 - Cách làm việc với hình ảnh trong Python Thư viện hình ảnh Python [PIL] là gói Python của bên thứ 3, bổ sung khả năng xử lý hình ảnh cho trình thông dịch Python của bạn. Nó cho phép bạn xử lý ảnh và thực hiện nhiều thao tác tệp hình ảnh phổ biến. Phiên bản hiện tại của phần mềm này nằm ở Pillow, là một cái nĩa của PIL gốc để hỗ trợ Python 3. Một số gói Python khác, như WxPython và Báo cáo, sử dụng gối để hỗ trợ tải nhiều loại tệp hình ảnh khác nhau. Bạn có thể sử dụng Gối cho một số trường hợp sử dụng bao gồm các trường hợp sau: Xử lý hình ảnh Lưu trữ hình ảnh Hiển thị hình ảnh Batch qua Tkinter Trong chương này, bạn sẽ tìm hiểu cách thực hiện như sau với gối: Mở hình ảnh cắt hình ảnh bằng các bộ lọc thêm đường viền thay đổi kích thước hình ảnh khi bạn có thể Xem, gối có thể được sử dụng cho nhiều loại xử lý hình ảnh. Những hình ảnh được sử dụng trong chương này là một số tác giả đã tự chụp. Chúng được bao gồm trong các ví dụ mã trên GitHub. Xem phần giới thiệu để biết thêm chi tiết. Bây giờ hãy để bắt đầu bằng cách cài đặt gối!

Cài đặt gối lắp đặt gối rất dễ thực hiện với PIP. Đây là cách bạn sẽ làm điều đó sau khi mở một cửa sổ thiết bị đầu cuối hoặc bảng điều khiển: 1 python -m pip cài đặt gối

Bây giờ gối đó đã được cài đặt, bạn đã sẵn sàng để bắt đầu sử dụng nó!

Mở hình ảnh gối cho phép bạn mở và xem nhiều loại tệp khác nhau. Để biết danh sách đầy đủ các loại tệp hình ảnh hỗ trợ gối, xem phần sau: //pillow.readthedocs.io/en/stable/handbook/image-fileformats.html Bạn có thể sử dụng gối để mở và xem bất kỳ tệp nào Các loại được đề cập trong phần Định dạng được hỗ trợ đầy đủ của người Viking tại liên kết ở trên. Trình xem được tạo bằng tkinter và hoạt động theo cách tương tự như matplotlib làm khi nó hiển thị một biểu đồ. Để xem cách thức hoạt động của nó, hãy tạo một tệp mới có tên open_image.py và nhập mã sau: 1 2 3 4 5 6

# open_image.py từ hình ảnh nhập nhập PIL = Image.open ['sứa.jpg'] Image.Show []

Ở đây bạn nhập hình ảnh từ gói PIL. Sau đó, bạn sử dụng Image.open [] để mở một hình ảnh. Điều này sẽ trả về một đối tượng Pil.JpegImagePlugin.jpegImageFile mà bạn có thể sử dụng để tìm hiểu thêm về hình ảnh của mình. Khi bạn chạy mã này, bạn sẽ thấy một cửa sổ tương tự như sau:

Hình 41-1: Hiển thị hình ảnh với gối

Điều này khá tiện dụng vì bây giờ bạn có thể xem hình ảnh của mình bằng Python mà không cần viết toàn bộ giao diện người dùng đồ họa. Bạn cũng có thể sử dụng gối để tìm hiểu thêm về hình ảnh của bạn. Tạo một tệp mới có tên get_image_info.py và thêm mã này vào nó: 1 2 3 4 5 6 7 8 9 10 11 12

# get_image_info.py từ PIL Nhập hình ảnh def get_image_info [path]: Image = Image.open [path] in [f'this hình ảnh là {Image.width} x {Image.Height} '] [exif] nếu __name__ == '__main__':

Ở đây bạn có được chiều rộng và chiều cao của hình ảnh bằng cách sử dụng đối tượng hình ảnh. Sau đó, bạn sử dụng phương thức _getExif [] để lấy siêu dữ liệu về hình ảnh của bạn. EXIF là viết tắt của định dạng tệp hình ảnh có thể trao đổi và là một tiêu chuẩn chỉ định các định dạng cho hình ảnh, âm thanh và thẻ phụ trợ được sử dụng bởi máy ảnh kỹ thuật số. Đầu ra khá dài dòng, nhưng bạn có thể học từ dữ liệu đó

Bức ảnh đặc biệt này được chụp bằng máy ảnh Sony 6300 với các cài đặt sau: E E 18-200mm F3.5-6.3 OSS LE. Dấu thời gian cho bức ảnh cũng nằm trong thông tin EXIF. Tuy nhiên, dữ liệu EXIF ​​có thể được thay đổi nếu bạn sử dụng phần mềm chỉnh sửa ảnh để cắt, áp dụng các bộ lọc hoặc thực hiện các loại thao tác hình ảnh khác. Điều này có thể xóa một phần hoặc tất cả các dữ liệu EXIF. Hãy thử chạy chức năng này trên một số ảnh của riêng bạn và xem những loại thông tin bạn có thể trích xuất! Một thông tin thú vị khác mà bạn có thể trích xuất từ ​​hình ảnh là dữ liệu biểu đồ của nó. Biểu đồ của một hình ảnh là một biểu diễn đồ họa của các giá trị âm của nó. Nó cho bạn thấy độ sáng của ảnh dưới dạng danh sách các giá trị mà bạn có thể vẽ đồ thị. Hãy để sử dụng hình ảnh này làm ví dụ:

Hình 41-2: Một con bướm vui vẻ

Để có được biểu đồ từ hình ảnh này, bạn sẽ sử dụng phương thức biểu đồ hình ảnh []. Sau đó, bạn sẽ sử dụng matplotlib [xem chương cuối] để vẽ nó ra. Để xem một cách mà bạn có thể làm điều đó, hãy tạo một tệp mới có tên get_histrogram.py và thêm mã này vào nó: 1 # get_histrogram.py 2 3

6 7 def get_image_histrogram [đường dẫn]: 8 IMAGE.OPEN.OPEN [PATH] 9 Biểu đồ = Image.histogram [] 10 plt.hist [Biểu đồ, Bins = Len [Biểu đồ]] 11 plt.xlabel ['Biểu đồ'] .Show [] 13 14 nếu __name__ == '__main__': 15 get_image_histrogram ['Butterfly.jpg']

Khi bạn chạy mã này, bạn mở hình ảnh như trước. Sau đó, bạn trích xuất biểu đồ từ nó và chuyển danh sách các giá trị cho đối tượng matplotlib của bạn nơi bạn gọi hàm hist []. Hàm Hist [] có trong danh sách các giá trị và số lượng các thùng có độ rộng bằng nhau trong phạm vi của các giá trị. Khi bạn chạy mã này, bạn sẽ thấy biểu đồ sau:

Hình 41-3: Biểu đồ của con bướm

Biểu đồ này cho bạn thấy các giá trị âm trong hình ảnh đã được đề cập trước đó. Bạn có thể thử chuyển qua một số hình ảnh khác được bao gồm trên GitHub

Để xem các biểu đồ khác nhau hoặc hoán đổi trong một số hình ảnh của riêng bạn để xem biểu đồ của chúng. Bây giờ, hãy để khám phá cách bạn có thể sử dụng gối để cắt hình ảnh!

Hình ảnh cắt xén khi bạn đang chụp ảnh, tất cả quá thường xuyên, chủ đề của bức ảnh sẽ di chuyển hoặc bạn đã phóng to đủ xa. Điều này dẫn đến một bức ảnh mà trọng tâm của hình ảnh thực sự là trung tâm. Để khắc phục sự cố này, bạn có thể cắt hình ảnh thành phần đó của hình ảnh mà bạn muốn làm nổi bật. Gối có chức năng này tích hợp. Để xem nó hoạt động như thế nào, hãy tạo một tệp có tên cắt xén và thêm mã sau vào nó: 1 2 3 4 5 6 7 8 9 10 11

# cropping.py từ PIL Nhập hình ảnh def crop_image [path, cropped_path]: Image = Image.open [Path] crop '__main__': crop_image ['ducks.jpg', 'ducks_cropped.jpg']]

Hàm crop_image [] đi theo đường dẫn của tệp mà bạn muốn cắt cũng như đường dẫn đến tệp bị cắt mới. Sau đó, bạn mở [] tệp như trước và gọi crop []. Phương pháp này lấy tọa độ X/Y bắt đầu và kết thúc mà bạn đang sử dụng để cắt cùng. Bạn đang tạo một hộp được sử dụng để cắt xén. Hãy để chụp ảnh thú vị này về những con vịt và thử cắt nó bằng mã ở trên:

Hình 41-4: Vịt em bé

Bây giờ khi bạn chạy mã chống lại điều này, bạn sẽ kết thúc với hình ảnh bị cắt sau:

Hình 41-5: Vịt bé bị cắt

Các tọa độ bạn sử dụng để cắt với Will thay đổi theo ảnh. Trên thực tế, có lẽ bạn nên thay đổi mã này để nó chấp nhận tọa độ cây trồng làm đối số. Bạn có thể tự làm điều đó như một bài tập về nhà nhỏ. Phải mất một số thử nghiệm và lỗi để tìm ra hộp giới hạn cây trồng để sử dụng. Bạn có thể sử dụng một công cụ như GIMP để giúp bạn bằng cách vẽ một hộp giới hạn với GIMP và lưu ý các tọa độ mà nó cung cấp cho bạn để thử với gối. Bây giờ, hãy để di chuyển và tìm hiểu về việc áp dụng các bộ lọc vào hình ảnh của bạn!

Sử dụng Bộ lọc Gói Gối có một số bộ lọc mà bạn có thể áp dụng cho hình ảnh của mình. Đây là những bộ lọc hiện tại được hỗ trợ: chi tiết độ lệch mờ Edge_enhance edge_enhance_more bệbs_edges làm sắc nét Smooth_more, hãy sử dụng hình ảnh bướm từ trước để thử nghiệm một vài bộ lọc này. Đây là hình ảnh bạn sẽ sử dụng:

Hình 41-6: Một con bướm vui vẻ

Bây giờ bạn có một hình ảnh để sử dụng, hãy tiếp tục và tạo một tệp mới có tên Blur.py và thêm mã này vào nó để thử bộ lọc Blur Pillow:

1 2 3 4 5 6 7 8 9 10 11 12

# blur.py từ PIL Nhập hình ảnh từ PIL Nhập ImageFilter def Blur [Path, Modified_Photo]: Image = Image.open [Path] blurred_image = Image.filter [ImageFilter.Blur] ': Blur [' Butterfly.jpg ',' Butterfly_blurred.jpg ']]

Để thực sự sử dụng bộ lọc trong gối, bạn cần nhập ImageFilter. Sau đó, bạn chuyển trong bộ lọc cụ thể mà bạn muốn sử dụng cho phương thức Filter []. Khi bạn gọi bộ lọc [], nó sẽ trả về một đối tượng hình ảnh mới. Sau đó, bạn lưu tệp đó vào đĩa. Đây là hình ảnh mà bạn sẽ nhận được khi bạn chạy mã:

Hình 41-7: Một con bướm mờ

Trông có vẻ mờ, vì vậy bạn có thể coi đây là một thành công! Nếu bạn muốn nó thậm chí còn mờ hơn, bạn có thể chạy ảnh mờ trở lại thông qua kịch bản của bạn lần thứ hai. Tất nhiên, đôi khi bạn chụp ảnh hơi mờ và bạn muốn mài chúng lên một chút. Gối bao gồm đó như một bộ lọc bạn có thể áp dụng dưới dạng

Tốt. Tạo một tệp mới có tên là Sharpen.py và thêm mã này: 1 2 3 4 5 6 7 8 9 10 11 12

# Sharpen.py từ PIL Nhập hình ảnh từ PIL Nhập ImageFilter def Sharpen [Path, Modified_Photo]: Image = Image.open [Path] Sharped_image = Image.Filter [ImageFilter.SharPen] Sharped_image.save [Modified_Photo] nếu __name__ == ' ': Sharpen [' Butterfly.jpg ',' Butterfly_sharper.jpg ']]

Tại đây, bạn chụp ảnh bướm ban đầu và áp dụng bộ lọc mài cho nó trước khi tiết kiệm nó. Khi bạn chạy mã này, kết quả của bạn sẽ trông như thế này:

Hình 41-8: Một con bướm sắc nét hơn

Tùy thuộc vào thị lực của bạn và chất lượng màn hình của bạn, bạn có thể hoặc không thể thấy nhiều sự khác biệt ở đây. Tuy nhiên, bạn có thể yên tâm rằng nó hơi sắc nét hơn. Bây giờ, hãy để tìm hiểu làm thế nào bạn có thể thêm đường viền vào hình ảnh của mình!

Thêm biên giới một cách để làm cho ảnh của bạn trông chuyên nghiệp hơn là thêm đường viền cho chúng. Gối làm cho điều này khá dễ thực hiện thông qua mô -đun ImageOps của họ. Nhưng trước khi bạn có thể thực hiện bất kỳ biên giới nào, bạn cần một hình ảnh. Đây là một trong những bạn sẽ sử dụng:

Hình 41-9: Một con bướm khác

Bây giờ bạn có một hình ảnh đẹp để chơi xung quanh, hãy tiếp tục và tạo một tệp có tên Border.py và đặt mã này vào đó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 18

# Border.py từ PIL Nhập hình ảnh, ImageOps def add_border [input_image, output_image, biên giới]: img = Image.open [input_image] If isInstance [Border, int] hoặc isinstance [Border, tuple] , Border = Border] Khác: Tăng RunTimEError ['Border không phải là một số nguyên hay tuple!']

19 20

ADD_BORDER [IN_IMG, OUTPUT_IMAGE = 'Butterfly_border.jpg', Border = 100]

Hàm add_bonder [] có trong 3 đối số: input_image - hình ảnh bạn muốn thêm đường viền vào output_image - hình ảnh có đường viền biên giới mới - lượng đường viền để áp dụng trong pixel

Trong mã này, bạn nói với Gối rằng bạn muốn thêm đường viền 100 pixel vào bức ảnh mà bạn đi vào. Khi bạn vượt qua số nguyên, số nguyên đó được sử dụng cho đường viền ở cả bốn phía. Màu mặc định của đường viền là màu đen. Phương thức chính ở đây là Mở rộng [], có trong đối tượng hình ảnh và số lượng biên giới. Khi bạn chạy mã này, bạn sẽ kết thúc với kết quả đáng yêu này:

Hình 41-10: Bướm có biên giới

Bạn có thể vượt qua trong một bộ giá trị để làm cho đường viền có chiều rộng khác nhau. Ví dụ: nếu bạn đã vượt qua [10, 50], điều đó sẽ thêm đường viền 10 pixel ở bên trái và bên phải của hình ảnh và đường viền 50 pixel lên trên cùng và

đáy. Hãy thử làm điều đó với mã ở trên và chạy lại nó. Nếu bạn làm như vậy, bạn sẽ nhận được như sau:

Hình 41-11: Bướm có đường viền có chiều rộng khác nhau

Có phải là tốt không? Nếu bạn muốn nhận được thực sự lạ mắt, bạn có thể vượt qua các giá trị khác nhau cho cả bốn mặt của hình ảnh. Nhưng có lẽ có rất nhiều trường hợp sử dụng nơi đó có ý nghĩa. Có một đường viền màu đen là tốt đẹp và tất cả, nhưng đôi khi bạn sẽ muốn thêm một chút pizazz vào hình ảnh của bạn. Bạn có thể thay đổi màu đường viền đó bằng cách chuyển trong đối số điền để mở rộng []. Đối số này có một màu được đặt tên hoặc màu RGB. Tạo một tệp mới có tên colored_bardder.py và thêm mã này vào nó: 1 # colored_border.py 2 3 từ hình ảnh nhập PIL, ImageOps 4 5 def add_border [input_image, output_image, border, color = 0]: 6 img = Image.open .

14 MSG = 'Border không phải là một số nguyên hay tuple!' 15 Nâng cao RunTimEError [MSG] 16 17 Bimg.Save [Output_Image] 18 19 nếu __name__ == ' 100, 25 màu = 'Ấn Độ']]

Bây giờ hàm add_border [] của bạn có một đối số màu, mà bạn chuyển sang phương thức mở rộng []. Khi bạn chạy mã này, bạn sẽ thấy điều này cho kết quả của mình:

Hình 41-12: Bướm có đường viền màu

Trông trông khá đẹp. Bạn có thể thử nghiệm xung quanh với các màu khác nhau hoặc áp dụng màu yêu thích của riêng bạn làm biên giới. Mục tiếp theo trong chuyến tham quan gối của bạn là tìm hiểu cách thay đổi kích thước hình ảnh!

Thay đổi kích thước hình ảnh thay đổi kích thước hình ảnh với gối khá đơn giản. Bạn sẽ sử dụng phương thức Resize [] có trong một số nguyên được sử dụng để thay đổi kích thước hình ảnh. Để xem nó hoạt động như thế nào, bạn sẽ sử dụng bức ảnh đáng yêu của một con thằn lằn:

Hình 41-13: Lizard trên tường

Bây giờ bạn có một bức ảnh, hãy tiếp tục và tạo một tệp mới có tên resize_image.py và đặt mã này vào đó: 1 # resize_image.py 2 3 từ PIL Nhập hình ảnh 4 5 Def Resize_image [input_image_path, output_image_path, kích thước] = Image.open [input_image_path] 7 chiều rộng, chiều cao = gốc_image.size 8 in [f'the kích thước hình ảnh gốc là {width} rộng x {height} '

9 f'high '] 10 11 resized_image = gốc_image. resized_image.show [] 16 resized_image.save [output_image_path] 17 18 nếu __name__ == '__main__': 19 resize_image [20 input_image_path = 'lizard.jpg', 21 output_image ], 23]

Tại đây, bạn vượt qua trong ảnh thằn lằn và bảo Pillow thay đổi kích thước thành 600 x 400. Khi bạn chạy mã này, đầu ra sẽ cho bạn biết rằng ảnh gốc là 1191 x 1141 pixel trước khi nó thay đổi kích thước cho bạn. Kết quả của việc chạy mã này trông như thế này: Hình 41-14: Lizard thay đổi kích thước

Hình 41-14: Thằn lằn thay đổi kích thước

Vâng, điều đó có vẻ hơi kỳ quặc! Gối không thực sự làm bất kỳ tỷ lệ nào khi nó thay đổi kích thước hình ảnh. Thay vào đó, gối sẽ kéo dài hoặc mâu thuẫn hình ảnh của bạn để phù hợp với các giá trị bạn bảo nó sử dụng. Những gì bạn muốn làm là mở rộng hình ảnh. Để thực hiện công việc đó, bạn cần tạo một tệp mới có tên scale_image.py và thêm một số mã mới vào nó.

Tại đây, mã bạn cần: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 40

# scale_image.py từ nhập hình ảnh nhập pil def scale_image [input_image_path, output_image_path, width = none, height = none]: gốc_image = Image.open [input_image_path] w, h = gốc_image. } rộng x {h} '' cao '] nếu chiều rộng và chiều cao: max_size = [chiều rộng, chiều cao] elif width: max_size = [chiều rộng, h] elif chiều cao: max_size = [w, chiều cao] Yêu cầu tăng giá trị ['chiều rộng hoặc chiều cao yêu cầu!'] gốc_image.thumbnail [max_size, Image.antialias] gốc_image.save [output_image_path] scale_image = Image. Kích thước là {width} rộng x {height} '' cao '] nếu __name__ ==' __main__ ': scale_image [input_image_path =' lizard.jpg ', output_image_path =' lizard_scaled.jpg ', width = 800,]

Lần này, bạn cho phép người dùng chỉ định cả chiều rộng và chiều cao. Nếu người dùng chỉ định chiều rộng, chiều cao hoặc cả hai, thì câu lệnh có điều kiện sử dụng thông tin đó để tạo MAX_SIZE. Khi nó có giá trị MAX_SIZE được tính toán, bạn chuyển nó sang hình thu nhỏ [] và lưu kết quả. Nếu người dùng chỉ định cả hai giá trị, hình thu nhỏ [] sẽ duy trì tỷ lệ khung hình một cách chính xác khi thay đổi kích thước. Khi bạn chạy mã này, bạn sẽ thấy rằng kết quả là phiên bản nhỏ hơn của hình ảnh gốc và hiện nó vẫn duy trì tỷ lệ khung hình của nó.

Ghép gối lên rất hữu ích để làm việc với hình ảnh bằng Python. Trong chương này, bạn đã học được cách thực hiện như sau: hình ảnh mở hình ảnh sử dụng các bộ lọc Thêm đường viền kích thước kích thước hình ảnh Bạn có thể làm nhiều hơn với gối so với những gì được hiển thị ở đây. Ví dụ, bạn có thể thực hiện các cải tiến hình ảnh khác nhau, như thay đổi độ tương phản hoặc độ sáng của hình ảnh. Hoặc bạn có thể tổng hợp nhiều hình ảnh với nhau. Có nhiều ứng dụng khác mà bạn có thể sử dụng gối cho. Bạn chắc chắn nên kiểm tra gói ra và đọc tài liệu của nó để tìm hiểu thêm.

Xem lại câu hỏi 1. Làm thế nào để bạn có được chiều rộng và chiều cao của một bức ảnh bằng gối? 2. Bạn sử dụng phương pháp nào để áp dụng đường viền cho hình ảnh? 3. Làm thế nào để bạn thay đổi kích thước một hình ảnh với gối trong khi duy trì tỷ lệ khung hình của nó?

Chapter 42 - How to Create a Graphical User Interface When you first get started as a programmer or software developer, you usually start by writing code that prints to your console or standard out. A lot of students are also starting out by writing front-end programs, which are typically websites written with HTML, JavaScript and CSS. However, most beginners do not learn how to create a graphical user interface until much later in their classwork. Graphical user interfaces [GUI] are programs that are usually defined as created for the desktop. The desktop refers to Windows, Linux and MacOS. It could be argued that GUIs are also created for mobile and web as well though. For the purposes of this chapter, you will learn about creating desktop GUIs. The concepts you learn in this chapter can be applied to mobile and web development to some degree as well. A graphical user interface is made up of some kind of window that the user interacts with. The window holds other shapes inside it. These consist of buttons, text, pictures, tables, and more. Collectively, these items are known as “widgets”. There are many different GUI toolkits for Python. Here is a list of some of the most popular: Tkinter wxPython PyQt Kivy You will be learning about wxPython in this chapter. The reason that wxPython was chosen is that the author has more experience with it than any other and wxPython has a very friendly and helpful community.

In this chapter, you will be learning: Learning About Event Loops How to Create Widgets How to Lay Out Your Application How to Add Events How to Create an Application This chapter does not attempt to cover everything there is to know about wxPython. However, you will learn enough to see the power of wxPython as well as discover how much fun it is to create a desktop GUI of your very own. Note: Some of the examples in this chapter come from my book, Creating GUI Applications with wxPython. Let’s get started!

Installing wxPython Installing wxPython is usually done with pip. If you are installing on Linux, you may need to install some prerequisites before installing wxPython. You can see the most up-to-date set of requirements on the wxPython Github page here: //github.com/wxWidgets/Phoenix#prerequisites On Mac OSX, you may need the XCode compiler to install wxPython. Here is the command you would use to install wxPython using pip: 1 python -m pip install wxpython

Assuming everything worked, you should now be able to use wxPython!

Learning About Event Loops Before you get started, there is one other item that you need to know about. In the introduction, you learned what widgets are. But when it comes to creating GUI programs, you need to understand that they use events to tell the GUI what to do. Unlike a command-line application, a GUI is basically an infinite loop, waiting for the user to do something, like click a button or press a key on the keyboard. When the user does something like that, the GUI receives an event. Button events are usually connected to wx.EVT_BUTTON, for example. Some books call this event-driven programming. The overarching process is called the event loop. You can think of it like this: 1. The GUI waits for the user to do something 2. The user does something [clicks a button, etc] 3. The GUI responds somehow 4. Go back to step 1 The user can stop the event loop by exiting the program. Now that you have a basic understanding of event loops, it’s time to learn how to write a simple prototype application!

How to Create Widgets Widgets are the building blocks of your application. You start out with toplevel widgets, such as a wx.Frame or a wx.Dialog. These widgets can contain other widgets, like buttons and labels. When you create a frame or dialog, it includes a title bar and the minimize, maximize, and exit buttons. Note that when using wxPython, most widgets and attributes are pre-fixed with wx. To see how this all works, you should create a little “Hello World” application. Go ahead and create a new file named hello_wx.py and add this code to it: 1 2 3 4 5 6 7 8

# hello_wx.py import wx app = wx.App[False] frame = wx.Frame[parent=None, title='Hello World'] frame.Show[] app.MainLoop[]

Here you import wx, which is how you access wxPython in your code. Then you create an instance of wx.App[], which is your Application object. There can only be one of these in your application. It creates and manages your event loop for you. You pass in False to tell it not to redirect standard out. If you set that to True, then standard out is redirected to a new window. This can be useful when debugging, but should be disabled in production applications. Next, you create a wx.Frame[] where you set its parent to None. This tells wxPython that this frame is a top-level window. If you create all your frames without a parent, then you will need to close all the frames to end the program. The other parameter that you set is the title, which will appear along the top of your application’s window. The next step is to Show[] the frame, which makes it visible to the user. Finally, you call MainLoop[] which starts the event loop and makes your application work. When you run this code, you should see something like this:

Hình 42-1: Xin chào Thế giới trong Wxpython

Khi làm việc với wxpython, bạn thực sự sẽ là lớp phụ wx.frame và khá nhiều trong số các tiện ích khác. Tạo một tệp mới có tên hello_wx_class.py và đặt mã này vào đó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

# hello_wx_gr wx.App [false] frame = myFrame [] frame.show [] app.mainloop []

Mã này làm điều tương tự như ví dụ trước, nhưng lần này bạn đang tạo phiên bản của lớp WX.Frame của riêng mình. Khi bạn tạo một ứng dụng có nhiều tiện ích trong đó, bạn hầu như sẽ luôn có wx.panel là tiện ích con duy nhất của WX.Frame. Sau đó, tiện ích wx.panel được sử dụng để chứa các tiện ích khác. Lý do cho điều này là WX.Panel cung cấp khả năng tab giữa các tiện ích, đó là thứ không hoạt động nếu bạn tạo ra tất cả các trẻ em của WX.Frame.

Vì vậy, đối với một ví dụ cuối cùng của Hello Hello World, bạn có thể thêm một wx.panel vào hỗn hợp. Tạo một tệp có tên hello_with_panel.py và thêm mã này: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

# hello_with_panel.py Nhập WX Class MyPanel [wx.panel]: def __init __ [self, cha mẹ]: super []. Khung]: def __init __ [self]: super [] .__ init __ [none, title = 'hello world'] panel = myPanel [self] self.show [] nếu __name__ == '__main__' = False] frame = myFrame [] app.mainloop []

Trong mã này, bạn tạo hai lớp. Một lớp phụ wx.panel và thêm một nút vào nó bằng wx.button. Lớp myFrame [] gần giống như ví dụ trước ngoại trừ bây giờ bạn tạo một thể hiện của mypanel [] trong đó. Lưu ý rằng bạn đang chuyển bản thân cho my panel [], đang nói với WxPython rằng khung hiện là cha mẹ của tiện ích bảng điều khiển. Khi bạn chạy mã này, bạn sẽ thấy ứng dụng sau xuất hiện:

Hình 42-2: Hello World in wxpython với wx.panel

Ví dụ này cho thấy khi bạn thêm một tiện ích trẻ em, giống như một nút, nó sẽ tự động xuất hiện ở phía trên bên trái của ứng dụng. Wx.Panel là một ngoại lệ khi nó là tiện ích con duy nhất của WX.Frame. Trong trường hợp đó, wx.panel sẽ tự động mở rộng để điền vào wx.frame. Bạn nghĩ gì xảy ra nếu bạn thêm nhiều widget vào bảng điều khiển? Hãy cùng tìm hiểu! Tạo một tệp mới có tên Stacked_buttons.py và thêm mã này: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

# xếp chồng_buttons.py Nhập Wx Class MyPanel [wx.panel]: def __init __ [self, cha mẹ]: super []. . 'Hello World'] Bảng điều khiển = MyPanel [self] self.show [] nếu __name__ == '__main__': app = wx.app [redirect = false] frame = myFrame [] app.mainloop []

Bây giờ bạn có ba nút là con của bảng điều khiển. Hãy thử chạy mã này để xem điều gì sẽ xảy ra:

Hình 42-3: Các nút xếp chồng lên nhau

Ối! Bạn chỉ nhìn thấy một nút, đó là cái cuối cùng bạn tạo ra. Chuyện gì đã xảy ra ở đây? Bạn đã nói với các nút đi đâu, vì vậy tất cả chúng đều đi đến vị trí mặc định, đó là góc trên bên trái của tiện ích. Về bản chất, các vật dụng hiện được xếp chồng lên nhau. Hãy để tìm hiểu làm thế nào bạn có thể khắc phục sự cố đó trong phần tiếp theo!

Cách đưa ra ứng dụng của bạn, bạn có hai tùy chọn khi đưa ra ứng dụng của bạn: Các kẻ giết người định vị tuyệt đối Trong hầu hết các trường hợp, bạn sẽ muốn sử dụng các kẻ nói. Nếu bạn muốn sử dụng định vị tuyệt đối, bạn có thể sử dụng tham số Widget POS POS và cung cấp cho nó một bộ xử lý chỉ định tọa độ X và Y để đặt tiện ích. Định vị tuyệt đối có thể hữu ích khi bạn cần định vị hoàn hảo pixel của các widget. Tuy nhiên, khi bạn sử dụng định vị tuyệt đối, các vật dụng của bạn không thể thay đổi kích thước hoặc di chuyển khi cửa sổ chúng được thay đổi kích thước. Chúng là tĩnh tại thời điểm đó. Giải pháp cho những vấn đề đó là sử dụng các kẻ nói. Họ có thể xử lý cách các vật dụng của bạn nên thay đổi kích thước và điều chỉnh khi kích thước ứng dụng được thay đổi. Có một số người dùng khác nhau mà bạn có thể sử dụng, chẳng hạn như wx.boxsizer, wx.gridsizer, v.v. Tài liệu WxPython giải thích cách chúng hoạt động chi tiết ở đây: //docs.wxpython.org/sizers_overview.html Hãy để lấy mã đó từ trước và giảm xuống thành hai nút và thêm một sizer. Tạo một tệp mới có tên Sizer_With_TWO_WIDGETS.PY và đặt mã này vào đó: 1 # sizer_with_two_widgets.py 2 3 Nhập WX 4 5 Lớp MyPanel [wx.panel]: 6 7 def __init __ [self, cha mẹ]: 8 Super [] . .Add [nút, tỷ lệ = 1, 15 cờ = wx.all | wx.center | wx.expand, 16 biên giới = 5]

17 main_sizer.Add[button2, 0, wx.ALL, 5] 18 self.SetSizer[main_sizer] 19 20 class MyFrame[wx.Frame]: 21 22 def __init__[self]: 23 super[].__init__[None, title='Hello World'] 24 panel = MyPanel[self] 25 self.Show[] 26 27 if __name__ == '__main__': 28 app = wx.App[redirect=False] 29 frame = MyFrame[] 30 app.MainLoop[]

In this example, you create a wx.BoxSizer. A wx.BoxSizer can be set to add widgets horizontally [left-to-right] or vertically [top-to-bottom]. For your code, you set the sizer to add widgets horizontally by using the wx.HORIZONTAL constant. To add a widget to a sizer, you use the Add[] method. The Add[] method takes up to five arguments: window - the widget to add proportion - tells wxPython

if the widget can change its size in the

same orientation as the sizer flag - one or more flags that affect the sizer’s behavior border - the border width, in pixels userData - allows adding an extra object to the sizer item, which is used for subclasses of sizers. The first button that you add to the sizer is set to a proportion of 1, which will make it expand to fill as much space in the sizer as it can. You also give it three flags: wx.ALL - add a border on all sides wx.CENTER - center the widget within the sizer wx.EXPAND - the item will be expanded as much

as possible while also

maintaining its aspect ratio Finally, you add a border of five pixels. These pixels are added to the top, bottom, left, and right of the widget because you set the wx.ALL flag.

The second button has a proportion of 0, which means it wont expand at all. Then you tell it to add a five pixel border all around it as well. To apply the sizer to the panel, you need to call the panel’s SetSizer[] method. When you run this code, you will see the following applications:

Fig. 42-4: Putting Buttons in a BoxSizer

You can see how the various flags have affected the appearance of the buttons. Note that on MacOS, wx.Button cannot be stretched, so if you want to do that on a Mac, you would need to use a generic button from wx.lib.buttons instead. Generic buttons are usually made with Python and do not wrap the native widget. Now let’s move on and learn how events work!

How to Add Events So far you have created a couple of neat little applications with buttons, but the buttons don’t do anything when you click on them. Why is that? Well, when you are writing a GUI application, you need to tell it what to do when something happens. That “something” that happens is known as an event. To hook an event to a widget, you will need to use the Bind[] method. Some widgets have multiple events that can be bound to them while others have only one or two. The wx.Button can be bound to wx.EVT_BUTTON only. Let’s copy the code from the previous example and paste it into a new file named button_events.py. Then update it to add events like this: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

# button_events.py import wx class MyPanel[wx.Panel]: def __init__[self, parent]: super[].__init__[parent] button = wx.Button[self, label='Press Me'] button.Bind[wx.EVT_BUTTON, self.on_button1] button2 = wx.Button[self, label='Second button'] button2.Bind[wx.EVT_BUTTON, self.on_button2] main_sizer = wx.BoxSizer[wx.HORIZONTAL] main_sizer.Add[button, proportion=1, flag=wx.ALL | wx.CENTER | wx.EXPAND, border=5] main_sizer.Add[button2, 0, wx.ALL, 5] self.SetSizer[main_sizer] def on_button1[self, event]: print['You clicked the first button'] def on_button2[self, event]: print['You clicked the second button'] class MyFrame[wx.Frame]: def __init__[self]: super[].__init__[None, title='Hello World'] panel = MyPanel[self] self.Show[] if __name__ == '__main__': app = wx.App[redirect=False] frame = MyFrame[] app.MainLoop[]

Here you call Bind[] for each of the buttons in turn. You bind the button to wx.EVT_BUTTON, which will fire when the user presses a button. The second argument to Bind[] is the method that should be called when you click the button. If you run this code, the GUI will still look the same. However, when you press the buttons, you should see different messages printed to stdout [i.e. your terminal or console window]. Give it a try and see how it works. Now let’s go ahead and write a simple application!

How to Create an Application The first step in creating an application is to come up with an idea. You could try to copy something simple like Microsoft Paint or Notepad. You will quickly find that they aren’t so easy to emulate as you would think, though! So instead, you will create a simple application that can load and display a photo. When it comes to creating a GUI application, it is a good idea to think about what it will look like. If you enjoy working with pencil and paper, you could draw a sketch of what your application will look like. There are many software applications you can use to draw with or create simple mock-ups. To simulate a Sizer, you can draw a box. Here is a mockup of what the finished application should look like:

Fig. 42-5: Image Viewer Mockup

Now you have a goal in mind. This allows you to think about how you might lay out the widgets. Go ahead and create a new file named image_viewer.py and add the following code to it: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

# image_viewer.py import wx class ImagePanel[wx.Panel]: def __init__[self, parent, image_size]: super[].__init__[parent] img = wx.Image[*image_size] self.image_ctrl = wx.StaticBitmap[self, bitmap=wx.Bitmap[img]] browse_btn = wx.Button[self, label='Browse'] main_sizer = wx.BoxSizer[wx.VERTICAL] main_sizer.Add[self.image_ctrl, 0, wx.ALL, 5] main_sizer.Add[browse_btn] self.SetSizer[main_sizer] main_sizer.Fit[parent] self.Layout[] class MainFrame[wx.Frame]: def __init__[self]: super[].__init__[None, title='Image Viewer'] panel = ImagePanel[self, image_size=[240,240]] self.Show[] if __name__ == '__main__': app = wx.App[redirect=False] frame = MainFrame[] app.MainLoop[]

Here you create a new class named ImagePanel[] that will hold all your widgets. Inside it, you have a wx.Image, which you will use to hold the photo in memory in an object that wxPython can work with. To display that photo to the user, you use wx.StaticBitmap. The other widget you need is the familiar wx.Button, which you will use to browse to the photo to load. The rest of the code lays out the widgets using a vertically oriented wx.BoxSizer. You use the sizer’s Fit[] method to try to make the frame “fit” the widgets. What that means is that you want the application to not have a lot of white space around the widgets. When you run this code, you will end up with the following user interface:

Fig. 42-6: Image Viewer Demo

That looks almost right. It looks like you forgot to add the text entry widget to the right of the browse button, but that’s okay. The objective was to try and get a close approximation to what the application would look like in the end, and this looks pretty good. Of course, none of the widgets actually do anything yet. Your next step is to update the code so it works. Copy the code from the previous example and make a new file named image_viewer_working.py. There will be significant updates to the code, which you will learn about soon. But first, here is the full change in its entirety: 1 # image_viewer_working.py 2 3 import wx 4 5 class ImagePanel[wx.Panel]: 6 7 def __init__[self, parent, image_size]: 8 super[].__init__[parent] 9 self.max_size = 240 10 11 img = wx.Image[*image_size] 12 self.image_ctrl = wx.StaticBitmap[self, 13 bitmap=wx.Bitmap[img]] 14 15 browse_btn = wx.Button[self, label='Browse'] 16 browse_btn.Bind[wx.EVT_BUTTON, self.on_browse] 17

18 self.photo_txt = wx.TextCtrl[self, size=[200, -1]] 19 20 main_sizer = wx.BoxSizer[wx.VERTICAL] 21 hsizer = wx.BoxSizer[wx.HORIZONTAL] 22 23 main_sizer.Add[self.image_ctrl, 0, wx.ALL, 5] 24 hsizer.Add[browse_btn, 0, wx.ALL, 5] 25 hsizer.Add[self.photo_txt, 0, wx.ALL, 5] 26 main_sizer.Add[hsizer, 0, wx.ALL, 5] 27 28 self.SetSizer[main_sizer] 29 main_sizer.Fit[parent] 30 self.Layout[] 31 32 def on_browse[self, event]: 33 """ 34 Browse for an image file 35 @param event: The event object 36 """ 37 wildcard = "JPEG files [*.jpg]|*.jpg" 38 with wx.FileDialog[None, "Choose a file", 39 wildcard=wildcard, 40 style=wx.ID_OPEN] as dialog: 41 if dialog.ShowModal[] == wx.ID_OK: 42 self.photo_txt.SetValue[dialog.GetPath[]] 43 self.load_image[] 44 45 def load_image[self]: 46 """ 47 Load the image and display it to the user 48 """ 49 filepath = self.photo_txt.GetValue[] 50 img = wx.Image[filepath, wx.BITMAP_TYPE_ANY] 51 52 # scale the image, preserving the aspect ratio 53 W = img.GetWidth[] 54 H = img.GetHeight[] 55 if W > H: 56 NewW = self.max_size 57 NewH = self.max_size * H / W 58 else: 59 NewH = self.max_size 60 NewW = self.max_size * W / H 61 img = img.Scale[NewW,NewH] 62 63 self.image_ctrl.SetBitmap[wx.Bitmap[img]] 64 self.Refresh[] 65 66 class MainFrame[wx.Frame]: 67 68 def __init__[self]: 69 super[].__init__[None, title='Image Viewer'] 70 panel = ImagePanel[self, image_size=[240,240]] 71 self.Show[] 72 73 if __name__ == '__main__': 74 app = wx.App[redirect=False] 75 frame = MainFrame[] 76 app.MainLoop[]

This change is pretty long. To make things easier, you will go over each change in its own little chunk. The changes all occurred in the ImagePanel class, so you will go over the changes in each of the methods in turn, starting with the constructor below: 1 def __init__[self, parent, image_size]: 2 super[].__init__[parent] 3 self.max_size = 240 4 5 img = wx.Image[*image_size] 6 self.image_ctrl = wx.StaticBitmap[self, 7 bitmap=wx.Bitmap[img]] 8 9 browse_btn = wx.Button[self, label='Browse'] 10 browse_btn.Bind[wx.EVT_BUTTON, self.on_browse] 11 12 self.photo_txt = wx.TextCtrl[self, size=[200, -1]] 13 14 main_sizer = wx.BoxSizer[wx.VERTICAL] 15 hsizer = wx.BoxSizer[wx.HORIZONTAL] 16 17 main_sizer.Add[self.image_ctrl, 0, wx.ALL, 5] 18 hsizer.Add[browse_btn, 0, wx.ALL, 5] 19 hsizer.Add[self.photo_txt, 0, wx.ALL, 5] 20 main_sizer.Add[hsizer, 0, wx.ALL, 5] 21 22 self.SetSizer[main_sizer] 23 main_sizer.Fit[parent] 24 self.Layout[]

Có một vài thay đổi nhỏ ở đây. Đầu tiên là bạn đã thêm MAX_SIZE cho hình ảnh. Sau đó, bạn đã kết nối một sự kiện vào nút Duyệt. Nút này bây giờ sẽ gọi on_browse [] khi được nhấp. Thay đổi tiếp theo là bạn đã thêm một tiện ích mới, chính xác là Wx.TextCtrl. Bạn đã lưu trữ một tham chiếu đến tiện ích đó trong self.photo_txt, sẽ cho phép bạn trích xuất đường dẫn vào ảnh sau. Sự thay đổi cuối cùng là bây giờ bạn có hai người dùng. Một là ngang và cái còn lại theo chiều dọc. Sizer ngang là để giữ nút duyệt và các tiện ích điều khiển văn bản mới của bạn. Điều này cho phép bạn đặt chúng cạnh nhau, từ trái sang phải. Sau đó, bạn thêm chính Sizer ngang vào Main_Sizer dọc. Bây giờ, hãy để Lôi xem cách on_browse [] hoạt động: 1 def on_browse [tự, sự kiện]: 2 "" "

3 4 5 6 7 8 9 10 11 12

Duyệt cho một tệp hình ảnh @param sự kiện: đối tượng sự kiện "" "Wildcard =" JPEG Files [*.jpg] |*.jpg "với wx.filedialog [không," chọn tệp ", WildCard = WildCard, style = wx .Id_open] AS Hộp thoại: Nếu hộp thoại.

Tại đây, bạn tạo một ký tự đại diện được sử dụng bởi wx.filedialog để lọc tất cả các loại tệp khác ngoại trừ định dạng JPEG. Tiếp theo, bạn tạo wx.filedialog. Khi bạn làm điều đó, bạn đặt cha mẹ của nó thành không ai và cho nó một tiêu đề đơn giản. Bạn cũng đặt ký tự đại diện và phong cách. Style là hộp thoại Mở tệp thay vì hộp thoại Lưu tệp. Sau đó, bạn hiển thị hộp thoại của bạn một cách vừa phải. Điều đó có nghĩa là hộp thoại sẽ xuất hiện qua ứng dụng chính của bạn và ngăn bạn tương tác với ứng dụng chính cho đến khi bạn đã chấp nhận hoặc loại bỏ hộp thoại tệp. Nếu người dùng nhấn nút OK, thì bạn sẽ sử dụng getpath [] để lấy đường dẫn của tệp đã chọn và đặt điều khiển văn bản thành đường dẫn đó. Điều này có hiệu quả tiết kiệm đường dẫn hình ảnh để bạn có thể sử dụng nó sau. Cuối cùng, bạn gọi load_image [] sẽ tải hình ảnh vào wxpython và cố gắng hiển thị nó. Bạn có thể tìm hiểu làm thế nào bằng cách đọc mã sau: 1 def Load_image [self]: 2 "" "3 tải hình ảnh và hiển thị nó cho người dùng 4" "5 filePath = self.photo_txt.getValue [] 6 img = wx .Image [filepath, wx.bitmap_type_any] 7 8 # tỷ lệ hình ảnh, bảo tồn tỷ lệ khung hình 9 w = img.getWidth [] 10 h = img.getheight [] 11 nếu w> h: 12 neww = self.max_size 13 newh = self.max_size * h / w 14 khác: 15 newh = self.max_size 16 neww = self.max_size * w / h 17 img = img.scale [neww, newh] 18 19 self.image_ctrl.setbitmap [wx.bitmap [ img]] 20 self.refresh []

Bước đầu tiên trong phương pháp này là trích xuất filepath từ tiện ích điều khiển văn bản. Sau đó, bạn chuyển con đường đó theo một ví dụ mới của wx.image. Điều này sẽ tải hình ảnh vào wxpython cho bạn. Tiếp theo, bạn có được chiều rộng và chiều cao từ đối tượng wx.image và sử dụng giá trị max_size để thay đổi kích thước hình ảnh trong khi duy trì tỷ lệ khung hình của nó. Bạn làm điều này vì hai lý do. Đầu tiên là bởi vì nếu bạn don, hình ảnh sẽ bị kéo dài hoặc bị vênh. Thứ hai là hầu hết các hình ảnh ở độ phân giải đầy đủ đều giành được sự phù hợp trên màn hình, vì vậy chúng cần được thay đổi kích thước. Khi bạn có chiều rộng và chiều cao mới, bạn tỷ lệ [] hình ảnh xuống một cách thích hợp. Sau đó, bạn gọi phương thức WX.StaticBitMap Control SetBitMap [] của bạn để cập nhật nó lên hình ảnh mới mà bạn đã tải. Cuối cùng, bạn gọi Refresh [], sẽ buộc tiện ích bitmap phải vẽ lại với hình ảnh mới trong đó. Đây là một bức ảnh bướm được tải trong đó:

Hình 42-7: Người xem hình ảnh làm việc

Bây giờ bạn có một ứng dụng đầy đủ chức năng có thể tải ảnh JPEG. Bạn có thể cập nhật ứng dụng để tải các loại hình ảnh khác nếu bạn thích. Bộ công cụ WxPython sử dụng gối, do đó, nó sẽ tải các loại tệp hình ảnh tương tự mà bản thân gối có thể tải.

Kết thúc bộ công cụ WxPython cực kỳ linh hoạt. Nó đi kèm với nhiều, nhiều vật dụng tích hợp và cũng bao gồm một gói demo tuyệt vời. Gói demo sẽ giúp bạn tìm hiểu cách sử dụng các tiện ích trong mã của riêng bạn. Bạn chỉ được giới hạn bởi trí tưởng tượng của bạn. Trong chương này, bạn đã tìm hiểu về các chủ đề sau: Tìm hiểu về các vòng lặp sự kiện Cách tạo các widget cách đưa ra ứng dụng của bạn Cách thêm sự kiện Cách tạo ứng dụng Bạn có thể lấy mã và các khái niệm trong mã này và thêm các tính năng mới hoặc Tạo các ứng dụng hoàn toàn mới. Nếu bạn cần ý tưởng, bạn có thể kiểm tra một số ứng dụng trên máy tính hoặc điện thoại của riêng bạn. Bạn cũng có thể kiểm tra cuốn sách của tôi, tạo các ứng dụng GUI với WXPython, có rất nhiều ứng dụng nhỏ thú vị mà bạn có thể tạo và mở rộng.

Xem lại câu hỏi 1. GUI là gì? 2. Vòng lặp sự kiện là gì? 3. Làm thế nào để bạn đặt các widget trong ứng dụng của bạn?

Part IV - Distributing Your Code If you have reached this part of the book, then you should now have a good understanding of the Python programming language. You may be excited to create an application and share it with your friends. If that is the case, then you are in the right place. The last section of this book will teach you how to share your code. In it, you will learn how to do the following: Chapter 43 - How to Create a Python package Chapter 44 - How to Create an Exe for Windows Chapter 45 - How to Create an Installer for Windows Chapter 46 - How to Create an “exe” for Mac A Python package is a module or group of modules that you install using pip to enhance your code. Windows and Mac have good solutions for creating a distributable file that your friends and family can use to install your program or run your program without installing Python or any other dependencies. Let’s get started!

Chapter 43 - How to Create a Python Package When you create a Python file, you are creating a Python module. Any Python file that you create can be imported by another Python script. Thus, by definition, it is also a Python module. If you have two or more related Python files, then you may have a Python package. Some organizations keep all their code to themselves. This is known as closed-source. Python is an open-source language and most of the Python modules and packages that you can get from the Python Package Index [PyPI] are all free and open-source as well. One of the quickest ways to share your package or module is to upload it to the Python Package Index or Github or both. In this chapter, you will learn about the following topics: Creating a Module Creating a Package Packaging a Project for PyPI Creating Project Files Creating setup.py Uploading to PyPI The first step in the process is to understand what creating a reusable module looks like. Let’s get started!

Creating a Module Any Python file you create is a module that you can import. You can try it out with some of the examples from this book by adding a new file to any of the chapter’s code folders and attempt to import one of the modules in there. For example, if you have a Python file named a.py and then create a new file named b.py, you can import a into b through the use of import a. Of course, that’s a silly example. Instead, you will create a simple module that has some basic arithmetic functions in it. You can name the file arithmetic.py and add this code to it: 1 2 3 4 5 6 7 8 9 10 11 12 13

# arithmetic.py def add[x, y]: return x + y def divide[x, y]: return x / y def multiply[x, y]: return x * y def subtract[x, y]: return x - y

This code is very naive. You have no error handling at all, for example. What that means is that you could divide by zero and cause an exception to be thrown. You could also pass incompatible types to these functions, like a string and an integer – that would cause a different kind of exception to be raised. However, for learning purposes, this code is adequate. You can prove that it is importable by creating a test file using the knowledge you acquired in chapter 30. Create a new file named test_arithmetic.py and add this code to it: 1 2 3 4 5 6 7 8 9

# test_arithmetic.py import arithmetic import unittest class TestArithmetic[unittest.TestCase]: def test_addition[self]: self.assertEqual[arithmetic.add[1, 2], 3]

10 11 def test_subtraction[self]: 12 self.assertEqual[arithmetic.subtract[2, 1], 1] 13 14 def test_multiplication[self]: 15 self.assertEqual[arithmetic.multiply[5, 5], 25] 16 17 def test_division[self]: 18 self.assertEqual[arithmetic.divide[8, 2], 4] 19 20 if __name__ == '__main__': 21 unittest.main[]

Now you can run this code using the following command: 1 2 3 4 5 6

$ python test_arithmetic.py .... ---------------------------------------------------------------------Ran 4 tests in 0.000s OK

This demonstrates that you can import arithmetic.py as a module. These tests also show the basic functionality of the code works. You can enhance these tests by testing division by zero and mixing strings and integers. Those kinds of tests will currently fail. Once you have a failing test, you can follow the Test Driven Development methodology you learned in chapter 30 to fix the issues. Now let’s find out how to make a Python package!

Creating a Package A Python package is one or more files that you plan on sharing with others, usually by uploading it to the Python Package Index [PyPI]. Packages are generally made by naming a directory of files rather than a file itself. Then inside of that directory you will have a special __init__.py file. When Python sees the __init__.py file, it knows that the folder is importable as a package. There are a couple ways to transform arithmetic.py into a package. The simplest is to move the code from arithmetic.py into arithmetic/__init__.py: create the folder arithmetic move/copy arithmetic.py to arithmetic/__init__.py if you used “copy” in the previous step then delete arithmetic.py run test_arithmetic.py That last step is extremely important! If your tests still pass then you know your conversion from a module to a package worked. To test out your package, open up a Command Prompt if you’re on Windows or a terminal if you’re on Mac or Linux. Then navigate to the folder that contains the arithmetic folder, but not inside of it. You should now be in the same folder as your test_arithmetic.py file. At this point you can run python test_arithmetic.py and see if your efforts were successful. It might seem silly to simply put all your code in a single __init__.py file, but that actually works fine for files up to a few thousand lines. The second way to transform arithmetic.py into a package is similar to the first, but involves using more files than just __init__.py. In real code the functions/classes/etc. in each file would be grouped somehow – perhaps one file for all your package’s custom exceptions, one file for common utilities, and one file for the main functionality. For our example, you’ll just split the four functions in arithmetic.py into their own files. Go ahead and move each function from __init__.py into

Tệp riêng của nó. Cấu trúc thư mục của bạn sẽ trông như thế này: 1 Số học/ 2 __init__.py 3 add.py 4 SUBTRACT.PY 5 Nhân.

Đối với tệp __init__.py, bạn có thể thêm mã sau: 1 2 3 4 5

# __init__.

Bây giờ bạn đã thực hiện những thay đổi này, bước tiếp theo của bạn là gì? Hy vọng rằng bạn đã nói, Chạy thử các bài kiểm tra của tôi! Nếu các bài kiểm tra của bạn vẫn vượt qua thì bạn đã phá vỡ API của bạn. Ngay bây giờ, gói số học của bạn chỉ có sẵn cho mã Python khác của bạn nếu bạn có cùng thư mục với tệp test_arithmetic.py của bạn. Để cung cấp nó trong phiên Python của bạn hoặc trong mã Python khác, bạn có thể sử dụng mô -đun Python, SYS để thêm gói của bạn vào đường dẫn tìm kiếm Python. Đường dẫn tìm kiếm là những gì Python sử dụng để tìm các mô -đun khi bạn sử dụng từ khóa nhập. Bạn có thể thấy những con đường nào Python tìm kiếm bằng cách in ra sys.path. Hãy cùng giả vờ rằng thư mục số học của bạn ở vị trí này:/user/Michael/packages/arithmetic. Để thêm nó vào đường dẫn tìm kiếm Python, bạn có thể thực hiện điều này: 1 2 3 4 5 6

Nhập Sys Sys.Path.Append ["/Người dùng/Michael/Gói/Số học"]

Điều này sẽ thêm số học vào đường dẫn Python, để bạn có thể nhập nó và sau đó sử dụng gói trong mã của mình. Tuy nhiên, điều đó thực sự khó xử. Sẽ thật tuyệt nếu bạn có thể cài đặt gói hàng của mình bằng PIP để bạn không phải lộn xộn với đường dẫn mọi lúc.

Hãy cùng tìm hiểu làm thế nào để làm điều đó tiếp theo!

Đóng gói một dự án cho PYPI khi tạo ra một gói cho Chỉ số gói Python [PYPI], bạn sẽ cần một số tệp bổ sung. Có một hướng dẫn tốt về quy trình tạo và tải lên gói lên pypi tại đây: //packaging.python.org/tutorials/packaging-projects/ Hướng dẫn đóng gói chính thức khuyên bạn nên thiết lập cấu trúc thư mục như thế này: 1 my_package/ 2 giấy phép 3 readme.md 4 arithmetic/ 5 __init__.py 6 add.py 7 subtract.py 8 mult

Thư mục thử nghiệm có thể trống. Đây là thư mục mà bạn sẽ bao gồm các thử nghiệm cho gói của bạn. Hầu hết các nhà phát triển sử dụng Python sườn Unittest hoặc khung pytest cho các bài kiểm tra của họ. Đối với ví dụ này, bạn có thể để trống thư mục. Hãy cùng tiếp tục và tìm hiểu về các tệp khác mà bạn cần tạo trong phần tiếp theo!

Tạo tệp dự án Tệp giấy phép là nơi bạn đề cập đến giấy phép mà gói của bạn có. Điều này cho người dùng của gói những gì họ có thể và không thể làm với gói của bạn. Có rất nhiều giấy phép khác nhau bạn có thể sử dụng. Giấy phép GPL và MIT chỉ là một vài ví dụ phổ biến. Tệp readme.md là một mô tả về dự án của bạn, được viết bằng Markdown. Bạn sẽ muốn viết về dự án của mình trong tệp này và bao gồm bất kỳ thông tin nào về các phụ thuộc mà nó có thể cần. Bạn có thể cung cấp hướng dẫn để cài đặt cũng như sử dụng ví dụ về gói của bạn. Markdown khá linh hoạt và thậm chí cho phép bạn làm nổi bật cú pháp! Tệp khác bạn cần cung cấp là setup.py. Tệp đó phức tạp hơn, vì vậy bạn sẽ tìm hiểu về điều đó trong phần tiếp theo.

Tạo setup.py Có một tệp đặc biệt có tên Setup.py được sử dụng làm tập lệnh xây dựng cho các bản phân phối Python. Nó được sử dụng bởi setuptools, nơi thực hiện tòa nhà thực tế cho bạn. Nếu bạn muốn biết thêm về setuptools, thì bạn nên xem những điều sau: //setuptools.readthedocs.io/en/latest/ Bạn có thể sử dụng setup.py để tạo bánh xe python. Bánh xe là một kho lưu trữ Zipformat với tên được định dạng đặc biệt và phần mở rộng .whl. Nó chứa mọi thứ cần thiết để cài đặt gói của bạn. Bạn có thể nghĩ về nó như một phiên bản mã hóa của mã mà PIP có thể giải nén và cài đặt cho bạn. Bánh xe theo PEP 376, mà bạn có thể đọc ở đây: //www.python.org/dev/peps/pep-0376/ Sau khi bạn đọc tất cả tài liệu đó [nếu bạn muốn], bạn có thể tạo Cài đặt của bạn và thêm mã này vào nó: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

Nhập setuptools với Open ["readme.md", "r"] là fh: long_descrip = fh.read [] setuptools.setup [name = "arithmetic-your-username-here", # thay thế bằng phiên bản tên người dùng của riêng bạn = " 0,0.1 ", tác giả =" Mike Driscoll ", Author_email =" [Email & NBSP; github.com/driscollis/arithmetic ", gói = setuptools.find_packages [], slassifiers = [" Ngôn ngữ lập trình :: python :: 3 " ",], python_requires = '> = 3.6',]

Bước đầu tiên trong mã này là nhập setuptools. Sau đó, bạn đọc trong tệp readme.md của bạn thành một biến mà bạn sẽ sử dụng sớm. Bit cuối cùng là phần lớn của mã. Ở đây bạn gọi setuptools.setup [], có thể nhận được khá nhiều

Một vài lập luận khác nhau. Ví dụ trên chỉ là một mẫu của những gì bạn có thể chuyển đến chức năng này. Để xem danh sách đầy đủ, bạn sẽ cần phải đến đây: //packaging.python.org/guides/distributing-packages-usingsetuptools/ Hầu hết các đối số đều tự giải thích. Hãy để tập trung vào những người khó hiểu hơn. Các đối số gói là một danh sách các gói cần thiết cho gói của bạn. Trong trường hợp này, bạn sử dụng find_packages [] để tìm các gói cần thiết cho bạn tự động. Đối số phân loại được sử dụng để chuyển thêm siêu dữ liệu cho PIP. Ví dụ, mã này cho PIP biết rằng gói tương thích Python 3. Bây giờ bạn đã có một thiết lập.py, bạn đã sẵn sàng để tạo một bánh xe trăn!

Tạo một bánh xe python setup.py được sử dụng để tạo bánh xe Python. Nó luôn luôn là một ý tưởng tốt để đảm bảo rằng bạn đã cài đặt phiên bản setuptools và bánh xe mới nhất, vì vậy trước khi bạn tạo bánh xe của riêng mình, bạn nên chạy lệnh sau: 1 python3 -m pip cài đặt

Điều này sẽ cập nhật các gói nếu có phiên bản mới hơn phiên bản bạn hiện đã cài đặt. Bây giờ bạn đã sẵn sàng để tự tạo ra một bánh xe. Mở một lời nhắc lệnh hoặc ứng dụng thiết bị đầu cuối và điều hướng đến thư mục chứa tệp setup.py của bạn. Sau đó chạy lệnh sau: 1 python3 setup.py sdist bdist_wheel

Lệnh này sẽ xuất ra rất nhiều văn bản, nhưng một khi nó đã hoàn thành, bạn sẽ tìm thấy một thư mục mới có tên Dist có chứa hai tệp sau: arithmetic_your_username_here-0.0.1-py3-none-ol 0,0.1.tar.gz

Tar.gz là một kho lưu trữ nguồn, có nghĩa là nó có mã nguồn Python cho gói của bạn bên trong nó. Người dùng của bạn có thể sử dụng kho lưu trữ nguồn để xây dựng gói trên máy của họ, nếu họ cần. Định dạng WHL là một kho lưu trữ được PIP sử dụng để cài đặt gói của bạn trên máy người dùng của bạn. Bạn có thể cài đặt bánh xe trực tiếp bằng PIP, nếu bạn muốn: 1 Python -M Pip Cài đặt arithmetic_your_username_here-0.0.1-py3-none-any.whl

Nhưng phương pháp thông thường sẽ là tải gói của bạn lên Chỉ số gói Python [PYPI] và sau đó cài đặt nó. Hãy để khám phá cách để có được gói tuyệt vời của bạn trên PYPI tiếp theo!

Tải lên PYPI Bước đầu tiên để tải gói lên PYPI là tạo một tài khoản trên PYPI thử nghiệm. Điều này cho phép bạn kiểm tra rằng gói của bạn có thể được tải lên trên máy chủ thử nghiệm và được cài đặt từ máy chủ thử nghiệm đó. Để tạo tài khoản, hãy truy cập URL sau và làm theo các bước trên trang đó: //test.pypi.org/account/register/ Bây giờ bạn cần tạo mã thông báo API PYPI. Điều này sẽ cho phép bạn tải lên gói an toàn. Để nhận mã thông báo API, bạn sẽ cần đến đây: //test.pypi.org/manage/account/#api-tokens, bạn có thể giới hạn phạm vi mã thông báo. Tuy nhiên, bạn không cần phải làm điều đó cho mã thông báo này vì bạn đang tạo nó cho một dự án mới. Hãy chắc chắn rằng bạn sao chép mã thông báo và lưu nó ở đâu đó trước khi bạn đóng trang. Khi trang được đóng, bạn không thể lấy lại mã thông báo một lần nữa. Bạn sẽ được yêu cầu tạo một mã thông báo mới thay thế. Bây giờ bạn đã đăng ký và có mã thông báo API, bạn sẽ cần phải nhận gói Twine. Bạn sẽ sử dụng Twine để tải gói của mình lên PYPI. Để cài đặt Twine, bạn có thể sử dụng PIP như thế này: 1 Python3 -M Pip Cài đặt --User -Nâng cấp Twine

Sau khi được cài đặt, bạn có thể tải lên gói của mình để kiểm tra PYPI bằng lệnh sau: 1 Python3 -M Tải lên TWINE -Reprepository TestPypi Dist/*

Lưu ý rằng bạn sẽ cần chạy lệnh này từ bên trong thư mục chứa tệp setup.py vì nó đang sao chép tất cả các tệp trong thư mục dist để kiểm tra pypi. Khi bạn chạy lệnh này, nó sẽ nhắc bạn cho tên người dùng và mật khẩu. Đối với tên người dùng, bạn cần sử dụng __token__. Mật khẩu là giá trị mã thông báo được đặt trước với PYPI-. Khi lệnh này chạy, bạn sẽ thấy đầu ra tương tự như sau:

1 2 3 4 5 6 7

Tải các bản phân phối lên //test.pypi.org/legacy/ Nhập tên người dùng của bạn: [Tên người dùng của bạn] Nhập mật khẩu của bạn: Tải lên arithmetic_your_username_here-0.0.1-py3-none-any.whl 100%| ███████████████ | 4.65k/4.65k [00: 01pysearch.exe 2 Sử dụng: pysearch [-h] -p đường dẫn -e mở rộng [-s kích thước] 3 pysearch: Lỗi: các đối số sau là bắt buộc: -p/ -đường dẫn, -e /-ext

Trông giống như một bản dựng khá thành công! Tuy nhiên, nếu bạn muốn cung cấp thực thi cho bạn bè, bạn sẽ phải cung cấp cho họ toàn bộ thư mục PYSEARCH vì tất cả các tệp khác trong đó cũng được yêu cầu. Bạn có thể khắc phục sự cố đó bằng cách chuyển cờ --onefile, như thế này: 1 pyinstaller pysearch.py ​​-onefile

The output from that command is similar to the first command. This time when you go into the dist folder though, you will find a single file in there called pysearch.exe instead of a folder full of files.

Creating an Executable for a GUI Creating an executable for a GUI is slightly different than it is for a command-line application. The reason is that the GUI is the main interface and PyInstaller’s default is that the user will be using a Command Prompt or console window. If you run either of the PyInstaller commands that you learned about in the previous section, it will successfully create your executable. However, when you go to use your executable, you will see a Command Prompt appear in addition to your GUI. You usually don’t want that. To suppress the Command Prompt, you need to use the --noconsole flag. To test out how this would work, grab the code for the image viewer you created with wxPython in chapter 42. Here is the code again for your convenience: 1 # image_viewer.py 2 3 import wx 4 5 class ImagePanel[wx.Panel]: 6 7 def __init__[self, parent, image_size]: 8 super[].__init__[parent] 9 self.max_size = 240 10 11 img = wx.Image[*image_size] 12 self.image_ctrl = wx.StaticBitmap[self, 13 bitmap=wx.Bitmap[img]] 14 15 browse_btn = wx.Button[self, label='Browse'] 16 browse_btn.Bind[wx.EVT_BUTTON, self.on_browse] 17 18 self.photo_txt = wx.TextCtrl[self, size=[200, -1]] 19 20 main_sizer = wx.BoxSizer[wx.VERTICAL] 21 hsizer = wx.BoxSizer[wx.HORIZONTAL] 22 23 main_sizer.Add[self.image_ctrl, 0, wx.ALL, 5] 24 hsizer.Add[browse_btn, 0, wx.ALL, 5] 25 hsizer.Add[self.photo_txt, 0, wx.ALL, 5] 26 main_sizer.Add[hsizer, 0, wx.ALL, 5] 27 28 self.SetSizer[main_sizer] 29 main_sizer.Fit[parent] 30 self.Layout[] 31 32 def on_browse[self, event]: 33 """

34 Browse for an image file 35 @param event: The event object 36 """ 37 wildcard = "JPEG files [*.jpg]|*.jpg" 38 with wx.FileDialog[None, "Choose a file", 39 wildcard=wildcard, 40 style=wx.ID_OPEN] as dialog: 41 if dialog.ShowModal[] == wx.ID_OK: 42 self.photo_txt.SetValue[dialog.GetPath[]] 43 self.load_image[] 44 45 def load_image[self]: 46 """ 47 Load the image and display it to the user 48 """ 49 filepath = self.photo_txt.GetValue[] 50 img = wx.Image[filepath, wx.BITMAP_TYPE_ANY] 51 52 # scale the image, preserving the aspect ratio 53 W = img.GetWidth[] 54 H = img.GetHeight[] 55 if W > H: 56 NewW = self.max_size 57 NewH = self.max_size * H / W 58 else: 59 NewH = self.max_size 60 NewW = self.max_size * W / H 61 img = img.Scale[NewW,NewH] 62 63 self.image_ctrl.SetBitmap[wx.Bitmap[img]] 64 self.Refresh[] 65 66 67 class MainFrame[wx.Frame]: 68 69 def __init__[self]: 70 super[].__init__[None, title='Image Viewer'] 71 panel = ImagePanel[self, image_size=[240,240]] 72 self.Show[] 73 74 75 if __name__ == '__main__': 76 app = wx.App[redirect=False] 77 frame = MainFrame[] 78 app.MainLoop[]

To turn this into an executable, you would run the following PyInstaller command: 1 pyinstaller.exe image_viewer.py --noconsole

Note that you are not using the --onefile flag here. Windows Defender will flag GUIs that are created with the --onefile as malware and remove it. You can get around that by not using the --onefile flag or by digitally

signing the executable. Starting in Windows 10, all GUI applications need to be signed or they are considered malware. Microsoft has a Sign Tool you can use, but you will need to purchase a digital certificate or create a self-signed certificate with Makecert, a .NET tool or something similar.

Wrapping Up There are lots of different ways to create an executable with Python. In this chapter, you used PyInstaller. You learned about the following topics: Installing PyInstaller Creating an Executable for a Command-Line Application Creating an Executable for a GUI PyInstaller has many other flags that you can use to modify its behavior when generating executables. If you run into issues with PyInstaller, there is a mailing list that you can turn to. Or you can search with Google and on StackOverflow. Most of the common issues that crop up are covered either in the PyInstaller documentation or are easily discoverable through searching online.

Review Questions 1. Name 3 different tools you can use to create a Windows executable out of Python code. 2. What command do you use with PyInstaller to create an executable? 3. How do you create a single file executable with PyInstaller? 4. Which flag do you use with PyInstaller to suppress the console window?

Chapter 45 - How to Create an Installer for Windows Windows users have certain expectations when it comes to installing software. They typically think that the software should be able to be downloaded and then installed using a wizard-type interface. These wizards are created using “installer software”. While there aren’t really any Python packages available for creating installers, there are some nice free applications that you can use. Two of the most popular are: NSIS - //nsis.sourceforge.io/Main_Page Inno Setup - //www.jrsoftware.org/isinfo.php For this chapter, you will be using Inno Setup. You will also be learning about the following topics: Installing Inno Setup Creating an Installer Testing Your Installer Let’s get started by learning to install the installer!

Cài đặt cài đặt Inno Cài đặt Inno Cài đặt khá đơn giản. Bạn sẽ cần truy cập URL sau: //www.jrsoftware.org/isinfo.php sau đó truy cập liên kết tải xuống inno setup và chọn nơi bạn muốn tải xuống ứng dụng. Sau khi tải xuống thiết lập Inno, bạn sẽ cần nhấp đúp vào trình cài đặt và cài đặt nó trên hệ thống của bạn. Bây giờ bạn đã cài đặt Inno được cài đặt trên máy Windows của mình, bạn có thể tạo trình cài đặt của riêng mình!

Tạo trình cài đặt Bước đầu tiên trong việc tạo trình cài đặt là chọn những gì bạn muốn cài đặt. Đối với ví dụ này, bạn sẽ sử dụng Trình xem hình ảnh có thể thực thi mà bạn đã tạo trong chương trước. Thiết lập Inno làm cho việc tạo một trình cài đặt thực sự thẳng thắn. Nó sử dụng một trình hướng dẫn sẽ hướng dẫn bạn qua từng bước. Để bắt đầu, hãy chạy thiết lập Inno và bạn sẽ thấy một màn hình trông như thế này:

Hình 45-1: Trang khởi động của Inno Setup,

Mặc dù thiết lập Inno mặc định mở một tệp hiện có, những gì bạn muốn làm là chọn tùy chọn thứ hai từ trên cùng: Tạo Tạo tệp tập lệnh mới bằng cách sử dụng trình hướng dẫn tập lệnh. Sau đó nhấn OK. Bây giờ bạn sẽ xem trang đầu tiên của Trình hướng dẫn tập lệnh Inno Setup:

Hình 45-2: Trang chào mừng thiết lập Inno

Hãy tiếp tục và đánh tiếp theo ở đây. Bây giờ bạn sẽ ở trên trang thông tin ứng dụng:

Hình 45-3: Trang thông tin ứng dụng của Inno Setup

Đây là nơi bạn nhập tên ứng dụng của bạn, thông tin phiên bản, tên nhà xuất bản và trang web ứng dụng. Bạn có thể điền vào nó để phù hợp với những gì trong ảnh chụp màn hình hoặc tùy chỉnh nó theo thông số kỹ thuật của riêng bạn. Khi bạn đã hoàn thành, nhấn tiếp theo và bạn sẽ thấy những điều sau đây:

Hình 45-4: Trang thư mục ứng dụng của Inno Setup

Trang này của trình hướng dẫn là nơi bạn có thể đặt thư mục cài đặt ứng dụng. Trên Windows, hầu hết các ứng dụng cài đặt vào các tệp chương trình, cũng là mặc định ở đây. Đây cũng là nơi bạn đặt tên thư mục cho ứng dụng của bạn. Đây là tên của thư mục sẽ xuất hiện trong các tệp chương trình. Ngoài ra, bạn có thể kiểm tra hộp ở phía dưới cho biết rằng ứng dụng của bạn không cần một thư mục. Bạn có thể chỉnh sửa trang này nếu bạn không thích mặc định. Nếu không, nhấn tiếp theo để tiếp tục:

Hình 45-5: Trang ứng dụng của Inno Setup,

Đây là nơi bạn sẽ chọn tệp thực thi chính. Trong trường hợp này, bạn muốn chọn thực thi mà bạn đã tạo với Pyinstaller. Nếu bạn đã tạo ra thực thi bằng cách sử dụng cờ --onefile, thì bạn có thể thêm các tệp khác bằng nút Thêm [các] tệp thêm. Nếu ứng dụng của bạn yêu cầu bất kỳ tệp đặc biệt nào khác, như tệp hoặc hình ảnh cơ sở dữ liệu SQLite, đây cũng là nơi bạn sẽ thêm chúng. Lưu ý: Hãy nhớ trên Windows 10, nếu bạn đã sử dụng -OneFile, thì bạn cũng cần ký vào tệp hoặc nó sẽ được Windows Defender của Windows Defender đánh dấu là phần mềm độc hại. Theo mặc định, trang này sẽ cho phép người dùng chạy ứng dụng của bạn khi trình cài đặt kết thúc. Rất nhiều trình cài đặt làm điều này, vì vậy, nó thực sự được mong đợi bởi hầu hết người dùng. Khi bạn xong việc, nhấp vào tiếp theo để chuyển đến trang tắt

Hình 45-6: Trang tắt ứng dụng của Inno Setup

Đây là trang phím tắt ứng dụng và nó cho phép bạn quản lý những phím tắt được tạo cho ứng dụng của bạn và nơi chúng nên đi. Các tùy chọn là khá tự giải thích. Bạn thường có thể sử dụng các mặc định, nhưng bạn có thể thay đổi chúng tuy nhiên bạn thấy phù hợp. Khi bạn đã hoàn tất định cấu hình các phím tắt, hãy nhấn tiếp theo để tiếp tục:

Hình 45-7: Trang tài liệu ứng dụng của Inno Setup,

Trang tài liệu của trình hướng dẫn là nơi bạn có thể thêm tệp giấy phép ứng dụng của bạn. Ví dụ: nếu bạn đã đưa ra một ứng dụng nguồn mở, bạn có thể thêm GPL hoặc MIT hoặc bất kỳ tệp giấy phép nào bạn cần ở đó. Nếu đây là một ứng dụng thương mại, đây là nơi bạn sẽ thêm tệp Thỏa thuận cấp phép [EULA] của người dùng cuối. Bạn cũng có thể thêm một số thông tin thêm trước và sau khi cài đặt ở đây! Tất cả các tập tin này là tùy chọn. Nếu bạn không muốn áp dụng giấy phép hoặc thêm trước và sau khi hướng dẫn, thì bạn có thể chỉ cần nhấp vào tiếp theo.

Hình 45-8: Trang Cài đặt Cài đặt Cài đặt Inno

Trang này chỉ định chế độ cài đặt nào để sử dụng khi cài đặt ứng dụng của bạn. Mặc định là cài đặt cho tất cả người dùng, đó có lẽ là những gì bạn muốn. Các tùy chọn khác là khá tự giải thích. Bạn có thể chơi xung quanh với họ hoặc đọc thêm về họ trong tài liệu của Inno Setup. Khi bạn đã hoàn thành với trang này, hãy tiếp tục.

Hình 45-9: Trang Cài đặt thiết lập Inno

Tại đây bạn có thể thiết lập ngôn ngữ nào nên được đưa vào trình cài đặt của bạn. Mặc định là tiếng Anh, nhưng thiết lập Inno hỗ trợ nhiều người khác. Hãy thoải mái sửa đổi điều này khi cần thiết trước khi tiếp tục.

Hình 45-10: Trang cài đặt trình biên dịch của Inno Setup

Trang cài đặt trình biên dịch cho phép bạn đặt tên cho tệp thiết lập đầu ra, mặc định là thiết lập đơn giản. Bạn có thể đặt thư mục đầu ra ở đây, thêm biểu tượng tệp thiết lập tùy chỉnh và thậm chí thêm bảo vệ mật khẩu vào tệp thiết lập. Tôi thường chỉ để mặc định một mình, nhưng đây là cơ hội để thêm một số thương hiệu vào thiết lập nếu bạn có một tệp biểu tượng đẹp tiện dụng. Trang tiếp theo là dành cho bộ tiền xử lý:

Hình 45-11: Trang tiền xử lý của Inno Setup

Bộ tiền xử lý chủ yếu là để bắt lỗi chính tả trong tệp tập lệnh thiết lập Inno. Về cơ bản, nó bổ sung một số tùy chọn hữu ích tại thời điểm biên dịch vào tập lệnh thiết lập Inno của bạn. Kiểm tra URL sau đây để biết chi tiết đầy đủ: //www.jrsoftware.org/ispphelp/ Khi bạn nhấn tiếp theo, bạn sẽ tiếp cận trang cuối cùng của trình hướng dẫn:

Hình 45-12: Trang trình hướng dẫn cuối cùng của Inno Setup

Không có gì để làm ở đây nhưng báo chí kết thúc, quay lại hoặc hủy bỏ. Đi trước và hoàn thành trình hướng dẫn bằng cách nhấn kết thúc:

Hình 45-13: Tập lệnh trình biên dịch Run Setup Inno Setup

Thiết lập Inno ngay bây giờ hỏi bạn rằng bạn có muốn biên dịch tập lệnh không. Điều này có nghĩa là thiết lập inno đã tạo tập lệnh xây dựng cho trình cài đặt của bạn và sẽ

Giống như quyền của bạn để chạy tập lệnh đó để thực sự tạo Trình cài đặt của bạn có thể thực thi. Nhấn có để tiếp tục.

Hình 45-14: Tập lệnh trình biên dịch Savo Setup của Inno

Hộp thoại này hỏi bạn có muốn lưu tập lệnh trình biên dịch thiết lập Inno trước khi chạy nó không. Đó chắc chắn là một ý tưởng tốt vì bạn không muốn mất bất kỳ thay đổi nào của bạn. Nhấn có để lưu nó và sau đó chọn những gì để đặt tên cho tập lệnh và nơi để lưu nó. Khi tập lệnh được lưu, nó sẽ tạo trình cài đặt của bạn. Tại thời điểm này, bạn nên có một trình cài đặt được tạo! Bạn có thể chỉnh sửa tệp tập lệnh trong bất kỳ trình soạn thảo văn bản nào, mặc dù trình chỉnh sửa thiết lập Inno có lẽ tốt nhất vì nó có cú pháp làm nổi bật cú pháp riêng được tích hợp cho nó.

Kiểm tra trình cài đặt của bạn ngay bây giờ khi bạn có trình cài đặt, đó là một ý tưởng tốt để kiểm tra nó. Khi bạn hoàn thành việc xây dựng trình cài đặt với thiết lập Inno, nó sẽ tự động chạy trình cài đặt cho bạn. Bạn có thể chọn cài đặt ứng dụng của mình ngay bây giờ và xác minh rằng nó khởi chạy chính xác. Bạn có thể thấy lỗi khi bạn cố gắng chạy ứng dụng của mình. Điều đó thường có nghĩa là bạn quên bao gồm một số tệp hoặc khác trong trình cài đặt của bạn. Thỉnh thoảng bạn sẽ nhận được các lỗi liên quan đến các vấn đề về quyền. Bạn có thể giải quyết vấn đề đầu tiên bằng cách so sánh những tệp nào đã được cài đặt với các tệp trong thư mục dist của bạn mà bạn đã tạo với pyinstaller. Nếu có bất kỳ thiếu, bạn có thể chạy thiết lập Inno và xem lại trình hướng dẫn hoặc bạn có thể tự sửa đổi tệp tập lệnh trực tiếp. Các vấn đề về quyền là khó khăn hơn và sẽ có một số thử nghiệm và lỗi để tìm ra. Bạn có thể sẽ cần nghiên cứu chính xác vấn đề là gì để tìm ra cách giải quyết nó. Tất nhiên, thỉnh thoảng có một cái gì đó sai với chính thực thi. Sau đó, bạn sẽ phải gỡ lỗi trước khi bạn có thể đóng gói lại nó vào trình cài đặt.

Kết thúc việc tạo một trình cài đặt cho người dùng Windows của bạn là một ý tưởng tốt. Có một trình cài đặt giúp người dùng tin tưởng vào chương trình của bạn. Trình cài đặt thêm một chút đánh bóng đó và chúng giúp dễ dàng đảm bảo tất cả các tệp bạn cần được cài đặt với ứng dụng của bạn. Trong chương này, bạn đã tìm hiểu về: Cài đặt thiết lập Inno Tạo trình cài đặt kiểm tra trình cài đặt của bạn, bạn nên dành thời gian để đọc tài liệu để thiết lập Inno và sau đó thử nó trên một số sáng tạo của riêng bạn. Bạn sẽ nhanh chóng thấy rằng thiết lập Inno là trực quan và bạn sẽ sớm có một số trình cài đặt của riêng bạn.

Xem lại câu hỏi 1. Đặt tên cho hai chương trình bạn có thể sử dụng để tạo trình cài đặt cho Windows. 2. Làm thế nào để bạn sửa đổi tập lệnh trình biên dịch thiết lập Inno? 3. Tại sao bạn nên kiểm tra trình cài đặt của mình?

Chương 46 - Cách tạo một ex exe cho Mac mỗi hệ điều hành có phương pháp cài đặt hoặc chạy ứng dụng riêng. Trên Windows, bạn chạy một thực thi hầu hết thời gian. Executables có một phần mở rộng của .exe. Phần mềm Apple Apple Mac có khái niệm về các ứng dụng sử dụng tiện ích mở rộng .APP. Đây là một gói các tập tin bao gồm một nhị phân có thể chạy được. Chúng giống như một tệp zip có thể chạy được. Tất cả những gì bạn cần làm là nhấp đúp vào tệp .App để chạy nó. Nếu bạn muốn phân phối một ứng dụng Python trên Mac OSX, bạn có ba tùy chọn: Pyinstaller - //www.pyinstaller.org/ Briefcase - //beeware.org/project : //py2app.readthedocs.io/en/latest/ bạn đã tìm hiểu về gói pyinstaller trong Chương 44. Trong chương này, bạn sẽ tìm hiểu cách sử dụng pyinstaller để tạo gói .app. Trong chương này, bạn sẽ đề cập đến hai chủ đề sau: Cài đặt PyinStaller tạo một thực thi với PyInstaller có thể tạo .App Bundles đưa ra cách phân phối ứng dụng của bạn cho người dùng Mac. Hãy cùng tìm hiểu cách cài đặt các gói Python mà bạn cần để bạn có thể bắt đầu!

Installing PyInstaller Both PyInstaller and Briefcase can be installed using pip. Here is how you would install PyInstaller: 1 python -m pip install pyinstaller

This is a pretty quick installation because PyInstaller doesn’t have a lot of dependencies. Once PyInstaller is installed, you can move on to the next section and create an executable for Mac OSX.

Creating an Executable with PyInstaller Creating an executable requires you to have some code. You can use the same wxPython GUI examples that you used in chapter 44. Here is the image_viewer program code: 1 # image_viewer.py 2 3 import wx 4 5 class ImagePanel[wx.Panel]: 6 7 def __init__[self, parent, image_size]: 8 super[].__init__[parent] 9 self.max_size = 240 10 11 img = wx.Image[*image_size] 12 self.image_ctrl = wx.StaticBitmap[self, 13 bitmap=wx.Bitmap[img]] 14 15 browse_btn = wx.Button[self, label='Browse'] 16 browse_btn.Bind[wx.EVT_BUTTON, self.on_browse] 17 18 self.photo_txt = wx.TextCtrl[self, size=[200, -1]] 19 20 main_sizer = wx.BoxSizer[wx.VERTICAL] 21 hsizer = wx.BoxSizer[wx.HORIZONTAL] 22 23 main_sizer.Add[self.image_ctrl, 0, wx.ALL, 5] 24 hsizer.Add[browse_btn, 0, wx.ALL, 5] 25 hsizer.Add[self.photo_txt, 0, wx.ALL, 5] 26 main_sizer.Add[hsizer, 0, wx.ALL, 5] 27 28 self.SetSizer[main_sizer] 29 main_sizer.Fit[parent] 30 self.Layout[] 31 32 def on_browse[self, event]: 33 """ 34 Browse for an image file 35 @param event: The event object 36 """ 37 wildcard = "JPEG files [*.jpg]|*.jpg" 38 with wx.FileDialog[None, "Choose a file", 39 wildcard=wildcard, 40 style=wx.ID_OPEN] as dialog: 41 if dialog.ShowModal[] == wx.ID_OK: 42 self.photo_txt.SetValue[dialog.GetPath[]] 43 self.load_image[] 44 45 def load_image[self]: 46 """ 47 Load the image and display it to the user 48 """ 49 filepath = self.photo_txt.GetValue[] 50 img = wx.Image[filepath, wx.BITMAP_TYPE_ANY] 51

52 # scale the image, preserving the aspect ratio 53 W = img.GetWidth[] 54 H = img.GetHeight[] 55 if W > H: 56 NewW = self.max_size 57 NewH = self.max_size * H / W 58 else: 59 NewH = self.max_size 60 NewW = self.max_size * W / H 61 img = img.Scale[NewW,NewH] 62 63 self.image_ctrl.SetBitmap[wx.Bitmap[img]] 64 self.Refresh[] 65 66 67 class MainFrame[wx.Frame]: 68 69 def __init__[self]: 70 super[].__init__[None, title='Image Viewer'] 71 panel = ImagePanel[self, image_size=[240,240]] 72 self.Show[] 73 74 if __name__ == '__main__': 75 app = wx.App[redirect=False] 76 frame = MainFrame[] 77 app.MainLoop[]

You can use the same commands for PyInstaller that you use on Windows to create a Mac application bundle. Open up a console window on your Mac and navigate to the folder that contains image_viewer.py. Then run the following command: 1 pyinstaller image_viewer.py --windowed

Running this command will give you this output, which is quite similar to the output you saw on Windows: 1 Mikes-MacBook-Pro:chapter46_mac michael$ pyinstaller image_viewer.py 2 102 INFO: PyInstaller: 3.6 3 102 INFO: Python: 3.8.1 4 112 INFO: Platform: macOS-10.14.6-x86_64-i386-64bit 5 112 INFO: wrote /Users/michael/Dropbox/Books/Python101_2nd_ed/python101code/chapter4\ 6 6_mac/image_viewer.spec 7 121 INFO: UPX is not available. 8 123 INFO: Extending PYTHONPATH with paths 9 ['/Users/michael/Dropbox/Books/Python101_2nd_ed/python101code/chapter46_mac', 10 '/Users/michael/Dropbox/Books/Python101_2nd_ed/python101code/chapter46_mac'] 11 123 INFO: checking Analysis 12 123 INFO: Building Analysis because Analysis-00.toc is non existent 13 123 INFO: Initializing module dependency graph... 14 126 INFO: Caching module graph hooks... 15 133 INFO: Analyzing base_library.zip ...

Of course, when you run PyInstaller on a Mac, you will see that the platform information reflects that. When this finishes, you will have a dist folder that contains your app bundle. There does seem to be a bug in Python 3.7 and 3.8 that occurs when you try to launch the app bundle: 1 FileNotFoundError: Tcl data directory

To fix this issue, you will need to run the following commands in your console: 1 cd dist/image_viewer.app/Contents/MacOS/ 2 mkdir tcl tk

Now when you go to run the application bundle, it will launch your wxPython GUI correctly. Because of this issue, if you use the --onefile option, you won’t be able to add those two folders. So the --onefile option won’t actually launch. Instead, you will see it attempt to launch and immediately crash. Hopefully PyInstaller or a newer version of Python will resolve this issue.

Wrapping Up Creating executables on MacOS is a bit more complicated than creating them on Windows. You also have fewer options for creating application bundles. Windows has many Python packages to choose from when it comes to creating binaries. Mac has PyInstaller and Beeware’s Briefcase. The latter is designed to work with other Beeware products, but can be used with regular Python too. Go ahead and give them both a try to see what works best for you. PyInstaller is a much more mature option, but sometimes it’s nice to give the newer packaging applications a try.

Xem lại câu hỏi 1. Bạn có thể sử dụng công cụ nào để tạo các tệp thực thi cho Python trên macOS? 2. Một thực thi được gọi là gì trên macOS là gì?

Tiên cầu cuốn sách này thực sự rất thú vị để viết. Python 101 là cuốn sách đầu tiên tôi từng viết và cố gắng quyết định những gì cần viết lại đã mất rất nhiều nỗ lực. Cuối cùng, tôi quyết định viết lại toàn bộ cuốn sách. Một số phần từ bản gốc đã bị cắt hoàn toàn. Các phần khác đã được sắp xếp lại hoặc hấp thụ vào các chương khác. Tôi đã có rất nhiều trợ giúp mới với phiên bản này của cuốn sách. Có nhiều người đọc nó và cho tôi phản hồi về các phần của cuốn sách. Ý định của tôi khi viết Python 101 luôn là viết loại cuốn sách Python mới bắt đầu mà tôi luôn muốn khi học Python. Tôi luôn muốn nhiều hơn chỉ là cú pháp của ngôn ngữ. Hy vọng của tôi là cuốn sách này giúp bạn học Python và nhìn thoáng qua nhiều khả năng mà nó cung cấp cho bạn. Cảm ơn rất nhiều vì đã kiểm tra cuốn sách này. Tôi hy vọng bạn sẽ cho tôi biết những gì bạn nghĩ. Mike

Phụ lục A - Kiểm soát phiên bản điều khiển phiên bản, còn được gọi là Điều khiển nguồn hoặc Kiểm soát sửa đổi, là một phương pháp để quản lý các thay đổi trong tài liệu, chương trình, trang web và tương tự. Các thay đổi đối với một tệp hoặc bộ tệp được xác định bằng số sửa đổi hoặc thay đổi. Mỗi lần sửa đổi được hẹn giờ và liên kết với người đã thực hiện thay đổi. Một sửa đổi có thể được so sánh và khôi phục và chúng cũng có thể được hợp nhất. Các nhà phát triển phần mềm sử dụng kiểm soát phiên bản để phiên bản phần mềm của họ. Điều này giúp thay đổi mã của bạn cũng như cuộn mã của bạn trở lại [hay còn gọi là thay đổi của bạn] nếu cần. Kiểm soát sửa đổi được sử dụng bởi các biên tập viên của phần mềm Wiki để theo dõi các chỉnh sửa, chính xác sai lầm và bảo vệ chống lại sự phá hoại. Trong chương này, bạn sẽ tìm hiểu về các điều sau đây: Hệ thống kiểm soát phiên bản phân phối so với phiên bản tập trung Phiên bản thuật ngữ phổ biến Python IDE Phiên bản hỗ trợ điều khiển cho phép bắt đầu!

Hệ thống điều khiển phiên bản Có nhiều loại hệ thống kiểm soát phiên bản [VCS]. Bộ xử lý văn bản và bảng tính thậm chí bao gồm kiểm soát phiên bản thô sơ. Các nhà phát triển phần mềm có một số hệ thống khác nhau để lựa chọn. Dưới đây chỉ là một vài trong số các hệ thống điều khiển phiên bản phổ biến: Git Mercurial Perforce Team Foundation Control [Microsoft] Apache Subversion Hệ thống điều khiển phiên bản phổ biến nhất trong nguồn mở là GIT. Tuy nhiên, các hệ thống kiểm soát phiên bản khác được đề cập ở đây được sử dụng bởi nhiều tổ chức và vì nhiều lý do khác nhau. Ví dụ: nếu công ty của bạn sử dụng Microsoft Tooling rất nhiều, thì bạn sẽ sử dụng Team Foundation. Mặt khác, nếu công ty của bạn vào nguồn mở hoặc không muốn trả phí cấp phép, thì bạn có thể chọn sử dụng một hệ thống kiểm soát phiên bản nguồn mở như Git hoặc Mercurial.

Phân phối so với phiên bản tập trung Có hai loại hệ thống kiểm soát phiên bản: tập trung hoặc phân phối. Một hệ thống tập trung theo mô hình máy khách-máy chủ. Hai ví dụ về điều này là lỗ hổng và lật đổ. Các công cụ này có một máy chủ tập trung với một bản sao chính tắc của mã nguồn. Các khách hàng là máy phát triển. Họ có thể kiểm tra mã từ máy chủ đến máy cục bộ của họ để chỉnh sửa. Khi hoàn thành, họ sẽ lưu hoặc đẩy các thay đổi của họ trở lại máy chủ. Nếu máy chủ đi xuống, bạn không thể làm việc trên mã. Một hệ thống phân tán, như Git hoặc Mercurial, tạo ra toàn bộ bản sao của mã nguồn trên máy phát triển. Điều này có nghĩa là mọi nhà phát triển đều có một bản sao lưu của cơ sở mã và lịch sử thay đổi của nó. Điều này bảo vệ các nhà phát triển khỏi mất dữ liệu. Một lợi thế khác của các hệ thống phân tán là khi bạn lưu mã, nó sẽ tiết kiệm cục bộ, có thể nhanh hơn nhiều. Khi bạn muốn chia sẻ mã của mình, bạn có thể đẩy nó ngang hàng. Phương pháp chung để thực hiện điều này là tạo ra một số loại vị trí đám mây để đẩy các thay đổi của bạn đến, giống như mô hình tập trung. Một trong những nhà cung cấp đám mây phổ biến nhất là GitHub. Bạn có thể thúc đẩy các thay đổi của mình ở đó và sau đó các nhà phát triển khác có thể kiểm tra mã của bạn, tải xuống và chỉnh sửa nó khi họ thấy phù hợp.

Thuật ngữ phổ biến Có rất nhiều thuật ngữ khi nói đến kiểm soát phiên bản. Nó có thể hữu ích để xem qua một số thuật ngữ phổ biến nhất và ý nghĩa của chúng.

Chi nhánh Một tập hợp các tập tin dưới điều khiển phiên bản có thể được phân nhánh hoặc phân nhánh tại một thời điểm. Điều này cho phép các nhà phát triển làm việc trên một tính năng mới một cách độc lập với một chi nhánh khác.

Thay đổi / thay đổi Một thay đổi mô tả một thay đổi trong một hoặc nhiều tệp được thực hiện trong một cam kết duy nhất. Chúng thường được xác định với một ID duy nhất.

Kiểm tra mã kiểm tra đang tạo một bản sao cục bộ từ kho lưu trữ từ xa. Bạn có thể chỉ định một bản sửa đổi cụ thể để kiểm tra hoặc kiểm tra mới nhất. Nếu bạn kiểm tra một tệp từ một hệ thống tập trung, những người dùng khác có thể không được phép chỉnh sửa tệp đó trong khi nó được kiểm tra.

Bản sao nhân bản một kho lưu trữ có nghĩa là bạn đang tạo một bản sao của kho lưu trữ. Điều này tương tự như kiểm tra mã từ một hệ thống phiên bản tập trung.

Cam kết đề cập đến việc lưu mã của bạn vào hệ thống điều khiển phiên bản hoặc kho lưu trữ. Cam kết còn được gọi là Checkin.

Diff A Diff là so sánh hai phiên bản của một tệp. Điều này giúp bạn so sánh trực quan các tệp để bạn có thể thấy những thay đổi đã được thực hiện.

Ngã ba xem chi nhánh

Đầu còn được gọi là Tip. Điều này đề cập đến cam kết gần đây nhất hoặc chi nhánh hoạt động hoặc thân cây. Thân cây và cành có đầu riêng của họ, mặc dù đôi khi, Head Head chỉ được sử dụng để chỉ thân cây.

Khởi tạo Tạo một kho lưu trữ mới, trống trong hệ thống điều khiển phiên bản.

Đường chính tương tự như thân cây, mặc dù có thể có một dòng chính cho mỗi nhánh

Hợp nhất một sự hợp nhất đang lấy các thay đổi của bạn và hợp nhất chúng vào một tệp hoặc tệp. Ví dụ: bạn có thể cần phải đồng bộ hóa các thay đổi của mình với máy chủ. Hoạt động đồng bộ hóa đang hợp nhất các thay đổi của bạn. Một kịch bản phổ biến khác là khi bạn có một nhánh các tệp và bạn cần hợp nhất chúng với đường chính hoặc thân cây.

Kéo / Đẩy bản sửa đổi bản sao từ kho này sang kho lưu trữ khác. Một lực kéo được bắt đầu bởi kho lưu trữ nhận được trong khi một cú đẩy được bắt đầu tại nguồn.

Kéo yêu cầu nhà phát triển tạo yêu cầu kéo [PR], đó là cách bạn yêu cầu các nhà phát triển khác xem xét mã của bạn.

Kho lưu trữ vị trí nơi các thay đổi hiện tại và lịch sử được lưu trữ.

Giải quyết

Giải quyết một tập tin liên quan đến nhà phát triển đang xem xét xung đột hợp nhất. Điều này xảy ra khi hai người chỉnh sửa một tệp cùng một lúc và sau đó nhà phát triển phải tìm ra cách hợp nhất cả hai thay đổi cùng với bản gốc.

Truyền một thùng chứa cho các tệp được phân nhánh cũng có mối quan hệ với các container khác. Phổ biến trong Perforce.

Thẻ thẻ hoặc nhãn là một ảnh chụp nhanh quan trọng của mã tại một điểm cụ thể. Thông thường thẻ có tên thân thiện với người dùng. Thẻ có thể được sử dụng để phát hành phần mềm.

Thân cây phát triển độc đáo không phải là một nhánh. Còn được gọi là đường chính hoặc đường cơ sở.

Hỗ trợ điều khiển phiên bản Python IDE Các ides Python phổ biến nhất có hỗ trợ kiểm soát phiên bản tích hợp. Ví dụ, Pycharm hỗ trợ Git, Mercurial, Perforce và Subversion. Wingide có khả năng tương tự. Nếu IDE không có hỗ trợ tích hợp cho hệ thống điều khiển phiên bản của bạn, thì bạn sẽ cần sử dụng một công cụ hoặc bộ công cụ riêng biệt để kiểm tra mã và cam kết quay lại kho lưu trữ. Khi bạn có hỗ trợ đầy đủ cho hệ thống điều khiển phiên bản của mình tích hợp, thì bạn có thể thực hiện tất cả những điều đó từ bên trong trình soạn thảo của mình. Điều này hợp lý hóa hoạt động trên cơ sở mã của bạn và làm cho việc làm việc trên mã đẹp hơn nhiều. Khi chọn IDE Python, hãy chắc chắn xác minh rằng IDE của bạn hoạt động với hệ thống điều khiển phiên bản của bạn. Mặc dù đây không phải là một công cụ phá vỡ thỏa thuận, nhưng nó chắc chắn làm cho dễ dàng hơn!

Kết thúc điều khiển phiên bản sẽ giúp bạn theo dõi các thay đổi của bạn và làm cho cuộc sống của bạn dễ dàng hơn. Mặc dù nó có nghĩa là thêm một công cụ khác vào hộp công cụ của bạn, công cụ này sẽ bảo vệ bạn khỏi chính bạn. Khi bạn thực hiện chỉnh sửa xấu, bạn luôn có thể quay lại sửa đổi trước đó và khắc phục sự cố. Bạn cũng có thể sử dụng kiểm soát phiên bản để nhanh chóng xem [các] thay đổi nào đã xảy ra trong mã của bạn.

Phụ lục B - Điều khiển phiên bản với điều khiển phiên bản Git cho phép bạn giữ các phiên bản trước của mã trước đó. Điều này rất hữu ích khi bạn đang chỉnh sửa mã vì bây giờ bạn có mạng lưới an toàn. Nếu bạn tình cờ viết mã phá vỡ một tính năng, bạn có thể dễ dàng quay lại phiên bản trước của mã. Kiểm soát phiên bản cho phép bạn làm việc trên các lỗi hoặc các tính năng mới mà không cần phải lo lắng rằng bạn sẽ phá hỏng công việc của mình. Có nhiều loại phần mềm kiểm soát phiên bản khác nhau. Phần mềm kiểm soát phiên bản phổ biến nhất được gọi là GIT. Trong Phụ lục này, bạn sẽ tìm hiểu về các điều sau: Cài đặt Git Định cấu hình Git Tạo một dự án bỏ qua các tệp khởi tạo kho lưu trữ kiểm tra trạng thái dự án Thêm tệp vào kho lưu trữ cam kết các tệp đang xem nhật ký Thay đổi tệp hoàn trả một tệp kiểm tra trước khi truy cập vào github Hãy tìm hiểu cách sử dụng kiểm soát phiên bản với GIT!

Cài đặt Git Git có sẵn cho tất cả các nền tảng chính, bao gồm Windows, MacOS và Linux. Tất nhiên, mỗi hệ điều hành có phương pháp riêng để cài đặt phần mềm.

Cài đặt trên Windows cho người dùng Windows, nên truy cập trang web sau: //git-scm.com/ chỉ cần tải xuống trình cài đặt Git cho phiên bản Windows của bạn và sau đó cài đặt nó.

Cài đặt trên MacOS tùy thuộc vào phiên bản nào của hệ điều hành bạn có trên Mac, bạn có thể đã cài đặt Git. Bạn có thể kiểm tra bằng cách chạy lệnh này: 1 git --Version

Tùy thuộc vào phiên bản macOS của bạn, một trong ba điều sẽ xảy ra: bạn nhận được lỗi mà bạn được nhắc cài đặt Git nó hoạt động! Nếu bạn nhận được lỗi, thì bạn sẽ cần cài đặt Git theo cách thủ công. Bạn có thể tải xuống Trình cài đặt Git cho MacOS từ cùng một liên kết bạn đã sử dụng cho Windows: //git-scm.com/

Cài đặt trên Linux Linux là một chút khác nhau. Thay vì tải xuống một tệp, bạn thường sẽ sử dụng lệnh Linux để cài đặt Git. Lệnh này sẽ hoạt động trên Debian và

Biến thể Ubuntu: 1 apt-get cài đặt git

Nếu bạn có một hương vị khác của Linux, thì bạn có thể muốn truy cập URL này để xem cách cài đặt Git trên hệ thống của bạn: //git-scm.com/doad/linux Sau khi bạn đã cài đặt Git, bạn có thể tiếp tục đến phần tiếp theo!

Cấu hình Git toàn bộ quan điểm của Git là theo dõi các thay đổi tệp, bất kể bao nhiêu hoặc bao nhiêu người trong nhóm của bạn. Nếu bạn là một nhóm của một, bạn vẫn cần định cấu hình Git để có thể ghi lại ai đang sửa đổi các tệp. Một tên người dùng và địa chỉ email được yêu cầu. Nếu bạn đang làm việc một mình và don kế hoạch về việc tải mã của mình lên một cái gì đó như GitHub, thì bạn có thể sử dụng bất kỳ tên người dùng và email nào bạn muốn. Tuy nhiên, nếu bạn sử dụng GitHub hoặc một cái gì đó tương tự, thì bạn sẽ muốn sử dụng tên người dùng GitHub và email của mình cho việc này. Để thiết lập các giá trị này trong GIT, bạn sẽ chạy các lệnh sau trong dấu nhắc lệnh [windows] hoặc thiết bị đầu cuối [macOS / linux]: 1 GIT config --global user.name "tên người dùng" "[Email & NBSP; được bảo vệ]"

Sau đó, bạn có thể sử dụng lệnh này để liệt kê các cài đặt Git nào đã được lưu trong cấu hình của bạn: 1 Git Config -Danh sách -List

Có một tệp cấu hình git được lưu chứa tất cả thông tin này và hơn thế nữa. URL này mô tả các vị trí khác nhau mà Git lưu tệp này: //git-scm.com/book/en/v2/getting-started-first-time-git-setup Bây giờ hãy tiếp tục và tạo một dự án mà bạn muốn Để đặt dưới sự kiểm soát phiên bản!

Tạo một dự án Một dự án là một từ lạ mắt cho bất cứ điều gì mà bạn đang làm việc. Bạn có thể sử dụng bất kỳ mã nào bạn có hoặc bạn có thể thực hiện mô -đun số học mà bạn đã tạo trong Chương 43. Đây là mã một lần nữa để thuận tiện cho bạn: 1 2 3 4 5 6 7 8 9 10 11 12 13

# arithmetic.py def add [x, y]: return x + y def Divide [x, y]: return x / y def mulul - y

Bây giờ bạn có một chương trình đơn giản mà bạn có thể sử dụng để học Git với. Bước đầu tiên để học là cách bỏ qua các tệp mà bạn không muốn theo dõi với Git.

Bỏ qua các tập tin Git theo dõi tất cả các thay đổi chương trình của bạn. Khi bạn chạy tập lệnh Python, nó thường sẽ tạo tệp *.pyc được lưu trong thư mục __pycache__, mà bạn không muốn giữ trong điều khiển phiên bản. Nếu bạn đang sử dụng Python IDE như Pycharm hoặc Wingide, đôi khi chúng cũng sẽ tạo cấu hình hoặc tệp dự án. Đây cũng không phải là một cái gì đó hữu ích để theo dõi vì chúng được gắn với máy tính của bạn. Họ đã giành chiến thắng giúp đỡ bất cứ ai khác trong nhóm của bạn khi họ đi chỉnh sửa dự án của bạn. Để bỏ qua các tệp như thế này, bạn có thể thêm một tệp đặc biệt có tên .gitignore vào dự án của bạn. Đây là những gì thư mục dự án của bạn sẽ trông như bây giờ: 1 /my_project 2 .gitignore 3 arithmetic.py

Bên trong tệp .gitignore, bạn có thể nói git những gì cần bỏ qua. Mỗi dòng là một loại tệp hoặc thư mục mới để bỏ qua. Mở ra .gitignore và thêm văn bản sau vào nó: 1 *.pyc 2 *.zip 3 *.pdf

Điều này sẽ bỏ qua các tệp PYC cũng như các tệp ZIP và PDF. Bây giờ bạn có thể tiếp tục và khởi tạo gói của bạn để nói với Git rằng bạn muốn bắt đầu theo dõi.

Khởi tạo kho lưu trữ để bắt đầu sử dụng GIT để phiên bản mã của mình, bạn cần mở một dấu nhắc thiết bị đầu cuối hoặc lệnh và điều hướng đến vị trí của [các] tệp mã của bạn. Sau đó chạy lệnh này: 1 git init

Điều này sẽ phát ra thông báo sau: Kho lưu trữ Git trống trong /path/to/your/files/.git. Thư mục .git là một thư mục ẩn được sử dụng bởi Git để theo dõi các thay đổi. Kho lưu trữ là thuật ngữ được sử dụng để mô tả các tệp đang được theo dõi bởi một hệ thống điều khiển phiên bản, như Git. Bạn đã giành chiến thắng khi làm bất cứ điều gì tại thư mục .git. Tuy nhiên, bạn không nên xóa thư mục này vì nó chứa tất cả lịch sử chỉnh sửa mã của bạn.

Kiểm tra trạng thái dự án Bây giờ bạn có một kho lưu trữ Git trống tất cả được thiết lập. Bạn có thể kiểm tra trạng thái dự án của bạn bằng cách chạy lệnh sau: 1 trạng thái git

Khi bạn chạy lệnh này, bạn sẽ thấy đầu ra sau: 1 2 3 4 5 6 7 8 9 10

Trên chi nhánh Master chưa có cam kết chưa được truy cập: [sử dụng "Git add ..." để đưa vào những gì sẽ được cam kết] Số học.

Điều này cho bạn biết một vài điều về Git. Đầu tiên là bạn đang ở trong Master Master. Một nhánh là phiên bản mã của bạn. Khi bạn kiểm tra trạng thái của mình, bạn nên ở trong chi nhánh chính của bạn trừ khi bạn đã nói cụ thể cho Git chuyển sang một nhánh khác. Ví dụ: bạn có thể tạo một chi nhánh mới để thêm một tính năng mới vào mã của bạn. Bằng cách có một chi nhánh mới, bạn đã thắng phá vỡ mã hiện đang làm việc và bạn có thể kiểm tra các thay đổi của mình trong nhánh riêng biệt này. Một chút thông tin khác ở đây là Git đã phát hiện ra rằng có một tệp không bị truy cập trong kho lưu trữ này được gọi là arithmetic.py. Nó cho bạn biết rằng bạn không có bất cứ điều gì để cam kết. Cam kết là một điểm kiểm tra hoặc ảnh chụp nhanh của mã hiện tại của bạn. Mặc dù vậy, bạn đã cam kết bất cứ điều gì cho kho Git của bạn. Hãy để tìm ra cách thêm một tập tin tiếp theo!

Thêm tệp vào kho lưu trữ đầu ra từ trạng thái Git thực sự cho bạn biết cách thêm tệp vào kho lưu trữ của bạn. Quay lại và nhìn vào dòng đầu ra cuối cùng. Nó đề cập đến việc sử dụng lệnh Thêm. Bạn có thể thêm các tệp theo tên như thế này: 1 git thêm arithmetic.py

Hoặc nếu bạn muốn thêm tất cả các tệp mà danh sách Git chưa được kiểm soát, bạn sẽ làm điều này: 1 git thêm.

Thời gian trên nói với Git để thêm tất cả các tệp chưa được truy cập. Hãy cẩn thận làm điều đó vì bạn có thể thêm một số tệp mà bạn đã không có ý định. Bạn phải luôn luôn kiểm tra trạng thái của mình trước khi chạy lệnh trên để đảm bảo bạn không thêm các tệp mà bạn không muốn thêm. Bây giờ nếu bạn chạy lệnh trạng thái, bạn sẽ thấy đầu ra này: 1 trên nhánh Master 2 3 chưa có cam kết : arithmetic.py

Bây giờ lệnh Thêm không thực sự có ảnh chụp nhanh của mã. Những gì đầu ra ở trên đang nói với bạn là Git đã dàn dựng tệp và nó đã sẵn sàng để lưu ảnh chụp nhanh. Để thực sự lưu một ảnh chụp nhanh, bạn cần phải cam kết, đó là những gì bạn sẽ làm tiếp theo.

Cam kết các tệp cam kết tệp lưu một ảnh chụp nhanh mã của bạn. Khi bạn lưu một ảnh chụp nhanh, bạn được yêu cầu thêm một tin nhắn. Thông điệp này cho Git những gì bạn đang cam kết và giúp bạn dễ dàng tìm ra những thay đổi nào trong việc cam kết trong lịch sử của bạn. Bạn có thể chạy lệnh này để cam kết tệp: 1 cam kết git

Điều này sẽ mở ra trình soạn thảo văn bản mặc định của bạn, nơi bạn có thể nhập thông báo cam kết. Ngoài ra, bạn có thể thêm thông báo cam kết trên dòng lệnh, như sau: 1 Git cam kết -M "Đây là cam kết đầu tiên của tôi"

Nếu bạn làm điều này, bạn sẽ thấy đầu ra sau: 1 [Master [-commit] 7F76A83] Đây là tệp cam kết đầu tiên của tôi 2 1, 13 lần chèn [+] 3 tạo chế độ 100644 arithmetic.py

Thành công! Bây giờ nếu bạn kiểm tra trạng thái của mình, bạn sẽ thấy rằng không có gì mới để cam kết.

Xem nhật ký như bạn biết, Git hiện đang theo dõi mã của bạn. Bạn có thể xem các cam kết bạn đã thực hiện bằng cách sử dụng lệnh nhật ký, như thế này: 1 nhật ký git

Nếu bạn chạy lệnh đó, bạn sẽ nhận được đầu ra tương tự như sau: 1 cam kết 7F76A8347C32C93CB3F47A7EA2BB292E1DA386F1 [Trưởng phòng -> cam kết đầu tiên

Các bài hát của Git, người đã cam kết, khi nó được cam kết và cũng thêm ID 40 ký tự độc đáo vào cam kết. Nếu bạn thích các thông báo nhật ký cam kết sẽ được in trên một dòng, bạn có thể chạy lệnh này thay vào đó: 1 log git --pretty = oneline

Lệnh đầu ra này ít dài dòng hơn, nhưng nó cung cấp cho bạn những gì bạn cần biết: 1 7F76A8347C32C93CB3F47A7A2BB292E1DA386F1 [đầu -> Master]

Hãy để xem những gì xảy ra khi bạn sửa đổi một tập tin!

Thay đổi một tệp để xem Git thực sự hoạt động như thế nào, bạn cần phải thực hiện nhiều hơn một cam kết. Tái cấu trúc tệp arithmetic.py của bạn và thêm chức năng này vào cuối: 1 def cos [x]: 2 in ['không được triển khai']]

Bây giờ hãy lưu tệp và chạy lại lệnh trạng thái. Bạn sẽ thấy đầu ra này: 1 trên nhánh Master 2 thay đổi không được dàn dựng cho cam kết: 3 [Sử dụng "Git ADD ..." để cập nhật những gì sẽ được cam kết] 4 [Sử dụng "Kiểm tra Git - ..." để loại bỏ các thay đổi trong Thư mục làm việc] 5 6 Sửa đổi: Số liệu

Bạn có thể thêm và cam kết điều này trong một lệnh duy nhất bằng cách sử dụng -Am, như thế này: 1 Git cam kết -Am "Đã thêm chức năng mới"

Bây giờ hãy tiếp tục và chạy lại thông báo nhật ký như bạn đã làm trước đây: 1 $ log Git --Pretty = oneline 2 7EA78E14831F077B6ED5489A222B3387146CE39F [

Như bạn có thể thấy, hiện có hai cam kết trong mã của bạn. Nhưng bạn sẽ làm gì nếu bạn quyết định rằng thay đổi cuối cùng của bạn là một điều xấu? Hãy cùng tìm hiểu trong phần tiếp theo!

Hoàn nguyên một tập tin khi bạn quyết định rằng bạn đã lưu một thay đổi xấu, bạn có thể phục hồi bằng cách hoàn nguyên thay đổi đó. Để xem cách thức hoạt động của nó, hãy tiếp tục và sửa đổi số học.

# arithmetic.py def add [x, y]: return x + y def Divide [x, y]: return x / y def mulul - y def cos [x]: in ['không được triển khai'] 1/0

Dòng cuối cùng đó sẽ gây ra lỗi nếu bạn cố gắng chạy hoặc nhập mã. Hãy tiếp tục và lưu mã, sau đó chạy Trạng thái Git: 1 trên Chi nhánh Master 2 Thay đổi không được dàn dựng cho cam kết: 3 [Sử dụng "Git ADD ..." để cập nhật những gì sẽ được cam kết] 4 [Sử dụng "Kiểm tra Git - .. "

Git thấy chính xác rằng bạn đã thay đổi tệp, nhưng bạn đã cam kết nó. Bạn có thể hoàn tác thay đổi xấu trong trình soạn thảo Python của bạn hoặc bạn có thể chạy lệnh GIT này để hoàn nguyên nó: 1 thanh toán Git.

Bây giờ nếu bạn chạy trạng thái một lần nữa, đầu ra sẽ khác: 1 $ GIT Trạng thái 2 trên nhánh Master 3 không có gì để cam kết, làm việc sạch sẽ

Bạn vừa hoàn nguyên một thay đổi không cam kết! Điều này hữu ích nhất khi bạn có nhiều tệp được kiểm tra rằng bạn không muốn cam kết. Khi nó chỉ có một hoặc hai tệp, có thể đơn giản hơn khi sử dụng trình soạn thảo Python của bạn. Đó thực sự là tùy thuộc vào bạn. Bạn làm gì trong trường hợp bạn đã thực hiện một số mã đang phá vỡ một cái gì đó? Bạn có thể hoàn tác một cách dễ dàng với biên tập viên Python của bạn. Hãy để xem Git sẽ giúp bạn như thế nào với vấn đề đó tiếp theo!

Kiểm tra các cam kết trước đây cho phép bạn kiểm tra các cam kết trước đó. Điều này cho phép bạn sửa lỗi của mình với phiên bản cũ của mã. Bạn có thể kiểm tra bất kỳ cam kết nào trước đó bằng cách sử dụng sáu ký tự đầu tiên của ID duy nhất cho cam kết. Tại đây, nhật ký hiện tại: 1 $ GIT log --pretty = oneline 2 7EA78E14831F077B6ED5489A222B3387146CE39F [đầu ->

Nếu bạn muốn kiểm tra cam kết đầu tiên, bạn sẽ thực hiện điều này: 1 Git Checkout 7F76A8

Khi bạn chạy lệnh này, bạn sẽ nhận được thông báo sau: 1 2 3 4 5 6 7 8 9 10 11 12

Lưu ý: Kiểm tra '7F76A8'. Bạn đang ở trong tình trạng 'đầu tách ra'. Bạn có thể nhìn xung quanh, thực hiện các thay đổi thử nghiệm và cam kết chúng, và bạn có thể loại bỏ bất kỳ cam kết nào bạn thực hiện ở trạng thái này mà không ảnh hưởng đến bất kỳ chi nhánh nào bằng cách thực hiện một thanh toán khác. Nếu bạn muốn tạo một nhánh mới để giữ lại cam kết bạn tạo, bạn có thể làm như vậy [bây giờ hoặc muộn hơn] bằng cách sử dụng -B với lệnh thanh toán lại. Ví dụ: Git Checkout -B Head hiện đang ở 7F76A83 ... Đây là cam kết đầu tiên của tôi

Điều này có nghĩa là bạn đã rời khỏi nhánh chính của bạn tạm thời. Git gọi đây là một trạng thái đầu tách ra. Trưởng phòng đề cập đến tình trạng cam kết hiện tại của dự án của bạn. Nhưng bạn không cam kết bất cứ điều gì ngay bây giờ. Thay vào đó, bạn là người tách rời khỏi đầu vì bạn không còn ở trong chủ. Khi bạn hoàn thành việc nhìn xung quanh, bạn có thể quay lại nhánh chính bằng cách sử dụng lệnh sau: 1 Git Checkout Master

Nếu bạn muốn quay lại cam kết trước đây, bạn có thể sử dụng lệnh RESET:

1 Git Reset - -Hard 7F76A8

Bạn sẽ cần phải sử dụng -cứng để làm cho công việc này chính xác. Nếu bạn đã chạy điều này, bạn sẽ chuyển sang cam kết đầu tiên trong kho lưu trữ của bạn. Sử dụng Đặt lại một cách thận trọng. Bạn không muốn vô tình quét sạch công việc của bạn.

Đẩy đến GitHub hầu hết thời gian, phát triển phần mềm xảy ra với nhiều nhà phát triển. Bạn có thể thực hiện công việc của mình trên máy của riêng bạn, nhưng sau đó bạn cần đẩy công việc của mình đến một vị trí trung tâm để những người khác trong nhóm của bạn có thể sử dụng nó. Có nhiều trang web phổ biến chuyên về không gian này. GitHub là phổ biến nhất, nhưng có những người khác như Gitlab và Bitbucket cũng phổ biến. Để đẩy mã của bạn vào GitHub, bạn sẽ cần đến đó và tạo một tài khoản: //github.com/ Tiếp theo, bạn sẽ cần tạo một kho lưu trữ mới. Dưới đây là kho lưu trữ cho cuốn sách này Mã này: //github.com/driscollis/python101code Hãy để Lừa lấy phần này. Sau địa chỉ GitHub, bạn thấy tên người dùng: Driscollis. Điều đó được theo sau bởi tên kho lưu trữ Python101Code. Vì vậy, nếu bạn đã thêm mã số học vào GitHub, URL sẽ trông giống như thế này: //github.com/username/arithmetic để nói với Git rằng bạn muốn đẩy mã của mình ở đây, bạn cần chạy lệnh sau đây Terminal của bạn: 1 Git từ xa Thêm nguồn gốc //github.com/username/arithmetic.git

Lệnh này sẽ nói với Git rằng bạn muốn đẩy mã vào kho lưu trữ cụ thể này trên GitHub. Tuy nhiên, nó không thực sự gửi mã ở đó. Bạn cần phải làm điều đó bằng cách chạy như sau: 1 Git Push Origin Master

Lệnh này bảo Git đẩy hoặc tải mã của bạn lên GitHub. Sau đó, bạn sẽ có thể sử dụng Git Push để tải lên bất kỳ thay đổi nào khác bạn thực hiện cho mã của mình.

Kết thúc git là một công cụ rất hữu ích. Cho dù bạn có chọn làm việc với Git hay không là tùy thuộc vào bạn. Tuy nhiên, bạn nên học cách sử dụng ít nhất một trong những hệ thống kiểm soát phiên bản phổ biến nhất. Git là phổ biến nhất. Khi bạn đã học cách sử dụng nó, bạn có thể di chuyển sang hầu hết các phần mềm kiểm soát phiên bản khác và nhanh chóng tăng tốc với chúng. Sử dụng Git sẽ giúp bạn trở thành một lập trình viên tốt hơn. Hãy nhớ cam kết thường xuyên. Nó dễ dàng hơn rất nhiều để quay trở lại một thay đổi nhỏ so với nó là một thay đổi lớn.

Xem lại câu trả lời câu trả lời

Chương 3 - Tài liệu về mã của bạn 1] Làm thế nào để bạn tạo một nhận xét? Bằng cách sử dụng phím pound hoặc octothorpe: #. Dưới đây là một vài ví dụ: 1 # Đây là một bình luận 2 a = 2 # Đây là một nhận xét nội tuyến

2] Bạn sử dụng một DocString để làm gì? Docstrings được sử dụng để ghi lại các chức năng, lớp học hoặc mô -đun. Bạn có thể tìm hiểu thêm về các chức năng và các lớp trong chương 17 và 18 tương ứng.

3] Hướng dẫn phong cách Python là gì? Nó là một hướng dẫn để định dạng mã python để nó phù hợp giữa các tác giả và dễ đọc hơn. Hướng dẫn phong cách Python sườn được định nghĩa trong PEP8. Bạn có thể tìm thấy nó ở đây: //www.python.org/dev/peps/pep-0008/

4] Tại sao ghi lại mã của bạn quan trọng? Tài liệu về mã của bạn rất quan trọng vì nó sẽ giúp bạn hiểu mã tốt hơn sau này. Nó cũng sẽ giúp các nhà phát triển khác cần sử dụng hoặc sửa đổi mã của bạn. Điều này đặc biệt đúng khi bạn đang ghi lại mã hoặc thuật toán phức tạp.

Chương 4 - Làm việc với các chuỗi 1] 3 cách để tạo một chuỗi là gì? Chuỗi được xác định bằng cách bắt đầu và kết thúc một chuỗi các ký tự với một trích dẫn đơn, gấp đôi hoặc ba hoặc ba lần: 1 >>> String_1 = 'Mike' 2 >>> String_2 = "Thích" 3 >>> String_3 = '' '' Python! '' '

Báo giá ba có thể được sử dụng để tạo chuỗi nhiều dòng.

2] Chạy DIR [""]. Điều này liệt kê tất cả các phương thức chuỗi bạn có thể sử dụng. Phương pháp nào trong số này sẽ tận dụng từng từ trong một câu? sẽ viết hoa mỗi chữ cái đầu tiên của mỗi từ. Viết hoa [] sẽ chỉ viết hoa chữ cái đầu tiên trong một chuỗi. .Tiêu đề[]

3] Thay đổi ví dụ sau để sử dụng F-Strings: 1 2 3 4

>>> Tên = 'Mike' >>> Tuổi = 21 >>> In ['Xin chào %s! Bạn là %I tuổi.' %[Tên, Tuổi]] Xin chào Mike! Bạn 21 tuổi.

Bạn có thể sửa đổi dòng cuối cùng của mã ở trên để sử dụng các chuỗi f như thế này: 1 >>> in [f'hello {name}! Bạn {Age} tuổi. ']

4] Làm thế nào để bạn kết hợp hai chuỗi này với nhau? 1 >>> First_String = 'Tên tôi là' 2 >>> Second_String = 'Mike'

Bạn có thể sử dụng toán tử + cho các chuỗi Concatenate: 1 >>> First_String + Second_String 2 'Tên tôi là Ismike'

Lưu ý rằng nó sẽ kết hợp với họ với nhau mà không có khoảng trống giữa họ, vì vậy bạn có thể cần phải tính đến điều đó. Bạn cũng có thể sử dụng phương thức chuỗi tham gia []: 1 >>> ''. A ", trong chuỗi sau: 5 6` `Python 7 >>> 'Đây là một chuỗi'

Dưới đây là ba cách để làm điều này: 1 2 3 4 5 6

>>> 'là >>>' là >>> 'là

'Đây là một chuỗi' [5: 9] a '' Đây là một chuỗi '[5: -7] a' 'Đây là một chuỗi' [-11: -7] A '

Chương 5 - Các loại số 1] Python hỗ trợ 3 loại mà không cần nhập bất cứ thứ gì? 3 loại số tích hợp là: Int float phức tạp

2] Bạn nên sử dụng mô -đun nào cho tiền hoặc các tính toán chính xác khác? Bạn nên sử dụng mô -đun thập phân để tính toán chính xác: //docs.python.org/3/l Library/decimal.html

3] Đưa ra một ví dụ về cách sử dụng nhiệm vụ tăng cường. 1 2 3 4

>>> x = 10 >>> x *= 5 >>> x 50

Chương 6 - Tìm hiểu về danh sách 1] Làm thế nào để bạn tạo một danh sách? Danh sách là một chuỗi được đặt trong niềng răng vuông: 1 >>> trống_list = [] 2 >>> my_list = [1, 2, 3] # Danh sách với 3 số nguyên

2] Tạo một danh sách với 3 mục và sau đó sử dụng append [] để thêm hai mục nữa. 1 2 3 4 5 6 7

>>> >>> >>> [1, >>> >>> [1,

my_list = [1, 2, 3] my_list.append [4] my_list 2, 3, 4] my_list.append [7] my_list 2, 3, 4, 7]

3] Có gì sai với mã này? 1 >>> my_list = [1, 2, 3] 2 >>> my_list.remove [4]

Điều này sẽ khiến một giá trị có thể được nâng lên vì bạn đang cố gắng loại bỏ một vật phẩm, 4, không tồn tại.

4] Làm thế nào để bạn xóa mục thứ 2 trong danh sách này? 1 >>> my_list = [1, 2, 3]

Cách hiệu quả nhất là sử dụng pop []: 1 2 3 4

>>> my_list.pop [1] 2 >>> my_list [1, 3]

Lấy chỉ mục của mục mà bạn muốn xóa. Hãy nhớ rằng các mục trong danh sách bắt đầu tại Index Zero. nhạc pop[]

5] Tạo một danh sách trông như thế này: [4, 10, 2, cắt chuỗi để chỉ nhận được 3 mục giữa. Đây là hai cách để làm điều đó: 1 2 3 4 5

>>> my_list = [4, 10, 2, 1, 23] >>> my_list [1: 4] [10, 2, 1] >>> my_list [1: -1] [10, 2, 1]

1, 23].

Sử dụng

Chương 7 - Tìm hiểu về Tuples 1] Làm thế nào để bạn tạo một tuple? Tuples là các chuỗi của các đối tượng [chuỗi, số nguyên, v.v.] được phân tách bằng dấu phẩy và tùy chọn được đặt trong dấu ngoặc đơn: 1 >>> my_tuple = [1, 2, 3] 2 >>> your_tuple = 4, 5, 6, 6

2] Bạn có thể chỉ ra cách truy cập phần tử thứ 3 trong bộ tuple này không? 1 >>> a_tuple = [1, 2, 3, 4]

Bạn có thể truy cập phần tử thứ 3 như thế này: 1 >>> a_tuple = [1, 2, 3, 4] 2 >>> a_tuple [2] 3 3

Hãy nhớ rằng, bộ dữ liệu bắt đầu ở Index Zero.

3] Có thể sửa đổi một tuple sau khi bạn tạo nó không? Tại sao hoặc tại sao không? Không. Các bộ dữ liệu là bất biến, điều đó có nghĩa là bạn không thể thay đổi chúng sau khi chúng được tạo ra.

4] Làm thế nào để bạn tạo một tuple với một mục? 1 >>> single_tuple = [1,] 2 >>> single_tuple 3 [1,]

Chương 8 - Tìm hiểu về từ điển 1] Làm thế nào để bạn tạo một từ điển? Từ điển đang tạo bằng cách sử dụng niềng răng xoăn: {}. Chúng là một loạt các khóa: các cặp giá trị. Đây là một ví dụ: 1 >>> my_dict = {1: 'một', 2: 'hai'}

2] Bạn có từ điển sau. Làm thế nào để bạn thay đổi trường Last_name thành ‘Smith,? 1 >>> my_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; được bảo vệ]'}

Bạn có thể thay đổi ánh xạ chính của một từ điển bằng cách viết biến từ điển, theo sau là niềng răng vuông với tên của khóa bên trong nó: 1 >>> my_dict ['last_name'] = 'Smith' 2 >>> my_dict 3 {' Email ':' [Email & nbsp; được bảo vệ] ',' First_name ':' James ',' last_name ':' Smith '}

3] Sử dụng từ điển ở trên, làm thế nào bạn sẽ xóa trường email khỏi từ điển? Bằng cách sử dụng phương thức pop []: 1 2 3 4

>>> my_dict.pop ['email'] '[Email & nbsp; được bảo vệ]' >>> my_dict {'first_name': 'James', 'last_name': 'Smith'}

4] Làm thế nào để bạn chỉ nhận được các giá trị từ một từ điển? Bạn có thể sử dụng phương thức giá trị []: 1 >>> my_dict = {'first_name': 'James', 'last_name': 'doe', 'email': '[email & nbsp; được bảo vệ]'} 2 >>> my_dict. Giá trị [] 3 Dict_Values ​​[['James', 'Doe', '[Email & NBSP; được bảo vệ]']]]]

Chương 9 - Tìm hiểu về các bộ 1] Làm thế nào để bạn tạo một bộ? Các bộ được tạo bằng cách sử dụng niềng răng xoăn, {}, nhưng thay vì khóa, các cặp giá trị, bạn sẽ sử dụng chuỗi đối tượng: 1 >>> my_set = {1, 'hai', 3}

2] Sử dụng tập hợp sau, làm thế nào bạn sẽ kiểm tra xem nó có chứa chuỗi không, có phải là B B không? 1 >>> my_set = {"a", "b", "c", "c"}

Bạn có thể sử dụng Python từ trong từ khóa để kiểm tra nếu tập hợp có chứa thứ gì đó không: 1 >>> 'B' trong my_set 2 true

3] Làm thế nào để bạn thêm một mục vào một bộ? Bạn có thể sử dụng phương thức Set Set ADD []: 1 2 3 4

>>> >>> >>> {1,

my_set = {"a", "b", "c", "c"} my_set.add [1] my_set 'a', 'b', 'c'}

4] Xóa chữ cái C C từ tập hợp sau bằng phương pháp đặt: 1 >>> my_set = {"A", "B", "C", "C"}

Bạn có thể sử dụng Remove [] hoặc Discard []. Đây là một ví dụ sử dụng Remove []: 1 2 3 4

>>> my_set = {"a", "b", "c", "c"} >>> my_set.remove ['c'] >>> my_set {'a', 'b'}

5] Làm thế nào để bạn tìm thấy các mục phổ biến giữa hai bộ? Bạn có thể sử dụng phương thức giao lộ [] để tìm các mục chung giữa hai bộ: 1 2 3 4

>>> First_set = {'One', 'Two', 'ba'} >>> Second_set = {'Orange', 'Banana', 'Peach', 'One'} >>> First_set.interection [Second_set] 'một'}

Chương 10 - Hoạt động Boolean và không 1] Số nào đúng bằng? Giá trị số nguyên, 1.

2] Làm thế nào để bạn chuyển các loại dữ liệu khác vào đúng hay sai? Bằng cách sử dụng hàm python Bool [].

3] Loại Null Python là gì? Không có

Chương 11 - Báo cáo có điều kiện 1] Đưa ra một vài ví dụ về toán tử so sánh:, ==,! =

2] Tại sao thụt lề quan trọng trong Python? Các vấn đề về thụt lề vì nó cho Python biết một khối mã bắt đầu và kết thúc. Ngoài ra, thụt phải nhất quán [tab hoặc không gian, không phải cả hai].

3] Làm thế nào để bạn tạo một tuyên bố có điều kiện? Bạn có thể tạo một câu lệnh có điều kiện trong Python bằng cách sử dụng từ khóa nếu theo sau là một biểu thức đánh giá là đúng hoặc sai: 1 2 3 4 5

>>> x = 15 >>> Nếu x> 10: ... in [f '{x =}'] ... x = 15

4] Làm thế nào để bạn sử dụng các toán tử logic để kiểm tra nhiều thứ cùng một lúc? Để kiểm tra nhiều thứ cùng một lúc, bạn có thể sử dụng và hoặc: 1 >>> nếu x> 10 và y >> My_String = 'The Fox nhảy' 2 >>> cho char trong my_string: 3 ... in [char]

3] Bạn sử dụng từ khóa nào để thoát một vòng lặp? phá vỡ

4] Làm thế nào để bạn bỏ qua một mục khi bạn lặp đi lặp lại? Bằng cách sử dụng từ khóa tiếp tục.

5] Tuyên bố khác cho các vòng lặp là gì? Tuyên bố khác chỉ được thực thi nếu phá vỡ không bao giờ xảy ra. Bạn có thể sử dụng nó để gây ra lỗi nếu bạn đang lặp lại một cái gì đó và không bao giờ tìm thấy một trận đấu.

6] Các câu lệnh kiểm soát dòng chảy trong Python là gì? Nếu Elif khác trong khi tiếp tục phá vỡ

Chương 13 - Trình độ Python 1] Làm thế nào để bạn tạo ra một danh sách hiểu? Bạn có thể tạo một danh sách hiểu bằng cách tạo một định dạng đặc biệt cho vòng lặp bên trong niềng răng vuông với biểu thức tùy chọn. Ở đây, một ví dụ về việc lọc ra ngay cả số nguyên: 1 2 3 4

>>> >>> >>> [1,

my_list = [1, 2, 3, 4, 5, 6, 7] list_comp = [x cho x trong my_list nếu x % 2] list_comp 3, 5, 7]

2] Trường hợp sử dụng tốt để hiểu danh sách là gì? Chúng là một cách tuyệt vời để áp dụng một bộ lọc vào một danh sách.

3] Tạo một từ điển bằng cách sử dụng sự hiểu biết chính thống. 1 >>> {khóa: giá trị cho khóa, giá trị trong liệt kê ['abcde']} 2 {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e '}

4] Tạo một tập hợp bằng cách sử dụng khả năng hiểu. 1 2 3 4 5

>>> my_set = {Mục cho mục trong phạm vi [5]} >>> my_set {0, 1, 2, 3, 4} >>> gõ [my_set]

Chương 14 - Xử lý ngoại lệ 1] Một vài ngoại lệ phổ biến là gì? Modulenotfounderror, indexError,

và valueerror khá phổ biến

những người.

2] Làm thế nào để bạn bắt được một ngoại lệ trong Python? Bằng cách sử dụng một câu tuyên bố thử/ngoại trừ.

3] Bạn cần làm gì để gây ra lỗi thời gian chạy? Bạn sẽ sử dụng những điều sau: Nâng cao

Lỗi runtime.

4] Tuyên bố cuối cùng là gì? Đây là nơi bạn sẽ đặt mã của mình để dọn dẹp sau khi một ngoại lệ xảy ra. Ví dụ: nếu bạn có một ngoại lệ khi làm việc với cơ sở dữ liệu, bạn sẽ muốn đóng kết nối với cơ sở dữ liệu ở đây.

5] Câu lệnh khác được sử dụng với một trình xử lý ngoại lệ? Mã khác thực thi khi không có lỗi xảy ra.

Chương 15 - Làm việc với các tệp 1] Làm thế nào để bạn mở một tệp? Bạn sử dụng hàm python Open Open [] và chuyển trong một đường dẫn tương đối hoặc đủ điều kiện đến một tệp.

2] Bạn cần làm gì để đọc tệp? 1 với mở ['đường dẫn/đến/some/file.txt'] dưới dạng fh: 2 nội dung = fh.read []

3] Viết câu sau vào tệp có tên Test.txt: 1 Fox Red nhanh chóng nhảy qua Python

Bạn sẽ cần mở một tệp trong chế độ ghi để viết một cái gì đó cho nó: 1 với Open ['test.txt', 'w'] như fh: 2 fh.write ['con cáo đỏ nhanh đã nhảy qua python']

4] Làm thế nào để bạn nối dữ liệu mới vào một tệp đã tồn tại trước? 1 # Mở tệp trong chế độ phụ lục 2 với Open ['test.txt', 'a'] là fh: 3 fh.write ['Đây là một số văn bản mới']

5] Bạn cần làm gì để bắt một ngoại lệ tệp? Hầu hết thời gian, bạn chỉ cần bắt Oserror: 1 Thử: 2 với Open ['test.txt'] dưới dạng file_handler: 3 cho dòng trong file_handler: 4 in [dòng] 5 ngoại trừ oserror: 6 in ['một lỗi đã xảy ra']

Chương 16 - Nhập 1] Làm thế nào để bạn bao gồm thư viện toán học từ thư viện tiêu chuẩn Python trong mã của bạn? Bạn cần sử dụng từ khóa nhập theo sau là thư viện bạn muốn nhập: 1 nhập khẩu toán

Đặt mã ở trên ở đầu tệp của bạn.

2] Làm thế nào để bạn bao gồm COS từ thư viện toán học trong mã của riêng bạn? Nếu tất cả những gì bạn cần từ hàm Math

3] Làm thế nào để bạn nhập một mô -đun/chức năng/vv. với một cái tên khác? Bằng cách thêm từ khóa AS và tên mới để sử dụng: 1 từ nhập khẩu cos cos như cosin

4] Python có cú pháp đặc biệt mà bạn có thể sử dụng để bao gồm mọi thứ. Nó là gì? 1 từ nhập khẩu *

Bạn có thể thay thế toán học bằng bất kỳ thư viện nào bạn muốn nhập mọi thứ. Lưu ý rằng điều này không được khuyến khích!

Chương 17 - Chức năng 1] Làm thế nào để bạn tạo một hàm chấp nhận hai đối số vị trí? 1 def my_function [a, b]: 2 in [a] 3 in [b]

2] Tạo một hàm có tên địa chỉ_builder chấp nhận những điều sau và thêm gợi ý loại: Tên [Chuỗi] Địa chỉ [Chuỗi] Mã zip [Số nguyên] 1 DEF Địa chỉ_Builder [Tên: Str, Địa chỉ: Str, Zip_Code: Int] -> Str: 2 Trả về f '{name} - {địa chỉ} - {zip_code}'

3] Sử dụng hàm từ câu hỏi 2, hãy cho mã zip mặc định là 55555 1 def address_builder [tên: str, địa chỉ: str, zip_code: int = 55555] -> str: 2 return f '{name} - {địa chỉ} - {Mã Bưu Chính}'

4] Làm thế nào để bạn cho phép một số lượng đối số từ khóa tùy ý được truyền đến một hàm? Sử dụng ** kwargs để cho phép một số lượng đối số từ khóa tùy ý được truyền trong: 1 từ khóa def [** kwargs]: 2 in [kwargs]

5] Bạn sử dụng cú pháp nào để buộc một hàm sử dụng các tham số chỉ có vị trí? Sau khi xác định một số tham số chỉ có vị trí, bạn có thể thêm ForwardsSlash, Hồi/. Điều này làm cho các tham số đến trước nó chỉ có vị trí:

1 DEF Vị trí [A, B, /, C]: 2 In [A]

Trong ví dụ trên, A và B là các đối số chỉ có vị trí.

Chương 18 - Lớp 1] Làm thế nào để bạn tạo một lớp trong Python? Bạn có thể tạo một lớp bằng cách sử dụng từ khóa lớp theo sau là tên của lớp và đại tràng: 1 lớp myclass: 2 Pass

2] Bạn đặt tên cho một trình khởi tạo lớp là gì? Khởi tạo trong các lớp có một tên đặc biệt gọi là __init __ []. Một bộ khởi tạo là một phương pháp bên trong một lớp và thường là phương pháp đầu tiên được xác định.

3] Giải thích việc sử dụng bản thân trong các từ của bạn, từ tự được sử dụng bên trong lớp để theo dõi các trường hợp.

4] Việc ghi đè một phương pháp làm gì? Khi bạn ghi đè một phương thức, bạn đang xác định lại những gì nó làm. Ví dụ: nếu lớp cha có phương thức nhảy [], thì con của nó có thể xác định lại nó theo cách mà bước nhảy của nó [] hoạt động khác nhau. Có lẽ cha mẹ được đo bằng chân trong khi đứa trẻ sử dụng hệ thống số liệu.

5] Lớp con là gì? Một lớp con sẽ kế thừa tất cả các phương pháp từ lớp cha mẹ hoặc lớp cơ sở của nó. Bạn có thể sử dụng nó như một cách đơn giản để tạo một lớp mới tương tự như một trong những lớp cũ của bạn, nhưng có các tính năng mới. 1 lớp Myball [Ball]: 2 "" "Lớp này kế thừa từ lớp bóng" "" 3 4 def roll [self]: 5 in ['lăn bóng']]

Chương 19 - Hướng nội 1] Nội tâm là gì? Hướng nội là khả năng mã hóa để điều tra và mã khác bằng cách sử dụng các công cụ được tích hợp vào ngôn ngữ lập trình của bạn. Python cho phép bạn thực hiện hướng nội của mã dễ dàng bằng cách sử dụng Dir [], loại [], Help [] và các loại khác.

2] Hàm loại [] được sử dụng cho? Bạn có thể sử dụng loại [] để tìm ra loại đối tượng. Ví dụ: bạn có thể cần biết liệu loại đối tượng là chuỗi so với loại số.

3] Dir [] hữu ích như thế nào? Bạn có thể sử dụng Dir [] để tìm hiểu những thuộc tính và hàm hoặc phương thức nào mà một đối tượng có [nếu có].

Chương 20 - Cài đặt các gói với PIP 1] Làm thế nào để bạn cài đặt gói với PIP? 1 python -m pip cài đặt

2] Bạn sử dụng lệnh nào để xem phiên bản của các gói bạn đã cài đặt? Danh sách 1 Python -M Pip

3] Làm thế nào để bạn gỡ cài đặt một gói? 1 python -m pip gỡ cài đặt

Chương 21 - Môi trường ảo Python 1] Làm thế nào để bạn tạo ra một môi trường ảo Python? Nếu bạn sử dụng mô -đun Python sườn VEN, bạn có thể tạo một mô -đun như thế này: 1 Python -M Venv env_name

Nếu bạn sử dụng VirtualEnv, thì lệnh là: 1 VirtualEnv env_name

2] Bạn cần làm gì sau khi tạo ra một môi trường ảo để sử dụng nó? Bạn cần phải kích hoạt nó. Trên Mac/Linux, bạn có thể kích hoạt môi trường bằng cách chạy phần sau bên trong thư mục bạn đã tạo: 1 Nguồn Bin/Activeat

Trên Windows, bạn cần chạy tệp Activate.bat hoặc tệp PowerShell tương đương.

3] Tại sao bạn sẽ sử dụng môi trường ảo Python? Môi trường ảo Python rất hữu ích cho việc cô lập mã của bạn. Bạn có thể kiểm tra các gói mới mà không cần cài đặt chúng vào Python hệ thống của bạn.

Chương 22 - Loại kiểm tra trong Python 1] Loại gợi ý trong từ của bạn là gì? Loại gợi ý trong Python là một cú pháp đặc biệt cho nhà phát triển biết loại dữ liệu là biến hoặc đối số là gì. Gợi ý loại là tùy chọn và không được thi hành trong Python. Chúng có thể được kiểm tra bằng IDE hoặc công cụ MyPy.

2] Tại sao bạn sẽ sử dụng gợi ý loại? Loại gợi ý là hữu ích trong các cơ sở mã lớn, phức tạp. Nó cũng có thể hữu ích nếu bạn dự định tạo gói Python mà bạn muốn phân phối cho người khác trên Chỉ số Bao bì Python [PYPI]. Các gợi ý loại sẽ giúp những người khác dễ dàng đóng góp vào mã của bạn hơn.

3] Thể hiện sự hiểu biết của bạn về kiểu gợi ý bằng cách thêm các chú thích loại vào các biến cũng như hàm. Đừng quên loại trở lại! Đây là một cách để thêm gợi ý loại: 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Từ gõ danh sách nhập, tùy chọn A: int = 1 b: float = 3.14 def my_function [x: list [int] = [], y: tùy chọn [int] = none] -> list [int]: nếu y không phải là không : result = [i * y for i in x] other: result = x return results my_function [[1, 2, 3], 2]

Chương 23 - Tạo nhiều luồng 1] Chủ đề tốt cho cái gì? Chủ đề được sử dụng tốt nhất cho các ứng dụng sẽ thực hiện các hoạt động chuyên sâu I/O, chẳng hạn như viết tệp, tải xuống tệp, làm việc với cơ sở dữ liệu, v.v.

2] Bạn sử dụng mô -đun nào để tạo một luồng trong Python? Bạn sẽ sử dụng mô -đun luồng. Hầu hết thời gian, bạn sẽ sử dụng lớp luồng.

3] Khóa phiên dịch toàn cầu là gì? Khóa phiên dịch toàn cầu là một mutex bảo vệ các đối tượng Python. Điều này có nghĩa là nó ngăn chặn nhiều luồng thực thi mã byte Python cùng một lúc. Vì vậy, khi bạn sử dụng các luồng, chúng không chạy trên tất cả các CPU trên máy của bạn.

Chương 24 - Tạo nhiều quy trình 1] Các quy trình tốt cho cái gì? Các quy trình là tốt cho các tính toán toán học phức tạp, mã hóa và tìm kiếm.

2] Làm thế nào để bạn tạo ra một quy trình trong Python? Bạn có thể tạo một quy trình bằng mô -đun đa xử lý, cụ thể là lớp quy trình.

3] Bạn có thể tạo một nhóm quy trình trong Python không? Làm sao? Có bạn có thể. Bạn có thể sử dụng Multiprocessing.pool để tạo một.

4] Khóa phiên dịch toàn cầu có ảnh hưởng gì đến các quy trình? Sử dụng mô -đun đa bộ xử lý tránh khóa Intepreter toàn cầu, do đó nó không có bất kỳ tác dụng nào.

5] Điều gì xảy ra nếu bạn không sử dụng Process.join []? Điểm sử dụng tham gia [] là làm cho quy trình chính [ứng dụng của bạn] chờ đợi các quy trình con kết thúc. Nếu bạn không gọi hãy gọi tham gia [], quy trình chính của bạn có thể cố gắng kết thúc sớm.

Chương 25 - Khởi động các quy trình con với Python 1] Làm thế nào bạn sẽ khởi chạy Microsoft Notepad hoặc trình soạn thảo văn bản yêu thích của bạn với Python? 1 Nhập quá trình phụ 2 3 CMD = ['notepad.exe'] 4 Sub thế chấp.run [CMD]

2] Bạn sử dụng phương pháp nào để có được kết quả từ một quá trình? Bạn có thể sử dụng phương thức popen.Comm đối thủ [].

3] Làm thế nào để bạn có được quy trình phụ để trả lại chuỗi thay vì byte? Một cách để có được quy trình con để trả về các chuỗi thay vì byte là đặt đối số mã hóa thành UTF-8.

Chương 26 - Gỡ lỗi mã 1 của bạn] PDB là gì? là trình gỡ lỗi tích hợp Python. Đây cũng là một mô -đun mà bạn có thể nhập vào mã của mình để thêm gỡ lỗi trực tiếp. PDB

2] Làm thế nào để bạn sử dụng PDB để đến một vị trí cụ thể trong mã của bạn? Khi bên trong trình gỡ lỗi PDB trong dòng thiết bị đầu cuối hoặc dòng lệnh, hãy sử dụng lệnh Jump theo sau là số dòng mà bạn muốn đi.

3] Điểm dừng là gì? Một điểm dừng là một vị trí trong một tệp được đánh dấu theo một cách nào đó để cho trình gỡ lỗi ngừng thực thi ở đó. Điều này cho phép nhà phát triển nói với trình gỡ lỗi của họ hoặc IDE của họ dừng tại một điểm cụ thể trong mã của họ để họ có thể phân tích các biến và trạng thái của các đối tượng với hy vọng tìm ra vấn đề.

4] Callstack là gì? Một ngăn xếp cuộc gọi là cấu trúc dữ liệu mà Python sử dụng để theo dõi các lệnh gọi chức năng và phương thức.

Chương 27 - Học về trang trí 1] Người trang trí là gì? Một người trang trí là một chức năng chấp nhận một chức năng khác như lập luận của nó. Một người trang trí thường thêm một trình bao bọc xung quanh chức năng để thực hiện trước hoặc sau xử lý dữ liệu mà chức năng sử dụng.

2] Bạn sử dụng cú pháp đặc biệt nào để áp dụng bộ trang trí? Để áp dụng hàm trang trí vào một hàm khác, bạn sử dụng dấu @ theo sau tên của người trang trí.

3] Đặt tên cho ít nhất hai trong số các nhà trang trí tích hợp Python, STATICMETHOD STATICMETHOD

4] Tài sản Python là gì? Các thuộc tính Python là một cách để thêm mã để xử lý tra cứu và gán thuộc tính trong khi vẫn sử dụng quyền truy cập thuộc tính thông thường trong mã của bạn.

Chương 28 - Biểu thức gán 1] Biểu thức gán là gì? Biểu thức gán là một cú pháp mới cho phép bạn gán cho một biến trong một biểu thức [chẳng hạn như trong một thời gian hoặc câu lệnh IF].

2] Làm thế nào để bạn tạo một biểu thức gán? Cú pháp chung như sau: 1 Tên: = expr

3] Tại sao bạn sẽ sử dụng các biểu thức gán? Bạn có thể sử dụng các biểu thức gán để tránh các cuộc gọi chức năng lặp đi lặp lại, tra cứu thuộc tính, kiểm tra boolean, v.v.

Chương 29 - Hồ sơ mã của bạn 1] Hồ sơ có nghĩa là gì trong bối cảnh lập trình? Để sử dụng một công cụ để chạy mã của bạn và giúp bạn tìm thấy các vấn đề CPU và bộ nhớ hoặc tắc nghẽn. Mục tiêu là tạo ra một chương trình hiệu quả và hiệu quả bộ nhớ bất cứ khi nào có thể.

2] Bạn sử dụng thư viện Python nào để lập cấu hình mã của mình? Bạn có thể sử dụng mô -đun CPROFILE để lập cấu hình mã của bạn.

3] Làm thế nào để bạn trích xuất dữ liệu từ số liệu thống kê hồ sơ đã lưu? Bạn có thể sử dụng mô -đun PSTATS để trích xuất, lọc và định dạng thống kê hồ sơ.

Chương 30 - Giới thiệu về thử nghiệm 1] Làm thế nào để bạn thêm các bài kiểm tra được sử dụng với DocTest? Bạn có thể thêm bài kiểm tra vào một tài liệu. Tuy nhiên, bạn phải sử dụng cú pháp thích hợp và làm cho nó trông giống như một phiên Python: 1 >>> Thêm [1, 2] 2 3

2] Các bài kiểm tra cho Doctest có bắt buộc phải ở trong DocString không? Nếu không, bạn sẽ thực hiện nó như thế nào? Không, họ cũng có thể ở trong một tệp riêng biệt. Khi bạn thực thi chúng từ một tệp riêng biệt, bạn sẽ chuyển tệp đó cho DocTest thay vì tệp Python.

3] Bài kiểm tra đơn vị là gì? Một bài kiểm tra đơn vị là một cách để kiểm tra đoạn mã nhỏ nhất có thể được cách ly với phần còn lại.

4] Phát triển theo hướng thử nghiệm là gì? Ý tưởng đằng sau sự phát triển theo hướng kiểm tra là bạn nên viết các bài kiểm tra trước khi bạn viết mã. Ít nhất, bạn nên viết bài kiểm tra của mình trong khi bạn viết mã để chắc chắn rằng bạn đang kiểm tra mọi thứ.

Chương 31 - Tìm hiểu về Notebook Jupyter 1] Notebook Jupyter là gì? Notebook Jupyter là một ứng dụng web nguồn mở cho phép bạn tạo và chia sẻ các tài liệu có chứa mã, phương trình, trực quan hóa và văn bản được định dạng.

2] Đặt tên cho hai loại di động loại máy tính xách tay Mã đánh dấu tiêu đề NBConvert thô

3] Bạn sử dụng ngôn ngữ đánh dấu nào để định dạng văn bản trong Jupyter Notebook? Đánh dấu

4] Làm thế nào để bạn xuất một máy tính xách tay sang định dạng khác? Bạn có thể sử dụng NBConvert hoặc sử dụng menu Tệp với tùy chọn tải xuống làm tùy chọn để chuyển đổi sổ ghi chép sang các định dạng khác.

Chương 32 - Cách tạo ứng dụng dòng lệnh với Argparse 1] Mô -đun nào trong thư viện tiêu chuẩn Bạn có thể sử dụng để tạo ứng dụng dòng lệnh không? Bạn có thể sử dụng mô -đun Argparse.

2] Làm thế nào để bạn thêm đối số vào armentParSer []? Bằng cách sử dụng phương thức add_argument [].

3] Làm thế nào để bạn tạo tin nhắn hữu ích cho người dùng của bạn? Khi thêm một đối số với phương thức add_argument [], bạn có thể chỉ định thông báo trợ giúp là gì bằng cách đặt đối số trợ giúp.

4] Bạn sử dụng phương pháp nào để tạo ra một nhóm lệnh loại trừ lẫn nhau? Bạn sẽ sử dụng phương thức add_mutally_exclusive_group [] để tạo một nhóm mà bạn có thể thêm các đối số loại trừ lẫn nhau vào.

Chương 33 - Làm thế nào để phân tích XML 1] Những mô -đun XML nào có sẵn trong thư viện tiêu chuẩn Python? xml.etree.elementtree xml.dom xml.dom.minidom xml.dom.pulldom xml.sax xml.parsers.expat

2] Làm cách nào để bạn truy cập thẻ XML bằng ElementTree? Thông thường bạn sẽ cần phải làm điều này bằng cách lặp / lặp lại các yếu tố và sau đó truy cập vào thuộc tính thẻ của nó.

3] Làm thế nào để bạn có được phần tử gốc bằng API ElementTree? Để truy cập phần tử gốc, bạn cần tải tệp XML vào lớp ElementTree và gọi getRoot []: 1 cây = ElementTree [file = xml_file] 2 root_element = tree.getRoot []

Chương 34 - Làm thế nào để phân tích JSON 1] JSON là gì? Ký hiệu đối tượng JavaScript là một định dạng trao đổi dữ liệu nhẹ được sử dụng đặc biệt cho các ứng dụng web.

2] Làm thế nào để bạn giải mã một chuỗi JSON trong Python? Bạn sẽ sử dụng json.loads [] để giải mã hoặc giảm bớt chuỗi JSON trong Python.

3] Làm thế nào để bạn lưu JSON vào đĩa với Python? Bạn sẽ sử dụng json.dump để lưu json vào đĩa.

Chương 35 - Làm thế nào để cạo một trang web 1] Một số gói quét web Python phổ biến là gì? Đẹp và Scracy là phổ biến nhất.

2] Làm thế nào để bạn kiểm tra một trang web với trình duyệt của bạn? Nhấp chuột phải vào bất cứ nơi nào trên một trang web và chọn tùy chọn menu của Inspect Inspect Factect [Mozilla Firefox] hoặc Trình kiểm tra trực tuyến [Google Chrome].

3] Bạn sử dụng mô -đun Python nào từ thư viện tiêu chuẩn để tải xuống một tệp? Urllib.Request

Chương 36 - Cách làm việc với các tệp CSV 1] Làm cách nào để bạn đọc tệp CSV với thư viện tiêu chuẩn Python? Bạn phải sử dụng mô -đun CSV và tạo đối tượng đầu đọc bằng cách sử dụng trình đọc hoặc dictreader.

2] Nếu tệp CSV của bạn không sử dụng dấu phẩy làm dấu phân cách, làm thế nào để bạn sử dụng mô -đun CSV để đọc nó? Khi bạn tạo trình đọc [], bạn có thể đặt đối số Delimiter thành một cái gì đó khác ngoài dấu phẩy. Ở đây, một ví dụ: 1 Nhập CSV 2 3 với Open [đường dẫn] là F: 4 Reader = CSV.Reader [F, Delimiter = ':']

3] Làm thế nào để bạn viết một hàng dữ liệu CSV bằng mô -đun CSV? Bạn sẽ cần tạo một đối tượng nhà văn bằng cách sử dụng Writer [] hoặc DictWriter []. Sau đó, bạn sẽ sử dụng hàm writerow [] để ghi dữ liệu.

Chương 37 - Cách làm việc với cơ sở dữ liệu bằng SQLite 1] Làm thế nào để bạn tạo cơ sở dữ liệu với thư viện SQLite3? Bạn có thể sử dụng mã sau: 1 Nhập sqlite3 2 sqlite3.connect ["/path/to/database.db"]

2] Lệnh SQL nào được sử dụng để thêm dữ liệu vào bảng? Bạn sẽ sử dụng chèn

3] Làm thế nào để bạn thay đổi một trường trong cơ sở dữ liệu với SQL? Sử dụng lệnh cập nhật SQL

4] Các truy vấn SQL được sử dụng để làm gì? Các truy vấn SQL là để đưa dữ liệu ra khỏi cơ sở dữ liệu. Bạn có thể trích xuất tất cả mọi thứ hoặc sử dụng các bộ lọc để thu hẹp nó chỉ để chỉ đầu ra mà bạn mong muốn.

5] Theo mặc định, có bao nhiêu bản ghi trong bảng sẽ xóa ảnh hưởng? Làm thế nào về cập nhật và chọn? Tất cả bọn họ.

6] Hàm xóa_Author ở trên dễ bị tấn công tiêm SQL. Tại sao, và làm thế nào bạn sẽ sửa nó? Hàm Delete_Author [] đang sử dụng định dạng chuỗi Python và được truyền trong dữ liệu để tạo truy vấn. Để tránh vấn đề, sử dụng? Thay vào đó, cú pháp: 1 def Delete_Author [tác giả]: 2 Conn = sqlite3.connect ["Thư viện.db"] 3 con trỏ = Conn.Cursor [] 4 SQL = "Xóa khỏi sách nơi tác giả =?" 5 con trỏ.execute [SQL, [tác giả]] 6 Conn.Commit []

Chương 38 - Làm việc với một tài liệu Excel trong Python 1] Gói Python nào bạn có thể sử dụng để làm việc với bảng tính Microsoft Excel? Bạn có thể sử dụng OpenPyXL, XLWings hoặc một số gói Python bên thứ 3 khác để làm việc với Excel.

2] Làm thế nào để bạn mở một bảng tính Excel với Python? Bạn sẽ sử dụng một cái gì đó như thế này: 1 Nhập OpenPyxl 2 3 Workbook = openPyxl.load_workbook ['/path/to/excel/file.xlsx']

3] Bạn sử dụng lớp nào để tạo bảng tính Excel với OpenPyXL? Bạn sẽ sử dụng openpyxl.workbook [] để tạo một tài liệu mới.

Chương 39 - Làm thế nào để tạo PDF 1] Bạn sử dụng lớp nào trong báo cáo để vẽ trực tiếp trên PDF ở cấp thấp? Bạn sử dụng lớp Canvas [] từ Báo cáo.pdfgen.

2] Platypus là gì? Bố cục trang và kiểu chữ bằng cách sử dụng tập lệnh.

3] Làm thế nào để bạn áp dụng một biểu định kiểu cho một đoạn văn? Bạn cần phải có được một bảng kiểu. Một trong những cách phổ biến nhất là sử dụng biểu định kiểu mẫu: 1 styles = getSamplestyLesheet []

Sau đó, bạn áp dụng phong cách bằng cách chuyển nó vào lớp đoạn [] thông qua cờ kiểu: 1 para = đoạn [văn bản, style = style ["bình thường"]]

4] Bạn sử dụng phương pháp nào để áp dụng bảng tính? Bạn sử dụng phương thức đối tượng [] đối tượng SetStyle [] để áp dụng TableStyle [].

Chương 40 - Làm thế nào để tạo biểu đồ 1] Bạn có sử dụng mô -đun nào trong matplotlib để tạo các sơ đồ không? Bạn sử dụng mô hình phụ Pyplot: Nhập

matplotlib.pyplot như plt.

2] Làm cách nào để thêm nhãn vào trục x của lô? Bạn sẽ sử dụng hàm nhãn [] của mô -đun lô.

3] Bạn sử dụng các chức năng nào để tạo tiêu đề và truyền thuyết cho các lô? Các hàm tiêu đề [] và LEGEND [], tương ứng.

Chương 41 - Làm thế nào để làm việc với hình ảnh trong Python 1] Làm thế nào để bạn có được chiều rộng và chiều cao của một bức ảnh bằng gối? Bạn có thể có được chiều rộng và chiều cao bằng cách truy cập thuộc tính kích thước của đối tượng hình ảnh.

2] Bạn sử dụng phương pháp nào để áp dụng đường viền cho hình ảnh? Bạn sẽ sử dụng phương thức Mở rộng [].

3] Làm thế nào để bạn thay đổi kích thước một hình ảnh với gối trong khi duy trì tỷ lệ khung hình của nó? Bạn sẽ muốn sử dụng phương thức thu nhỏ [].

Chương 42 - Làm thế nào để tạo giao diện người dùng đồ họa 1] GUI là gì? GUI hoặc giao diện người dùng đồ họa, là một cách để mọi người tương tác với ứng dụng của bạn bằng các nút hoặc các tiện ích khác, bàn phím và chuột của họ. Điều này trái ngược với cách bạn sẽ tương tác với một ứng dụng chỉ dành cho bàn điều khiển, nơi bạn đang làm việc trong một thiết bị đầu cuối bằng cách sử dụng bàn phím của bạn gần như độc quyền.

2] Vòng lặp sự kiện là gì? Vòng lặp sự kiện là một vòng lặp vô hạn chạy trong ứng dụng GUI của bạn. Nó chờ người dùng làm một cái gì đó, như nhấp vào nút, nhấn phím trên bàn phím hoặc tương tác với GUI theo một cách khác. Khi người dùng làm những việc này, nó sẽ tạo ra một hoặc nhiều sự kiện mà ứng dụng của bạn có thể phản hồi.

3] Làm thế nào để bạn bố trí các widget trong ứng dụng của bạn? Bạn có hai lựa chọn: Định vị tuyệt đối - sử dụng tọa độ x/y pixel cho mỗi người dùng widget - một đối tượng đặc biệt trong wxpython có chứa các widget và đưa chúng ra một cách linh hoạt khi bạn thay đổi kích thước ứng dụng.

Chương 43 - Làm thế nào để tạo gói Python 1] Mô -đun là gì? Một mô -đun là một tệp Python. Bất kỳ tệp Python có thể được nhập.

2] Một gói khác với mô -đun như thế nào? Gói Python là một thư mục với một hoặc nhiều tệp bên trong nó. Khi bạn nhập một gói, về cơ bản bạn đang nhập một thư mục.

3] Tên ít nhất hai công cụ cần thiết để đóng gói một dự án? Bạn cần PIP, Setuptools và Twine để đóng gói và tải lên một gói.

4] Một số tệp bạn cần đưa vào một gói không phải là tệp Python là gì? ReadMe.MD và các tập tin giấy phép.

Chương 44 - Cách tạo EXE cho Windows 1] Tên 3 Công cụ khác nhau bạn có thể sử dụng để tạo Windows có thể thực thi từ mã Python. Pyinstaller, py2exe, cặp, nuitka, cx_freeze.

2] Bạn sử dụng lệnh nào với pyinstaller để tạo một thực thi? Bạn sẽ sử dụng cái này: 1 pyinstaller my_python_script.py

Nếu pyinstaller không có trên đường dẫn của bạn, thì bạn sẽ cần sửa đổi lệnh để sử dụng đường dẫn đầy đủ đến pyinstaller: 1/path/to/pyinstaller my_python_script.pypy

3] Làm thế nào để bạn tạo một tệp thực thi với PyInstaller? Bạn sẽ cần sử dụng cờ --onefile: 1 pyinstaller my_python_script.py --onefile

4] Bạn sử dụng cờ nào với Pyinstaller để triệt tiêu cửa sổ bảng điều khiển? Bạn sẽ cần sử dụng cờ -noconsole: 1 pyinstaller my_python_script.py -noconsole

Chương 45 - Cách tạo trình cài đặt cho Windows 1] Đặt tên cho hai chương trình bạn có thể sử dụng để tạo trình cài đặt cho Windows. Thiết lập Inno NSIS

2] Làm thế nào để bạn sửa đổi tập lệnh trình biên dịch thiết lập Inno? Bạn có thể sử dụng bất kỳ trình soạn thảo văn bản nào để sửa đổi tập lệnh trình biên dịch vì nó là tệp văn bản. Bản thân thiết lập Inno có thể được sử dụng để chỉnh sửa tệp.

3] Tại sao bạn nên kiểm tra trình cài đặt của mình?Bạn nên luôn luôn kiểm tra trình cài đặt của mình để đảm bảo họ làm việc trước khi đưa chúng cho người dùng của bạn.Bạn sẽ nhận được tiếng xấu khá nhanh nếu trình cài đặt của bạn không làm việc.

Chương 46 - Làm thế nào để tạo một ex exe cho mac 1] Bạn có thể sử dụng công cụ nào để tạo các tệp thực thi cho Python trên macOS?Pyinstaller cặp Py2App

2] Điều gì có thể thực thi được trên MacOS là gì?Chúng được biết đến với tên gọi là các gói ứng dụng trên mạng trên Mac.

Bài Viết Liên Quan

Chủ Đề