Biến toàn cục python

Bên cạnh câu lệnh 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. ______0_______7 Câu lệnh

Có lẽ loại câu lệnh nổi tiếng nhất là câu lệnh. Ví dụ

>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
..     x = 0
..     print('Negative changed to zero')
.. elif x == 0:
..     print('Zero')
.. elif x == 1:
..     print('Single')
.. else:
..     print('More')
...
More

Có thể có 0 hoặc nhiều phần và phần này 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 lamb
9' 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 lamb
7 …
>>> 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
9 …
>>> 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
9 … 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 một số 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 xem

4. 2. ______6_______8 Câu lệnh

Câu lệnh 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 lại 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 lại trên các mục của bất kỳ chuỗi nào (một danh sách hoặc . Ví dụ (không có ý định chơi chữ)

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12

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.

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status

4. 3. Hàm

Nếu bạn cần lặp lại một dãy số, chức năng tích hợp sẵn sẽ rất hữu ích. Nó tạo ra các cấp số cộng

>>> for i in range(5):
..     print(i)
...
0
1
2
3
4

Đ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')

>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]

Để lặp lại các chỉ số của một chuỗi, bạn có thể kết hợp và 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, việc sử dụng chức năng này sẽ thuận tiện hơn, xem

Một điều kỳ lạ xảy ra nếu bạn chỉ in một phạm vi

>>> range(10)
range(0, 10)

Theo nhiều cách, đối tượng được trả về 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à , nghĩa là, phù hợp làm mục tiêu cho các chức năng và cấu trúc mong đợi một thứ gì đó mà từ đó chúng có thể nhận được các mục liên tiếp cho đến khi nguồn cung cạn kiệt. Chúng ta đã thấy rằng câu lệnh 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à

>>> sum(range(4))  # 0 + 1 + 2 + 3
6

Sau này chúng ta sẽ thấy nhiều hàm trả về iterables hơn và lấy iterables làm đối số. Trong chương này, chúng ta sẽ thảo luận chi tiết hơn về

4. 4. _______19_______1 và >>> for n in range(2, 10): .. for x in range(2, n): .. if n % x == 0: .. print(n, 'equals', x, '*', n//x) .. break .. else: .. # loop fell through without finding a factor .. print(n, 'is a prime number') ... 2 is a prime number 3 is a prime number 4 equals 2 * 2 5 is a prime number 6 equals 2 * 3 7 is a prime number 8 equals 2 * 4 9 equals 3 * 3 2 Các câu lệnh, và các mệnh đề >>> range(10) range(0, 10) 0 trong các vòng lặp

Câu lệnh, giống như trong C, thoát ra khỏi vòng lặp hoặc bao quanh trong cùng

Câu lệnh 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ố

>>> for n in range(2, 10):
..     for x in range(2, n):
..         if n % x == 0:
..             print(n, 'equals', x, '*', n//x)
..             break
..     else:
..         # loop fell through without finding a factor
..         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

(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, không phải câu lệnh. )

Khi được sử dụng với một 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 hơn là với mệnh đề của câu lệnh. mệnh đề
>>> range(10)
range(0, 10)
0 của câu lệnh 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ó
>>> for n in range(2, 10):
..     for x in range(2, n):
..         if n % x == 0:
..             print(n, 'equals', x, '*', n//x)
..             break
..     else:
..         # loop fell through without finding a factor
..         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
1 xảy ra. Để biết thêm về tuyên bố
>>> for num in range(2, 10):
..     if num % 2 == 0:
..         print("Found an even number", num)
..         continue
..     print("Found an odd number", num)
...
Found an even number 2
Found an odd number 3
Found an even number 4
Found an odd number 5
Found an even number 6
Found an odd number 7
Found an even number 8
Found an odd number 9
6 và các trường hợp ngoại lệ, hãy xem

Câu lệnh, 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

>>> for num in range(2, 10):
..     if num % 2 == 0:
..         print("Found an even number", num)
..         continue
..     print("Found an odd number", num)
...
Found an even number 2
Found an odd number 3
Found an even number 4
Found an odd number 5
Found an even number 6
Found an odd number 7
Found an even number 8
Found an odd number 9

4. 5. ______11_______04 Câu lệnh

Tuyên bố 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ụ

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
0

Điều này thường được sử dụng để tạo các lớp tối thiểu

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
1

Một nơi khác có thể được sử dụng như một trình giữ chỗ cho một hàm hoặc phần thân có đ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.

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
04 bị bỏ qua trong im lặng

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
2

4. 6. ______6_______7 Câu lệnh

Một câu lệnh 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ữ

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
3

Lưu ý khối cuối cùng. “tên biến”

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
10 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

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
11 (“hoặc”)

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
4

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

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
5

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ể (

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
12). 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
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
13

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

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
6

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

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
14 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
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
15 với biến
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
16)

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
7

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ư

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
16 ở trên) được gán cho bởi câu lệnh so khớp. Tên có dấu chấm (như
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
18), tên thuộc tính (_______11_______19 và
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
20 ở trên) hoặc tên lớp (được nhận dạng bởi dấu “(…)” bên cạnh chúng như
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
21 ở 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

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
8

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 lamb
7 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á

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
9

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.

    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    24 và
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    25 hoạt động tương tự như giải nén bài tập. Tên sau
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    26 cũng có thể là
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    10, do đó,
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    28 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ại

  • Các mẫu ánh xạ.

    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    29 nắm bắt các giá trị
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    30 và
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    31 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ư
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    32 cũng được hỗ trợ. (Nhưng
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    33 sẽ là thừa nên không được phép. )

  • Các mẫu con có thể được ghi lại bằng cách sử dụng từ khóa

    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    34

    # Create a sample collection
    users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}
    
    # Strategy:  Iterate over a copy
    for user, status in users.copy().items():
        if status == 'inactive':
            del users[user]
    
    # Strategy:  Create a new collection
    active_users = {}
    for user, status in users.items():
        if status == 'active':
            active_users[user] = status
    
    0

    sẽ nắm bắt phần tử thứ hai của đầu vào là

    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    35 (miễn là đầu vào là một chuỗi gồm hai điểm)

  • Hầu hết các nghĩa đen được so sánh theo đẳng thức, tuy nhiên các từ đơn lẻ

    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    36,
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    37 và
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    38 được so sánh theo đặc tính

  • Cá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

    # Create a sample collection
    users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}
    
    # Strategy:  Iterate over a copy
    for user, status in users.copy().items():
        if status == 'inactive':
            del users[user]
    
    # Strategy:  Create a new collection
    active_users = {}
    for user, status in users.items():
        if status == 'active':
            active_users[user] = status
    
    1

Để 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 chức năng

Chúng ta có thể tạo một hàm ghi chuỗi Fibonacci vào một ranh giới tùy ý

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
2

Từ khóa giới thiệu một định nghĩa chức năng. 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 chọn là một chuỗi ký tự; . (Thông tin thêm về docstrings có thể được tìm thấy trong phần. ) 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 một câu lệnh, 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), mặc dù chúng có thể được tham chiếu

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; . 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 đượ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

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
3

Đến từ các ngôn ngữ khác, bạn có thể phản đối rằng

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
42 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 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à
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
38 (đó là tên tích hợp). Việc ghi giá trị
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
38 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

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
4

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ó

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
5

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 trả về với một giá trị từ một hàm.

    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    43 không có đối số biểu thức trả về
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    38. Rơi khỏi phần cuối của hàm cũng trả về
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    38

  • Câu lệnh

    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    51 gọi một phương thức của đối tượng danh sách
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    52. 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à
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    53, trong đó
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    54 là một đối tượng nào đó (đây có thể là một biểu thức) và
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    55 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 phần ) Phương thức
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    56 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ới
    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    57, 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ụ

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
6

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.

    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    58

  • đưa ra một trong những đối số tùy chọn.

    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    59

  • hoặc thậm chí đưa ra tất cả các đối số.

    >>> # Measure some strings:
    .. words = ['cat', 'window', 'defenestrate']
    >>> for w in words:
    ..     print(w, len(w))
    ...
    cat 3
    window 6
    defenestrate 12
    
    60

Ví dụ này cũng giới thiệu từ khóa. Đ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

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
7

sẽ in

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
62

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

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
8

Điều này sẽ in

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
9

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ế

>>> for i in range(5):
..     print(i)
...
0
1
2
3
4
0

4. 8. 2. Đối số từ khóa

Hàm cũng có thể được gọi bằng cách sử dụng biểu mẫu

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
63. Chẳng hạn, chức năng sau

>>> for i in range(5):
..     print(i)
...
0
1
2
3
4
1

chấp nhận một đối số bắt buộc (

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
64) và ba đối số tùy chọn (
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
65,
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
66 và
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
67). Hàm này có thể được gọi theo bất kỳ cách nào sau đây

>>> for i in range(5):
..     print(i)
...
0
1
2
3
4
2

nhưng tất cả các cuộc gọi sau đây sẽ không hợp lệ

>>> for i in range(5):
..     print(i)
...
0
1
2
3
4
3

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.

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
68 không phải là đối số hợp lệ cho hàm
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
69) 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.
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
70 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

>>> for i in range(5):
..     print(i)
...
0
1
2
3
4
4

Khi có một tham số chính thức cuối cùng có dạng

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
71, nó sẽ nhận được một từ điển (xem ) chứa tất cả các đối số từ khóa ngoại trừ những đối số tương ứng với một tham số chính thức. Điều này có thể được kết hợp với một tham số chính thức có dạng
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
72 (được mô tả trong tiểu mục tiếp theo) nhận được một đối số vị trí có chứa ngoài danh sách tham số chính thức. (
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
72 phải xảy ra trước
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
71. ) Ví dụ: nếu chúng ta định nghĩa một hàm như thế này

>>> for i in range(5):
..     print(i)
...
0
1
2
3
4
5

Nó có thể được gọi như thế này

>>> for i in range(5):
..     print(i)
...
0
1
2
3
4
6

và tất nhiên nó sẽ in

>>> for i in range(5):
..     print(i)
...
0
1
2
3
4
7

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. Thông 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ư

>>> for i in range(5):
..     print(i)
...
0
1
2
3
4
8

trong đó

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
75 và
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
26 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

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
75 và
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
26 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 tham số chỉ vị trí được đặt trước một

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
75 (dấu gạch chéo về phía trước).
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
75 đượ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ó
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
75 trong định nghĩa hàm, thì không có tham số chỉ vị trí

Các tham số theo sau

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
75 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

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
26 trong danh sách đối số ngay trước tham số chỉ dành cho từ khóa đầu tiên

4. 8. 3. 4. Ví dụ về hàm

Xem xét các định nghĩa hàm ví dụ sau chú ý đến các điểm đánh dấu

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
75 và
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
26

>>> for i in range(5):
..     print(i)
...
0
1
2
3
4
9

Định nghĩa hàm đầu tiên,

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
86, 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

>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]
0

Hàm thứ hai

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
87 bị hạn chế chỉ sử dụng các tham số vị trí vì có một ____11_______75 trong định nghĩa hàm

>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]
1

Hàm thứ ba

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
89 chỉ cho phép đối số từ khóa như được biểu thị bằng ____11_______26 trong định nghĩa hàm

>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]
2

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

>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]
3

Cuối cùng, hãy xem định nghĩa hàm này có khả năng xảy ra xung đột giữa đối số vị trí

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
91 và
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
92 có khóa
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
91

>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]
4

Không có lệnh gọi nào có thể khiến nó trả về

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
36 vì từ khóa
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
95 sẽ luôn liên kết với tham số đầu tiên. Ví dụ

>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]
5

Nhưng sử dụng

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
75 (đối số chỉ vị trí), có thể thực hiện được vì nó cho phép
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
91 làm đối số vị trí và
>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
95 làm khóa trong đối số từ khóa

>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]
6

Nói cách khác, tên của các tham số chỉ vị trí có thể được sử dụng trong

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
92 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

>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]
7

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 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ộ dữ liệu (xem phần ). 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

>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]
8

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ố

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
00 đề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í

>>> list(range(5, 10))
[5, 6, 7, 8, 9]

>>> list(range(0, 10, 3))
[0, 3, 6, 9]

>>> list(range(-10, -100, -30))
[-10, -40, -70]
9

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 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ử

>>> # Measure some strings:
.. words = ['cat', 'window', 'defenestrate']
>>> for w in words:
..     print(w, len(w))
...
cat 3
window 6
defenestrate 12
26 để 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 lamb
0

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ử

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
03

>>> 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
1

4. 8. 6. Biểu thức Lambda

Các chức năng ẩn danh nhỏ có thể được tạo bằng từ khóa. Hàm này trả về tổng của hai đối số của nó.

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
05. Hàm lambda có thể được sử dụng ở bất cứ nơi nào cần 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 lamb
2

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 lamb
3

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 tình cờ 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 lamb
4

4. 8. 8. Chú thích chức năng

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 chức năng do người dùng xác định (xem PEP 3107 và PEP 484 để biết thêm thông tin)

được lưu trữ trong thuộc tính

# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
06 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ự
# Create a sample collection
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}

# Strategy:  Iterate over a copy
for user, status in users.copy().items():
    if status == 'inactive':
        del users[user]

# Strategy:  Create a new collection
active_users = {}
for user, status in users.items():
    if status == 'active':
        active_users[user] = status
07, 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. 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 lamb
5

4. 9. Intermezzo. Phong cách mã hóa

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 thủ; . 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.

    # Create a sample collection
    users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}
    
    # Strategy:  Iterate over a copy
    for user, status in users.copy().items():
        if status == 'inactive':
            del users[user]
    
    # Strategy:  Create a new collection
    active_users = {}
    for user, status in users.items():
        if status == 'active':
            active_users[user] = status
    
    09

  • Đặt tên cho các lớp và chức năng của bạn một cách nhất quán; . Luôn sử dụng

    # Create a sample collection
    users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}
    
    # Strategy:  Iterate over a copy
    for user, status in users.copy().items():
        if status == 'inactive':
            del users[user]
    
    # Strategy:  Create a new collection
    active_users = {}
    for user, status in users.items():
        if status == 'active':
            active_users[user] = status
    
    12 làm tên cho đối số phương thức đầu tiên (xem để 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

Trê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)