(đã trả lời 23 tháng 11, 10 lúc 19:48)
Tôi không thực sự là một Pythoner lớn - nhưng tôi đã tìm thấy cú pháp này một lần, quên từ đâu đến, vì vậy tôi nghĩ rằng tôi đã ghi lại nó:
nếu bạn sử dụng sys.stdout.write
thay vì print
( sự khác biệt, sys.stdout.write
lấy các đối số làm hàm, trong ngoặc đơn - trong khi print
không ), thì đối với một lớp lót, bạn có thể thoát khỏi việc đảo ngược thứ tự của lệnh và for
xóa dấu chấm phẩy, và đặt lệnh trong dấu ngoặc vuông, nghĩa là:
python -c "import sys; [sys.stdout.write('rob\n') for r in range(10)]"
Không biết cú pháp này sẽ được gọi như thế nào trong Python :)
Hi vọng điêu nay co ich,
Chúc mừng!
(EDIT Tue ngày 9 tháng 4 20:30:30 2013) Chà, tôi nghĩ rằng cuối cùng tôi đã tìm thấy những dấu ngoặc vuông này trong một lớp lót là gì; chúng là "danh sách hiểu" (rõ ràng); lưu ý đầu tiên này trong Python 2.7:
$ STR=abc
$ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); print a"
<generator object <genexpr> at 0xb771461c>
Vì vậy, lệnh trong ngoặc tròn / dấu ngoặc đơn được xem như là một "đối tượng trình tạo"; nếu chúng ta "lặp lại" thông qua nó bằng cách gọi next()
- thì lệnh bên trong dấu ngoặc đơn sẽ được thực thi (lưu ý "abc" trong đầu ra):
$ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); a.next() ; print a"
abc
<generator object <genexpr> at 0xb777b734>
Nếu bây giờ chúng ta sử dụng dấu ngoặc vuông - lưu ý rằng chúng ta không cần gọi next()
để thực thi lệnh, nó sẽ thực thi ngay khi được gán; tuy nhiên, kiểm tra sau đó cho thấy rằnga
được None
:
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; print a"
abc
[None]
Điều này không để lại nhiều thông tin cần tìm, đối với trường hợp dấu ngoặc vuông - nhưng tôi tình cờ thấy trang này mà tôi nghĩ giải thích:
Mẹo và thủ thuật Python - Phiên bản đầu tiên - Hướng dẫn Python | Dream.In.Code :
Nếu bạn nhớ lại, định dạng chuẩn của trình tạo dòng đơn là một loại vòng lặp 'cho' trong dấu ngoặc. Điều này sẽ tạo ra một đối tượng lặp lại 'một lần bắn', đó là một đối tượng bạn có thể lặp đi lặp lại chỉ theo một hướng và bạn không thể sử dụng lại một khi bạn đạt đến điểm cuối.
Một "mức độ hiểu danh sách" trông gần giống như một trình tạo một dòng thông thường, ngoại trừ các dấu ngoặc thông thường - () - được thay thế bằng dấu ngoặc vuông - []. Ưu điểm chính của sự hiểu biết toàn diện là tạo ra một 'danh sách', chứ không phải là một đối tượng có thể lặp lại 'một lần bắn', để bạn có thể qua lại, thêm các yếu tố, sắp xếp, v.v.
Và thực sự nó là một danh sách - đó chỉ là yếu tố đầu tiên của nó trở thành không có gì ngay khi nó được thực thi:
$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin].__class__"
abc
<type 'list'>
$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin][0]"
abc
None
Việc hiểu danh sách được ghi lại trong 5. Cấu trúc dữ liệu: 5.1.4. Danh sách hiểu - Tài liệu Python v2.7.4 là " Hiểu danh sách cung cấp một cách ngắn gọn để tạo danh sách"; có lẽ, đó là nơi mà "khả năng thực thi" của các danh sách được phát huy trong một lớp lót.
Chà, hy vọng tôi không quá kinh khủng ở đây ...
EDIT2: và đây là dòng lệnh một lớp với hai vòng lặp không lồng nhau; cả hai được đặt trong dấu ngoặc vuông "hiểu danh sách":
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; b=[sys.stdout.write(str(x)) for x in range(2)] ; print a ; print b"
abc
01[None]
[None, None]
Lưu ý rằng "danh sách" thứ hai b
bây giờ có hai phần tử, vì vòng lặp for của nó được chạy rõ ràng hai lần; tuy nhiên, kết quả của sys.stdout.write()
cả hai trường hợp là (rõ ràng) None
.