python中的字符输出(str()、repr()、print)

一、字符输出的三种函数
str()、repr()、print
开发环境为python2.7
我们常常会遇到字符输出和转换问题,一个看似简单的字符问题却往往让我们殚精竭虑。其实只要真的理解了,python的字符输出转换规则,这些问题再也不是问题了。

二、实战
简单的交互输出

    >>> 'hello'
    'hello'
    >>> print 'hello'
    hello
    >>> '你好'
    '\xc4\xe3\xba\xc3'
    >>> print '你好'
    你好

变量是英文的话不管直接输入还是print结果都一样。但是变量是中文的话直接输入变量和print变量会显示不一样的东西呢?因为python 2是绝对英文友好的。中文对于它来说,只存储为一串编码而不是原文。

话说回来,为什么’你好’和print ‘你好’结果会不一样呢?

在查看print官方文档时发现,在python里面print是一个非常厉害的小家伙:它能把几乎任何常见类型的对象打印成一串文字,甚至包括列表、字典、元组等等。这在别的语言里是不可理解的,所以给从其他语言转过来的人埋了个大坑。

总结:Python中出现的任何中文,虽然我们在编辑器里看到的是中文,但是背地里全是一串编码。千万不要轻易信任print!print xx给你显示出来的,其实并不是xx的真实面貌!

至于这个编码是什么格式,unicode还是utf-8之类,一会再说。

Python中的str()和repr()原生函数

好多人都知道str()能把123数字转成字符串,python里的str()甚至还能把列表、字典等对象转成字符串。这都好理解,可是一旦把str()和repr()放在一起,大家就全都不淡定了-_-!
来看一段代码,仍是在IDLE里交互:

>>> str('hello')
'hello'
>>> repr('hello')
"'hello'"

>>> str('你好')
'\xc4\xe3\xba\xc3'
>>> repr('你好')
"'\\xc4\\xe3\\xba\\xc3'"

先看前两句:英文的’hello’在str()后仍是’hello’,可是在repr()后就变成了“‘hello’”。这就说明,str()返回的就是字符串本身,而repr()虽然返回的也是字符串,但它是一个标准字符串,官方解释比较绕,我来解释下吧。repr是representation及描述的意思,不是对人的描述,而是对python机器的描述,也就是它会将某物返回一个它在python中的描述。说人话:repr(obj)告诉我们obj这个变量在背地里是什么样子,在背地里是怎么被python处理被python”玩弄”的。
在python里,我们总会被眼睛欺骗。编辑器里显示的东西,并不总是它原本的面貌。python为了方便,总是表面上一套,背地里又一套。
再来理解后两句:中文的’你好’在str()后变成了编码’\xc4\xe3\xba\xc3’,在repr()后变成了”’\xc4\xe3\xba\xc3’”。都加上了转移符变成\,相当于把字符串中的内容都“标准化”了。至于'变成"只是为了说明repr()返回的是一个经过处理的新字符串。

print后的str()和repr()

来看代码:

>>> print str('你好')
你好
>>> print repr('你好')
'\xc4\xe3\xba\xc3'

之前str(‘你好’)显示的是’\xc4\xe3\xba\xc3’,而一经过print,就变成了正确的’你好’。上面说过了,命令行里直接输入一个变量,显示的是它在python后台存储的数据;而用print出来的东西,会显出出尽量友好、让人能看懂的东西。
理解了这个,对print这两个结果的不同,也就全然理解了。然后也就放弃print作为考据的心了。

另外,以上代码的交互,再windows系统cmd中,结果是一样的。

这样一来,python对字符串的基本理解就差不多了。这篇文章里尽量避免了对各种code编码的讨论,如unicode, ascii, ANSI, UTF-8, GB2312, GBK等等,是因为太复杂了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python,类的特殊方法`__repr__`和`__str__`都是用来返回对象的字符串表示形式,但是它们的用途和输出方式略有不同。 `__repr__`方法的作用是返回一个对象的“官方”字符串表示形式,通常包含足够的信息以便于重建该对象。在交互式环境,直接输入对象名称并执行时,会自动调用该对象的`__repr__`方法。例如: ```python class Person: def __init__(self, name, age): self.name = name self.age = age def __repr__(self): return f"Person('{self.name}', {self.age})" p = Person('Alice', 25) print(p) # 输出:Person('Alice', 25) ``` `__str__`方法的作用是返回一个对象的可读性较好的字符串表示形式,通常用于打印输出和显示给用户看。当使用`str()`函数或者`print()`函数输出一个对象时,会自动调用该对象的`__str__`方法。例如: ```python class Person: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return f"{self.name} is {self.age} years old" p = Person('Alice', 25) print(p) # 输出:Alice is 25 years old ``` 需要注意的是,如果一个对象没有定义`__str__`方法,但是定义了`__repr__`方法,则在使用`str()`函数或者`print()`函数输出该对象时,会默认使用`__repr__`方法返回的字符串表示形式。反之亦然,如果一个对象没有定义`__repr__`方法,则在交互式环境直接输入该对象名称并执行时,会默认使用`__str__`方法返回的字符串表示形式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值