Ở đây, chúng tôi đã sử dụng câu lệnh
Enter a number: 0 Zero16. Chúng ta có thể làm điều tương tự bằng cách sử dụng các câu lệnh
Enter a number: 0 Zero17 lồng nhau như sau
Mã nguồn. Sử dụng Nested nếu
num = float[input["Enter a number: "]]
if num >= 0:
if num == 0:
print["Zero"]
else:
print["Positive number"]
else:
print["Negative number"]
Đầu ra của cả hai chương trình sẽ giống nhau
Đầu ra 1
Enter a number: 2 Positive number
Đầu ra 2
Enter a number: 0 Zero
Một số dương nếu nó lớn hơn 0. Chúng tôi kiểm tra điều này trong biểu thức của
Enter a number: 0 Zero17. Nếu là
Enter a number: 0 Zero19, số này sẽ bằng 0 hoặc âm. Điều này cũng được kiểm tra trong biểu thức tiếp theo
Bên cạnh câu lệnh
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb6 vừa được giới thiệu, Python sử dụng các câu lệnh điều khiển luồng thông thường được biết đến từ các ngôn ngữ khác, với một số thay đổi
4. 1. ______37 Câu lệnh¶
Có lẽ loại câu lệnh nổi tiếng nhất là câu lệnh
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb7. Ví dụ
>>> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb9 và phần
>>> range[10] range[0, 10]0 là tùy chọn. Từ khóa '
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb9' là viết tắt của 'else if' và rất hữu ích để tránh thụt lề quá mức. Trình tự
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb7 …
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb9 …
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb9 … thay thế cho câu lệnh
>>> range[10] range[0, 10]5 hoặc
>>> range[10] range[0, 10]6 được tìm thấy trong các ngôn ngữ khác
Nếu bạn đang so sánh cùng một giá trị với nhiều hằng số hoặc kiểm tra các loại hoặc thuộc tính cụ thể, bạn cũng có thể thấy câu lệnh
>>> range[10] range[0, 10]7 hữu ích. Để biết thêm chi tiết, hãy xem Các câu lệnh đối sánh .
4. 2. ______88 Câu lệnh¶
Câu lệnh
>>> range[10] range[0, 10]8 trong Python khác một chút so với những gì bạn có thể quen dùng trong C hoặc Pascal. Thay vì luôn lặp qua một cấp số cộng của các số [như trong Pascal] hoặc cung cấp cho người dùng khả năng xác định cả bước lặp và điều kiện tạm dừng [như C], câu lệnh
>>> range[10] range[0, 10]8 của Python lặp qua các mục của bất kỳ chuỗi nào [danh sách hoặc . Ví dụ [không có ý định chơi chữ]
Enter a number: 2 Positive number9
Mã sửa đổi một bộ sưu tập trong khi lặp lại trên cùng một bộ sưu tập đó có thể khó hiểu đúng. Thay vào đó, việc lặp lại một bản sao của bộ sưu tập hoặc tạo một bộ sưu tập mới thường đơn giản hơn.
Enter a number: 0 Zero0
4. 3. Hàm Enter a number: 0
Zero
11¶
Nếu bạn cần lặp lại một dãy số, hàm tích hợp sẵn
Enter a number: 0 Zero11 sẽ rất hữu ích. Nó tạo ra các cấp số cộng
Enter a number: 0 Zero3
Điểm cuối đã cho không bao giờ là một phần của chuỗi được tạo; . Có thể để phạm vi bắt đầu ở một số khác hoặc chỉ định một mức tăng khác [thậm chí là âm; đôi khi điều này được gọi là 'bước']
Enter a number: 0 Zero5
Để lặp lại các chỉ số của một chuỗi, bạn có thể kết hợp
Enter a number: 0 Zero11 và
Enter a number: 0 Zero15 như sau
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb
Tuy nhiên, trong hầu hết các trường hợp như vậy, sẽ thuận tiện hơn khi sử dụng hàm
Enter a number: 0 Zero16, xem Kỹ thuật lặp .
Một điều kỳ lạ xảy ra nếu bạn chỉ in một phạm vi
________số 8
Theo nhiều cách, đối tượng được trả về bởi
Enter a number: 0 Zero11 hoạt động như thể nó là một danh sách, nhưng thực tế không phải vậy. Nó là một đối tượng trả về các mục liên tiếp của chuỗi mong muốn khi bạn lặp lại nó, nhưng nó không thực sự tạo danh sách, do đó tiết kiệm không gian
Chúng tôi nói rằng một đối tượng như vậy là có thể lặp lại , nghĩa là, phù hợp làm mục tiêu cho các hàm và cấu trúc mong đợi thứ gì đó mà chúng có thể nhận được từ đó . Chúng ta đã thấy rằng câu lệnh
>>> range[10] range[0, 10]8 là một cấu trúc như vậy, trong khi một ví dụ về hàm có thể lặp lại là
Enter a number: 0 Zero19.
Enter a number: 0 Zero1
Sau này chúng ta sẽ thấy nhiều hàm hơn trả về iterables và lấy iterables làm đối số. Trong chương Cấu trúc dữ liệu , chúng ta sẽ thảo luận chi tiết hơn về
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb50.
4. 4. ______351 và >>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range[len[a]]:
.. print[i, a[i]]
...
0 Mary
1 had
2 a
3 little
4 lamb
52 Câu lệnh, và >>> range[10]
range[0, 10]
0 Mệnh đề trên Vòng lặp¶
Câu lệnh
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb51, giống như trong C, thoát ra khỏi vòng lặp
>>> range[10] range[0, 10]8 hoặc
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb6 trong cùng
Câu lệnh vòng lặp có thể có mệnh đề
>>> range[10] range[0, 10]0; . Điều này được minh họa bằng vòng lặp sau, tìm kiếm các số nguyên tố
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb5
[Vâng, đây là mã chính xác. Nhìn kĩ. mệnh đề
>>> range[10] range[0, 10]0 thuộc về vòng lặp
>>> range[10] range[0, 10]8, không phải câu lệnh
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb7. ]
Khi được sử dụng với vòng lặp, mệnh đề
>>> range[10] range[0, 10]0 có nhiều điểm chung với mệnh đề
>>> range[10] range[0, 10]0 của câu lệnh
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb26 hơn là với mệnh đề của câu lệnh
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb7. mệnh đề
>>> range[10] range[0, 10]0 của câu lệnh
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb26 chạy khi không có ngoại lệ xảy ra và mệnh đề
>>> range[10] range[0, 10]0 của vòng lặp chạy khi không có
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb51 xảy ra. Để biết thêm về câu lệnh
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb26 và các ngoại lệ, hãy xem Xử lý ngoại lệ .
Câu lệnh
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb52, cũng mượn từ C, tiếp tục với lần lặp tiếp theo của vòng lặp
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb2
4. 5. ______ Báo cáo năm 1904¶
Tuyên bố
Enter a number: 2 Positive number904 không làm gì cả. Nó có thể được sử dụng khi một câu lệnh được yêu cầu về mặt cú pháp nhưng chương trình không yêu cầu hành động nào. Ví dụ
Enter a number: 2 Positive number90
Điều này thường được sử dụng để tạo các lớp tối thiểu
Enter a number: 2 Positive number91
Một nơi khác có thể sử dụng
Enter a number: 2 Positive number904 là giữ chỗ cho một hàm hoặc phần điều kiện khi bạn đang làm việc với mã mới, cho phép bạn tiếp tục suy nghĩ ở mức độ trừu tượng hơn.
Enter a number: 2 Positive number904 bị âm thầm bỏ qua
Enter a number: 2 Positive number92
4. 6. ______87 Câu lệnh¶
Một câu lệnh
>>> range[10] range[0, 10]7 lấy một biểu thức và so sánh giá trị của nó với các mẫu liên tiếp được đưa ra dưới dạng một hoặc nhiều khối trường hợp. Điều này bề ngoài giống với câu lệnh chuyển đổi trong C, Java hoặc JavaScript [và nhiều ngôn ngữ khác], nhưng nó giống với khớp mẫu hơn trong các ngôn ngữ như Rust hoặc Haskell. Chỉ mẫu đầu tiên phù hợp mới được thực thi và nó cũng có thể trích xuất các thành phần [phần tử trình tự hoặc thuộc tính đối tượng] từ giá trị thành các biến
Hình thức đơn giản nhất so sánh một giá trị chủ đề với một hoặc nhiều chữ
Enter a number: 2 Positive number93
Lưu ý khối cuối cùng. “tên biến”
Enter a number: 2 Positive number910 hoạt động như một ký tự đại diện và không bao giờ không khớp. Nếu không có trường hợp nào khớp, không có nhánh nào được thực thi
Bạn có thể kết hợp nhiều chữ trong một mẫu duy nhất bằng cách sử dụng
Enter a number: 2 Positive number911 [“hoặc”]
Enter a number: 2 Positive number94
Các mẫu có thể trông giống như các bài tập giải nén và có thể được sử dụng để liên kết các biến
Enter a number: 2 Positive number95
Nghiên cứu kỹ cái đó. Mẫu đầu tiên có hai chữ và có thể được coi là phần mở rộng của mẫu chữ được hiển thị ở trên. Nhưng hai mẫu tiếp theo kết hợp một chữ và một biến, và biến liên kết một giá trị từ chủ thể [
Enter a number: 2 Positive number912]. Mẫu thứ tư nắm bắt hai giá trị, khiến nó tương tự về mặt khái niệm với bài tập giải nén
Enter a number: 2 Positive number913
Nếu bạn đang sử dụng các lớp để cấu trúc dữ liệu của mình, bạn có thể sử dụng tên lớp theo sau là một danh sách đối số giống như một hàm tạo, nhưng với khả năng nắm bắt các thuộc tính thành các biến
Enter a number: 2 Positive number96
Bạn có thể sử dụng các tham số vị trí với một số lớp dựng sẵn cung cấp thứ tự cho các thuộc tính của chúng [e. g. lớp dữ liệu]. Bạn cũng có thể xác định một vị trí cụ thể cho các thuộc tính trong các mẫu bằng cách đặt thuộc tính đặc biệt
Enter a number: 2 Positive number914 trong các lớp của bạn. Nếu nó được đặt thành [“x”, “y”], tất cả các mẫu sau đều tương đương [và tất cả đều liên kết thuộc tính
Enter a number: 2 Positive number915 với biến
Enter a number: 2 Positive number916]
Enter a number: 2 Positive number97
Một cách được khuyến nghị để đọc các mẫu là xem chúng như một dạng mở rộng của những gì bạn sẽ đặt ở bên trái của một nhiệm vụ, để hiểu những biến nào sẽ được đặt thành những gì. Chỉ những tên độc lập [như
Enter a number: 2 Positive number916 ở trên] được gán cho bởi câu lệnh so khớp. Các tên có dấu chấm [như
Enter a number: 2 Positive number918], tên thuộc tính [các
Enter a number: 2 Positive number919 và
Enter a number: 2 Positive number920 ở trên] hoặc tên lớp [được nhận dạng bởi dấu “[…]” bên cạnh chúng như
Enter a number: 2 Positive number921 ở trên] không bao giờ được gán cho
Các mẫu có thể được lồng vào nhau tùy ý. Ví dụ: nếu chúng tôi có một danh sách ngắn các điểm, chúng tôi có thể khớp nó như thế này
Enter a number: 2 Positive number98
Chúng ta có thể thêm một mệnh đề
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb7 vào một mẫu, được gọi là “bảo vệ”. Nếu người bảo vệ là sai,
>>> range[10] range[0, 10]7 tiếp tục thử khối trường hợp tiếp theo. Lưu ý rằng việc nắm bắt giá trị xảy ra trước khi bảo vệ được đánh giá
Enter a number: 2 Positive number99
Một số tính năng chính khác của tuyên bố này
Giống như các bài tập giải nén, các mẫu bộ và danh sách có ý nghĩa hoàn toàn giống nhau và thực sự khớp với các chuỗi tùy ý. Một ngoại lệ quan trọng là chúng không khớp với các trình vòng lặp hoặc chuỗi
Các mẫu trình tự hỗ trợ giải nén mở rộng.
Enter a number: 2 Positive number
924 vàEnter a number: 2 Positive number
925 hoạt động tương tự như giải nén bài tập. Tên sauEnter a number: 2 Positive number
926 cũng có thể làEnter a number: 2 Positive number
910, do đó,Enter a number: 2 Positive number
928 khớp với một chuỗi ít nhất hai mục mà không ràng buộc các mục còn lạiCác mẫu ánh xạ.
Enter a number: 2 Positive number
929 nắm bắt các giá trịEnter a number: 2 Positive number
930 vàEnter a number: 2 Positive number
931 từ một từ điển. Không giống như các mẫu trình tự, các phím phụ bị bỏ qua. Giải nén nhưEnter a number: 2 Positive number
932 cũng được hỗ trợ. [NhưngEnter a number: 2 Positive number
933 sẽ thừa nên không được phép. ]Các mẫu con có thể được chụp bằng từ khóa
Enter a number: 2 Positive number
934Enter a number: 0 Zero
00sẽ nắm bắt phần tử thứ hai của đầu vào là
Enter a number: 2 Positive number
935 [miễn là đầu vào là một chuỗi gồm hai điểm]Hầu hết các chữ cái được so sánh bằng sự bình đẳng, tuy nhiên, những người độc thân
Enter a number: 2 Positive number
936,Enter a number: 2 Positive number
937 vàEnter a number: 2 Positive number
938 được so sánh theo danh tínhCác mẫu có thể sử dụng các hằng số được đặt tên. Đây phải là những tên chấm để ngăn chúng bị hiểu là biến chụp
Enter a number: 0 Zero
01
Để có giải thích chi tiết hơn và các ví dụ bổ sung, bạn có thể xem PEP 636 được viết ở định dạng hướng dẫn
4. 7. Xác định Hàm¶
Chúng ta có thể tạo một hàm ghi chuỗi Fibonacci vào một ranh giới tùy ý
Enter a number: 0 Zero02
Từ khóa
Enter a number: 2 Positive number939 giới thiệu một định nghĩa hàm. Nó phải được theo sau bởi tên hàm và danh sách các tham số chính thức được đặt trong ngoặc đơn. Các câu lệnh tạo thành phần thân của hàm bắt đầu ở dòng tiếp theo và phải được thụt vào
Câu lệnh đầu tiên của thân hàm có thể tùy ý là một chuỗi ký tự; . [Bạn có thể tìm hiểu thêm về chuỗi tài liệu trong phần Chuỗi tài liệu . ] Có các công cụ sử dụng chuỗi tài liệu để tự động tạo tài liệu trực tuyến hoặc tài liệu in hoặc để cho phép người dùng duyệt qua mã một cách tương tác; .
Việc thực thi một hàm giới thiệu một bảng ký hiệu mới được sử dụng cho các biến cục bộ của hàm. Chính xác hơn, tất cả các phép gán biến trong một hàm đều lưu trữ giá trị trong bảng ký hiệu cục bộ; . Do đó, các biến toàn cục và các biến của các hàm bao quanh không thể được gán trực tiếp một giá trị trong một hàm [trừ khi, đối với các biến toàn cục, được đặt tên trong câu lệnh
Enter a number: 2 Positive number940, hoặc, đối với các biến của các hàm bao quanh, được đặt tên trong một câu lệnh
Enter a number: 2 Positive number941], mặc dù chúng có thể là
Các tham số thực tế [đối số] cho một lệnh gọi hàm được đưa vào trong bảng ký hiệu cục bộ của hàm được gọi khi nó được gọi; . 1 Khi một hàm gọi một hàm khác hoặc gọi chính nó theo cách đệ quy, một bảng ký hiệu cục bộ mới sẽ được tạo cho lệnh gọi đó
Định nghĩa hàm liên kết tên hàm với đối tượng hàm trong bảng ký hiệu hiện tại. Trình thông dịch nhận ra đối tượng được trỏ tới bởi tên đó như một hàm do người dùng định nghĩa. Các tên khác cũng có thể trỏ đến cùng đối tượng chức năng đó và cũng có thể được sử dụng để truy cập chức năng
Enter a number: 0 Zero03
Đến từ các ngôn ngữ khác, bạn có thể phản đối rằng
Enter a number: 2 Positive number942 không phải là hàm mà là thủ tục vì nó không trả về giá trị. Trên thực tế, ngay cả những hàm không có câu lệnh
Enter a number: 2 Positive number943 cũng trả về một giá trị, mặc dù một giá trị khá nhàm chán. Giá trị này được gọi là
Enter a number: 2 Positive number938 [đó là tên tích hợp]. Việc viết giá trị
Enter a number: 2 Positive number938 thường bị trình thông dịch loại bỏ nếu đó là giá trị duy nhất được ghi. Bạn có thể xem nó nếu bạn thực sự muốn sử dụng
Enter a number: 2 Positive number946
Enter a number: 0 Zero04
Thật đơn giản để viết một hàm trả về danh sách các số của dãy Fibonacci, thay vì in nó
Enter a number: 0 Zero05
Ví dụ này, như thường lệ, minh họa một số tính năng mới của Python
Câu lệnh
Enter a number: 2 Positive number
943 trả về một giá trị từ một hàm.Enter a number: 2 Positive number
943 không có đối số biểu thức trả vềEnter a number: 2 Positive number
938. Rơi khỏi phần cuối của hàm cũng trả vềEnter a number: 2 Positive number
938Câu lệnh
Enter a number: 2 Positive number
951 gọi một phương thức của đối tượng danh sáchEnter a number: 2 Positive number
952. Một phương thức là một hàm 'thuộc về' một đối tượng và được đặt tên làEnter a number: 2 Positive number
953, trong đóEnter a number: 2 Positive number
954 là một số đối tượng [đây có thể là một biểu thức] vàEnter a number: 2 Positive number
955 là tên của một phương thức được xác định bởi kiểu của đối tượng. Các loại khác nhau xác định các phương pháp khác nhau. Các phương thức thuộc các loại khác nhau có thể có cùng tên mà không gây ra sự mơ hồ. [Có thể xác định các loại đối tượng và phương thức của riêng bạn, sử dụng các lớp, xem Lớp ] Phương thứcEnter a number: 2 Positive number
956 hiển thị trong ví dụ được xác định cho các đối tượng danh sách; . Trong ví dụ này, nó tương đương vớiEnter a number: 2 Positive number
957, nhưng hiệu quả hơn.
4. 8. Thông tin thêm về cách xác định hàm¶
Cũng có thể định nghĩa các hàm với số lượng đối số thay đổi. Có ba hình thức, có thể được kết hợp
4. 8. 1. Giá trị đối số mặc định¶
Hình thức hữu ích nhất là chỉ định một giá trị mặc định cho một hoặc nhiều đối số. Điều này tạo ra một hàm có thể được gọi với ít đối số hơn nó được định nghĩa để cho phép. Ví dụ
Enter a number: 0 Zero06
Chức năng này có thể được gọi theo nhiều cách
chỉ đưa ra đối số bắt buộc.
Enter a number: 2 Positive number
958đưa ra một trong những đối số tùy chọn.
Enter a number: 2 Positive number
959hoặc thậm chí đưa ra tất cả các đối số.
Enter a number: 2 Positive number
960
Ví dụ này cũng giới thiệu từ khóa
Enter a number: 2 Positive number961. Điều này kiểm tra xem một chuỗi có chứa một giá trị nhất định hay không
Các giá trị mặc định được đánh giá tại điểm định nghĩa hàm trong phạm vi xác định, sao cho
Enter a number: 0 Zero07
sẽ in
Enter a number: 2 Positive number962
cảnh báo quan trọng. Giá trị mặc định chỉ được đánh giá một lần. Điều này tạo ra sự khác biệt khi mặc định là một đối tượng có thể thay đổi, chẳng hạn như danh sách, từ điển hoặc thể hiện của hầu hết các lớp. Ví dụ: hàm sau tích lũy các đối số được truyền cho nó trong các lần gọi tiếp theo
Enter a number: 0 Zero08
Điều này sẽ in
Enter a number: 0 Zero09
Nếu bạn không muốn mặc định được chia sẻ giữa các lần gọi tiếp theo, bạn có thể viết hàm như thế này để thay thế
Enter a number: 0 Zero30
4. 8. 2. Đối số từ khóa¶
Hàm cũng có thể được gọi bằng cách sử dụng đối số từ khóa có dạng
Enter a number: 2 Positive number963. Chẳng hạn, chức năng sau.
Enter a number: 0 Zero31
chấp nhận một đối số bắt buộc [
Enter a number: 2 Positive number964] và ba đối số tùy chọn [
Enter a number: 2 Positive number965,
Enter a number: 2 Positive number966 và
Enter a number: 2 Positive number967]. Hàm này có thể được gọi theo bất kỳ cách nào sau đây
Enter a number: 0 Zero32
nhưng tất cả các cuộc gọi sau đây sẽ không hợp lệ
Enter a number: 0 Zero33
Trong một lệnh gọi hàm, các đối số từ khóa phải tuân theo các đối số vị trí. Tất cả các đối số từ khóa được truyền phải khớp với một trong các đối số được hàm chấp nhận [e. g.
Enter a number: 2 Positive number968 không phải là đối số hợp lệ cho hàm
Enter a number: 2 Positive number969] và thứ tự của chúng không quan trọng. Điều này cũng bao gồm các đối số không tùy chọn [e. g.
Enter a number: 2 Positive number970 cũng hợp lệ]. Không có đối số có thể nhận được một giá trị nhiều hơn một lần. Đây là một ví dụ không thành công do hạn chế này
Enter a number: 0 Zero34
Khi có tham số chính thức cuối cùng có dạng
Enter a number: 2 Positive number971, nó sẽ nhận được một từ điển [xem Các loại ánh xạ — dict ] chứa tất cả các đối số từ khóa . Điều này có thể được kết hợp với một tham số chính thức có dạng
Enter a number: 2 Positive number972 [được mô tả trong tiểu mục tiếp theo] nhận một bộ chứa các đối số vị trí ngoài danh sách tham số chính thức. [
Enter a number: 2 Positive number972 phải xảy ra trước
Enter a number: 2 Positive number971. ] Ví dụ: nếu chúng ta định nghĩa một hàm như thế này.
Enter a number: 0 Zero35
Nó có thể được gọi như thế này
Enter a number: 0 Zero36
và tất nhiên nó sẽ in
Enter a number: 0 Zero37
Lưu ý rằng thứ tự in các đối số từ khóa được đảm bảo khớp với thứ tự mà chúng được cung cấp trong lệnh gọi hàm
4. 8. 3. Tham số đặc biệt¶
Theo mặc định, các đối số có thể được chuyển đến một hàm Python theo vị trí hoặc theo từ khóa một cách rõ ràng. Đối với khả năng đọc và hiệu suất, nên hạn chế cách truyền đối số sao cho nhà phát triển chỉ cần xem định nghĩa hàm để xác định xem các mục được truyền theo vị trí, theo vị trí hoặc theo từ khóa hay theo từ khóa
Một định nghĩa chức năng có thể trông giống như
Enter a number: 0 Zero38
trong đó
Enter a number: 2 Positive number975 và
Enter a number: 2 Positive number926 là tùy chọn. Nếu được sử dụng, các ký hiệu này cho biết loại tham số theo cách các đối số có thể được truyền cho hàm. chỉ vị trí, vị trí hoặc từ khóa và chỉ từ khóa. Tham số từ khóa còn được gọi là tham số được đặt tên
4. 8. 3. 1. Đối số vị trí hoặc từ khóa¶
Nếu
Enter a number: 2 Positive number975 và
Enter a number: 2 Positive number926 không có trong định nghĩa hàm, các đối số có thể được chuyển đến hàm theo vị trí hoặc theo từ khóa
4. 8. 3. 2. Thông số chỉ dành cho vị trí¶
Xem xét điều này chi tiết hơn một chút, có thể đánh dấu các tham số nhất định là chỉ theo vị trí. Nếu chỉ có vị trí, thì thứ tự của tham số mới quan trọng và không thể chuyển tham số theo từ khóa. Các thông số chỉ dành cho vị trí được đặt trước một dấu gạch chéo 1975 [dấu gạch chéo về phía trước].
Enter a number: 2 Positive number975 được sử dụng để phân tách hợp lý các tham số chỉ vị trí với các tham số còn lại. Nếu không có
Enter a number: 2 Positive number975 trong định nghĩa hàm, thì không có tham số chỉ vị trí
Các tham số theo sau
Enter a number: 2 Positive number975 có thể là vị trí hoặc từ khóa hoặc chỉ từ khóa
4. 8. 3. 3. Đối số chỉ có từ khóa¶
Để đánh dấu các tham số là chỉ từ khóa, cho biết các tham số phải được truyền bằng đối số từ khóa, hãy đặt một
Enter a number: 2 Positive number926 trong danh sách đối số ngay trước tham số chỉ từ khóa đầu tiên
4. 8. 3. 4. Ví dụ hàm¶
Xem xét các định nghĩa hàm ví dụ sau chú ý đến các điểm đánh dấu
Enter a number: 2 Positive number975 và
Enter a number: 2 Positive number926
Enter a number: 0 Zero39
Định nghĩa hàm đầu tiên,
Enter a number: 2 Positive number986, dạng quen thuộc nhất, không hạn chế quy ước gọi và các đối số có thể được truyền theo vị trí hoặc từ khóa
Enter a number: 0 Zero50
Hàm thứ hai
Enter a number: 2 Positive number987 bị hạn chế chỉ sử dụng các tham số vị trí vì có một
Enter a number: 2 Positive number975 trong định nghĩa hàm
Enter a number: 0 Zero51
Hàm thứ ba
Enter a number: 2 Positive number989 chỉ cho phép các đối số từ khóa như được chỉ định bởi một
Enter a number: 2 Positive number926 trong định nghĩa hàm
Enter a number: 0 Zero52
Và cái cuối cùng sử dụng cả ba quy ước gọi trong cùng một định nghĩa hàm
Enter a number: 0 Zero53
Cuối cùng, hãy xem xét định nghĩa hàm này có khả năng xảy ra xung đột giữa đối số vị trí
Enter a number: 2 Positive number991 và
Enter a number: 2 Positive number992 có khóa
Enter a number: 2 Positive number991
Enter a number: 0 Zero54
Không có lệnh gọi nào có thể khiến nó trả về
Enter a number: 2 Positive number936 vì từ khóa
Enter a number: 2 Positive number995 sẽ luôn liên kết với tham số đầu tiên. Ví dụ
Enter a number: 0 Zero55
Nhưng sử dụng
Enter a number: 2 Positive number975 [đối số chỉ vị trí], có thể vì nó cho phép
Enter a number: 2 Positive number991 làm đối số vị trí và
Enter a number: 2 Positive number995 làm khóa trong đối số từ khóa
Enter a number: 0 Zero56
Nói cách khác, tên của các tham số chỉ vị trí có thể được sử dụng trong
Enter a number: 2 Positive number992 mà không có sự mơ hồ
4. 8. 3. 5. Tóm tắt¶
Trường hợp sử dụng sẽ xác định tham số nào sẽ được sử dụng trong định nghĩa hàm
Enter a number: 0 Zero57
Theo hướng dẫn
Chỉ sử dụng vị trí nếu bạn muốn tên của các tham số không có sẵn cho người dùng. Điều này hữu ích khi tên tham số không có ý nghĩa thực sự, nếu bạn muốn thực thi thứ tự của các đối số khi hàm được gọi hoặc nếu bạn cần lấy một số tham số vị trí và từ khóa tùy ý
Chỉ sử dụng từ khóa khi tên có ý nghĩa và định nghĩa hàm dễ hiểu hơn bằng cách đặt tên rõ ràng hoặc bạn muốn ngăn người dùng dựa vào vị trí của đối số được truyền
Đối với một API, chỉ sử dụng vị trí để ngăn các thay đổi API phá vỡ nếu tên của thông số được sửa đổi trong tương lai
4. 8. 4. Danh sách đối số tùy ý¶
Cuối cùng, tùy chọn ít được sử dụng nhất là chỉ định rằng một hàm có thể được gọi với số lượng đối số tùy ý. Các đối số này sẽ được gói gọn trong một bộ [xem Bộ và trình tự ]. Trước số lượng đối số thay đổi, có thể xảy ra không hoặc nhiều đối số bình thường.
Enter a number: 0 Zero58
Thông thường, các đối số biến thiên này sẽ nằm cuối cùng trong danh sách các tham số hình thức, bởi vì chúng thu thập tất cả các đối số đầu vào còn lại được truyền cho hàm. Bất kỳ tham số chính thức nào xuất hiện sau tham số
Enter a number: 0 Zero000 đều là đối số 'chỉ từ khóa', nghĩa là chúng chỉ có thể được sử dụng làm từ khóa thay vì đối số vị trí
Enter a number: 0 Zero59
4. 8. 5. Giải nén danh sách đối số¶
Tình huống ngược lại xảy ra khi các đối số đã có trong danh sách hoặc bộ nhưng cần được giải nén để gọi hàm yêu cầu các đối số vị trí riêng biệt. Chẳng hạn, hàm
Enter a number: 0 Zero11 tích hợp mong đợi các đối số bắt đầu và dừng riêng biệt. Nếu chúng không có sẵn một cách riêng biệt, hãy viết lời gọi hàm với toán tử
Enter a number: 2 Positive number926 để giải nén các đối số ra khỏi danh sách hoặc bộ dữ liệu
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb0
Theo cách tương tự, từ điển có thể cung cấp các đối số từ khóa với toán tử
Enter a number: 0 Zero003
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb1
4. 8. 6. Biểu thức Lambda¶
Có thể tạo các hàm ẩn danh nhỏ bằng từ khóa
Enter a number: 0 Zero004. Hàm này trả về tổng của hai đối số của nó.
Enter a number: 0 Zero005. Các hàm lambda có thể được sử dụng ở bất kỳ đâu cần có các đối tượng hàm. Chúng bị giới hạn về mặt cú pháp trong một biểu thức duy nhất. Về mặt ngữ nghĩa, chúng chỉ là đường cú pháp cho một định nghĩa hàm bình thường. Giống như các định nghĩa hàm lồng nhau, các hàm lambda có thể tham chiếu các biến từ phạm vi chứa
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb2
Ví dụ trên sử dụng biểu thức lambda để trả về một hàm. Một cách sử dụng khác là truyền một hàm nhỏ làm đối số
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb3
4. 8. 7. Chuỗi tài liệu¶
Dưới đây là một số quy ước về nội dung và định dạng của chuỗi tài liệu
Dòng đầu tiên phải luôn là một bản tóm tắt ngắn gọn, súc tích về mục đích của đối tượng. Để cho ngắn gọn, nó không nên nêu rõ ràng tên hoặc loại của đối tượng, vì những thứ này có sẵn theo các cách khác [ngoại trừ nếu tên đó là một động từ mô tả hoạt động của một chức năng]. Dòng này phải bắt đầu bằng chữ in hoa và kết thúc bằng dấu chấm
Nếu có nhiều dòng hơn trong chuỗi tài liệu, thì dòng thứ hai phải để trống, tách phần tóm tắt khỏi phần còn lại của phần mô tả một cách trực quan. Các dòng sau phải là một hoặc nhiều đoạn văn mô tả quy ước gọi của đối tượng, tác dụng phụ của nó, v.v.
Trình phân tích cú pháp Python không loại bỏ thụt đầu dòng khỏi các ký tự chuỗi nhiều dòng trong Python, vì vậy các công cụ xử lý tài liệu phải loại bỏ thụt đầu dòng nếu muốn. Điều này được thực hiện bằng cách sử dụng quy ước sau. Dòng không trống đầu tiên sau dòng đầu tiên của chuỗi xác định số lượng thụt lề cho toàn bộ chuỗi tài liệu. [Chúng ta không thể sử dụng dòng đầu tiên vì nó thường liền kề với dấu ngoặc kép mở đầu của chuỗi nên phần thụt đầu dòng của nó không rõ ràng trong ký tự chuỗi. ] Khoảng trắng “tương đương” với thụt đầu dòng này sau đó sẽ bị xóa khỏi đầu tất cả các dòng của chuỗi. Các dòng bị thụt vào ít hơn sẽ không xảy ra, nhưng nếu chúng xuất hiện thì tất cả các khoảng trắng ở đầu của chúng sẽ bị xóa. Tính tương đương của khoảng trắng nên được kiểm tra sau khi mở rộng các tab [thông thường là 8 khoảng trắng]
Dưới đây là một ví dụ về chuỗi tài liệu nhiều dòng
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb4
4. 8. 8. Chú thích hàm¶
Chú thích hàm là thông tin siêu dữ liệu hoàn toàn tùy chọn về các loại được sử dụng bởi các hàm do người dùng xác định [xem PEP 3107 và PEP 484 để biết thêm thông tin].
Chú thích được lưu trữ trong thuộc tính
Enter a number: 0 Zero006 của hàm dưới dạng từ điển và không ảnh hưởng đến bất kỳ phần nào khác của hàm. Chú thích tham số được xác định bằng dấu hai chấm sau tên tham số, theo sau là biểu thức đánh giá giá trị của chú thích. Chú thích trả về được xác định bởi một ký tự
Enter a number: 0 Zero007, theo sau là một biểu thức, nằm giữa danh sách tham số và dấu hai chấm biểu thị phần cuối của câu lệnh
Enter a number: 2 Positive number939. Ví dụ sau có đối số bắt buộc, đối số tùy chọn và giá trị trả về được chú thích.
>>> a = ['Mary', 'had', 'a', 'little', 'lamb'] >>> for i in range[len[a]]: .. print[i, a[i]] ... 0 Mary 1 had 2 a 3 little 4 lamb5
4. 9. Intermezzo. Kiểu viết mã¶
Bây giờ bạn sắp viết các phần Python dài hơn, phức tạp hơn, đây là thời điểm tốt để nói về phong cách viết mã. Hầu hết các ngôn ngữ có thể được viết [hoặc ngắn gọn hơn, được định dạng] theo các phong cách khác nhau; . Giúp người khác dễ dàng đọc mã của bạn luôn là một ý tưởng hay và việc áp dụng một kiểu viết mã đẹp sẽ giúp ích rất nhiều cho điều đó
Đối với Python, PEP 8 đã nổi lên như một hướng dẫn về phong cách mà hầu hết các dự án đều tuân theo; . Mọi nhà phát triển Python nên đọc nó vào một thời điểm nào đó;
Sử dụng thụt lề 4 dấu cách và không có tab
4 dấu cách là một sự thỏa hiệp tốt giữa thụt đầu dòng nhỏ [cho phép độ sâu lồng lớn hơn] và thụt đầu dòng lớn [dễ đọc hơn]. Các tab giới thiệu sự nhầm lẫn và tốt nhất là bỏ qua
Ngắt dòng sao cho chúng không vượt quá 79 ký tự
Điều này giúp người dùng có màn hình nhỏ và có thể có nhiều tệp mã cạnh nhau trên màn hình lớn hơn
Sử dụng các dòng trống để phân tách các hàm và lớp và các khối mã lớn hơn bên trong các hàm
Khi có thể, hãy đặt nhận xét trên một dòng của riêng họ
sử dụng docstrings
Sử dụng khoảng trắng xung quanh toán tử và sau dấu phẩy, nhưng không trực tiếp bên trong cấu trúc ngoặc.
Enter a number: 0 Zero
009Đặt tên nhất quán cho các lớp và chức năng của bạn; . Luôn sử dụng
Enter a number: 0 Zero
012 làm tên cho đối số phương thức đầu tiên [xem Cái nhìn đầu tiên về các lớp để biết thêm về các lớp và phương thức].Không sử dụng mã hóa ưa thích nếu mã của bạn được sử dụng trong môi trường quốc tế. Mặc định của Python, UTF-8 hoặc thậm chí ASCII đơn giản hoạt động tốt nhất trong mọi trường hợp
Tương tự như vậy, không sử dụng các ký tự không phải ASCII trong số nhận dạng nếu chỉ có một cơ hội nhỏ nhất là những người nói một ngôn ngữ khác sẽ đọc hoặc duy trì mã
chú thích
1Trên thực tế, gọi theo tham chiếu đối tượng sẽ là một mô tả tốt hơn, vì nếu một đối tượng có thể thay đổi được chuyển, người gọi sẽ thấy bất kỳ thay đổi nào mà callee thực hiện đối với nó [các mục được chèn vào danh sách]