(11 : 23 23 '10 at 19:48)
나는 실제로 큰 Pythoner는 아니지만-이 구문을 한 번 발견했는데 어디서 왔는지 잊었으므로 문서화 할 것이라고 생각했습니다.
sys.stdout.write
대신 차이점 을 사용하면 print
( 괄호 안에 인수를 함수로 사용하지만 인수는 사용 하지 않음 ) 한 줄짜리 명령의 경우 명령 순서를 반전 하고 세미콜론을 제거하면됩니다. 명령을 대괄호로 묶습니다.sys.stdout.write
print
for
python -c "import sys; [sys.stdout.write('rob\n') for r in range(10)]"
이 구문이 파이썬에서 어떻게 호출되는지 모릅니다. :)
도움이 되었기를 바랍니다,
건배!
(편집 화요일 4 월 9 일 20시 57 분 30 초) 글쎄, 나는 마침내 한 줄짜리에있는 대괄호가 무엇인지 발견했다고 생각합니다. 그들은 "목록 이해력"(명백히)입니다; 먼저 파이썬 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>
따라서 대괄호 / 괄호 안의 명령은 "제너레이터 객체"로 간주됩니다. 만약 우리가 이것을 호출하여 그것을 "반복"한다면 next()
-괄호 안의 명령이 실행될 것이다 (출력에서 "abc"를 주목하라) :
$ 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>
이제 대괄호를 사용 next()
하면 명령을 실행하기 위해 호출 할 필요가 없으므로 할당 즉시 실행됩니다. 그러나 나중에 검사 결과 a
는 None
다음과 같습니다.
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; print a"
abc
[None]
이것은 대괄호의 경우에 대한 정보를 많이 남기지 않지만-나는이 페이지를 우연히 발견했다고 설명합니다.
파이썬 팁과 트릭 – 초판-Python Tutorials | 드림 인 코드 :
리콜하면 단일 라인 생성기의 표준 형식은 괄호 안에있는 한 줄의 'for'루프입니다. 이렇게하면 한 방향으로 만 반복 할 수 있고 끝까지 도달 한 후에는 재사용 할 수없는 '원샷'반복 가능 객체가 생성됩니다.
'목록 이해력'은 일반 괄호 ()가 대괄호 ([])로 대체된다는 점을 제외하면 일반 한 줄 생성기와 거의 같습니다. alist 이해의 주요 이점은 'one-shot'반복 가능한 객체가 아닌 'list'를 생성하여 앞뒤로 이동하고 요소를 추가하고 정렬하는 등의 작업을 수행 할 수 있다는 것입니다.
그리고 실제로 목록입니다. 실행되는 즉시 첫 번째 요소가 없습니다.
$ 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
리스트 이해는 5에 기술 되어있다 . 자료 구조 : 5.1.4. 리스트 이해 — 파이썬 v2.7.4 문서 "리스트 이해는리스트를 생성하는 간결한 방법을 제공합니다"; 아마도,리스트의 제한된 "실행 가능성"이 한 줄짜리에서 실행되는 곳일 것입니다.
글쎄, 내가 여기서 너무 많이 표시되지 않기를 바랍니다.
EDIT2 : 여기에 두 개의 중첩되지 않은 for 루프가있는 한 줄짜리 명령 줄이 있습니다. 둘 다 "목록 이해"대괄호 안에 들어 있습니다 :
$ 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]
두 번째 "목록" b
에는 for 루프가 명시 적으로 두 번 실행되었으므로 이제 두 개의 요소가 있습니다. 그러나 sys.stdout.write()
두 경우 의 결과 는 (분명히) None
였습니다.