인쇄

2016-11-05 6 views
2

저는 현재 코드가인쇄

My name is Bob in green and my friend's name is Jeff in red. 

을 그리고 출력에 단어 Bob은 녹색이고 Jeff은 빨간색입니다. 난 그냥 shell.write("Bob", "STRING") 일을 입력하는 것을 알고

My name is ('Bob', 'STRING') in green and my friend's name is ('Jeff', 'KEYWORD') in red 

하지만 색상에서 더 많은 일을 인쇄해야하는 경우 그 코드의 너무 많은 라인을 차지 : 내가 노력 코드는 단순히의 출력을 제공하지만

.

는 또한

my_name = shell.write("Bob", "STRING") 

을하려고 노력하지만 때 그냥

3 내가 출력을 달성하는 방법에 대한 대답을해야하고,

를 인쇄 할 때 또한 3 출력 이유를 출력하는 것을 인쇄

my_name = shell.write("Bob", "STRING")

나는 이상하게도 왜 'B obby '는 위에서 정의 된대로 녹색으로 표시됩니다.

PS. 나는 파이썬과 함께 윈도우 머신에있다. 3.4.3

+0

'my_name = shell.write ("밥", "STRING")는'3을 제공합니다 쓴 문자 수 ("Bob"은 3 자) – cdarke

+0

Oh ok 그렇다면'my_name = shell.write ("Bobby", "STRING")를 사용하면 5가 반환 될 것입니다. @cdarke –

+0

또한 이렇게 정의하면 바비가 녹색으로 인쇄됩니다. 나는 아무 것도 인쇄 해달라고 요청하지 않았다. –

답변

1

여기에 그 방법이있다.

import sys 

def shell_print(txt, *args): 

    out = txt.split("%s") 
    # vars = [*args]  # See comments 
    vars = list(args) 
    for t in out: 
     sys.stdout.shell.write(t) 
     if vars: 
      v = vars.pop(0) 
      sys.stdout.shell.write(*v) 

my_name = ("Bob", "STRING") 
friends_name = ("Jeff", "KEYWORD") 
question = "My name is %s in green and my friend's name is %s in red" 

shell_print(question, my_name, friends_name) 

그것은 단지 QAD (신속하고 더러운) 솔루션을, 그리고 단지 "%s" 함께하지만, 그 시작. 첫 번째 매개 변수는 %s 자리 표시자를 포함하는 문자열이며, 다음 매개 변수 (그 수에 관계없이)는 해당 속성이 포함 된 변수를 삽입합니다.

편집 :

["My name is ", "in green and my friend's name is", "in red"] 
: 기본 원리는 먼저 우리가 (예에서)이 같은 목록 ( out)를 txt에 문자열을하고 %s 년대 주위를 분할, 그래서 우리가 함께 남아있는 것입니다

그런 다음이 목록을 반복 (반복)합니다. out의 다음 요소를 작성한 후 args의 첫 번째 요소 인 튜플을 봅니다. 하나가 있다고 가정하면이 두 튜플 요소를 write()에 전달합니다.

sys.stdout.shell.write(*v) 

* 다음은 두 개의 인수를 전달합니다 v라는 튜플의 두 요소가있는 경우 는, 즉,을 풀고 않습니다.

args을 목록으로 변환하여 pop() 요소를 사용할 수 있습니다. pop(0) 메서드는 목록에서 요소를 제거하여 제거한 요소를 반환합니다. 따라서 루프를 돌 때마다 항상 목록의 첫 번째 요소를 얻습니다.

그건 그렇고, 우리는 목록의 앞쪽에서 "터지기"때문에 (그것은 0입니다.) 비효율적입니다 (끝에서 튀어 나오는 것이 더 효율적입니다). 그러나 목록은 작아서 큰 문제는 아닙니다.

2 편집 :

개선 된 버전, 추가 테스트를 포함 :()는`을 돌려 쓰기 '때문에

import sys 

def shell_print(txt, *args): 
    shell = sys.stdout.shell 
    out = txt.split("%s") 
    argc = len(args) 

    for i, t in enumerate(out): 
     shell.write(t) 
     if i < argc: 
      sargs = (str(args[i][0]), args[i][1]) 
      shell.write(*sargs) 

my_name = ("Bob", "STRING") 
friends_name = ("Jeff", "KEYWORD") 
question = "My name is %s in green and my friend's name is %s in red\n" 
shell_print(question, my_name, friends_name) 

# Test all tags 
valid_tags = {"COMMENT","KEYWORD","BUILTIN","STRING","DEFINITION","SYNC", 
       "TODO","ERROR"} 
for tag in valid_tags: 
    shell_print("\n", (tag, tag)) 

# Other types 
my_num = (1234, "STRING") 
my_float = (3.142, "COMMENT") 

text = "\nMy number: %s, My float: %s\n" 
shell_print(text, my_num, my_float) 
+0

Hmmm 그냥 오류 –

+0

와 vars = [* args] 비트가 있다고 말합니다 –

+0

어떤 버전의 파이썬입니까? 오류가 무엇입니까? – cdarke