การพิมพ์โดยไม่ขึ้นบรรทัดใหม่ (พิมพ์ 'a',) พิมพ์ช่องว่างวิธีการลบ?


124

ฉันมีรหัสนี้:

>>> for i in xrange(20):
...     print 'a',
... 
a a a a a a a a a a a a a a a a a a a a

ฉันต้องการส่งออก'a'โดยไม่มี' 'สิ่งนี้:

aaaaaaaaaaaaaaaaaaaa

เป็นไปได้ไหม?


4
"".join("a" for i in xrange(20))ฉันประหลาดใจว่าไม่มีใครที่ยังไม่ได้กล่าวถึง (มีความยืดหยุ่นมากกว่าการทำเพียง"a" * 20อย่างเดียวเนื่องจากฉันคิดว่าเป็นตัวอย่างที่เรียบง่าย)
Thomas K

คำตอบ:


131

มีหลายวิธีในการบรรลุผลลัพธ์ของคุณ หากคุณแค่ต้องการคำตอบสำหรับกรณีของคุณให้ใช้การคูณสตริงตามที่@Antกล่าวถึง สิ่งนี้จะได้ผลก็ต่อเมื่อแต่ละprintคำสั่งของคุณพิมพ์สตริงเดียวกัน โปรดทราบว่ามันใช้ได้กับการคูณสตริงความยาวใด ๆ (เช่น'foo' * 20งาน)

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

หากคุณต้องการทำสิ่งนี้โดยทั่วไปให้สร้างสตริงแล้วพิมพ์ครั้งเดียว การดำเนินการนี้จะใช้หน่วยความจำเล็กน้อยสำหรับสตริง แต่จะโทรไปที่เพียงครั้งเดียวprintเท่านั้น โปรดทราบว่าการต่อสตริงที่ใช้ใน+=ขณะนี้เป็นแบบเชิงเส้นในขนาดของสตริงที่คุณเชื่อมต่อดังนั้นสิ่งนี้จะรวดเร็ว

>>> for i in xrange(20):
...     s += 'a'
... 
>>> print s
aaaaaaaaaaaaaaaaaaaa

หรือคุณสามารถทำมันขึ้นโดยตรงโดยใช้sys.stdout เขียน ()ซึ่งprintเป็นกระดาษห่อหุ้ม สิ่งนี้จะเขียนเฉพาะสตริงดิบที่คุณระบุโดยไม่มีการจัดรูปแบบใด ๆ โปรดทราบว่าจะไม่มีการพิมพ์ขึ้นบรรทัดใหม่เมื่อสิ้นสุด 20 aวินาที

>>> import sys
>>> for i in xrange(20):
...     sys.stdout.write('a')
... 
aaaaaaaaaaaaaaaaaaaa>>> 

Python 3 เปลี่ยนprintคำสั่งเป็นฟังก์ชัน print ()ซึ่งให้คุณตั้งค่าendพารามิเตอร์ คุณสามารถใช้ใน> = 2.6 โดยการนำเข้าจาก__future__. ฉันจะหลีกเลี่ยงสิ่งนี้ในรหัส 2.x ที่ร้ายแรงเนื่องจากจะทำให้สับสนเล็กน้อยสำหรับผู้ที่ไม่เคยใช้ 3.x อย่างไรก็ตามควรให้คุณได้ลิ้มรสความดีบางอย่างที่ 3.x นำมา

>>> from __future__ import print_function
>>> for i in xrange(20):
...     print('a', end='')
... 
aaaaaaaaaaaaaaaaaaaa>>> 

4
@AAI อ่านคำถามเมื่อมีคำตอบการคูณสตริงและคิดว่าฉันจะให้ภาพรวมของตัวเลือกต่างๆ คนอื่น ๆ มาในขณะที่ฉันรวบรวมคำตอบของฉัน หลังจากนั้นไม่นานก็ได้รับการยอมรับไม่เช่นนั้นฉันน่าจะลบทิ้ง
moinudin

10
-1 อย่าสร้างสตริงโดยการต่อกัน มันคือ O (n ^ 2) แทน O (n) ใช้"".join(...)แทน
Katriel

10
ฉันไม่มีปัญหากับคำตอบของคุณมันสรุปทุกอย่างและนั่นก็ดี แต่การทำเช่นนี้ทำให้คุณกีดกันคนอื่นที่ตอบ มีคำตอบที่ดีมากมายและสมควรได้รับ +1 ลองนึกดูว่าถ้าทุกคนเริ่มทำสรุป
user225312

3
@katrielalex: มันสำคัญหรือไม่? OP ได้ขอการเพิ่มประสิทธิภาพหรือความซับซ้อนหรือไม่? และมันจะสำคัญสำหรับ 20 สายหรือไม่? มาเถอะคุณต้องล้อเล่นอย่างจริงจัง
user225312

1
@katrielalex ผิดการต่อสายอักขระโดยใช้+=ใน Python เป็นการดำเนินการเวลาคงที่สำหรับการต่ออักขระเดี่ยว
moinudin

119

จากPEP 3105: พิมพ์เป็นฟังก์ชันในเอกสารมีอะไรใหม่ใน Python 2.6 :

>>> from __future__ import print_function
>>> print('a', end='')

เห็นได้ชัดว่าใช้งานได้กับ python 3.0 หรือสูงกว่าเท่านั้น (หรือ 2.6+ กับ a from __future__ import print_functionที่จุดเริ่มต้น) printคำสั่งที่ถูกถอดออกและกลายเป็นprint()ฟังก์ชั่นโดยเริ่มต้นในหลาม 3.0


41

คุณสามารถระงับช่องว่างโดยการพิมพ์สตริงว่างเพื่อ stdout ระหว่างprintคำสั่ง

>>> import sys
>>> for i in range(20):
...   print 'a',
...   sys.stdout.write('')
... 
aaaaaaaaaaaaaaaaaaaa

อย่างไรก็ตามวิธีแก้ปัญหาที่สะอาดกว่าคือสร้างสตริงทั้งหมดที่คุณต้องการพิมพ์ก่อนแล้วจึงส่งออกด้วยprintคำสั่งเดียว


4
@Soulseekah: ใช่การใช้อย่างเดียวsys.stdout.write()จะสะดวกกว่าในกรณีนี้ อย่างไรก็ตามฉันต้องการแสดงให้เห็นว่าการเขียนสตริงว่างไปยัง stdout ยับยั้งช่องว่างระหว่างองค์ประกอบที่เขียนโดยใช้printซึ่งอาจมีประโยชน์ในสถานการณ์ที่คล้ายคลึงกัน
Pär Wieslander


30

Python 3.x:

for i in range(20):
    print('a', end='')

Python 2.6 หรือ 2.7:

from __future__ import print_function
for i in xrange(20):
    print('a', end='')

10

หากคุณต้องการให้แสดงทีละรายการคุณสามารถทำได้:

import time
import sys
for i in range(20):
    sys.stdout.write('a')
    sys.stdout.flush()
    time.sleep(0.5)

sys.stdout.flush() จำเป็นต้องบังคับให้เขียนอักขระทุกครั้งที่มีการรันลูป


7

เช่นเดียวกับหมายเหตุด้านข้าง:

การพิมพ์คือ O (1) แต่การสร้างสตริงแล้วการพิมพ์คือ O (n) โดยที่ n คือจำนวนอักขระทั้งหมดในสตริง ใช่แล้วแม้ว่าการสร้างสตริงจะ "สะอาดกว่า" แต่ก็ไม่ใช่วิธีที่มีประสิทธิภาพที่สุดในการทำเช่นนั้น

วิธีที่ฉันจะทำมีดังนี้:

from sys import stdout
printf = stdout.write

ตอนนี้คุณมี "ฟังก์ชันการพิมพ์" ที่พิมพ์สตริงใด ๆ ที่คุณให้ไว้โดยไม่ต้องส่งอักขระบรรทัดใหม่ทุกครั้ง

printf("Hello,")
printf("World!")

ผลลัพธ์จะเป็น: สวัสดีชาวโลก!

อย่างไรก็ตามหากคุณต้องการพิมพ์จำนวนเต็มจำนวนทศนิยมหรือค่าอื่น ๆ ที่ไม่ใช่สตริงคุณจะต้องแปลงเป็นสตริงด้วยฟังก์ชัน str ()

printf(str(2) + " " + str(4))

ผลลัพธ์จะเป็น: 2 4


คุณบอกว่าฉันสามารถส่งออกข้อความจำนวนไม่ จำกัด ในเวลาเดียวกับการส่งออกอักขระหนึ่งตัวได้หรือไม่?
ctrl-alt-delor

เมื่อฉันกำหนด printf ใหม่เป็น stdout.write stdout.write ของฉันดูเหมือนว่าจะพิมพ์จำนวนชาร์ตแทคเตอร์ที่สตริงคือ: "สวัสดี 6" ให้อะไร? เกิดอะไรขึ้น? แล้วฉันจะหยุดมันได้อย่างไร?
ทอม

1
นอกจากนี้คุณสามารถอธิบายความหมายของ O (1) O (n) ได้หรือไม่? ฉันไม่เข้าใจว่าหมายถึงอะไร
ทอม

@ ทอมมันหมายถึงความซับซ้อน (สัญกรณ์ O ขนาดใหญ่) เพื่อสะท้อนต้นทุนของการดำเนินการ O (1) คือเวลาคงที่ - ในอุดมคติ - และ O (n) คือเวลาเชิงเส้น - โอเคแต่แพงเกินไปสำหรับบางสิ่งที่เรียบง่าย แม้ว่าสำหรับเรื่องเล็ก ๆ น้อย ๆ เวลาที่คุณใช้สมองเพื่อกังวลกับสิ่งเหล่านี้จะเป็นการสิ้นเปลืองในเชิงคำนวณมากกว่าการใช้การต่อสตริง
Benjamin R

6

ไม่ว่าจะเป็นสิ่งที่Ant พูดหรือสะสมเป็นสตริงจากนั้นพิมพ์ครั้งเดียว:

s = '';
for i in xrange(20):
    s += 'a'
print s


3

มันง่ายมาก

สำหรับเวอร์ชัน python 3+ คุณจะต้องเขียนโค้ดต่อไปนี้เท่านั้น

for i in range(20):
      print('a',end='')

เพียงแค่แปลงลูปเป็นรหัสต่อไปนี้คุณไม่ต้องกังวลเรื่องอื่น ๆ


2

ว้าว!!!

เมื่อนานมาแล้ว

ตอนนี้ในpython 3.xมันจะค่อนข้างง่าย

รหัส:

for i in range(20):
      print('a',end='') # here end variable will clarify what you want in 
                        # end of the code

เอาท์พุท:

aaaaaaaaaaaaaaaaaaaa 

ข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชัน print ()

print(value1,value2,value3,sep='-',end='\n',file=sys.stdout,flush=False)

ที่นี่ :

value1,value2,value3

คุณสามารถพิมพ์หลายค่าโดยใช้ลูกน้ำ

sep = '-'

3 ค่าจะถูกคั่นด้วยอักขระ "-"

คุณสามารถใช้อักขระใดก็ได้แทนสตริงนั้นเช่น sep = '@' หรือ sep = 'good'

end='\n'

ตามค่าเริ่มต้นของฟังก์ชันการพิมพ์จะใส่อักขระ '\ n' ที่ส่วนท้ายของเอาต์พุต

แต่คุณสามารถใช้อักขระหรือสตริงใดก็ได้โดยเปลี่ยนค่า end variale

เช่น end = '$' หรือ end = '.' หรือ end = 'สวัสดี'

file=sys.stdout

นี่คือค่าดีฟอลต์เอาต์พุตมาตรฐานของระบบ

การใช้อาร์กิวเมนต์นี้คุณสามารถสร้างสตรีมไฟล์เอาต์พุตเช่น

print("I am a Programmer", file=open("output.txt", "w"))

ด้วยรหัสนี้คุณจะสร้างไฟล์ชื่อoutput.txtที่ซึ่งผลลัพธ์ของคุณ ฉันเป็นโปรแกรมเมอร์จะถูกเก็บไว้

flush = False

เป็นค่าเริ่มต้นโดยใช้flush = Trueคุณสามารถบังคับให้ล้างสตรีมได้


2

ง่ายอย่างนั้น

def printSleeping():
     sleep = "I'm sleeping"
     v = ""
     for i in sleep:
         v += i
         system('cls')
         print v
         time.sleep(0.02)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.