Hướng dẫn does python support functional programming - python có hỗ trợ lập trình chức năng không

Tác giả

A. M. Kuchling

Phóng thích

0.32

Trong tài liệu này, chúng tôi sẽ tham gia một chuyến tham quan các tính năng của Python, phù hợp để thực hiện các chương trình theo phong cách chức năng. Sau khi giới thiệu các khái niệm về lập trình chức năng, chúng tôi sẽ xem xét các tính năng ngôn ngữ như trình lặp và trình tạo và các mô -đun thư viện có liên quan như

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
9 và
for line in file:
    # do something for each line
    ...
0.iterators and generators and relevant library modules such as
>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
9 and
for line in file:
    # do something for each line
    ...
0.

Giới thiệu¶

Phần này giải thích khái niệm cơ bản về lập trình chức năng; Nếu bạn chỉ quan tâm đến việc tìm hiểu về các tính năng ngôn ngữ Python, hãy bỏ qua phần tiếp theo trên các trình lặp.Iterators.

Ngôn ngữ lập trình hỗ trợ phân tách các vấn đề theo nhiều cách khác nhau:

  • Hầu hết các ngôn ngữ lập trình là thủ tục: các chương trình là danh sách các hướng dẫn cho máy tính phải làm gì với đầu vào của chương trình. C, Pascal, và thậm chí vỏ Unix là ngôn ngữ thủ tục.procedural: programs are lists of instructions that tell the computer what to do with the program’s input. C, Pascal, and even Unix shells are procedural languages.

  • Trong các ngôn ngữ khai báo, bạn viết một đặc điểm kỹ thuật mô tả vấn đề cần giải quyết và việc thực hiện ngôn ngữ tìm ra cách thực hiện tính toán hiệu quả. SQL là ngôn ngữ khai báo mà bạn có thể quen thuộc nhất; Một truy vấn SQL mô tả tập dữ liệu bạn muốn truy xuất và động cơ SQL quyết định có nên quét các bảng hay sử dụng các chỉ mục, mà các phân nhóm nên được thực hiện trước tiên, v.v.declarative languages, you write a specification that describes the problem to be solved, and the language implementation figures out how to perform the computation efficiently. SQL is the declarative language you’re most likely to be familiar with; a SQL query describes the data set you want to retrieve, and the SQL engine decides whether to scan tables or use indexes, which subclauses should be performed first, etc.

  • Các chương trình hướng đối tượng thao túng các bộ sưu tập của các đối tượng. Các đối tượng có trạng thái nội bộ và các phương thức hỗ trợ truy vấn hoặc sửa đổi trạng thái nội bộ này theo một cách nào đó. Smalltalk và Java là các ngôn ngữ hướng đối tượng. C ++ và Python là các ngôn ngữ hỗ trợ lập trình hướng đối tượng, nhưng don don buộc phải sử dụng các tính năng hướng đối tượng. programs manipulate collections of objects. Objects have internal state and support methods that query or modify this internal state in some way. Smalltalk and Java are object-oriented languages. C++ and Python are languages that support object-oriented programming, but don’t force the use of object-oriented features.

  • Lập trình chức năng phân tách một vấn đề thành một tập hợp các chức năng. Lý tưởng nhất, các chức năng chỉ lấy đầu vào và tạo ra các đầu ra, và don lồng có bất kỳ trạng thái nội bộ nào ảnh hưởng đến đầu ra được tạo ra cho một đầu vào nhất định. Các ngôn ngữ chức năng nổi tiếng bao gồm họ ML (ML tiêu chuẩn, OCAML và các biến thể khác) và Haskell. programming decomposes a problem into a set of functions. Ideally, functions only take inputs and produce outputs, and don’t have any internal state that affects the output produced for a given input. Well-known functional languages include the ML family (Standard ML, OCaml, and other variants) and Haskell.

Các nhà thiết kế của một số ngôn ngữ máy tính chọn để nhấn mạnh một cách tiếp cận cụ thể để lập trình. Điều này thường gây khó khăn cho việc viết các chương trình sử dụng một cách tiếp cận khác. Các ngôn ngữ khác là các ngôn ngữ đa Paradigm hỗ trợ một số phương pháp khác nhau. Lisp, C ++ và Python là đa Paradigm; Bạn có thể viết các chương trình hoặc thư viện chủ yếu là thủ tục, hướng đối tượng hoặc chức năng trong tất cả các ngôn ngữ này. Trong một chương trình lớn, các phần khác nhau có thể được viết bằng cách sử dụng các phương pháp khác nhau; GUI có thể được định hướng đối tượng trong khi logic xử lý là thủ tục hoặc chức năng chẳng hạn.

Trong một chương trình chức năng, đầu vào chảy qua một tập hợp các chức năng. Mỗi chức năng hoạt động trên đầu vào của nó và tạo ra một số đầu ra. Kiểu chức năng không khuyến khích các chức năng với các tác dụng phụ sửa đổi trạng thái bên trong hoặc thực hiện các thay đổi khác có thể nhìn thấy trong giá trị trả về chức năng. Các chức năng không có tác dụng phụ nào được gọi là hoàn toàn chức năng. Tránh các tác dụng phụ có nghĩa là không sử dụng các cấu trúc dữ liệu được cập nhật khi một chương trình chạy; Mỗi chức năng đầu ra chỉ phải phụ thuộc vào đầu vào của nó.purely functional. Avoiding side effects means not using data structures that get updated as a program runs; every function’s output must only depend on its input.

Một số ngôn ngữ rất nghiêm ngặt về độ tinh khiết và don thậm chí còn có các câu lệnh gán như

for line in file:
    # do something for each line
    ...
1 hoặc
for line in file:
    # do something for each line
    ...
2, nhưng nó khó tránh khỏi tất cả các tác dụng phụ, chẳng hạn như in lên màn hình hoặc ghi vào tệp đĩa. Một ví dụ khác là một cuộc gọi đến hàm
for line in file:
    # do something for each line
    ...
3 hoặc
for line in file:
    # do something for each line
    ...
4, cả hai đều không trả về một giá trị hữu ích. Cả hai chỉ được gọi cho các tác dụng phụ của họ là gửi một số văn bản lên màn hình hoặc tạm dừng thực hiện trong một giây.

Các chương trình Python được viết theo phong cách chức năng thường giành chiến thắng đi đến cực đoan trong việc tránh tất cả I/O hoặc tất cả các bài tập; Thay vào đó, họ sẽ cung cấp một giao diện xuất hiện chức năng nhưng sẽ sử dụng các tính năng không chức năng bên trong. Ví dụ, việc thực hiện một hàm vẫn sẽ sử dụng các bài tập cho các biến cục bộ, nhưng won đã sửa đổi các biến toàn cầu hoặc có các tác dụng phụ khác.

Lập trình chức năng có thể được coi là ngược lại với lập trình hướng đối tượng. Các đối tượng là những viên nang nhỏ chứa một số trạng thái nội bộ cùng với một tập hợp các cuộc gọi phương thức cho phép bạn sửa đổi trạng thái này và các chương trình bao gồm thực hiện đúng các thay đổi trạng thái. Lập trình chức năng muốn tránh các thay đổi trạng thái càng nhiều càng tốt và hoạt động với dữ liệu chảy giữa các chức năng. Trong Python, bạn có thể kết hợp hai cách tiếp cận bằng cách viết các chức năng lấy và trả về các trường hợp biểu thị các đối tượng trong ứng dụng của bạn (tin nhắn e-mail, giao dịch, v.v.).

Thiết kế chức năng có vẻ như là một ràng buộc kỳ lạ để làm việc theo. Tại sao bạn nên tránh các đối tượng và tác dụng phụ? Có những lợi thế về mặt lý thuyết và thực tế đối với phong cách chức năng:

  • Khả năng cung cấp chính thức.

  • Modularity.

  • Composability.

  • Dễ gỡ lỗi và thử nghiệm.

Khả năng cung cấp chính thức

Một lợi ích lý thuyết là nó dễ dàng hơn để xây dựng một bằng chứng toán học rằng một chương trình chức năng là chính xác.

Trong một thời gian dài, các nhà nghiên cứu đã quan tâm đến việc tìm cách chứng minh toán học chính xác. Điều này khác với việc kiểm tra một chương trình về nhiều đầu vào và kết luận rằng đầu ra của nó thường đúng hoặc đọc mã nguồn chương trình và kết luận rằng mã có vẻ đúng; Mục tiêu thay vào đó là một bằng chứng nghiêm ngặt rằng một chương trình tạo ra kết quả đúng cho tất cả các đầu vào có thể.

Kỹ thuật được sử dụng để chứng minh các chương trình chính xác là viết ra các bất biến, các thuộc tính của dữ liệu đầu vào và các biến của chương trình luôn luôn đúng. Đối với mỗi dòng mã, sau đó bạn chỉ ra rằng nếu bất biến X và Y là đúng trước khi dòng được thực thi, các bất biến hơi khác nhau X, và Y, đúng sau khi dòng được thực thi. Điều này tiếp tục cho đến khi bạn đạt đến cuối chương trình, tại thời điểm đó các bất biến sẽ phù hợp với các điều kiện mong muốn trên đầu ra của chương trình.invariants, properties of the input data and of the program’s variables that are always true. For each line of code, you then show that if invariants X and Y are true before the line is executed, the slightly different invariants X’ and Y’ are true after the line is executed. This continues until you reach the end of the program, at which point the invariants should match the desired conditions on the program’s output.

Lập trình chức năng Tránh tránh các bài tập phát sinh vì các bài tập rất khó xử lý với kỹ thuật này; Bài tập có thể phá vỡ các bất biến đúng trước khi chuyển nhượng mà không tạo ra bất kỳ bất biến mới nào có thể được truyền đi trở đi.

Thật không may, việc chứng minh các chương trình chính xác phần lớn là không thực tế và không liên quan đến phần mềm Python. Ngay cả các chương trình tầm thường cũng yêu cầu bằng chứng dài vài trang; Bằng chứng về tính chính xác cho một chương trình phức tạp vừa phải sẽ rất lớn và rất ít hoặc không có chương trình nào bạn sử dụng hàng ngày (trình thông dịch Python, trình phân tích cú pháp XML của bạn, trình duyệt web của bạn) có thể được chứng minh chính xác. Ngay cả khi bạn đã viết ra hoặc tạo ra một bằng chứng, sau đó sẽ có câu hỏi về việc xác minh bằng chứng; Có thể có một lỗi trong đó, và bạn đã tin sai tin rằng bạn đã chứng minh chương trình chính xác.

Tính mô đun

Một lợi ích thiết thực hơn của lập trình chức năng là nó buộc bạn phải chia ra vấn đề của mình thành các mảnh nhỏ. Các chương trình là mô -đun nhiều hơn do đó. Nó dễ dàng hơn để chỉ định và viết một chức năng nhỏ làm một việc hơn là một hàm lớn thực hiện một phép biến đổi phức tạp. Các chức năng nhỏ cũng dễ đọc hơn và kiểm tra lỗi.

Dễ gỡ lỗi và thử nghiệm bài

Kiểm tra và gỡ lỗi một chương trình kiểu chức năng dễ dàng hơn.

Gỡ lỗi được đơn giản hóa vì các chức năng thường nhỏ và được chỉ định rõ ràng. Khi một chương trình không hoạt động, mỗi hàm là một điểm giao diện nơi bạn có thể kiểm tra xem dữ liệu có chính xác không. Bạn có thể nhìn vào các đầu vào và đầu ra trung gian để nhanh chóng cô lập chức năng mà chịu trách nhiệm cho một lỗi.

Kiểm tra dễ dàng hơn vì mỗi chức năng là một đối tượng tiềm năng cho một bài kiểm tra đơn vị. Các chức năng don lồng phụ thuộc vào trạng thái hệ thống cần được nhân rộng trước khi chạy thử nghiệm; Thay vào đó, bạn chỉ phải tổng hợp đầu vào đúng và sau đó kiểm tra xem đầu ra có phù hợp với mong đợi không.

Khả năng kết hợp Or

Khi bạn làm việc trên một chương trình kiểu chức năng, bạn sẽ viết một số chức năng với các đầu vào và đầu ra khác nhau. Một số chức năng này sẽ không thể tránh khỏi chuyên dụng cho một ứng dụng cụ thể, nhưng những chức năng khác sẽ hữu ích trong nhiều chương trình khác nhau. Ví dụ: một hàm lấy đường dẫn thư mục và trả về tất cả các tệp XML trong thư mục hoặc hàm lấy tên tệp và trả về nội dung của nó, có thể được áp dụng cho nhiều tình huống khác nhau.

Theo thời gian, bạn sẽ tạo thành một thư viện cá nhân của các tiện ích. Thông thường, bạn sẽ tập hợp các chương trình mới bằng cách sắp xếp các chức năng hiện có trong một cấu hình mới và viết một vài chức năng chuyên về nhiệm vụ hiện tại.

Tereratorators¶

Tôi sẽ bắt đầu bằng cách nhìn vào một tính năng ngôn ngữ Python mà một nền tảng quan trọng để viết các chương trình theo phong cách chức năng: iterators.

Một trình lặp là một đối tượng đại diện cho một luồng dữ liệu; Đối tượng này trả về dữ liệu một phần tử tại một thời điểm. Trình lặp Python phải hỗ trợ một phương thức gọi là

for line in file:
    # do something for each line
    ...
5 không có đối số và luôn trả về phần tử tiếp theo của luồng. Nếu không có thêm các yếu tố trong luồng,
for line in file:
    # do something for each line
    ...
5 phải tăng ngoại lệ
for line in file:
    # do something for each line
    ...
7. Mặc dù vậy, các phép lặp không phải là hữu hạn; Nó hoàn toàn hợp lý để viết một trình lặp lại tạo ra một luồng dữ liệu vô hạn.

Hàm

for line in file:
    # do something for each line
    ...
8 tích hợp có một đối tượng tùy ý và cố gắng trả về một trình lặp sẽ trả về nội dung hoặc phần tử đối tượng, tăng
for line in file:
    # do something for each line
    ...
9 nếu đối tượng không hỗ trợ lặp lại. Một số loại dữ liệu tích hợp Python, hỗ trợ lặp lại, danh sách và từ điển phổ biến nhất. Một đối tượng được gọi là ITable nếu bạn có thể nhận được một trình lặp cho nó.iterable if you can get an iterator for it.

Bạn có thể thử nghiệm giao diện lặp theo cách thủ công:

>>> L = [1, 2, 3]
>>> it = iter(L)
>>> it  
<...iterator object at ...>
>>> it.__next__()  # same as next(it)
1
>>> next(it)
2
>>> next(it)
3
>>> next(it)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration
>>>

Python mong đợi các đối tượng có thể lặp lại trong một số bối cảnh khác nhau, quan trọng nhất là tuyên bố

>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
0. Trong câu lệnh
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
1, y phải là một trình lặp hoặc một số đối tượng mà
for line in file:
    # do something for each line
    ...
8 có thể tạo một trình lặp. Hai câu này tương đương:

for i in iter(obj):
    print(i)

for i in obj:
    print(i)

Trình lặp có thể được vật chất hóa dưới dạng danh sách hoặc bộ dữ liệu bằng cách sử dụng các hàm xây dựng

>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
3 hoặc
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
4:

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)

Trình tự Giải nén cũng hỗ trợ các trình lặp lại: Nếu bạn biết trình lặp sẽ trả lại n phần tử, bạn có thể giải nén chúng thành một n-tuple:

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)

Các chức năng tích hợp như

>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
5 và
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
6 có thể lấy một đối số lặp duy nhất và sẽ trả về phần tử lớn nhất hoặc nhỏ nhất. Các toán tử
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
7 và
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
8 cũng hỗ trợ các trình lặp lại:
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
9 là đúng nếu X được tìm thấy trong luồng được trả về bởi trình lặp lại. Bạn sẽ gặp phải các vấn đề rõ ràng nếu người lặp là vô hạn;
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
5,
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
6 sẽ không bao giờ quay trở lại và nếu phần tử X không bao giờ xuất hiện trong luồng, các nhà khai thác
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
7 và
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
8 cũng giành được trở lại.

Lưu ý rằng bạn chỉ có thể đi về phía trước trong một trình lặp; Không có cách nào để có được phần tử trước đó, đặt lại trình lặp hoặc tạo một bản sao của nó. Các đối tượng Iterator có thể tùy chọn cung cấp các khả năng bổ sung này, nhưng giao thức Iterator chỉ chỉ định phương thức

for line in file:
    # do something for each line
    ...
5. Do đó, các chức năng có thể tiêu thụ tất cả đầu ra của iterator và nếu bạn cần làm một cái gì đó khác biệt với cùng một luồng, bạn sẽ phải tạo một trình lặp mới.

Các loại dữ liệu hỗ trợ các trình lặp lại

Chúng tôi đã thấy cách các danh sách và bộ dữ liệu hỗ trợ các trình lặp lại. Trên thực tế, bất kỳ loại trình tự Python nào, chẳng hạn như chuỗi, sẽ tự động hỗ trợ tạo ra một trình lặp.

Gọi

for line in file:
    # do something for each line
    ...
8 trên một từ điển trả về một trình lặp sẽ lặp lại các khóa từ điển từ điển:

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
...     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12

Lưu ý rằng bắt đầu với Python 3.7, thứ tự lặp từ điển được đảm bảo giống như thứ tự chèn. Trong các phiên bản trước, hành vi không được xác định và có thể thay đổi giữa các triển khai.

Áp dụng

for line in file:
    # do something for each line
    ...
8 cho một từ điển luôn lặp lại các khóa, nhưng từ điển có các phương pháp trả về các trình lặp khác. Nếu bạn muốn lặp lại các giá trị hoặc các cặp khóa/giá trị, bạn có thể gọi rõ ràng các phương thức
>>> line_list = ['  line 1\n', 'line 2  \n', ' \n', '']

>>> # Generator expression -- returns iterator
>>> stripped_iter = (line.strip() for line in line_list)

>>> # List comprehension -- returns list
>>> stripped_list = [line.strip() for line in line_list]
7 hoặc
>>> line_list = ['  line 1\n', 'line 2  \n', ' \n', '']

>>> # Generator expression -- returns iterator
>>> stripped_iter = (line.strip() for line in line_list)

>>> # List comprehension -- returns list
>>> stripped_list = [line.strip() for line in line_list]
8 để có trình lặp phù hợp.

Trình xây dựng

>>> line_list = ['  line 1\n', 'line 2  \n', ' \n', '']

>>> # Generator expression -- returns iterator
>>> stripped_iter = (line.strip() for line in line_list)

>>> # List comprehension -- returns list
>>> stripped_list = [line.strip() for line in line_list]
9 có thể chấp nhận một trình lặp trả về một luồng hữu hạn của
>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
0 Tuples:

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}

Các tệp cũng hỗ trợ lặp lại bằng cách gọi phương thức

>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
1 cho đến khi không còn dòng nào trong tệp. Điều này có nghĩa là bạn có thể đọc từng dòng của một tệp như thế này:

for line in file:
    # do something for each line
    ...

Các bộ có thể lấy nội dung của chúng từ một điều đáng tin cậy và cho phép bạn lặp lại các phần tử của bộ:

>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13

Biểu thức máy phát và danh sách toàn diện

Hai hoạt động phổ biến trên đầu ra của Iterator là 1) thực hiện một số hoạt động cho mọi yếu tố, 2) chọn một tập hợp con của các phần tử đáp ứng một số điều kiện. Ví dụ, được đưa ra một danh sách các chuỗi, bạn có thể muốn loại bỏ khoảng trắng kéo dài từ mỗi dòng hoặc trích xuất tất cả các chuỗi chứa một chuỗi con nhất định.

Danh sách các biểu thức toàn diện và trình tạo (Mẫu ngắn: List ListComps và và GenExps,) là một ký hiệu ngắn gọn cho các hoạt động đó, được mượn từ ngôn ngữ lập trình chức năng Haskell (https://www.haskell.org/). Bạn có thể tước tất cả khoảng trắng từ một luồng chuỗi với mã sau:

>>> line_list = ['  line 1\n', 'line 2  \n', ' \n', '']

>>> # Generator expression -- returns iterator
>>> stripped_iter = (line.strip() for line in line_list)

>>> # List comprehension -- returns list
>>> stripped_list = [line.strip() for line in line_list]

Bạn chỉ có thể chọn các yếu tố nhất định bằng cách thêm điều kiện

>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
2:

>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]

Với sự hiểu biết danh sách, bạn lấy lại một danh sách Python;

>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
3 là một danh sách chứa các dòng kết quả, không phải là một trình lặp. Biểu thức của máy phát trả về một trình lặp lại tính toán các giá trị khi cần thiết, không cần phải thực hiện tất cả các giá trị cùng một lúc. Điều này có nghĩa là các toàn bộ danh sách không có ích nếu bạn làm việc với các trình lặp lại trả về một luồng vô hạn hoặc một lượng dữ liệu rất lớn. Biểu thức của máy phát là thích hợp hơn trong các tình huống này.

Các biểu thức của máy phát được bao quanh bởi dấu ngoặc đơn ((()) và các toàn bộ danh sách được bao quanh bởi các dấu ngoặc vuông ([[] []). Biểu thức của máy phát có biểu mẫu:

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
0

Một lần nữa, đối với một danh sách hiểu chỉ các dấu ngoặc bên ngoài là khác nhau (dấu ngoặc vuông thay vì dấu ngoặc đơn).

Các yếu tố của đầu ra được tạo sẽ là các giá trị liên tiếp của

>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
4. Các mệnh đề
>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
5 đều là tùy chọn; Nếu có,
>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
4 chỉ được đánh giá và thêm vào kết quả khi
>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
7 là đúng.

Biểu thức của máy phát luôn phải được viết bên trong dấu ngoặc đơn, nhưng dấu ngoặc đơn báo hiệu một cuộc gọi chức năng cũng được tính. Nếu bạn muốn tạo một trình lặp sẽ được truyền ngay lập tức cho một hàm bạn có thể viết:

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
1

Các mệnh đề

>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
8 chứa các chuỗi được lặp lại. Các chuỗi không phải có cùng độ dài, bởi vì chúng được lặp lại từ trái sang phải, không song song. Đối với mỗi yếu tố trong
>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
9,
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
00 được lặp lại từ đầu.
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
01 sau đó được lặp lại cho mỗi cặp phần tử kết quả từ
>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
9 và
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
00.not in parallel. For each element in
>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
9,
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
00 is looped over from the beginning.
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
01 is then looped over for each resulting pair of elements from
>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
9 and
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
00.

Để đặt nó một cách khác, một biểu thức hiểu biết hoặc biểu thức tạo danh sách tương đương với mã Python sau:

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
2

Điều này có nghĩa là khi có nhiều mệnh đề

>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
8 nhưng không có mệnh đề
>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
5, độ dài của đầu ra kết quả sẽ bằng với sản phẩm của độ dài của tất cả các chuỗi. Nếu bạn có hai danh sách độ dài 3, danh sách đầu ra dài 9 yếu tố:

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
3

Để tránh đưa ra một sự mơ hồ vào ngữ pháp Python, nếu

>>> stripped_list = [line.strip() for line in line_list
...                  if line != ""]
4 đang tạo ra một tuple, nó phải được bao quanh với dấu ngoặc đơn. Độ hiểu hiểu danh sách đầu tiên dưới đây là lỗi cú pháp, trong khi lần thứ hai là chính xác:

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
4

Máy phát điện

Máy phát điện là một lớp đặc biệt của các chức năng đơn giản hóa nhiệm vụ viết trình lặp. Các hàm chính quy tính một giá trị và trả về nó, nhưng các trình tạo trả về một trình lặp trả về một luồng giá trị.

Bạn không nghi ngờ gì khi quen thuộc với cách các chức năng thường xuyên gọi hoạt động trong Python hoặc C. Khi bạn gọi một hàm, nó sẽ nhận được một không gian tên riêng nơi các biến cục bộ của nó được tạo. Khi hàm đạt đến câu lệnh

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
07, các biến cục bộ sẽ bị phá hủy và giá trị được trả lại cho người gọi. Một cuộc gọi sau đó đến cùng một hàm tạo ra một không gian tên riêng mới và một bộ biến cục bộ mới. Nhưng, điều gì sẽ xảy ra nếu các biến cục bộ weren vứt bỏ khi thoát ra một chức năng? Điều gì sẽ xảy ra nếu sau này bạn có thể tiếp tục chức năng nơi nó rời đi? Đây là những gì máy phát điện cung cấp; Họ có thể được coi là các chức năng có thể tiếp tục.

Ở đây, ví dụ đơn giản nhất về hàm máy phát:

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
5

Bất kỳ chức năng nào chứa từ khóa

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08 là hàm máy phát; Điều này được phát hiện bởi trình biên dịch mã byte Python, kết quả là tổng hợp hàm đặc biệt.bytecode compiler which compiles the function specially as a result.

Khi bạn gọi hàm máy phát, nó không trả về một giá trị duy nhất; Thay vào đó, nó trả về một đối tượng Trình tạo hỗ trợ giao thức Iterator. Khi thực hiện biểu thức

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08, trình tạo xuất ra giá trị của
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
10, tương tự như câu lệnh
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
07. Sự khác biệt lớn giữa tuyên bố
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08 và
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
07 là khi đạt được
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08, trạng thái thực thi của máy phát điện bị đình chỉ và các biến cục bộ được bảo tồn. Trong cuộc gọi tiếp theo đến phương thức Generator
for line in file:
    # do something for each line
    ...
5, chức năng sẽ tiếp tục thực thi.

Ở đây, một cách sử dụng mẫu của trình tạo

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
16:

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
6

Bạn cũng có thể viết

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
17 hoặc
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
18.

Bên trong hàm máy phát,

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
19 khiến
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
20 được nâng lên từ phương pháp
for line in file:
    # do something for each line
    ...
5. Khi điều này xảy ra, hoặc đáy của hàm đạt được, việc rước các giá trị kết thúc và trình tạo không thể mang lại bất kỳ giá trị nào nữa.

Bạn có thể đạt được hiệu ứng của các trình tạo theo cách thủ công bằng cách viết lớp của riêng bạn và lưu trữ tất cả các biến cục bộ của trình tạo dưới dạng các biến thể hiện. Ví dụ: trả lại danh sách các số nguyên có thể được thực hiện bằng cách đặt

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
22 thành 0 và có mức tăng phương thức
for line in file:
    # do something for each line
    ...
5
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
22 và trả về nó. Tuy nhiên, đối với một trình tạo phức tạp vừa phải, viết một lớp tương ứng có thể gây lộn xộn hơn nhiều.

Bộ thử nghiệm được bao gồm trong thư viện Python, LIB/TEST/TEST_GENERATORS.PY, chứa một số ví dụ thú vị hơn. Ở đây, một máy phát điện thực hiện một bộ phận theo thứ tự của một cây bằng cách sử dụng các máy phát điện đệ quy.

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
7

Hai ví dụ khác trong

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
25 Sản xuất các giải pháp cho vấn đề N-Queens (đặt N Queens lên bảng cờ NXN để không có nữ hoàng nào đe dọa người khác) và chuyến lưu diễn của Hiệp sĩ bất kỳ hình vuông hai lần).

Chuyển các giá trị vào một máy phát điện

Trong Python 2.4 trở lên, các máy phát điện chỉ tạo ra đầu ra. Khi mã máy phát điện được gọi để tạo một trình lặp, không có cách nào để truyền bất kỳ thông tin mới nào vào chức năng khi việc thực thi nó được nối lại. Bạn có thể cùng nhau hack khả năng này bằng cách làm cho trình tạo nhìn vào một biến toàn cầu hoặc bằng cách truyền trong một số đối tượng có thể thay đổi mà người gọi sau đó sửa đổi, nhưng các phương pháp này rất lộn xộn.

Trong Python 2.5, có một cách đơn giản để chuyển các giá trị vào một trình tạo.

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08 trở thành một biểu thức, trả về một giá trị có thể được gán cho một biến hoặc hoạt động khác trên:

Tôi khuyên bạn nên luôn đặt dấu ngoặc đơn xung quanh biểu thức

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08 khi bạn làm một cái gì đó với giá trị trả về, như trong ví dụ trên. Các dấu ngoặc đơn luôn luôn cần thiết, nhưng nó dễ dàng hơn để luôn luôn thêm chúng thay vì phải nhớ khi chúng cần thiết.always put parentheses around a
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08 expression when you’re doing something with the returned value, as in the above example. The parentheses aren’t always necessary, but it’s easier to always add them instead of having to remember when they’re needed.

. Khi có một hoạt động, như trong

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
30.)PEP 342 explains the exact rules, which are that a
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08-expression must always be parenthesized except when it occurs at the top-level expression on the right-hand side of an assignment. This means you can write
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
29 but have to use parentheses when there’s an operation, as in
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
30.)

Các giá trị được gửi vào một trình tạo bằng cách gọi phương thức

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
31 của nó. Phương thức này nối lại mã máy phát điện và biểu thức
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08 trả về giá trị được chỉ định. Nếu phương thức
for line in file:
    # do something for each line
    ...
5 thông thường được gọi,
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08 trả về
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
35.

Ở đây, một bộ đếm đơn giản tăng thêm 1 và cho phép thay đổi giá trị của bộ đếm bên trong.

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
8

Và ở đây, một ví dụ về việc thay đổi bộ đếm:

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
9

Bởi vì

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08 thường sẽ trở lại
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
35, bạn phải luôn luôn kiểm tra trường hợp này. Don Tiết chỉ sử dụng giá trị của nó trong các biểu thức trừ khi bạn chắc chắn rằng phương thức
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
38 sẽ là phương pháp duy nhất được sử dụng để tiếp tục chức năng trình tạo của bạn.

Ngoài

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
38, có hai phương thức khác trên máy phát điện:

  • for i in iter(obj):
        print(i)
    
    for i in obj:
        print(i)
    
    40 được sử dụng để tăng một ngoại lệ bên trong trình tạo; Ngoại lệ được nêu ra bởi biểu thức
    for i in iter(obj):
        print(i)
    
    for i in obj:
        print(i)
    
    08 trong đó quá trình thực hiện máy phát điện được tạm dừng.

  • for i in iter(obj):
        print(i)
    
    for i in obj:
        print(i)
    
    42 làm tăng ngoại lệ
    for i in iter(obj):
        print(i)
    
    for i in obj:
        print(i)
    
    43 bên trong trình tạo để chấm dứt lần lặp. Khi nhận được ngoại lệ này, mã máy phát điện phải tăng
    for i in iter(obj):
        print(i)
    
    for i in obj:
        print(i)
    
    43 hoặc
    for line in file:
        # do something for each line
        ...
    
    7; nắm bắt ngoại lệ và làm bất cứ điều gì khác là bất hợp pháp và sẽ kích hoạt
    for i in iter(obj):
        print(i)
    
    for i in obj:
        print(i)
    
    46.
    for i in iter(obj):
        print(i)
    
    for i in obj:
        print(i)
    
    42 cũng sẽ được gọi bởi người thu gom rác Python, khi máy phát điện được thu thập rác.

    Nếu bạn cần chạy mã dọn dẹp khi xảy ra

    for i in iter(obj):
        print(i)
    
    for i in obj:
        print(i)
    
    43, tôi khuyên bạn nên sử dụng bộ
    for i in iter(obj):
        print(i)
    
    for i in obj:
        print(i)
    
    49 thay vì bắt
    for i in iter(obj):
        print(i)
    
    for i in obj:
        print(i)
    
    43.

Hiệu ứng tích lũy của những thay đổi này là biến các máy phát điện từ các nhà sản xuất thông tin một chiều thành cả nhà sản xuất và người tiêu dùng.

Máy phát điện cũng trở thành Coroutines, một hình thức chương trình con tổng quát hơn. Các chương trình con được nhập tại một điểm và thoát tại một điểm khác (đỉnh của hàm và câu lệnh ____107), nhưng các coroutines có thể được nhập, thoát và nối lại tại nhiều điểm khác nhau (câu lệnh

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08).coroutines, a more generalized form of subroutines. Subroutines are entered at one point and exited at another point (the top of the function, and a
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
07 statement), but coroutines can be entered, exited, and resumed at many different points (the
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
08 statements).

Chức năng tích hợp sẵn¶

Hãy cùng tìm kiếm chi tiết hơn tại các chức năng tích hợp thường được sử dụng với các trình lặp.

Hai trong số các chức năng tích hợp của Python,

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
53 và
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
54 sao chép các tính năng của các biểu thức máy phát:

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
55 trả về trình lặp qua chuỗi

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
56.

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
0

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
1

Tất nhiên bạn có thể đạt được hiệu ứng tương tự với sự hiểu biết danh sách.

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
57 trả về một trình lặp lại trên tất cả các yếu tố chuỗi đáp ứng một điều kiện nhất định và được nhân đôi tương tự bởi các toàn bộ danh sách. Một vị từ là một hàm trả về giá trị sự thật của một số điều kiện; Để sử dụng với
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
54, vị ngữ phải lấy một giá trị duy nhất.predicate is a function that returns the truth value of some condition; for use with
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
54, the predicate must take a single value.

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
2

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
3

Điều này cũng có thể được viết như một danh sách hiểu danh sách:

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
4

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
59 đếm các phần tử trong 2 bộ được trả lại có chứa số lượng (từ bắt đầu) và mỗi phần tử.

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
5

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
60 thường được sử dụng khi lặp qua danh sách và ghi lại các chỉ mục mà tại đó các điều kiện nhất định được đáp ứng:

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
6

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
61 thu thập tất cả các yếu tố của IT có thể vào một danh sách, sắp xếp danh sách và trả về kết quả được sắp xếp. Các đối số chính và đảo ngược được chuyển qua phương thức Danh sách được xây dựng
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
62.

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
7

(Để thảo luận chi tiết hơn về phân loại, hãy xem cách sắp xếp cách.)Sorting HOW TO.)

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
63 và
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
64 Xây dựng nhìn vào các giá trị sự thật của một nội dung có thể lặp lại.
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
65 trả về
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
66 Nếu bất kỳ phần tử nào trong ITBER có thể là một giá trị thực và
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
67 trả về
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
66 nếu tất cả các phần tử là giá trị thực:

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
8

A

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
9

Nó không xây dựng một danh sách trong bộ nhớ và làm cạn kiệt tất cả các trình lặp đầu vào trước khi quay lại; Thay vào đó, các bộ dữ liệu được xây dựng và trả lại chỉ khi chúng được yêu cầu. (Thuật ngữ kỹ thuật cho hành vi này là đánh giá lười biếng.)

Trình lặp này được dự định sẽ được sử dụng với các vòng lặp có cùng độ dài. Nếu các vòng lặp có độ dài khác nhau, luồng kết quả sẽ có cùng chiều dài với độ ngắn nhất có thể đi được.

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
0

Tuy nhiên, bạn nên tránh làm điều này bởi vì một yếu tố có thể được lấy từ các trình lặp dài hơn và bị loại bỏ. Điều này có nghĩa là bạn có thể tiếp tục sử dụng các trình lặp hơn nữa vì bạn có nguy cơ bỏ qua một yếu tố bị loại bỏ.

Mô -đun itertools

Mô -đun

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
9 chứa một số trình lặp thường được sử dụng cũng như các chức năng để kết hợp một số trình lặp. Phần này sẽ giới thiệu nội dung mô -đun bằng cách hiển thị các ví dụ nhỏ.

Các chức năng của mô -đun rơi vào một vài lớp rộng:

  • Các chức năng tạo ra một trình lặp mới dựa trên một trình lặp hiện có.

  • Các chức năng để xử lý các yếu tố Iterator là đối số chức năng.

  • Các chức năng để chọn các phần của đầu ra Iterator.

  • Một chức năng để nhóm một đầu ra của iterator.

Tạo trình lặp mới

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
71 trả về một luồng vô hạn có các giá trị cách đều nhau. Bạn có thể tùy chọn cung cấp số bắt đầu, mặc định là 0 và khoảng thời gian giữa các số, mặc định là 1:

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
1

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
72 lưu một bản sao nội dung của một thứ được cung cấp và trả về một trình lặp mới trả về các yếu tố của nó từ đầu đến cuối. Trình lặp mới sẽ lặp lại các yếu tố này vô hạn.

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
2

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
73 Trả về phần tử được cung cấp n lần hoặc trả về phần tử vô tận nếu N không được cung cấp.

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
3

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
74 lấy một số lần lặp tùy ý làm đầu vào và trả về tất cả các phần tử của trình lặp đầu tiên, sau đó tất cả các phần tử của phần thứ hai, v.v. cho đến khi tất cả các vòng lặp đã bị cạn kiệt.

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
4

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
75 trả về một luồng mà một lát cắt của trình lặp. Với một đối số dừng duy nhất, nó sẽ trả về các yếu tố dừng đầu tiên. Nếu bạn cung cấp một chỉ mục bắt đầu, bạn sẽ nhận được các yếu tố dừng dừng và nếu bạn cung cấp giá trị cho bước, các phần tử sẽ bị bỏ qua. Không giống như chuỗi Python và cắt danh sách, bạn có thể sử dụng các giá trị âm để bắt đầu, dừng hoặc bước.

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
5

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
76 sao chép một trình lặp; Nó trả về n vòng lặp độc lập, tất cả sẽ trả về nội dung của trình lặp nguồn. Nếu bạn không cung cấp giá trị cho n, mặc định là 2. Tái tạo các trình lặp lại yêu cầu lưu một số nội dung của trình lặp nguồn những người khác.

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
6

Gọi chức năng trên các yếu tố

Mô -đun

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
77 chứa một tập hợp các chức năng tương ứng với các toán tử Python. Một số ví dụ là
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
78 (thêm hai giá trị),
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
79 (giống như
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
80) và
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
81 (trả về một cuộc gọi có thể gọi được lấy thuộc tính
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
82).

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
83 Giả sử rằng ITBER có thể trả lại một luồng các bộ dữ liệu và gọi func bằng cách sử dụng các bộ dữ liệu này làm đối số:

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
7

Chọn các yếu tố

Một nhóm các chức năng khác chọn một tập hợp con của các phần tử Iterator dựa trên vị ngữ.

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
84 là trái ngược với
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
54, trả về tất cả các yếu tố mà vị ngữ trả về sai:

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
8

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
86 trả về các phần tử miễn là vị ngữ trả về đúng. Khi vị ngữ trả về sai, trình lặp sẽ báo hiệu kết thúc kết quả của nó.

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> a, b, c = iterator
>>> a, b, c
(1, 2, 3)
9

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
87 loại bỏ các yếu tố trong khi vị ngữ trả về đúng, và sau đó trả về phần còn lại của kết quả có thể lặp lại.

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
...     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
0

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
88 lấy hai trình lặp và chỉ trả về các phần tử dữ liệu mà phần tử tương ứng của bộ chọn là đúng, dừng lại bất cứ khi nào một trong hai lần cạn kiệt:

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
...     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
1

Chức năng tổ hợp

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
89 trả về một trình lặp lại cho tất cả các kết hợp R-Tuple có thể có của các yếu tố có trong ITable.

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
...     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
2

Các yếu tố trong mỗi tuple vẫn theo cùng một thứ tự như có thể trả lại chúng. Ví dụ, số 1 luôn luôn là trước 2, 3, 4 hoặc 5 trong các ví dụ trên. Một chức năng tương tự,

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
90, loại bỏ ràng buộc này theo thứ tự, trả lại tất cả các sắp xếp có thể có độ dài r:

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
...     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
3

Nếu bạn không cung cấp một giá trị cho r, độ dài của điều đó được sử dụng, có nghĩa là tất cả các yếu tố đều được hoán vị.

Lưu ý rằng các chức năng này tạo ra tất cả các kết hợp có thể có theo vị trí và don lồng yêu cầu rằng nội dung của có thể lặp lại là duy nhất:

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
...     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
4

Tuple giống hệt nhau

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
91 xảy ra hai lần, nhưng hai chuỗi ’A A đến từ các vị trí khác nhau.

Hàm

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
92 giúp thư giãn một ràng buộc khác: các phần tử có thể được lặp lại trong một tuple. Về mặt khái niệm, một phần tử được chọn cho vị trí đầu tiên của mỗi tuple và sau đó được thay thế trước khi phần tử thứ hai được chọn.

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
...     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
5

Nhóm các yếu tố

Chức năng cuối cùng mà tôi sẽ thảo luận,

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
93, là phức tạp nhất.
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
94 là một hàm có thể tính toán giá trị khóa cho mỗi phần tử được trả về bởi ITEBELBER. Nếu bạn không cung cấp một chức năng chính, khóa đơn giản là mỗi phần tử.

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
95 thu thập tất cả các yếu tố liên tiếp từ các IT có thể có cùng giá trị chính và trả về một luồng 2 bộ chứa có giá trị khóa và trình lặp cho các phần tử có khóa đó.

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
...     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
6

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
95 giả định rằng nội dung có thể lặp lại cơ bản sẽ được sắp xếp dựa trên khóa. Lưu ý rằng các trình lặp được trả về cũng sử dụng các điều chỉnh cơ bản, vì vậy bạn phải tiêu thụ kết quả của Iterator-1 trước khi yêu cầu Iterator-2 và khóa tương ứng của nó.

Mô -đun functools

Mô-đun

for line in file:
    # do something for each line
    ...
0 chứa một số hàm bậc cao hơn. Hàm bậc cao hơn có một hoặc nhiều chức năng làm đầu vào và trả về một hàm mới. Công cụ hữu ích nhất trong mô -đun này là hàm
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
98.higher-order function takes one or more functions as input and returns a new function. The most useful tool in this module is the
for i in iter(obj):
    print(i)

for i in obj:
    print(i)
98 function.

Đối với các chương trình được viết theo kiểu chức năng, đôi khi bạn muốn xây dựng các biến thể của các chức năng hiện có có một số tham số được điền. Hãy xem xét hàm Python

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
99; Bạn có thể muốn tạo một chức năng mới
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
00 tương đương với
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
01; Bạn có thể điền vào một giá trị cho một trong các tham số ____ 202. Đây được gọi là ứng dụng chức năng một phần của người Viking.

Chất xây dựng cho

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
03 lấy các đối số
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
04. Đối tượng kết quả có thể gọi được, vì vậy bạn chỉ có thể gọi nó để gọi
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
05 với các đối số đầy.

Ở đây, một ví dụ nhỏ nhưng thực tế:

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
...     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
7

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
06 tích lũy thực hiện một hoạt động trên tất cả các yếu tố khác nhau và do đó, có thể được áp dụng cho các vòng lặp vô hạn. Func phải là một hàm có hai phần tử và trả về một giá trị duy nhất.
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
07 lấy hai yếu tố đầu tiên A và B được trình lặp lại và tính toán
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
08. Sau đó, nó yêu cầu phần tử thứ ba, c, tính toán
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
09, kết hợp kết quả này với phần tử thứ tư được trả về và tiếp tục cho đến khi có thể hết được hết. Nếu có thể trả về không có giá trị nào cả, ngoại lệ
for line in file:
    # do something for each line
    ...
9 sẽ được nâng lên. Nếu giá trị ban đầu được cung cấp, nó được sử dụng làm điểm bắt đầu và
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
11 là tính toán đầu tiên.

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
...     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
8

Nếu bạn sử dụng

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
12 với
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
07, bạn sẽ thêm tất cả các yếu tố của điều đó. Trường hợp này phổ biến đến mức có một tích hợp đặc biệt có tên là
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
14 để tính toán nó:

>>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
>>> for key in m:
...     print(key, m[key])
Jan 1
Feb 2
Mar 3
Apr 4
May 5
Jun 6
Jul 7
Aug 8
Sep 9
Oct 10
Nov 11
Dec 12
9

Tuy nhiên, đối với nhiều cách sử dụng của

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
07, có thể rõ ràng hơn khi viết vòng lặp
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
0 rõ ràng:

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
0

Một chức năng liên quan là

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
17. Nó thực hiện cùng một tính toán, nhưng thay vì chỉ trả về kết quả cuối cùng,
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
18 trả về một trình lặp cũng mang lại cho mỗi kết quả một phần:

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
1

Mô -đun vận hành

Mô -đun

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
77 đã được đề cập trước đó. Nó chứa một tập hợp các chức năng tương ứng với các toán tử Python. Các chức năng này thường hữu ích trong mã kiểu chức năng vì chúng cứu bạn khỏi việc viết các chức năng tầm thường thực hiện một thao tác duy nhất.

Một số chức năng trong mô -đun này là:

  • Hoạt động toán học:

    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    20,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    21,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    22,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    23,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    24,

  • Hoạt động logic:

    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    25,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    26.

  • Hoạt động bitwise:

    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    27,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    28,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    29.

  • So sánh:

    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    30,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    31,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    32,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    33,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    34 và
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    35.

  • Nhận dạng đối tượng:

    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    36,
    >>> L = [1, 2, 3]
    >>> iterator = iter(L)
    >>> t = tuple(iterator)
    >>> t
    (1, 2, 3)
    
    37.

Tham khảo tài liệu mô -đun của nhà điều hành để biết danh sách đầy đủ.

Các chức năng nhỏ và biểu thức Lambda

Khi viết các chương trình theo phong cách chức năng, bạn sẽ thường cần các chức năng nhỏ hoạt động như các vị ngữ hoặc kết hợp các yếu tố theo một cách nào đó.

Nếu có một python tích hợp hoặc một hàm mô-đun phù hợp, bạn không cần phải xác định một chức năng mới: tất cả:

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
2

Nếu chức năng bạn cần không tồn tại, bạn cần phải viết nó. Một cách để viết các chức năng nhỏ là sử dụng biểu thức

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
38.
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
38 lấy một số tham số và biểu thức kết hợp các tham số này và tạo ra một hàm ẩn danh trả về giá trị của biểu thức:

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
3

Một giải pháp thay thế là chỉ sử dụng câu lệnh

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
40 và xác định một hàm theo cách thông thường:

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
4

Thay thế nào là thích hợp hơn? Đó là một câu hỏi về phong cách; Khóa học thông thường của tôi là tránh sử dụng

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
38.

Một lý do cho sở thích của tôi là

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
38 khá hạn chế trong các chức năng mà nó có thể xác định. Kết quả phải được tính toán như một biểu thức duy nhất, điều đó có nghĩa là bạn có thể có các so sánh đa đường
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
43 hoặc các câu lệnh
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
44. Nếu bạn cố gắng làm quá nhiều trong một tuyên bố
>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
38, bạn sẽ kết thúc với một biểu thức quá phức tạp mà khó có thể đọc được. Nhanh chóng, những gì mà mã sau đây làm?

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
5

Bạn có thể tìm ra nó, nhưng cần có thời gian để giải quyết biểu thức để tìm ra những gì đang diễn ra. Sử dụng các câu lệnh

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
40 ngắn làm cho mọi thứ tốt hơn một chút:

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
6

Nhưng sẽ là tốt nhất nếu tôi chỉ đơn giản là sử dụng vòng lặp

>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
0:

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
7

Hoặc

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
14 tích hợp và biểu thức máy phát:

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
8

Nhiều cách sử dụng của

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
07 rõ ràng hơn khi được viết dưới dạng các vòng
>>> S = {2, 3, 5, 7, 11, 13}
>>> for i in S:
...     print(i)
2
3
5
7
11
13
0.

Fredrik Lundh đã từng đề xuất bộ quy tắc sau để tái cấu trúc sử dụng

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
38:

  1. Viết một hàm Lambda.

  2. Viết một bình luận giải thích những gì cái quái mà Lambda làm.

  3. Nghiên cứu nhận xét trong một thời gian, và nghĩ về một cái tên nắm bắt được bản chất của nhận xét.

  4. Chuyển đổi Lambda thành một câu lệnh DEF, sử dụng tên đó.

  5. Loại bỏ nhận xét.

Tôi thực sự thích những quy tắc này, nhưng bạn có thể tự do không đồng ý về việc phong cách không có Lambda này có tốt hơn hay không.

Sửa đổi Lịch sử và Lời cảm ơn

Tác giả muốn cảm ơn những người sau đây đã đưa ra đề xuất, sửa chữa và hỗ trợ với các bản nháp khác nhau của bài viết này: Ian Bicking, Nick Coghlan, Nick Efford, Raymond Hettinger, Jim Jewett, Mike Krell, Leandro Lameiro, Jussi Salmela, Collin Winter, Blake Winton.

Phiên bản 0.1: Đăng ngày 30 tháng 6 năm 2006.

Phiên bản 0.11: Đăng ngày 1 tháng 7 năm 2006. Sửa lỗi đánh máy.

Phiên bản 0.2: Được đăng ngày 10 tháng 7 năm 2006. Các phần GenExp và ListComp hợp nhất thành một. Sửa lỗi đánh máy.

Phiên bản 0.21: Đã thêm nhiều tài liệu tham khảo được đề xuất trong danh sách gửi thư gia sư.

Phiên bản 0.30: Thêm một phần trên mô -đun

>>> L = [1, 2, 3]
>>> iterator = iter(L)
>>> t = tuple(iterator)
>>> t
(1, 2, 3)
52 được viết bởi Collin Winter; thêm phần ngắn trên mô -đun toán tử; Một vài chỉnh sửa khác.

Người giới thiệu¶

Chung¶

Cấu trúc và giải thích các chương trình máy tính, của Harold Abelson và Gerald Jay Sussman với Julie Sussman. Toàn văn tại https://mitpress.mit.edu/sicp/. Trong sách giáo khoa cổ điển về khoa học máy tính, Chương 2 và 3 thảo luận về việc sử dụng các chuỗi và luồng để tổ chức luồng dữ liệu bên trong một chương trình. Cuốn sách sử dụng sơ đồ cho các ví dụ của nó, nhưng nhiều phương pháp thiết kế được mô tả trong các chương này có thể áp dụng cho mã Python kiểu chức năng., by Harold Abelson and Gerald Jay Sussman with Julie Sussman. Full text at https://mitpress.mit.edu/sicp/. In this classic textbook of computer science, chapters 2 and 3 discuss the use of sequences and streams to organize the data flow inside a program. The book uses Scheme for its examples, but many of the design approaches described in these chapters are applicable to functional-style Python code.

https://www.defmacro.org/ramblings/fp.html: Giới thiệu chung về lập trình chức năng sử dụng các ví dụ Java và có phần giới thiệu lịch sử dài.

https://en.wikipedia.org/wiki/fectional_programming: Nhập Wikipedia chung mô tả lập trình chức năng.

https://en.wikipedia.org/wiki/coroutine: Entry for Coroutines.

https://en.wikipedia.org/wiki/currying: Nhập cảnh cho khái niệm cà ri.

Đặc thù của Python

https://gnosis.cx/tpip/: Chương đầu tiên của việc xử lý văn bản sách David Mertz, trong Python thảo luận về lập trình chức năng để xử lý văn bản, trong phần có tiêu đề sử dụng các chức năng bậc cao hơn trong xử lý văn bản.

Mertz cũng đã viết một loạt các bài viết 3 phần về lập trình chức năng cho trang web của IBM, phát triển của IBM; Xem Phần 1, Phần 2 và Phần 3,

Tài liệu Python

Tài liệu cho mô -đun

>>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
>>> dict(iter(L))
{'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
9.

Tài liệu cho mô -đun

for line in file:
    # do something for each line
    ...
0.

Tài liệu cho mô -đun

for i in iter(obj):
    print(i)

for i in obj:
    print(i)
77.

PEP 289: Biểu thức của máy phát điện: “Generator Expressions”

PEP 342: Các coroutines thông qua các trình tạo nâng cao, mô tả các tính năng máy phát mới trong Python 2.5.: “Coroutines via Enhanced Generators” describes the new generator features in Python 2.5.

Python là một chức năng hay OOP?

Python là một ngôn ngữ lập trình tuyệt vời cho phép bạn sử dụng cả các mô hình lập trình chức năng và hướng đối tượng. Các lập trình viên Python sẽ có thể sử dụng các khái niệm lập trình hướng đối tượng cơ bản, cho dù họ là nhà phát triển phần mềm, kỹ sư máy học hay thứ gì khác.allows you to use both functional and object-oriented programming paradigms. Python programmers should be able to use fundamental object-oriented programming concepts, whether they are software developers, machine learning engineers, or something else.

Python có hỗ trợ lập trình có cấu trúc không?

Python là một ngôn ngữ lập trình đa mô hình.Lập trình hướng đối tượng và lập trình có cấu trúc được hỗ trợ đầy đủ, và nhiều tính năng của chúng hỗ trợ lập trình chức năng và lập trình theo định hướng khía cạnh (bao gồm metaprogramming và metaobjects).Object-oriented programming and structured programming are fully supported, and many of their features support functional programming and aspect-oriented programming (including metaprogramming and metaobjects).

Tại sao Python không hoạt động?

Nó không sử dụng dữ liệu bất biến nhiều (không thực sự có thể xác định các loại bất biến trong Python thuần túy, hầu hết các bộ sưu tập đều có thể thay đổi và các loại không được thiết kế để cập nhật chức năng) Mô hình thực thi của nó là rất bắt buộc.Nó có hỗ trợ hạn chế cho lập trình song song. (it's not really possible to define immutable types in pure python, most of the collections are mutable, and the ones which are not are not designed for functional updates) its execution model is very imperative. it has limited support for parallel programming.

Python là một ngôn ngữ chức năng hay thủ tục?

Python là cả về thủ tục và có các tính năng hướng đối tượng, cũng như một số khía cạnh của lập trình chức năng.both procedural and have object-oriented features, as well as some aspects of functional programming.