Learning Python Part II 之 Print

pass

Python3.X的print函数

严格来讲,printing在Python3.X中并不是一个单独的语句,而是之前所说的表达式语句。
print内置函数通常单独一行调用,因为它不返回任何值(严格来讲是返回None)。但因为它是函数,我们使用标准的函数调用语法而不是特殊的语句格式。并且因为它通过关键词参数提供特殊的操作模式,所以这种形式更通用和以后的拓展。

调用格式

print([object, ...][, sep=' '][, end='\n'][, file=sys.stdout][, flush=False])
  • sep是插入在每个对象之间的字符串,默认是空格;传入空字符串会将所有对象压缩到一起。
  • end是追加到打印字符串末尾的字符串,默认是换行符 \n ;传入空字符串会取消换行
  • file指定要将字符串打印到目标文件,标准流或类文件对象。默认是sys.stdout标准输出流
  • flush,在3.3时添加,默认False;它为True时会强制把缓存区的内容写入到待接收文件中。

举例

>>> print()  #打印空行
>>> x = 'spam'
>>> y = 99
>>> z = ['eggs']
>>> print(x,y,z)
spam 99 ['eggs']
>>> print(x,y,z, sep='')   #文本间插入字符
spam99['eggs']
>>> print(x, y, z, sep= ',')
spam,99,['eggs']
>>> 
>>> print(x, y, z, end='')   #结尾追加字符
spam 99 ['eggs']>>> 
>>> print(x, y, z, end=''); print(x, y, z)
spam 99 ['eggs']spam 99 ['eggs']
>>> print(x, y, z, end='...\n')
spam 99 ['eggs']...
>>> print(x, y, z, sep='...', end='!\n')
spam...99...['eggs']!
>>> print(x, y, z, end='!\n', sep='...')
spam...99...['eggs']!
>>> print(x, y, z, sep='...', file=open('data.txt', 'w')) #向文件中输出字符
>>> print(x, y, z)
spam 99 ['eggs']
>>> print(open('data.txt').read())
spam...99...['eggs']

最后铭记这几种参数只是提供了方便,如果你需要特定的格式,请提前使用字符串格式化。例如:

>>> text = '%s: %-.4f, %05d' % ('Result', 3.14159, 42)
>>> print(text)
Result: 3.1416, 00042
>>> print('%s: %-.4f, %05d' % ('Result', 3.14159, 42))
Result: 3.1416, 00042

Python2.X的print语句

在2.x中printing使用独特的语法而不是调用内建函数

语句格式

这里写图片描述

举例

>>> x = 'a'
>>> y = 'b'
>>> print x, y
a b
>>> print x, y,; print x, y
a b a b
>>> print x + y
ab
>>> print '%s...%s' % (x, y)
a...b

print流重定向

Python中的’hello world’

>>> print('hello world')  #3.x
hello world
>>> print 'hello world'   #2.x
hello world
>>> 'hello world'   #直接输出
'hello world'

这几个程序一点也不神秘,但却能完成打印操作。事实上,print操作只是Python中众多人体工学特性的一角——它提供了sys,stdout对象的简便接口,并且带有一些默认格式。如果你想更麻烦一点也可以用这种方法:

>>> import sys
>>> sys.stdout.write('hello world\n')
hello world

流重定向

 print(X, Y)

import sys
sys.stdout.write(str(X) + ' ' + str(Y) + '\n')

是等价的,后者能帮助我们理解print操作是如何做的,在理解了之后我们可以重定向sys.stdout到区别于标准输出流的不同的地方。换句话说,这提供了一种方法print操作把文本送到其他地方,例如:

import sys
sys.stdout = open('log.txt', 'a') #重定向到一个文件
...
print(x, y, x)

重定向之后,print之后所有的操作都会将内容输出到log文本中。print会调用sys.stdoutwrite方法,而sys.stdout是指向文件对象的。

但这会遇到一个问题,当重定向之后,会失去的流方向,所以我们可以提前储存以便以后恢复:

>>> import sys
>>> temp = sys.stdout
>>> sys.stdout = open('log.txt', 'a')
>>> print('spam')
>>> print(1, 2, 3)
>>> sys.stdout.close()
>>> sys.stdout = temp
>>> print('back here')
back here
>>> print(open('log.txt').read())
spam
1 2 3

在Python中print也提供了一种方法临时重定向sys.stdout,普通的print会直接切换到原始的输出流。例如:

#3.X
log = open('log.txt', 'a')
print(x, y, z, file=log)
print(a, b, c)
#2.X
log = open('log.txt', 'a')
print >> log, x, y, z
print a, b, c

这种方法很方便但要确定传递的是文件对象。
这种拓展形式的print也用来输出error信息到error

>>> import sys
>>> sys.stderr.write(('Bad!' * 8) + '\n')
Bad!Bad!Bad!Bad!Bad!Bad!Bad!Bad!
>>> print('Bad!' * 8, file=sys.stderr)
Bad!Bad!Bad!Bad!Bad!Bad!Bad!Bad!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章