Cách bắt đầu lại vòng lặp trong Python

Bạn sẽ bắt đầu bằng việc so sánh một số mô hình khác nhau được các ngôn ngữ lập trình sử dụng để triển khai phép lặp xác định

  • Sau đó, bạn sẽ tìm hiểu về iterables và iterators, hai khái niệm tạo thành nền tảng của phép lặp xác định trong Python

  • Cuối cùng, bạn sẽ liên kết tất cả lại với nhau và tìm hiểu về vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 của Python

  • Tải xuống miễn phí. Nhận một chương mẫu từ Thủ thuật Python. Cuốn sách chỉ cho bạn các phương pháp hay nhất về Python với các ví dụ đơn giản mà bạn có thể áp dụng ngay lập tức để viết mã Pythonic + đẹp hơn

    Khảo sát về phép lặp xác định trong lập trình

    Các vòng lặp xác định thường được gọi là vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 vì
    for <var> in <iterable>:
        <statement(s)>
    
    0 là từ khóa được sử dụng để giới thiệu chúng trong hầu hết các ngôn ngữ lập trình, bao gồm cả Python

    Trong lịch sử, các ngôn ngữ lập trình đã cung cấp một số loại vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0. Chúng được mô tả ngắn gọn trong các phần sau

    Loại bỏ các quảng cáo

    Vòng lặp phạm vi số

    Vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 cơ bản nhất là một câu lệnh phạm vi số đơn giản với các giá trị bắt đầu và kết thúc. Định dạng chính xác khác nhau tùy thuộc vào ngôn ngữ nhưng thường trông giống như thế này

    for i = 1 to 10
        <loop body>
    

    Ở đây, phần thân của vòng lặp được thực hiện mười lần. Biến

    for <var> in <iterable>:
        <statement(s)>
    
    7 nhận giá trị
    for <var> in <iterable>:
        <statement(s)>
    
    8 trong lần lặp đầu tiên,
    for <var> in <iterable>:
        <statement(s)>
    
    9 trong lần lặp thứ hai, v.v. Loại vòng lặp
    for <var> in <iterable>:
        <statement(s)>
    
    0 này được sử dụng trong các ngôn ngữ BASIC, Algol và Pascal

    Vòng lặp ba biểu thức

    Một dạng khác của vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 được phổ biến bởi ngôn ngữ lập trình C có ba phần

    • Một khởi tạo
    • Một biểu thức xác định một điều kiện kết thúc
    • Một hành động được thực hiện ở cuối mỗi lần lặp

    Loại vòng lặp này có dạng như sau

    for (i = 1; i <= 10; i++)
        <loop body>
    

    Lưu ý kỹ thuật. Trong ngôn ngữ lập trình C,

    >>> a = ['foo', 'bar', 'baz']
    >>> for i in a:
    ..     print(i)
    ...
    foo
    bar
    baz
    
    2 tăng biến
    for <var> in <iterable>:
        <statement(s)>
    
    7. Nó gần tương đương với
    >>> a = ['foo', 'bar', 'baz']
    >>> for i in a:
    ..     print(i)
    ...
    foo
    bar
    baz
    
    4 trong Python

    Vòng lặp này được hiểu như sau

    • Khởi tạo
      for <var> in <iterable>:
          <statement(s)>
      
      7 thành
      for <var> in <iterable>:
          <statement(s)>
      
      8
    • Tiếp tục lặp miễn là
      >>> a = ['foo', 'bar', 'baz']
      >>> for i in a:
      ..     print(i)
      ...
      foo
      bar
      baz
      
      7
    • Tăng
      for <var> in <iterable>:
          <statement(s)>
      
      7 lên
      for <var> in <iterable>:
          <statement(s)>
      
      8 sau mỗi lần lặp vòng lặp

    Các vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 ba biểu thức rất phổ biến vì các biểu thức được chỉ định cho ba phần có thể gần như bất kỳ thứ gì, vì vậy điều này linh hoạt hơn một chút so với dạng phạm vi số đơn giản hơn được hiển thị ở trên. Các vòng lặp
    for <var> in <iterable>:
        <statement(s)>
    
    0 này cũng có trong các ngôn ngữ C++, Java, PHP và Perl

    Vòng lặp dựa trên bộ sưu tập hoặc dựa trên Iterator

    Loại vòng lặp này lặp qua một tập hợp các đối tượng, thay vì chỉ định các giá trị hoặc điều kiện số

    for i in <collection>
        <loop body>
    

    Mỗi lần qua vòng lặp, biến

    for <var> in <iterable>:
        <statement(s)>
    
    7 nhận giá trị của đối tượng tiếp theo trong
    >>> iter('foobar')                             # String
    
    
    >>> iter(['foo', 'bar', 'baz'])                # List
    
    
    >>> iter(('foo', 'bar', 'baz'))                # Tuple
    
    
    >>> iter({'foo', 'bar', 'baz'})                # Set
    
    
    >>> iter({'foo': 1, 'bar': 2, 'baz': 3})       # Dict
    
    
    3. Loại vòng lặp
    for <var> in <iterable>:
        <statement(s)>
    
    0 này được cho là khái quát và trừu tượng nhất. Perl và PHP cũng hỗ trợ loại vòng lặp này, nhưng nó được giới thiệu bởi từ khóa
    >>> iter('foobar')                             # String
    
    
    >>> iter(['foo', 'bar', 'baz'])                # List
    
    
    >>> iter(('foo', 'bar', 'baz'))                # Tuple
    
    
    >>> iter({'foo', 'bar', 'baz'})                # Set
    
    
    >>> iter({'foo': 1, 'bar': 2, 'baz': 3})       # Dict
    
    
    5 thay vì
    for <var> in <iterable>:
        <statement(s)>
    
    0

    Đọc thêm. Xem trang Wikipedia vòng lặp For để có cái nhìn sâu hơn về việc triển khai phép lặp xác định trên các ngôn ngữ lập trình

    Vòng lặp for in : 0 của Python

    Trong số các loại vòng lặp được liệt kê ở trên, Python chỉ thực hiện vòng lặp cuối cùng. lặp lại dựa trên bộ sưu tập. Thoạt nhìn, điều đó có vẻ giống như một thỏa thuận thô sơ, nhưng hãy yên tâm rằng việc triển khai phép lặp xác định của Python rất linh hoạt nên cuối cùng bạn sẽ không cảm thấy bị lừa

    Trong thời gian ngắn, bạn sẽ tìm hiểu chi tiết về vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 của Python. Nhưng bây giờ, hãy bắt đầu với một nguyên mẫu và ví dụ nhanh, chỉ để làm quen

    Vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 của Python trông như thế này

    for <var> in <iterable>:
        <statement(s)>
    

    >>> iter(42)                                   # Integer
    Traceback (most recent call last):
      File "", line 1, in 
        iter(42)
    TypeError: 'int' object is not iterable
    
    >>> iter(3.1)                                  # Float
    Traceback (most recent call last):
      File "", line 1, in 
        iter(3.1)
    TypeError: 'float' object is not iterable
    
    >>> iter(len)                                  # Built-in function
    Traceback (most recent call last):
      File "", line 1, in 
        iter(len)
    TypeError: 'builtin_function_or_method' object is not iterable
    
    0 là một tập hợp các đối tượng—ví dụ: danh sách hoặc bộ.
    >>> iter(42)                                   # Integer
    Traceback (most recent call last):
      File "", line 1, in 
        iter(42)
    TypeError: 'int' object is not iterable
    
    >>> iter(3.1)                                  # Float
    Traceback (most recent call last):
      File "", line 1, in 
        iter(3.1)
    TypeError: 'float' object is not iterable
    
    >>> iter(len)                                  # Built-in function
    Traceback (most recent call last):
      File "", line 1, in 
        iter(len)
    TypeError: 'builtin_function_or_method' object is not iterable
    
    1 trong thân vòng lặp được biểu thị bằng dấu thụt đầu dòng, như với tất cả các cấu trúc điều khiển Python và được thực thi một lần cho mỗi mục trong
    >>> iter(42)                                   # Integer
    Traceback (most recent call last):
      File "", line 1, in 
        iter(42)
    TypeError: 'int' object is not iterable
    
    >>> iter(3.1)                                  # Float
    Traceback (most recent call last):
      File "", line 1, in 
        iter(3.1)
    TypeError: 'float' object is not iterable
    
    >>> iter(len)                                  # Built-in function
    Traceback (most recent call last):
      File "", line 1, in 
        iter(len)
    TypeError: 'builtin_function_or_method' object is not iterable
    
    0. Biến vòng lặp
    >>> iter(42)                                   # Integer
    Traceback (most recent call last):
      File "", line 1, in 
        iter(42)
    TypeError: 'int' object is not iterable
    
    >>> iter(3.1)                                  # Float
    Traceback (most recent call last):
      File "", line 1, in 
        iter(3.1)
    TypeError: 'float' object is not iterable
    
    >>> iter(len)                                  # Built-in function
    Traceback (most recent call last):
      File "", line 1, in 
        iter(len)
    TypeError: 'builtin_function_or_method' object is not iterable
    
    3 nhận giá trị của phần tử tiếp theo trong
    >>> iter(42)                                   # Integer
    Traceback (most recent call last):
      File "", line 1, in 
        iter(42)
    TypeError: 'int' object is not iterable
    
    >>> iter(3.1)                                  # Float
    Traceback (most recent call last):
      File "", line 1, in 
        iter(3.1)
    TypeError: 'float' object is not iterable
    
    >>> iter(len)                                  # Built-in function
    Traceback (most recent call last):
      File "", line 1, in 
        iter(len)
    TypeError: 'builtin_function_or_method' object is not iterable
    
    0 mỗi lần qua vòng lặp

    Đây là một ví dụ đại diện

    >>>

    >>> a = ['foo', 'bar', 'baz']
    >>> for i in a:
    ..     print(i)
    ...
    foo
    bar
    baz
    

    Trong ví dụ này,

    >>> iter(42)                                   # Integer
    Traceback (most recent call last):
      File "", line 1, in 
        iter(42)
    TypeError: 'int' object is not iterable
    
    >>> iter(3.1)                                  # Float
    Traceback (most recent call last):
      File "", line 1, in 
        iter(3.1)
    TypeError: 'float' object is not iterable
    
    >>> iter(len)                                  # Built-in function
    Traceback (most recent call last):
      File "", line 1, in 
        iter(len)
    TypeError: 'builtin_function_or_method' object is not iterable
    
    0 là danh sách
    >>> iter(42)                                   # Integer
    Traceback (most recent call last):
      File "", line 1, in 
        iter(42)
    TypeError: 'int' object is not iterable
    
    >>> iter(3.1)                                  # Float
    Traceback (most recent call last):
      File "", line 1, in 
        iter(3.1)
    TypeError: 'float' object is not iterable
    
    >>> iter(len)                                  # Built-in function
    Traceback (most recent call last):
      File "", line 1, in 
        iter(len)
    TypeError: 'builtin_function_or_method' object is not iterable
    
    6 và
    >>> iter(42)                                   # Integer
    Traceback (most recent call last):
      File "", line 1, in 
        iter(42)
    TypeError: 'int' object is not iterable
    
    >>> iter(3.1)                                  # Float
    Traceback (most recent call last):
      File "", line 1, in 
        iter(3.1)
    TypeError: 'float' object is not iterable
    
    >>> iter(len)                                  # Built-in function
    Traceback (most recent call last):
      File "", line 1, in 
        iter(len)
    TypeError: 'builtin_function_or_method' object is not iterable
    
    3 là biến
    for <var> in <iterable>:
        <statement(s)>
    
    7. Mỗi lần qua vòng lặp,
    for <var> in <iterable>:
        <statement(s)>
    
    7 nhận một mục liên tiếp trong
    >>> iter(42)                                   # Integer
    Traceback (most recent call last):
      File "", line 1, in 
        iter(42)
    TypeError: 'int' object is not iterable
    
    >>> iter(3.1)                                  # Float
    Traceback (most recent call last):
      File "", line 1, in 
        iter(3.1)
    TypeError: 'float' object is not iterable
    
    >>> iter(len)                                  # Built-in function
    Traceback (most recent call last):
      File "", line 1, in 
        iter(len)
    TypeError: 'builtin_function_or_method' object is not iterable
    
    6, do đó,
    >>> a = ['foo', 'bar', 'baz']
    
    >>> itr = iter(a)
    >>> itr
    
    
    >>> next(itr)
    'foo'
    >>> next(itr)
    'bar'
    >>> next(itr)
    'baz'
    
    1 hiển thị các giá trị lần lượt là
    >>> a = ['foo', 'bar', 'baz']
    
    >>> itr = iter(a)
    >>> itr
    
    
    >>> next(itr)
    'foo'
    >>> next(itr)
    'bar'
    >>> next(itr)
    'baz'
    
    2,
    >>> a = ['foo', 'bar', 'baz']
    
    >>> itr = iter(a)
    >>> itr
    
    
    >>> next(itr)
    'foo'
    >>> next(itr)
    'bar'
    >>> next(itr)
    'baz'
    
    3 và
    >>> a = ['foo', 'bar', 'baz']
    
    >>> itr = iter(a)
    >>> itr
    
    
    >>> next(itr)
    'foo'
    >>> next(itr)
    'bar'
    >>> next(itr)
    'baz'
    
    4. Một vòng lặp
    for <var> in <iterable>:
        <statement(s)>
    
    0 như thế này là cách Pythonic để xử lý các mục trong một lần lặp

    Nhưng chính xác thì iterable là gì?

    Loại bỏ các quảng cáo

    Iterables

    Trong Python, iterable có nghĩa là một đối tượng có thể được sử dụng trong phép lặp. Thuật ngữ này được sử dụng như

    • Một tính từ. Một đối tượng có thể được mô tả là có thể lặp lại
    • Một danh từ. Một đối tượng có thể được đặc trưng như một iterable

    Nếu một đối tượng có thể lặp lại, nó có thể được chuyển đến hàm Python tích hợp sẵn

    >>> a = ['foo', 'bar', 'baz']
    
    >>> itr = iter(a)
    >>> itr
    
    
    >>> next(itr)
    'foo'
    >>> next(itr)
    'bar'
    >>> next(itr)
    'baz'
    
    7, hàm này trả về một thứ gọi là trình lặp. Có, thuật ngữ hơi lặp lại. Cố lên. Cuối cùng thì tất cả cũng thành công

    Mỗi đối tượng trong ví dụ sau là một iterable và trả về một số loại iterator khi được chuyển đến

    >>> a = ['foo', 'bar', 'baz']
    
    >>> itr = iter(a)
    >>> itr
    
    
    >>> next(itr)
    'foo'
    >>> next(itr)
    'bar'
    >>> next(itr)
    'baz'
    
    7

    >>>

    >>> iter('foobar')                             # String
    
    
    >>> iter(['foo', 'bar', 'baz'])                # List
    
    
    >>> iter(('foo', 'bar', 'baz'))                # Tuple
    
    
    >>> iter({'foo', 'bar', 'baz'})                # Set
    
    
    >>> iter({'foo': 1, 'bar': 2, 'baz': 3})       # Dict
    
    

    Mặt khác, các loại đối tượng này không thể lặp lại

    >>>

    >>> iter(42)                                   # Integer
    Traceback (most recent call last):
      File "", line 1, in 
        iter(42)
    TypeError: 'int' object is not iterable
    
    >>> iter(3.1)                                  # Float
    Traceback (most recent call last):
      File "", line 1, in 
        iter(3.1)
    TypeError: 'float' object is not iterable
    
    >>> iter(len)                                  # Built-in function
    Traceback (most recent call last):
      File "", line 1, in 
        iter(len)
    TypeError: 'builtin_function_or_method' object is not iterable
    

    Tất cả các loại dữ liệu bạn đã gặp cho đến nay là loại bộ sưu tập hoặc bộ chứa đều có thể lặp lại. Chúng bao gồm chuỗi, , , dict, set và các loại

    Nhưng đây không phải là những kiểu duy nhất mà bạn có thể lặp lại. Nhiều đối tượng được tích hợp vào Python hoặc được định nghĩa trong các mô-đun được thiết kế để có thể lặp lại. Ví dụ: các tệp đang mở trong Python có thể lặp lại. Như bạn sẽ sớm thấy trong phần hướng dẫn về tệp I/O, việc lặp qua một đối tượng tệp đang mở sẽ đọc dữ liệu từ tệp

    Trên thực tế, hầu hết mọi đối tượng trong Python đều có thể được lặp lại. Ngay cả các đối tượng do người dùng định nghĩa cũng có thể được thiết kế theo cách mà chúng có thể được lặp đi lặp lại. (Bạn sẽ tìm hiểu cách thực hiện điều đó trong bài viết sắp tới về lập trình hướng đối tượng. )

    vòng lặp

    Được rồi, bây giờ bạn đã biết ý nghĩa của việc một đối tượng có thể lặp lại và bạn biết cách sử dụng

    >>> a = ['foo', 'bar', 'baz']
    
    >>> itr = iter(a)
    >>> itr
    
    
    >>> next(itr)
    'foo'
    >>> next(itr)
    'bar'
    >>> next(itr)
    'baz'
    
    7 để lấy một trình vòng lặp từ đối tượng đó. Khi bạn đã có một iterator, bạn có thể làm gì với nó?

    Trình lặp về cơ bản là trình tạo giá trị tạo ra các giá trị liên tiếp từ đối tượng có thể lặp được liên kết của nó. Hàm tích hợp

    >>> next(itr)
    Traceback (most recent call last):
      File "", line 1, in 
        next(itr)
    StopIteration
    
    0 được sử dụng để lấy giá trị tiếp theo từ trong iterator

    Đây là một ví dụ sử dụng cùng một danh sách như trên

    >>>

    >>> a = ['foo', 'bar', 'baz']
    
    >>> itr = iter(a)
    >>> itr
    
    
    >>> next(itr)
    'foo'
    >>> next(itr)
    'bar'
    >>> next(itr)
    'baz'
    

    Trong ví dụ này,

    >>> iter(42)                                   # Integer
    Traceback (most recent call last):
      File "", line 1, in 
        iter(42)
    TypeError: 'int' object is not iterable
    
    >>> iter(3.1)                                  # Float
    Traceback (most recent call last):
      File "", line 1, in 
        iter(3.1)
    TypeError: 'float' object is not iterable
    
    >>> iter(len)                                  # Built-in function
    Traceback (most recent call last):
      File "", line 1, in 
        iter(len)
    TypeError: 'builtin_function_or_method' object is not iterable
    
    6 là một danh sách có thể lặp lại và
    >>> next(itr)
    Traceback (most recent call last):
      File "", line 1, in 
        next(itr)
    StopIteration
    
    2 là trình vòng lặp được liên kết, thu được với
    >>> a = ['foo', 'bar', 'baz']
    
    >>> itr = iter(a)
    >>> itr
    
    
    >>> next(itr)
    'foo'
    >>> next(itr)
    'bar'
    >>> next(itr)
    'baz'
    
    7. Mỗi cuộc gọi
    >>> next(itr)
    Traceback (most recent call last):
      File "", line 1, in 
        next(itr)
    StopIteration
    
    4 nhận được giá trị tiếp theo từ
    >>> next(itr)
    Traceback (most recent call last):
      File "", line 1, in 
        next(itr)
    StopIteration
    
    2

    Lưu ý cách một iterator giữ trạng thái bên trong. Nó biết những giá trị nào đã được lấy, vì vậy khi bạn gọi

    >>> next(itr)
    Traceback (most recent call last):
      File "", line 1, in 
        next(itr)
    StopIteration
    
    0, nó sẽ biết giá trị nào sẽ trả về tiếp theo

    Điều gì xảy ra khi iterator hết giá trị?

    >>>

    >>> next(itr)
    Traceback (most recent call last):
      File "", line 1, in 
        next(itr)
    StopIteration
    

    Nếu tất cả các giá trị từ một iterator đã được trả về, một cuộc gọi

    >>> next(itr)
    Traceback (most recent call last):
      File "", line 1, in 
        next(itr)
    StopIteration
    
    0 tiếp theo sẽ tạo ra một ngoại lệ
    >>> next(itr)
    Traceback (most recent call last):
      File "", line 1, in 
        next(itr)
    StopIteration
    
    9. Mọi nỗ lực tiếp theo để lấy giá trị từ trình vòng lặp sẽ không thành công

    Bạn chỉ có thể lấy các giá trị từ một trình vòng lặp theo một hướng. Bạn không thể đi lùi. Không có chức năng

    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    0. Nhưng bạn có thể định nghĩa hai trình vòng lặp độc lập trên cùng một đối tượng có thể lặp lại

    >>>

    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    

    Ngay cả khi iterator

    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    1 đã ở cuối danh sách, thì
    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    2 vẫn ở đầu. Mỗi iterator duy trì trạng thái bên trong của chính nó, độc lập với các iterator khác

    Nếu bạn muốn lấy tất cả các giá trị từ một trình vòng lặp cùng một lúc, bạn có thể sử dụng hàm

    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    3 tích hợp. Trong số các cách sử dụng có thể khác,
    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    3 lấy một trình vòng lặp làm đối số của nó và trả về một danh sách bao gồm tất cả các giá trị mà trình vòng lặp mang lại

    >>>

    for (i = 1; i <= 10; i++)
        <loop body>
    
    0

    Tương tự, các hàm

    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    5 và
    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    6 tích hợp lần lượt trả về một bộ và một tập hợp từ tất cả các giá trị mà trình vòng lặp tạo ra

    >>>

    for (i = 1; i <= 10; i++)
        <loop body>
    
    1

    Không nhất thiết phải tạo thói quen này. Một phần của sự sang trọng của iterators là chúng “lười. ” Điều đó có nghĩa là khi bạn tạo một trình vòng lặp, nó không tạo ra tất cả các mục mà nó có thể mang lại ngay lúc đó. Nó đợi cho đến khi bạn yêu cầu họ với

    >>> next(itr)
    Traceback (most recent call last):
      File "", line 1, in 
        next(itr)
    StopIteration
    
    0. Các mục không được tạo cho đến khi chúng được yêu cầu

    Khi bạn sử dụng

    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    3,
    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    5 hoặc tương tự, bạn đang buộc trình vòng lặp tạo tất cả các giá trị của nó cùng một lúc, vì vậy tất cả chúng có thể được trả về. Nếu tổng số đối tượng mà trình vòng lặp trả về rất lớn, có thể mất nhiều thời gian

    Trên thực tế, có thể tạo một trình lặp trong Python trả về một chuỗi đối tượng vô tận bằng cách sử dụng các hàm tạo và

    for (i = 1; i <= 10; i++)
        <loop body>
    
    00. Nếu bạn cố lấy tất cả các giá trị cùng một lúc từ trình lặp vô tận, chương trình sẽ bị treo

    Loại bỏ các quảng cáo

    Bản lĩnh của con trăn Vòng lặp for in : 0

    Bây giờ bạn đã được giới thiệu tất cả các khái niệm cần thiết để hiểu đầy đủ về cách thức hoạt động của vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 của Python. Trước khi tiếp tục, hãy xem lại các điều khoản có liên quan

    TermMeaningIteration Quá trình lặp qua các đối tượng hoặc mục trong bộ sưu tậpIterableMột đối tượng (hoặc tính từ được sử dụng để mô tả một đối tượng) có thể được lặp qua IteratorĐối tượng tạo ra các mục hoặc giá trị liên tiếp từ iterable được liên kết của nó

    >>> a = ['foo', 'bar', 'baz']
    
    >>> itr = iter(a)
    >>> itr
    
    
    >>> next(itr)
    'foo'
    >>> next(itr)
    'bar'
    >>> next(itr)
    'baz'
    
    7Hàm tích hợp được sử dụng để lấy một trình vòng lặp từ một

    Bây giờ, hãy xem xét lại vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 đơn giản được trình bày ở phần đầu của hướng dẫn này

    >>>

    >>> a = ['foo', 'bar', 'baz']
    >>> for i in a:
    ..     print(i)
    ...
    foo
    bar
    baz
    

    Vòng lặp này có thể được mô tả hoàn toàn bằng các khái niệm bạn vừa học về. Để thực hiện phép lặp vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 này mô tả, Python thực hiện như sau

    • Gọi
      >>> a = ['foo', 'bar', 'baz']
      
      >>> itr = iter(a)
      >>> itr
      
      
      >>> next(itr)
      'foo'
      >>> next(itr)
      'bar'
      >>> next(itr)
      'baz'
      
      7 để lấy iterator cho
      >>> iter(42)                                   # Integer
      Traceback (most recent call last):
        File "", line 1, in 
          iter(42)
      TypeError: 'int' object is not iterable
      
      >>> iter(3.1)                                  # Float
      Traceback (most recent call last):
        File "", line 1, in 
          iter(3.1)
      TypeError: 'float' object is not iterable
      
      >>> iter(len)                                  # Built-in function
      Traceback (most recent call last):
        File "", line 1, in 
          iter(len)
      TypeError: 'builtin_function_or_method' object is not iterable
      
      6
    • Gọi liên tục _______55_______0 để lấy lần lượt từng mục từ iterator
    • Chấm dứt vòng lặp khi
      >>> next(itr)
      Traceback (most recent call last):
        File "", line 1, in 
          next(itr)
      StopIteration
      
      0 tăng ngoại lệ
      >>> next(itr)
      Traceback (most recent call last):
        File "", line 1, in 
          next(itr)
      StopIteration
      
      9

    Thân vòng lặp được thực hiện một lần cho mỗi mục

    >>> next(itr)
    Traceback (most recent call last):
      File "", line 1, in 
        next(itr)
    StopIteration
    
    0 trả về, với biến vòng lặp
    for <var> in <iterable>:
        <statement(s)>
    
    7 được đặt thành mục đã cho cho mỗi lần lặp

    Chuỗi sự kiện này được tóm tắt trong sơ đồ sau

    Cách bắt đầu lại vòng lặp trong Python
    Sơ đồ của một Python cho vòng lặp

    Có lẽ điều này có vẻ giống như rất nhiều công việc khỉ không cần thiết, nhưng lợi ích là đáng kể. Python xử lý việc lặp qua tất cả các lần lặp theo cách chính xác theo cách này và trong Python, rất nhiều lần lặp và trình vòng lặp

    • Nhiều đối tượng tích hợp và thư viện có thể lặp lại

    • Có một mô-đun Thư viện chuẩn có tên là

      for (i = 1; i <= 10; i++)
          <loop body>
      
      00 chứa nhiều hàm trả về các lần lặp

    • Các đối tượng do người dùng định nghĩa được tạo bằng khả năng hướng đối tượng của Python có thể được lặp lại

    • Python có một cấu trúc được gọi là trình tạo cho phép bạn tạo trình vòng lặp của riêng mình theo cách đơn giản, dễ hiểu

    Bạn sẽ khám phá thêm về tất cả những điều trên trong suốt loạt bài này. Tất cả chúng đều có thể là mục tiêu của vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 và cú pháp giống nhau trên bảng. Nó thanh lịch trong sự đơn giản và cực kỳ linh hoạt

    Lặp lại thông qua một từ điển

    Trước đó, bạn đã thấy rằng một trình vòng lặp có thể được lấy từ một từ điển có

    >>> a = ['foo', 'bar', 'baz']
    
    >>> itr = iter(a)
    >>> itr
    
    
    >>> next(itr)
    'foo'
    >>> next(itr)
    'bar'
    >>> next(itr)
    'baz'
    
    7, vì vậy bạn biết rằng các từ điển phải có thể lặp lại được. Điều gì xảy ra khi bạn lặp qua một từ điển?

    >>>

    for (i = 1; i <= 10; i++)
        <loop body>
    
    3

    Như bạn có thể thấy, khi một vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 lặp qua một từ điển, biến vòng lặp được gán cho các khóa của từ điển

    Để truy cập các giá trị từ điển trong vòng lặp, bạn có thể tạo tham chiếu từ điển bằng cách sử dụng khóa như bình thường

    >>>

    for (i = 1; i <= 10; i++)
        <loop body>
    
    4

    Bạn cũng có thể lặp lại trực tiếp các giá trị của từ điển bằng cách sử dụng

    for (i = 1; i <= 10; i++)
        <loop body>
    
    17

    >>>

    for (i = 1; i <= 10; i++)
        <loop body>
    
    5

    Trên thực tế, bạn có thể lặp lại đồng thời cả khóa và giá trị của từ điển. Đó là bởi vì biến vòng lặp của vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 không chỉ giới hạn ở một biến duy nhất. Nó cũng có thể là một bộ, trong trường hợp đó, các phép gán được thực hiện từ các mục trong khả năng lặp lại bằng cách sử dụng đóng gói và giải nén, giống như với một câu lệnh gán

    >>>

    for (i = 1; i <= 10; i++)
        <loop body>
    
    6

    Như đã lưu ý trong hướng dẫn về Python , phương thức từ điển

    for (i = 1; i <= 10; i++)
        <loop body>
    
    19 trả về một danh sách các cặp khóa/giá trị dưới dạng bộ dữ liệu một cách hiệu quả

    >>>

    for (i = 1; i <= 10; i++)
        <loop body>
    
    7

    Do đó, cách Pythonic để lặp qua từ điển truy cập cả khóa và giá trị trông như thế này

    >>>

    for (i = 1; i <= 10; i++)
        <loop body>
    
    8

    Loại bỏ các quảng cáo

    Hàm for (i = 1; i <= 10; i++) 20

    Trong phần đầu tiên của hướng dẫn này, bạn đã thấy một loại vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 được gọi là a , trong đó các giá trị số bắt đầu và kết thúc được chỉ định. Mặc dù dạng vòng lặp
    for <var> in <iterable>:
        <statement(s)>
    
    0 này không được tích hợp trực tiếp vào Python, nhưng nó có thể dễ dàng đạt được

    Ví dụ: nếu bạn muốn lặp qua các giá trị từ

    for (i = 1; i <= 10; i++)
        <loop body>
    
    23 đến
    for (i = 1; i <= 10; i++)
        <loop body>
    
    24, bạn chỉ cần thực hiện điều này

    >>>

    for (i = 1; i <= 10; i++)
        <loop body>
    
    9

    Giải pháp này không quá tệ khi chỉ có một vài con số. Nhưng nếu phạm vi số lớn hơn nhiều, nó sẽ trở nên tẻ nhạt khá nhanh

    Đáng mừng là Python cung cấp một tùy chọn tốt hơn—hàm

    for (i = 1; i <= 10; i++)
        <loop body>
    
    20 tích hợp sẵn, trả về một lần lặp có thể tạo ra một chuỗi các số nguyên

    for (i = 1; i <= 10; i++)
        <loop body>
    
    26 trả về một iterable mang lại số nguyên bắt đầu bằng
    for (i = 1; i <= 10; i++)
        <loop body>
    
    23, tối đa nhưng không bao gồm
    for (i = 1; i <= 10; i++)
        <loop body>
    
    28

    >>>

    for i in <collection>
        <loop body>
    
    0

    Lưu ý rằng

    for (i = 1; i <= 10; i++)
        <loop body>
    
    20 trả về một đối tượng của lớp
    for (i = 1; i <= 10; i++)
        <loop body>
    
    30, không phải danh sách hoặc bộ giá trị. Bởi vì một đối tượng
    for (i = 1; i <= 10; i++)
        <loop body>
    
    30 là một đối tượng có thể lặp lại, nên bạn có thể lấy các giá trị bằng cách lặp lại chúng bằng một vòng lặp
    for <var> in <iterable>:
        <statement(s)>
    
    0

    >>>

    for i in <collection>
        <loop body>
    
    1

    Bạn cũng có thể lấy tất cả các giá trị cùng một lúc với

    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    3 hoặc
    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    5. Trong phiên REPL, đó có thể là một cách thuận tiện để hiển thị nhanh các giá trị

    >>>

    for i in <collection>
        <loop body>
    
    2

    Tuy nhiên, khi

    for (i = 1; i <= 10; i++)
        <loop body>
    
    20 được sử dụng trong mã là một phần của ứng dụng lớn hơn, thì việc sử dụng
    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    3 hoặc
    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    5 theo cách này thường được coi là thông lệ kém. Giống như các trình vòng lặp, các đối tượng
    for (i = 1; i <= 10; i++)
        <loop body>
    
    30 lười biếng—các giá trị trong phạm vi đã chỉ định không được tạo cho đến khi chúng được yêu cầu. Sử dụng
    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    3 hoặc
    >>> a
    ['foo', 'bar', 'baz']
    
    >>> itr1 = iter(a)
    >>> itr2 = iter(a)
    
    >>> next(itr1)
    'foo'
    >>> next(itr1)
    'bar'
    >>> next(itr1)
    'baz'
    
    >>> next(itr2)
    'foo'
    
    5 trên đối tượng
    for (i = 1; i <= 10; i++)
        <loop body>
    
    30 buộc tất cả các giá trị phải được trả về cùng một lúc. Điều này hiếm khi cần thiết và nếu danh sách dài, nó có thể lãng phí thời gian và bộ nhớ

    for (i = 1; i <= 10; i++)
        <loop body>
    
    42 trả về một iterable mang lại số nguyên bắt đầu bằng
    for (i = 1; i <= 10; i++)
        <loop body>
    
    43, tối đa nhưng không bao gồm
    for (i = 1; i <= 10; i++)
        <loop body>
    
    28. Nếu được chỉ định,
    for (i = 1; i <= 10; i++)
        <loop body>
    
    45 cho biết số lượng cần bỏ qua giữa các giá trị (tương tự như giá trị sải chân được sử dụng để cắt chuỗi và danh sách)

    >>>

    for i in <collection>
        <loop body>
    
    3

    Nếu bỏ qua

    for (i = 1; i <= 10; i++)
        <loop body>
    
    45, giá trị mặc định là
    for <var> in <iterable>:
        <statement(s)>
    
    8

    >>>

    for i in <collection>
        <loop body>
    
    4

    Tất cả các tham số được chỉ định cho

    for (i = 1; i <= 10; i++)
        <loop body>
    
    20 phải là số nguyên, nhưng bất kỳ tham số nào cũng có thể là số âm. Đương nhiên, nếu
    for (i = 1; i <= 10; i++)
        <loop body>
    
    43 lớn hơn
    for (i = 1; i <= 10; i++)
        <loop body>
    
    28, thì
    for (i = 1; i <= 10; i++)
        <loop body>
    
    45 phải âm (nếu bạn muốn có bất kỳ kết quả nào)

    >>>

    for i in <collection>
        <loop body>
    
    5

    Lưu ý kỹ thuật. Nói một cách chính xác,

    for (i = 1; i <= 10; i++)
        <loop body>
    
    20 không chính xác là một chức năng tích hợp sẵn. Nó được triển khai như một lớp có thể gọi được để tạo ra một loại trình tự bất biến. Nhưng đối với các mục đích thực tế, nó hoạt động giống như một chức năng tích hợp sẵn

    Để biết thêm thông tin về

    for (i = 1; i <= 10; i++)
        <loop body>
    
    20, hãy xem bài viết Real Python Hàm
    for (i = 1; i <= 10; i++)
        <loop body>
    
    20 của Python (Hướng dẫn)

    Loại bỏ các quảng cáo

    Thay đổi hành vi vòng lặp for in : 0

    Bạn đã thấy trong phần hướng dẫn trước trong loạt bài giới thiệu này cách thực hiện một vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    1 có thể bị gián đoạn và sửa đổi bằng một. Các khả năng này cũng có sẵn với vòng lặp
    for <var> in <iterable>:
        <statement(s)>
    
    0

    Tuyên bố for (i = 1; i <= 10; i++) 57 và for (i = 1; i <= 10; i++) 58

    Các vòng lặp

    for (i = 1; i <= 10; i++)
        <loop body>
    
    57 và
    for (i = 1; i <= 10; i++)
        <loop body>
    
    58 hoạt động giống như với vòng lặp
    for <var> in <iterable>:
        <statement(s)>
    
    1.
    for (i = 1; i <= 10; i++)
        <loop body>
    
    57 kết thúc vòng lặp hoàn toàn và chuyển sang câu lệnh đầu tiên sau vòng lặp

    >>>

    for i in <collection>
        <loop body>
    
    6

    for (i = 1; i <= 10; i++)
        <loop body>
    
    58 kết thúc lần lặp hiện tại và chuyển sang lần lặp tiếp theo

    >>>

    for i in <collection>
        <loop body>
    
    7

    Mệnh đề for (i = 1; i <= 10; i++) 59

    Vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0 cũng có thể có mệnh đề
    for (i = 1; i <= 10; i++)
        <loop body>
    
    59. Diễn giải tương tự như của vòng lặp
    for <var> in <iterable>:
        <statement(s)>
    
    1. Mệnh đề
    for (i = 1; i <= 10; i++)
        <loop body>
    
    59 sẽ được thực thi nếu vòng lặp kết thúc do hết khả năng lặp

    >>>

    for i in <collection>
        <loop body>
    
    8

    Mệnh đề

    for (i = 1; i <= 10; i++)
        <loop body>
    
    59 sẽ không được thực hiện nếu danh sách được tách ra bằng câu lệnh
    for (i = 1; i <= 10; i++)
        <loop body>
    
    57

    >>>

    for i in <collection>
        <loop body>
    
    9

    Phần kết luận

    Hướng dẫn này trình bày về vòng lặp

    for <var> in <iterable>:
        <statement(s)>
    
    0, đặc điểm của phép lặp xác định trong Python

    Bạn cũng đã tìm hiểu về hoạt động bên trong của iterables và iterators, hai loại đối tượng quan trọng làm nền tảng cho phép lặp xác định, nhưng cũng xuất hiện nổi bật trong nhiều loại mã Python khác

    Trong hai hướng dẫn tiếp theo của loạt bài giới thiệu này, bạn sẽ sang số một chút và khám phá cách các chương trình Python có thể tương tác với người dùng thông qua đầu vào từ bàn phím và đầu ra cho bảng điều khiển

    « Vòng lặp "trong khi" của Python (Lặp lại vô thời hạn)

    Nhập và xuất cơ bản trong Python »

    Đánh dấu là đã hoàn thành

    Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Đối với vòng lặp trong Python (Lặp lại xác định)

    🐍 Thủ thuật Python 💌

    Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

    Cách bắt đầu lại vòng lặp trong Python

    Gửi cho tôi thủ thuật Python »

    Giới thiệu về John Sturtz

    Cách bắt đầu lại vòng lặp trong Python
    Cách bắt đầu lại vòng lặp trong Python

    John là một Pythonista cuồng nhiệt và là thành viên của nhóm hướng dẫn Real Python

    » Thông tin thêm về John


    Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

    Cách bắt đầu lại vòng lặp trong Python

    Aldren

    Cách bắt đầu lại vòng lặp trong Python

    David

    Cách bắt đầu lại vòng lặp trong Python

    Joanna

    Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

    Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

    Nâng cao kỹ năng Python của bạn »

    Chuyên gia Kỹ năng Python trong thế giới thực
    Với quyền truy cập không giới hạn vào Python thực

    Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

    Nâng cao kỹ năng Python của bạn »

    Bạn nghĩ sao?

    Đánh giá bài viết này

    Tweet Chia sẻ Chia sẻ Email

    Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

    Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi