2.python:从print说到自省

print是一个函数

  为什么print是一个函数呢?可以在交互式解释器下

输入:

>>>type(print)

输出:

<class 'builtin_function_or_method'>

  这句话的意思是说,print的类型是一个内建的函数或方法,class只是起指示作用,与类定义时的class作用不同,而'builtin_function_or_method'是一段描述性文本,不需要在意其中的下划线,我相信它仅仅是python想输出的一段文本而已,有无这下划线并不妨碍说明print是一个函数。

如何使用print函数

  可以在交互式解释器下

输入:

>>>print.__doc__

输出:

"print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n\nPrints the values to a stream, 
or to sys.stdout by default.\nOptional keyword arguments:\nfile:  a file-like object (stream); 
defaults to the current sys.stdout.\nsep:   string inserted between values, default a space.\nend:   
string appended after the last value, default a newline.\nflush: whether to forcibly flush the stream."

  从这段文档来看,要使用print函数,就应该如同文档所给出的那种形式:print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False),可以看到其中非常可能变化的参数是"value,...,",而不需要变化的参数是sep和它后面的参数(默认参数)。如果想要改变打印的方式,就需要改变这些默认参数。代码如下:

1 .value, ...,

>>> print('a')                      # 打印单个字符串,其他参数默认
a
>>> print('a', 'b', 'c')            # 打印多个字符串
a b c

2 .sep

>>> print('a', 'b', 'c', sep=',')   # 用逗号将结果隔开
a,b,c

3 .end

新建.py文件,保存运行
输入:

print('hello,')                     # 打印结束默认换行
print('world!')

输出:

hello,
world!

新建.py文件,保存运行

扫描二维码关注公众号,回复: 3961317 查看本文章

输入:

print('hell,', end='***')           # 打印结束不换行而是加三颗星*
print('world!')

输出:

hell,***world!

4 .file

输入

with open(r'D:\python36\print_file.txt', 'w') as f:
    print('a', 'b', 'c', file=f)    

  如果不改变file参数默认值,print直接是显示在解释器上,因为sys.stdout指向控制台,所以sys.stdout是print默认的输出格式(sys本文不扯),如果改变了file参数,如上面代码那样这时屏幕上就不会再显示a b c,而是写在刚刚新建的(如果原先没有这个文件就会新建这个文件)文件中。

5 .flush=False

  从flush参数的值可以看出,flush=False/True,表示是否立刻将输出语句输入到参数file指向的对象中(默认是sys.stdout)

输入

>>> f=open(r'print_flush.txt', 'w')
>>> print('a', 'b', 'c', file=f)  
# 此时,txt文件没有任何东西写入,print的内容存在内存中,直到文件关闭,输出到txt中输入

>>> f=open(r'print_flush.txt', 'w')
>>> print('a', 'b', 'c', file=f, flush=True)   # 此时,txt文件已经写入a b c

  先不管为何先存到内存中,以后再写。更详细了解可以参考python中文文档

6 .print函数返回了什么?

  既然是一个函数,无论如何,返回值是最重要的,最终还是要看结果嘛,默认情况下,print函数将值(即values)打印到流或sys.stdout,。

print的属性

  python中要查看一个对象的属性,可以用dir()函数,

输入:

dir(print)

输出:

['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '
__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', 
'__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', 
'__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__text_signature__']

  dir函数返回传递给它的任何对象的属性名称经过排序的列表,这里的属性很丰富,注意到这些属性都是以双下划线开始和结束,在python中这有特殊的意义它代表一些特殊的方法,方法也是属性,这里主要说下__str__和__repr__

1 .__str__

  既然__str__是print的一个属性,那么我们就可以通过他的"对象"+."属性"的形式去查看这个属性到底是什么东西__doc__属性查看这个对象的注释,

输入:

>>>print.__str__

输出:

<method-wrapper '__str__' of builtin_function_or_method object at 0x005A0120>

  顺手牵羊输入>>>print.__str__,结果也是如同上面那样,这说明了__str__和__repr__都是print的一个封装方法,它们所在的内存地址是一样的!

接着输入:

>>> print.__str__.__doc__

输出:

'Return str(self).'

  str()是什么?是python的一个内置类型!

继续输入:

>>> type(str())
<class 'str'>   #输出
>>> type(str)
<class 'type'>  # 输出

  没错,按照python文档,str()是一个内置类型,其形式如下:

class str(object='')
class str(object=b'', encoding='utf-8', errors='strict')

  那么str()返回的是什么?——返回object的字符串版本。如下:

输入:

>>> str('a')
'a'             #输出
>>> str(1)
'1'

2.__repr__

同理所得:

>>> print.__repr__
<method-wrapper '__repr__' of builtin_function_or_method object at 0x005A0120>
>>> print.__repr__.__doc__
'Return repr(self).'
>>> repr('a')
"'a'"
>>> repr(1)
'1'

repr()返回了什么?repr(object)返回一个包含对象可打印表示的字符串。对于许多类型,此函数尝试返回一个字符串,该字符串在传递给eval()时会产生一个具有相同值的对象,否则该表示是一个用尖括号括起来的字符串,其中包含名称该对象的类型以及经常包括该对象的名称和地址的附加信息。一个类可以通过定义一个__repr__()方法来控制该函数为其实例返回的内容。

引号去了哪儿?

>>> print('hello, world!')
hello, world!

  无论是在交互式解释器运行,还是在程序中运行,print('hello, world!')都没有出现引号,那么引号去了哪里?
  实际上,前面已经讨论过print函数的返回结果是什么,print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)返回的结果就是values,即((value, ...),那么问题就剩下这value到底包不包含引号呢?答案是否定的,引号只是标明了这个value是一个字符串,并不是字符串的一部分!可以很容易验证,比如len('abc')的结果是3而不是5

>>> len('abc')
3

为何引号又出现了?

>>> a='b'
>>> a
'b'
>>> print(a)
b

  print函数直接将a打印出来,它是不包含引号的,据说print语句使用str()函数显示对象,交互解释器调用repr()函数来显示对象,但我无法通过python自省等方式得知。

最后的最后

  最后的最后,能安利一波最好了!没错,我就是要安利python的自省机制,这里给出安利的链接python自省指南,为啥不在开头给出?因为无论如何,至少到最后能给大家安排上车,就算读到最后还是不知道笔者在扯啥!

猜你喜欢

转载自www.cnblogs.com/ydkh/p/9913097.html
今日推荐