Tôi có nên sử dụng năng suất trong Python không?

Nói tóm lại, bất cứ khi nào điều khiển đạt đến câu lệnh return trong chương trình của bạn, thì việc thực thi chương trình sẽ bị chấm dứt và các câu lệnh còn lại sẽ không được thực thi

Tuy nhiên, trong trường hợp năng suất, bất cứ khi nào điều khiển đạt đến câu lệnh năng suất trong chương trình của bạn, việc thực thi chương trình của bạn sẽ bị tạm dừng và sau đó chúng tôi có thể tiếp tục các câu lệnh khác trong chức năng

Hãy hiểu chi tiết cả hai tuyên bố

năng suất

Sử dụng câu lệnh năng suất trong một hàm làm cho hàm trở thành một hàm tạo có thể được sử dụng trong một vòng lặp. Khi chức năng đang chạy và câu lệnh năng suất thực thi, giá trị sau năng suất được chuyển trở lại vòng lặp đã gọi nó. Lần lặp lại vòng lặp tiếp theo, hàm sẽ bắt đầu ngay sau các câu lệnh năng suất

def func():
   yield 1
   yield 2
   yield 3

for num in func():
   print(num * num)

đầu ra

1
4
9

Trong chương trình trên, vòng lặp gọi hàm sẽ hoàn thành khi hàm func hoàn thành – hoặc gặp phần cuối của hàm (func()) hoặc câu lệnh trả về

Tuy nhiên, bất kỳ vòng lặp mới nào sử dụng cùng hàm tạo sẽ thực hiện lại hàm đó từ đầu

Trở lại

Một tuyên bố trở lại,

  • Được sử dụng để dừng thực thi một chức năng và tùy chọn trả về một giá trị cho người gọi. Không thể sử dụng một hàm có trả về (nhưng không có năng suất) trong một vòng lặp (không giống như năng suất ở trên)

  • Nếu một chức năng đã được thực hiện trước đó được gọi lại, thì chức năng đó sẽ bắt đầu thực hiện lại từ đầu (không giống như năng suất ở trên)

Khi nào sử dụng lợi tức hoặc năng suất?

Tuy nhiên, chúng tôi khuyên bạn nên sử dụng năng suất khi chúng tôi muốn lặp lại một chuỗi, do hạn chế về tài nguyên hoặc đơn giản là không muốn lưu trữ toàn bộ chuỗi trong bộ nhớ. Đối với các trường hợp khác, chúng ta có thể nghĩ đến việc sử dụng câu lệnh return

Hãy xem xét một chương trình khác sử dụng câu lệnh suất để tạo bình phương của số nguyên

def Square():
   i = 1;
   # An Infinite loop to generate squares
   while True:
      yield i*i
      i += 1 # Next execution resumes from this point
for num in Square():
   if num > 100:
      break
   print(num)

đầu ra

1
4
9
16
25
36
49
64
81
100

Câu lệnh yield thường không được sử dụng trong mệnh đề try của câu lệnh try…. khối cuối cùng vì không có gì đảm bảo rằng trình tạo sẽ được tiếp tục lại, do đó không có gì đảm bảo rằng khối cuối cùng sẽ được thực thi

Bạn đã bao giờ phải làm việc với một tập dữ liệu lớn đến mức tràn ngập bộ nhớ của máy chưa? . Trong những trường hợp này và hơn thế nữa, trình tạo và câu lệnh lợi nhuận Python luôn sẵn sàng trợ giúp

Đến cuối bài viết này, bạn sẽ biết

  • Máy phát điện là gì và cách sử dụng chúng
  • Cách tạo các hàm và biểu thức trình tạo
  • Cách thức hoạt động của câu lệnh năng suất Python
  • Cách sử dụng nhiều câu lệnh lợi nhuận Python trong hàm tạo
  • Cách sử dụng các phương pháp tạo nâng cao
  • Cách xây dựng đường ống dữ liệu với nhiều trình tạo

Nếu bạn là người mới bắt đầu hoặc Pythonista trung cấp và bạn muốn học cách làm việc với các tập dữ liệu lớn theo kiểu Pythonic hơn, thì đây là hướng dẫn dành cho bạn

Bạn có thể lấy một bản sao của tập dữ liệu được sử dụng trong hướng dẫn này bằng cách nhấp vào liên kết bên dưới

Tải xuống tập dữ liệu. Nhấp vào đây để tải xuống tập dữ liệu mà bạn sẽ sử dụng trong hướng dẫn này để tìm hiểu về trình tạo và năng suất trong Python

Sử dụng máy phát điện

Được giới thiệu với PEP 255, các hàm tạo là một loại hàm đặc biệt trả về một trình lặp lười biếng. Đây là những đối tượng mà bạn có thể lặp lại như một danh sách. Tuy nhiên, không giống như danh sách, lazy iterator không lưu trữ nội dung của chúng trong bộ nhớ. Để có cái nhìn tổng quan về các trình vòng lặp trong Python, hãy xem Vòng lặp “cho” Python (Lặp lại xác định)

Bây giờ bạn đã có ý tưởng sơ bộ về chức năng của máy phát điện, bạn có thể thắc mắc chúng trông như thế nào khi hoạt động. Hãy xem xét hai ví dụ. Đầu tiên, bạn sẽ thấy cách máy phát điện hoạt động từ góc nhìn toàn cảnh. Sau đó, bạn sẽ phóng to và kiểm tra từng ví dụ kỹ lưỡng hơn

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

ví dụ 1. Đọc các tệp lớn

Trường hợp sử dụng phổ biến của trình tạo là hoạt động với luồng dữ liệu hoặc tệp lớn, chẳng hạn như tệp CSV. Các tệp văn bản này phân tách dữ liệu thành các cột bằng cách sử dụng dấu phẩy. Định dạng này là một cách phổ biến để chia sẻ dữ liệu. Bây giờ, nếu bạn muốn đếm số hàng trong tệp CSV thì sao?

csv_gen = csv_reader("some_csv.txt")
row_count = 0

for row in csv_gen:
    row_count += 1

print(f"Row count is {row_count}")

Nhìn vào ví dụ này, bạn có thể mong đợi

def csv_reader(file_name):
    for row in open(file_name, "r"):
        yield row
5 là một danh sách. Để điền vào danh sách này,
def csv_reader(file_name):
    for row in open(file_name, "r"):
        yield row
6 mở một tệp và tải nội dung của nó vào
def csv_reader(file_name):
    for row in open(file_name, "r"):
        yield row
5. Sau đó, chương trình lặp lại danh sách và tăng
def csv_reader(file_name):
    for row in open(file_name, "r"):
        yield row
8 cho mỗi hàng

Đây là một lời giải thích hợp lý, nhưng thiết kế này vẫn hoạt động nếu tệp rất lớn?

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result

Hàm này mở một tệp đã cho và sử dụng

Row count is 64186394
0 cùng với
Row count is 64186394
1 để thêm từng dòng dưới dạng một phần tử riêng biệt vào danh sách. Nếu bạn sử dụng phiên bản
def csv_reader(file_name):
    for row in open(file_name, "r"):
        yield row
6 này trong khối mã đếm hàng mà bạn đã thấy ở trên, thì bạn sẽ nhận được kết quả sau

>>>

Traceback (most recent call last):
  File "ex1_naive.py", line 22, in <module>
    main()
  File "ex1_naive.py", line 13, in main
    csv_gen = csv_reader("file.txt")
  File "ex1_naive.py", line 6, in csv_reader
    result = file.read().split("\n")
MemoryError

Trong trường hợp này,

Row count is 64186394
3 trả về một đối tượng trình tạo mà bạn có thể lười biếng lặp lại từng dòng một. Tuy nhiên,
Row count is 64186394
4 tải mọi thứ vào bộ nhớ cùng một lúc, gây ra lỗi
Row count is 64186394
5

Trước khi điều đó xảy ra, có thể bạn sẽ nhận thấy máy tính của mình chậm thu thập thông tin. Bạn thậm chí có thể cần phải tắt chương trình bằng một

Row count is 64186394
6. Vì vậy, làm thế nào bạn có thể xử lý các tệp dữ liệu khổng lồ này?

def csv_reader(file_name):
    for row in open(file_name, "r"):
        yield row

Trong phiên bản này, bạn mở tệp, lặp qua nó và tạo ra một hàng. Mã này sẽ tạo đầu ra sau, không có lỗi bộ nhớ

Row count is 64186394

Điều gì đang xảy ra ở đây? . Phiên bản này mở một tệp, lặp qua từng dòng và tạo ra từng hàng thay vì trả về

Bạn cũng có thể xác định biểu thức trình tạo (còn được gọi là mức hiểu trình tạo), có cú pháp rất giống với mức hiểu danh sách. Bằng cách này, bạn có thể sử dụng trình tạo mà không cần gọi hàm

csv_gen = (row for row in open(file_name))

Đây là một cách ngắn gọn hơn để tạo danh sách

def csv_reader(file_name):
    for row in open(file_name, "r"):
        yield row
5. Bạn sẽ sớm tìm hiểu thêm về câu lệnh năng suất Python. Bây giờ, chỉ cần nhớ sự khác biệt chính này

  • Sử dụng
    csv_gen = (row for row in open(file_name))
    
    0 sẽ dẫn đến một đối tượng trình tạo
  • Sử dụng
    csv_gen = (row for row in open(file_name))
    
    1 sẽ chỉ dẫn đến dòng đầu tiên của tệp

ví dụ 2. Tạo một chuỗi vô hạn

Hãy chuyển bánh răng và xem xét việc tạo chuỗi vô hạn. Trong Python, để có được một dãy hữu hạn, bạn gọi

csv_gen = (row for row in open(file_name))
2 và đánh giá nó trong ngữ cảnh danh sách

>>>

>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]

Tuy nhiên, việc tạo một chuỗi vô hạn sẽ yêu cầu sử dụng trình tạo, vì bộ nhớ máy tính của bạn là hữu hạn

def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

Khối mã này ngắn và hấp dẫn. Đầu tiên, bạn khởi tạo biến

csv_gen = (row for row in open(file_name))
3 và bắt đầu một vòng lặp vô hạn. Sau đó, bạn ngay lập tức
csv_gen = (row for row in open(file_name))
4 để có thể nắm bắt được trạng thái ban đầu. Điều này bắt chước hành động của
csv_gen = (row for row in open(file_name))
2

Sau

csv_gen = (row for row in open(file_name))
0, bạn tăng
csv_gen = (row for row in open(file_name))
3 lên 1. Nếu bạn thử điều này với một vòng lặp
csv_gen = (row for row in open(file_name))
8, thì bạn sẽ thấy rằng nó thực sự có vẻ vô hạn

>>>

>>> for i in infinite_sequence():
..     print(i, end=" ")
...
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39 40 41 42
[...]
6157818 6157819 6157820 6157821 6157822 6157823 6157824 6157825 6157826 6157827
6157828 6157829 6157830 6157831 6157832 6157833 6157834 6157835 6157836 6157837
6157838 6157839 6157840 6157841 6157842
KeyboardInterrupt
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>

Chương trình sẽ tiếp tục thực thi cho đến khi bạn dừng chương trình theo cách thủ công

Thay vì sử dụng vòng lặp

csv_gen = (row for row in open(file_name))
8, bạn cũng có thể gọi trực tiếp
>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
0 trên đối tượng trình tạo. Điều này đặc biệt hữu ích để kiểm tra trình tạo trong bảng điều khiển

>>>

>>> gen = infinite_sequence()
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3

Ở đây, bạn có một trình tạo có tên là

>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
1, mà bạn lặp lại thủ công bằng cách gọi liên tục
>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
0. Điều này hoạt động như một kiểm tra độ tỉnh táo tuyệt vời để đảm bảo rằng máy phát điện của bạn đang tạo ra đầu ra mà bạn mong đợi

Ghi chú. Khi bạn sử dụng

>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
0, Python gọi
>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
4 trên hàm bạn truyền vào dưới dạng tham số. Có một số hiệu ứng đặc biệt mà tham số hóa này cho phép, nhưng nó vượt quá phạm vi của bài viết này. Thử nghiệm với việc thay đổi tham số mà bạn chuyển thành
>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
0 và xem điều gì sẽ xảy ra

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

ví dụ 3. Phát hiện Palindromes

Bạn có thể sử dụng các chuỗi vô hạn theo nhiều cách, nhưng một cách sử dụng thực tế cho chúng là xây dựng các máy dò palindrome. Máy dò bảng màu sẽ định vị tất cả các chuỗi chữ cái hoặc số là bảng màu. Đây là những từ hoặc số được đọc xuôi và ngược giống nhau, chẳng hạn như 121. Đầu tiên, xác định trình phát hiện palindrome số của bạn

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
0

Đừng lo lắng quá nhiều về việc hiểu toán học cơ bản trong mã này. Chỉ cần lưu ý rằng hàm lấy một số đầu vào, đảo ngược nó và kiểm tra xem liệu số được đảo ngược có giống với số ban đầu không. Giờ đây, bạn có thể sử dụng trình tạo chuỗi vô hạn của mình để nhận danh sách đang chạy của tất cả các đối xứng số

>>>

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
1

Trong trường hợp này, các số duy nhất được in ra bảng điều khiển là những số tiến hoặc lùi giống nhau

Ghi chú. Trong thực tế, bạn không thể viết trình tạo chuỗi vô hạn của riêng mình. Mô-đun

>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
6 cung cấp một trình tạo chuỗi vô hạn rất hiệu quả với
>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
7

Bây giờ bạn đã thấy một trường hợp sử dụng đơn giản cho trình tạo chuỗi vô hạn, hãy tìm hiểu sâu hơn về cách trình tạo hoạt động

Tìm hiểu máy phát điện

Cho đến giờ, bạn đã biết về hai cách chính để tạo trình tạo. bằng cách sử dụng các hàm trình tạo và biểu thức trình tạo. Bạn thậm chí có thể có một sự hiểu biết trực quan về cách thức hoạt động của máy phát điện. Hãy dành một chút thời gian để làm cho kiến ​​thức đó rõ ràng hơn một chút

Các hàm tạo có giao diện và hoạt động giống như các hàm thông thường, nhưng có một đặc điểm xác định. Các hàm tạo sử dụng Python thay vì

csv_gen = (row for row in open(file_name))
1. Nhớ lại hàm tạo mà bạn đã viết trước đó

def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

Điều này trông giống như một định nghĩa hàm điển hình, ngoại trừ câu lệnh năng suất Python và mã theo sau nó.

csv_gen = (row for row in open(file_name))
0 cho biết nơi một giá trị được gửi lại cho người gọi, nhưng không giống như
csv_gen = (row for row in open(file_name))
1, bạn không thoát khỏi chức năng sau đó

Thay vào đó, trạng thái của chức năng được ghi nhớ. Theo cách đó, khi

>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
0 được gọi trên một đối tượng trình tạo (rõ ràng hoặc ngầm định trong vòng lặp
csv_gen = (row for row in open(file_name))
8), biến được tạo ra trước đó
csv_gen = (row for row in open(file_name))
3 được tăng lên và sau đó được tạo lại. Vì các hàm trình tạo trông giống như các hàm khác và hoạt động rất giống với chúng, nên bạn có thể cho rằng các biểu thức trình tạo rất giống với các cách hiểu khác có sẵn trong Python

Ghi chú. Bạn có biết cách hiểu danh sách, tập hợp và từ điển của Python không?

Xây dựng trình tạo với biểu thức trình tạo

Giống như khả năng hiểu danh sách, các biểu thức trình tạo cho phép bạn nhanh chóng tạo một đối tượng trình tạo chỉ trong một vài dòng mã. Chúng cũng hữu ích trong các trường hợp tương tự khi sử dụng tính năng hiểu danh sách, với một lợi ích bổ sung. bạn có thể tạo chúng mà không cần xây dựng và giữ toàn bộ đối tượng trong bộ nhớ trước khi lặp lại. Nói cách khác, bạn sẽ không bị phạt bộ nhớ khi sử dụng các biểu thức trình tạo. Lấy ví dụ này về bình phương một số số

>>>

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
3

Cả

def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1
5 và
def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1
6 về cơ bản trông giống nhau, nhưng có một điểm khác biệt chính. Bạn có thể phát hiện ra nó?

>>>

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
4

Đối tượng đầu tiên sử dụng dấu ngoặc để tạo danh sách, trong khi đối tượng thứ hai tạo biểu thức trình tạo bằng cách sử dụng dấu ngoặc đơn. Đầu ra xác nhận rằng bạn đã tạo một đối tượng trình tạo và nó khác với danh sách

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

Hồ sơ hiệu suất máy phát điện

Trước đó bạn đã biết rằng trình tạo là một cách tuyệt vời để tối ưu hóa bộ nhớ. Mặc dù trình tạo chuỗi vô hạn là một ví dụ cực đoan về sự tối ưu hóa này, hãy mở rộng các ví dụ về bình phương số mà bạn vừa thấy và kiểm tra kích thước của các đối tượng kết quả. Bạn có thể làm điều này với một cuộc gọi đến

def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1
7

>>>

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
5

Trong trường hợp này, danh sách bạn nhận được từ việc hiểu danh sách là 87.624 byte, trong khi đối tượng trình tạo chỉ là 120. Điều này có nghĩa là danh sách lớn hơn 700 lần so với đối tượng trình tạo

Có một điều cần ghi nhớ, mặc dù. Nếu danh sách nhỏ hơn bộ nhớ khả dụng của máy đang chạy, thì khả năng hiểu danh sách có thể lớn hơn biểu thức trình tạo tương đương. Để khám phá điều này, hãy tổng hợp các kết quả từ hai cách hiểu trên. Bạn có thể tạo kết quả đọc với

def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1
8

>>>

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
6

Tại đây, bạn có thể thấy rằng việc tính tổng tất cả các giá trị trong phần hiểu danh sách mất khoảng một phần ba thời gian so với tính tổng trên trình tạo. Nếu tốc độ là một vấn đề còn bộ nhớ thì không, thì khả năng hiểu danh sách có thể là một công cụ tốt hơn cho công việc

Ghi chú. Các phép đo này không chỉ hợp lệ đối với các đối tượng được tạo bằng biểu thức trình tạo. Chúng cũng giống nhau đối với các đối tượng được tạo từ hàm trình tạo tương tự vì các trình tạo kết quả là tương đương

Hãy nhớ rằng, việc hiểu danh sách trả về danh sách đầy đủ, trong khi biểu thức trình tạo trả về trình tạo. Trình tạo hoạt động giống nhau cho dù chúng được tạo từ hàm hay biểu thức. Sử dụng một biểu thức chỉ cho phép bạn xác định các trình tạo đơn giản trong một dòng, với một ____23_______0 giả định ở cuối mỗi lần lặp bên trong

Tuyên bố năng suất Python chắc chắn là mấu chốt mà tất cả các chức năng của trình tạo dựa vào, vì vậy, hãy đi sâu vào cách thức hoạt động của

csv_gen = (row for row in open(file_name))
0 trong Python

Hiểu Tuyên bố năng suất Python

Nhìn chung,

csv_gen = (row for row in open(file_name))
0 là một câu nói khá đơn giản. Công việc chính của nó là kiểm soát luồng của hàm tạo theo cách tương tự như các câu lệnh
csv_gen = (row for row in open(file_name))
1. Tuy nhiên, như đã đề cập ngắn gọn ở trên, câu lệnh lợi nhuận trong Python có một số thủ thuật.

Khi bạn gọi một hàm trình tạo hoặc sử dụng biểu thức trình tạo, bạn trả về một trình vòng lặp đặc biệt được gọi là trình tạo. Bạn có thể gán trình tạo này cho một biến để sử dụng nó. Khi bạn gọi các phương thức đặc biệt trên trình tạo, chẳng hạn như

>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
0, mã bên trong hàm được thực thi tới ____23_______0

Khi câu lệnh năng suất Python được nhấn, chương trình sẽ tạm dừng thực thi chức năng và trả về giá trị năng suất cho người gọi. (Ngược lại,

csv_gen = (row for row in open(file_name))
1 dừng hoàn toàn việc thực thi chức năng. ) Khi một chức năng bị treo, trạng thái của chức năng đó sẽ được lưu. Điều này bao gồm mọi liên kết biến cục bộ với trình tạo, con trỏ lệnh, ngăn xếp bên trong và bất kỳ xử lý ngoại lệ nào

Điều này cho phép bạn tiếp tục thực thi chức năng bất cứ khi nào bạn gọi một trong các phương thức của trình tạo. Theo cách này, tất cả các đánh giá chức năng sẽ được khôi phục ngay sau khi

csv_gen = (row for row in open(file_name))
0. Bạn có thể thấy điều này đang hoạt động bằng cách sử dụng nhiều câu lệnh lợi nhuận Python

>>>

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
7

Hãy xem kỹ cuộc gọi cuối cùng tới

>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
0. Bạn có thể thấy rằng quá trình thực thi đã tăng lên với truy xuất ngược. Điều này là do các trình tạo, giống như tất cả các trình vòng lặp, có thể cạn kiệt. Trừ khi trình tạo của bạn là vô hạn, bạn chỉ có thể lặp lại nó một lần. Khi tất cả các giá trị đã được đánh giá, quá trình lặp sẽ dừng lại và vòng lặp
csv_gen = (row for row in open(file_name))
8 sẽ thoát. Nếu bạn đã sử dụng
>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
0, thì thay vào đó, bạn sẽ nhận được một ngoại lệ rõ ràng là
>>> gen = infinite_sequence()
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
0

Ghi chú.

>>> gen = infinite_sequence()
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
0 là một ngoại lệ tự nhiên được nêu ra để báo hiệu sự kết thúc của một trình vòng lặp. Ví dụ:
csv_gen = (row for row in open(file_name))
8 vòng lặp được xây dựng xung quanh
>>> gen = infinite_sequence()
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
0. Bạn thậm chí có thể triển khai vòng lặp
csv_gen = (row for row in open(file_name))
8 của riêng mình bằng cách sử dụng vòng lặp
>>> gen = infinite_sequence()
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
5

>>>

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
8

Bạn có thể đọc thêm về

>>> gen = infinite_sequence()
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
0 trong tài liệu Python về ngoại lệ. Để biết thêm về phép lặp nói chung, hãy xem Vòng lặp Python “for” (Lặp lại xác định) và Vòng lặp “while” của Python (Lặp lại không xác định)

csv_gen = (row for row in open(file_name))
0 có thể được sử dụng theo nhiều cách để kiểm soát luồng thực thi của trình tạo của bạn. Việc sử dụng nhiều câu lệnh lợi nhuận Python có thể được tận dụng theo khả năng sáng tạo của bạn cho phép

Sử dụng các phương pháp tạo nâng cao

Bạn đã thấy những cách sử dụng và cấu tạo phổ biến nhất của máy phát điện, nhưng có một số thủ thuật khác cần đề cập. Ngoài

csv_gen = (row for row in open(file_name))
0, các đối tượng trình tạo có thể sử dụng các phương thức sau

  • >>> gen = infinite_sequence()
    >>> next(gen)
    0
    >>> next(gen)
    1
    >>> next(gen)
    2
    >>> next(gen)
    3
    
    9
  • def csv_reader(file_name):
        file = open(file_name)
        result = file.read().split("\n")
        return result
    
    00
  • def csv_reader(file_name):
        file = open(file_name)
        result = file.read().split("\n")
        return result
    
    01

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

Cách sử dụng >>> gen = infinite_sequence() >>> next(gen) 0 >>> next(gen) 1 >>> next(gen) 2 >>> next(gen) 3 9

Đối với phần tiếp theo này, bạn sẽ xây dựng một chương trình sử dụng cả ba phương pháp. Chương trình này sẽ in các bảng chữ số như trước đây, nhưng với một vài điều chỉnh. Khi gặp một bảng màu, chương trình mới của bạn sẽ thêm một chữ số và bắt đầu tìm kiếm chữ số tiếp theo từ đó. Bạn cũng sẽ xử lý các trường hợp ngoại lệ với

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
00 và dừng trình tạo sau một số chữ số nhất định với
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
01. Đầu tiên, hãy nhớ lại mã cho máy dò palindrome của bạn

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
9

Đây là mã giống như bạn đã thấy trước đó, ngoại trừ việc bây giờ chương trình trả về nghiêm ngặt

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
05 hoặc
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
06. Bạn cũng sẽ cần sửa đổi trình tạo chuỗi vô hạn ban đầu của mình, như vậy

Traceback (most recent call last):
  File "ex1_naive.py", line 22, in <module>
    main()
  File "ex1_naive.py", line 13, in main
    csv_gen = csv_reader("file.txt")
  File "ex1_naive.py", line 6, in csv_reader
    result = file.read().split("\n")
MemoryError
0

Có rất nhiều thay đổi ở đây. Cái đầu tiên bạn sẽ thấy nằm ở dòng 5, trong đó

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
07. Mặc dù trước đó bạn đã biết rằng
csv_gen = (row for row in open(file_name))
0 là một câu khẳng định, nhưng đó không phải là toàn bộ câu chuyện

Kể từ Python 2. 5 (cùng một bản phát hành đã giới thiệu các phương pháp mà bạn đang tìm hiểu bây giờ),

csv_gen = (row for row in open(file_name))
0 là một cách diễn đạt, thay vì một câu khẳng định. Tất nhiên, bạn vẫn có thể sử dụng nó như một tuyên bố. Nhưng bây giờ, bạn cũng có thể sử dụng nó như bạn thấy trong khối mã ở trên, trong đó
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
10 nhận giá trị được tạo ra. Điều này cho phép bạn thao tác giá trị mang lại. Quan trọng hơn, nó cho phép bạn
>>> gen = infinite_sequence()
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
9 một giá trị trở lại trình tạo. Khi quá trình thực thi bắt đầu sau
csv_gen = (row for row in open(file_name))
0,
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
10 sẽ nhận giá trị được gửi

Bạn cũng sẽ kiểm tra

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
14, điều này có thể xảy ra nếu
>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
0 được gọi trên đối tượng trình tạo. (Điều này cũng có thể xảy ra khi bạn lặp với vòng lặp
csv_gen = (row for row in open(file_name))
8. ) Nếu
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
10 có một giá trị, thì bạn cập nhật
csv_gen = (row for row in open(file_name))
3 với giá trị mới. Nhưng bất kể
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
10 có giữ giá trị hay không, thì bạn sẽ tăng
csv_gen = (row for row in open(file_name))
3 và bắt đầu lại vòng lặp

Bây giờ, hãy xem mã chức năng chính, mã này sẽ gửi số thấp nhất có chữ số khác trở lại trình tạo. Ví dụ, nếu palindrome là 121, thì nó sẽ

>>> gen = infinite_sequence()
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
9 1000

Traceback (most recent call last):
  File "ex1_naive.py", line 22, in <module>
    main()
  File "ex1_naive.py", line 13, in main
    csv_gen = csv_reader("file.txt")
  File "ex1_naive.py", line 6, in csv_reader
    result = file.read().split("\n")
MemoryError
1

Với mã này, bạn tạo đối tượng trình tạo và lặp qua nó. Chương trình chỉ mang lại một giá trị sau khi tìm thấy một bảng màu. Nó sử dụng

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
22 để xác định số chữ số trong bảng màu đó. Sau đó, nó sẽ gửi
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
23 đến trình tạo. Điều này đưa việc thực thi trở lại logic trình tạo và gán
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
23 cho
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
10. Vì
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
10 hiện có một giá trị, chương trình cập nhật
csv_gen = (row for row in open(file_name))
3, tăng dần và kiểm tra lại các đối xứng

Khi mã của bạn tìm thấy và tạo ra một bảng màu khác, bạn sẽ lặp qua vòng lặp

csv_gen = (row for row in open(file_name))
8. Điều này giống như việc lặp lại với
>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
0. Trình tạo cũng nhận ở dòng 5 với
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
07. Tuy nhiên, bây giờ
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
10 là
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
32, bởi vì bạn đã không gửi một giá trị rõ ràng

Những gì bạn đã tạo ở đây là một coroutine hoặc một hàm tạo mà bạn có thể truyền dữ liệu vào đó. Chúng rất hữu ích để xây dựng các đường dẫn dữ liệu, nhưng như bạn sẽ sớm thấy, chúng không cần thiết để xây dựng chúng. (Nếu bạn đang muốn tìm hiểu sâu hơn, thì khóa học về coroutine và đồng thời này là một trong những phương pháp điều trị toàn diện nhất hiện có. )

Bây giờ bạn đã học về

>>> gen = infinite_sequence()
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
9, hãy xem qua
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
00

Cách sử dụng def csv_reader(file_name): file = open(file_name) result = file.read().split("\n") return result 00

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
00 cho phép bạn đưa ra các ngoại lệ với trình tạo. Trong ví dụ dưới đây, bạn nêu ngoại lệ ở dòng 6. Mã này sẽ ném một
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
37 khi
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
38 đạt 5

Traceback (most recent call last):
  File "ex1_naive.py", line 22, in <module>
    main()
  File "ex1_naive.py", line 13, in main
    csv_gen = csv_reader("file.txt")
  File "ex1_naive.py", line 6, in csv_reader
    result = file.read().split("\n")
MemoryError
2

Mã này giống với mã trước, nhưng bây giờ bạn sẽ kiểm tra xem

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
38 có bằng 5 không. Nếu vậy, thì bạn sẽ
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
00 a
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
37. Để xác nhận rằng điều này hoạt động như mong đợi, hãy xem đầu ra của mã

>>>

Traceback (most recent call last):
  File "ex1_naive.py", line 22, in <module>
    main()
  File "ex1_naive.py", line 13, in main
    csv_gen = csv_reader("file.txt")
  File "ex1_naive.py", line 6, in csv_reader
    result = file.read().split("\n")
MemoryError
3

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
00 hữu ích trong bất kỳ lĩnh vực nào mà bạn có thể cần bắt ngoại lệ. Trong ví dụ này, bạn đã sử dụng
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
00 để kiểm soát thời điểm bạn dừng lặp thông qua trình tạo. Bạn có thể làm điều này một cách tao nhã hơn với
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
01

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

Cách sử dụng def csv_reader(file_name): file = open(file_name) result = file.read().split("\n") return result 01

Đúng như tên gọi của nó,

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
01 cho phép bạn dừng máy phát điện. Điều này có thể đặc biệt tiện dụng khi điều khiển trình tạo chuỗi vô hạn. Hãy cập nhật mã ở trên bằng cách thay đổi
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
00 thành
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
01 để dừng lặp lại

Traceback (most recent call last):
  File "ex1_naive.py", line 22, in <module>
    main()
  File "ex1_naive.py", line 13, in main
    csv_gen = csv_reader("file.txt")
  File "ex1_naive.py", line 6, in csv_reader
    result = file.read().split("\n")
MemoryError
4

Thay vì gọi

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
00, bạn sử dụng
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
01 ở dòng 6. Ưu điểm của việc sử dụng
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
01 là nó tăng
>>> gen = infinite_sequence()
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
0, một ngoại lệ được sử dụng để báo hiệu sự kết thúc của một trình vòng lặp hữu hạn

>>>

Traceback (most recent call last):
  File "ex1_naive.py", line 22, in <module>
    main()
  File "ex1_naive.py", line 13, in main
    csv_gen = csv_reader("file.txt")
  File "ex1_naive.py", line 6, in csv_reader
    result = file.read().split("\n")
MemoryError
5

Bây giờ bạn đã tìm hiểu thêm về các phương pháp đặc biệt đi kèm với trình tạo, hãy nói về việc sử dụng trình tạo để xây dựng đường dẫn dữ liệu

Tạo đường ống dữ liệu với trình tạo

Đường ống dẫn dữ liệu cho phép bạn xâu chuỗi mã lại với nhau để xử lý các tập dữ liệu lớn hoặc luồng dữ liệu mà không cần sử dụng tối đa bộ nhớ của máy. Hãy tưởng tượng rằng bạn có một tệp CSV lớn

Traceback (most recent call last):
  File "ex1_naive.py", line 22, in <module>
    main()
  File "ex1_naive.py", line 13, in main
    csv_gen = csv_reader("file.txt")
  File "ex1_naive.py", line 6, in csv_reader
    result = file.read().split("\n")
MemoryError
6

Ví dụ này được lấy từ bộ TechCrunch Continental USA, mô tả các vòng tài trợ và số tiền đô la cho các công ty khởi nghiệp khác nhau có trụ sở tại Hoa Kỳ. Nhấp vào liên kết bên dưới để tải xuống bộ dữ liệu

Tải xuống tập dữ liệu. Nhấp vào đây để tải xuống tập dữ liệu mà bạn sẽ sử dụng trong hướng dẫn này để tìm hiểu về trình tạo và năng suất trong Python

Đã đến lúc thực hiện một số xử lý trong Python. Để minh họa cách xây dựng đường ống bằng trình tạo, bạn sẽ phân tích tệp này để lấy tổng và giá trị trung bình của tất cả các vòng chuỗi A trong tập dữ liệu

Hãy nghĩ về một chiến lược

  1. Đọc từng dòng của tệp
  2. Tách từng dòng thành một danh sách các giá trị
  3. Trích xuất tên cột
  4. Sử dụng tên cột và danh sách để tạo từ điển
  5. Lọc ra các vòng bạn không quan tâm
  6. Tính tổng giá trị và giá trị trung bình cho các vòng bạn quan tâm

Thông thường, bạn có thể làm điều này với một gói như

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
53, nhưng bạn cũng có thể đạt được chức năng này chỉ với một vài trình tạo. Bạn sẽ bắt đầu bằng cách đọc từng dòng từ tệp có biểu thức trình tạo

Traceback (most recent call last):
  File "ex1_naive.py", line 22, in <module>
    main()
  File "ex1_naive.py", line 13, in main
    csv_gen = csv_reader("file.txt")
  File "ex1_naive.py", line 6, in csv_reader
    result = file.read().split("\n")
MemoryError
7

Sau đó, bạn sẽ sử dụng một biểu thức trình tạo khác cùng với biểu thức trước đó để chia từng dòng thành một danh sách

Traceback (most recent call last):
  File "ex1_naive.py", line 22, in <module>
    main()
  File "ex1_naive.py", line 13, in main
    csv_gen = csv_reader("file.txt")
  File "ex1_naive.py", line 6, in csv_reader
    result = file.read().split("\n")
MemoryError
8

Tại đây, bạn đã tạo trình tạo

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
54, trình tạo này lặp qua trình tạo đầu tiên
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
55. Đây là một mẫu phổ biến để sử dụng khi thiết kế đường ống máy phát điện. Tiếp theo, bạn sẽ kéo các tên cột ra khỏi
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
56. Vì các tên cột có xu hướng tạo thành dòng đầu tiên trong tệp CSV, nên bạn có thể lấy nó bằng một cuộc gọi ngắn
>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
0

Traceback (most recent call last):
  File "ex1_naive.py", line 22, in <module>
    main()
  File "ex1_naive.py", line 13, in main
    csv_gen = csv_reader("file.txt")
  File "ex1_naive.py", line 6, in csv_reader
    result = file.read().split("\n")
MemoryError
9

Cuộc gọi này đến ____28_______0 nâng cấp trình vòng lặp qua trình tạo ___10_______54 một lần. Đặt tất cả lại với nhau và mã của bạn sẽ trông giống như thế này

def csv_reader(file_name):
    for row in open(file_name, "r"):
        yield row
0

Để tóm tắt điều này, trước tiên bạn tạo một biểu thức trình tạo

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
55 để tạo ra từng dòng trong một tệp. Tiếp theo, bạn lặp qua trình tạo đó trong định nghĩa của một biểu thức trình tạo khác có tên là
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
54, biến mỗi dòng thành một danh sách các giá trị. Sau đó, bạn tiếp tục lặp lại
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
54 chỉ một lần với
>>> a = range(5)
>>> list(a)
[0, 1, 2, 3, 4]
0 để nhận danh sách tên cột từ tệp CSV của bạn

Ghi chú. Coi chừng các dòng mới. Mã này tận dụng lợi thế của

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
64 trong biểu thức trình tạo
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
54 để đảm bảo không có ký tự dòng mới nào ở cuối, có thể xuất hiện trong tệp CSV

Để giúp bạn lọc và thực hiện các thao tác trên dữ liệu, bạn sẽ tạo từ điển trong đó các khóa là tên cột từ CSV

def csv_reader(file_name):
    for row in open(file_name, "r"):
        yield row
1

Biểu thức trình tạo này lặp qua các danh sách được tạo bởi

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
54. Sau đó, nó sử dụng
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
67 và
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
68 để tạo từ điển như đã chỉ định ở trên. Bây giờ, bạn sẽ sử dụng trình tạo thứ tư để lọc vòng tài trợ mà bạn muốn và kéo cả
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
69

def csv_reader(file_name):
    for row in open(file_name, "r"):
        yield row
2

Trong đoạn mã này, biểu thức trình tạo của bạn lặp lại thông qua các kết quả của

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
70 và lấy
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
69 cho bất kỳ
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
72 nào trong đó khóa
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
73 là
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
74

Hãy nhớ rằng, bạn không lặp lại tất cả những điều này cùng một lúc trong biểu thức trình tạo. Trên thực tế, bạn không lặp lại bất kỳ thứ gì cho đến khi bạn thực sự sử dụng vòng lặp

csv_gen = (row for row in open(file_name))
8 hoặc một hàm hoạt động trên các lần lặp, chẳng hạn như
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
76. Trên thực tế, hãy gọi
def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
76 ngay bây giờ để lặp qua các trình tạo

def csv_reader(file_name):
    for row in open(file_name, "r"):
        yield row
3

Đặt tất cả những thứ này lại với nhau, bạn sẽ tạo ra đoạn script sau

def csv_reader(file_name):
    for row in open(file_name, "r"):
        yield row
4

Tập lệnh này tập hợp mọi trình tạo mà bạn đã tạo và tất cả chúng đều hoạt động như một đường dẫn dữ liệu lớn. Đây là bảng phân tích từng dòng

  • Dòng 2 đọc trong mỗi dòng của tệp
  • Dòng 3 chia mỗi dòng thành các giá trị và đặt các giá trị vào danh sách
  • Dòng 4 sử dụng
    >>> a = range(5)
    >>> list(a)
    [0, 1, 2, 3, 4]
    
    0 để lưu trữ các tên cột trong danh sách
  • Dòng 5 tạo từ điển và hợp nhất chúng với lệnh gọi
    def csv_reader(file_name):
        file = open(file_name)
        result = file.read().split("\n")
        return result
    
    67
    • Các khóa là tên cột
      def csv_reader(file_name):
          file = open(file_name)
          result = file.read().split("\n")
          return result
      
      80 từ dòng 4
    • Các giá trị là các hàng ở dạng danh sách, được tạo ở dòng 3
  • Dòng 6 nhận số tiền tài trợ sê-ri A của mỗi công ty. Nó cũng lọc ra bất kỳ số tiền huy động nào khác
  • Dòng 11 bắt đầu quá trình lặp lại bằng cách gọi
    def csv_reader(file_name):
        file = open(file_name)
        result = file.read().split("\n")
        return result
    
    76 để nhận tổng số tiền tài trợ chuỗi A có trong CSV

Khi bạn chạy mã này vào ngày

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
56, bạn sẽ thấy tổng số tiền huy động được là $4.376.015.000 trong các vòng tài trợ sê-ri A

Ghi chú. Các phương pháp xử lý tệp CSV được phát triển trong hướng dẫn này rất quan trọng để hiểu cách sử dụng trình tạo và câu lệnh năng suất Python. Tuy nhiên, khi bạn làm việc với tệp CSV bằng Python, thay vào đó, bạn nên sử dụng mô-đun

def csv_reader(file_name):
    file = open(file_name)
    result = file.read().split("\n")
    return result
83 có trong thư viện chuẩn của Python. Mô-đun này có các phương pháp được tối ưu hóa để xử lý các tệp CSV một cách hiệu quả

Để tìm hiểu sâu hơn nữa, hãy thử tính số tiền trung bình huy động được cho mỗi công ty trong vòng sê-ri A. Đây là một chút phức tạp hơn, vì vậy đây là một số gợi ý

  • Máy phát điện tự cạn kiệt sau khi được lặp đi lặp lại đầy đủ
  • Bạn vẫn sẽ cần hàm
    def csv_reader(file_name):
        file = open(file_name)
        result = file.read().split("\n")
        return result
    
    76

Chúc may mắn

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

Phần kết luận

Trong hướng dẫn này, bạn đã học về các hàm trình tạo và biểu thức trình tạo

Bây giờ bạn biết

  • Cách sử dụng và viết các hàm trình tạo và biểu thức trình tạo
  • Làm thế nào câu lệnh năng suất Python cực kỳ quan trọng cho phép các trình tạo
  • Cách sử dụng nhiều câu lệnh lợi nhuận Python trong hàm tạo
  • Cách sử dụng
    >>> gen = infinite_sequence()
    >>> next(gen)
    0
    >>> next(gen)
    1
    >>> next(gen)
    2
    >>> next(gen)
    3
    
    9 để gửi dữ liệu đến trình tạo
  • Cách sử dụng
    def csv_reader(file_name):
        file = open(file_name)
        result = file.read().split("\n")
        return result
    
    00 để tăng ngoại lệ cho trình tạo
  • Cách sử dụng
    def csv_reader(file_name):
        file = open(file_name)
        result = file.read().split("\n")
        return result
    
    01 để dừng vòng lặp của trình tạo
  • Cách xây dựng đường ống trình tạo để xử lý hiệu quả các tệp CSV lớn

Bạn có thể lấy tập dữ liệu bạn đã sử dụng trong hướng dẫn này tại liên kết bên dưới

Tải xuống tập dữ liệu. Nhấp vào đây để tải xuống tập dữ liệu mà bạn sẽ sử dụng trong hướng dẫn này để tìm hiểu về trình tạo và năng suất trong Python

Máy phát điện đã giúp bạn như thế nào trong công việc hoặc dự án của bạn?

Đá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. Trình tạo Python 101

🐍 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

Tôi có nên sử dụng năng suất trong Python không?

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

Giới thiệu về Kyle Stratis

Tôi có nên sử dụng năng suất trong Python không?
Tôi có nên sử dụng năng suất trong Python không?

Kyle là một nhà phát triển tự học đang làm kỹ sư dữ liệu cấp cao tại Vizit Labs. Trong quá khứ, ông đã thành lập DanqEx (trước đây là Nasdanq. sàn giao dịch chứng khoán meme ban đầu) và Encryptid Gaming

» Thông tin thêm về Kyle


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à

Tôi có nên sử dụng năng suất trong Python không?

Aldren

Tôi có nên sử dụng năng suất trong Python không?

Geir Arne

Tôi có nên sử dụng năng suất trong Python không?

Jaya

Tôi có nên sử dụng năng suất trong Python không?

Joanna

Tôi có nên sử dụng năng suất trong Python không?

Mike

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

Năng suất Python có nhanh hơn không?

Hiệu suất sẽ tốt hơn nếu từ khóa lợi nhuận được sử dụng cho kích thước dữ liệu lớn . Rất nhiều bộ nhớ được sử dụng nếu kích thước dữ liệu lớn sẽ cản trở hiệu suất. Thời gian thực hiện nhanh hơn trong trường hợp năng suất cho kích thước dữ liệu lớn.

Mục đích của từ khóa năng suất trong Python là gì?

Từ khóa suất trong Python kiểm soát luồng của hàm tạo . Điều này tương tự như một câu lệnh trả về được sử dụng để trả về các giá trị trong Python.

Sản lượng có phải là một từ khóa hợp lệ trong Python không?

Có hai từ khóa Python được sử dụng để chỉ định những gì được trả về từ các hàm hoặc phương thức. lợi nhuận và năng suất .

Điều gì xảy ra sau khi trả Python?

yield trong Python có thể được sử dụng giống như câu lệnh return trong một hàm. Khi làm như vậy, hàm thay vì trả về đầu ra, nó trả về một trình tạo có thể được lặp lại khi . Sau đó, bạn có thể lặp qua trình tạo để trích xuất các mục. Việc lặp lại được thực hiện bằng cách sử dụng vòng lặp for hoặc đơn giản là sử dụng hàm next().