专栏首页python3Python(3)字符串的编码、长度、占

Python(3)字符串的编码、长度、占

3、字符串和编码的转换

1、转换单个字符为编码:

ord(c)

返回值可以认为是数字类型。

foo = '中'
print(ord(foo))     # 20013

如果不止一个字符,则会报错

2、转换单个字符的编码为字符

chr(code)

返回值是字符

print(chr(20013))     # '中'

3、用unicode方式输出字符

\u十六进制编码

例如,20013转为十六进制是4E2D

print('\u4e2d')     # '中'

4、将字符转为bytes形式的编码

首先,当字符串前面有b时表示是bytes形式的编码。

例如,b'\xe4\xb8\xad'表示文字。这个东西一般是需要进行网络传输,或者在硬盘上读写时使用的。

str.encode(encoding=’UTF-8’,errors=’strict’)

附个中文说明吧,找不到类似MDN这样的完善的说明网站。

两个参数都可以省略,默认转为utf-8格式。其作用大致类似js里的encodeURI()方法,虽然我并不能完全肯定其是否一样。

示例:

foo = '中'.encode('utf-8')
print(foo)  # b'\xe4\xb8\xad'

5、从bytes形式的编码转回普通字符串

属于上面的逆向行为。

bytes.decode(encoding=”utf-8”, errors=”strict”)

foo = b'\xe4\xb8\xad'.decode()
print(foo)  # '中'

4、字符串的长度

len(o)

参数是被检查的字符串。

这个比较智能:

  1. 对普通字符串,返回其字符个数,例如len('中')的返回值是1(只有一个字符);
  2. 对于bytes形式的编码,返回其字节数。例如len(b'\xe4\xb8\xad')的返回值是3;
  3. 对于普通字符串,像\n这样的换行符或者其他转义字符,其长度视为1;
  4. 但假如字符串前面加了r(视为非转义字符),那么\n的长度则视为2;
len('中')    # 1
len(b'\xe4\xb8\xad')    # 3
len('a\nb')    # 3
len(r'a\nb')    # 4

5、字符串的替换/占位符

简单来说,占位符就是先占住一个固定的位置,然后用其他东西替换这个位置的内容。

如果玩过c语言,那么应该很熟悉。

标准占位符是:%d,注意是小写的,其他占位符也一样是小写。

通用写法是:

foo = '→%s←' % ('abc')
print(foo)  # 箭头指向的地方被替换的→abc←

占位符的数量和括号里的参数数量要一致,不然抛错

因为上面只有一个占位符,所以括号可以省略。

foo = '→%s←' % 'abc'
print(foo)  # →abc←

整数占位符(%d)

参数可以是浮点数(小数)或整数,浮点数的话直接取整数位使用。

foo = '%d' % (1.9)
print(foo)  # 1

整数占位符的补位写法:

%和后面的d之间添加两个数字,可以表示补足到多少位内容和以什么字符来补。

常见写法是补零,如示例:

foo = '%03d' % 1
print(foo)  # 001

%后面跟的第一个是0,表示用0是补位内容;第二个字符开始至d之前的字符是3,表示补足到三位。

具体来说,就是首先用1来替换%03d的位置,替换后结果是1

然后发现第二个至d之间是3,表示要补足3位,即xx1这样。

但这个x是什么呢?发现第一位是0,因此变成001,即结果。

两种特殊情况:

  1. 假如被替换后超出三位,例如foo = '%03d' % 1234替换后结果是1234。这种情况不补位;
  2. 可以用其他填充么?答案是不行。

浮点数占位符(%f)

会把参数变为一个六位小数,然后替换。

示例:

foo = '%f' % 2.1234
print(foo)  # 2.123400

也可以只取几位小数,写法是 %f 之间加 . 和需要保留的位数。

示例:

foo = '%.2f' % 2.1234
print(foo)  # 2.12

另外需要注意,浮点数由于精确度问题,因此最后一位并不是四舍五入,也不是直接舍去后面的内容。

这涉及到浮点数的存储问题,就不深谈了。

转为十六进制(%x)

很好理解,将数字转为十六进制

foo = '%x' % 31
print(foo)  # 1f

另外提一下十六进制转为十进制的方法:

foo = '1f'    # 这里需要是字符串
print(int(foo, 16))  # 31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python classmethod和

       这两个装饰器是Python自带的,虽然一直都知道装饰器是怎么用的,但是确实不知道何时去使用它们,今天看到某人用到了,又看了一遍,才有所收货.

    py3study
  • python expect

    py3study
  • Threading in Python-

    原文是2.x版本的,然后应该是英文的.我在学习的过程中,同时改成python 3.3并且改成中文,引入一些自己的理解.

    py3study
  • python classmethod和

       这两个装饰器是Python自带的,虽然一直都知道装饰器是怎么用的,但是确实不知道何时去使用它们,今天看到某人用到了,又看了一遍,才有所收货.

    py3study
  • R中的管道操作符%>%

    管道是一种强大的工具,可以清楚地表示由多个操作组成的一个操作序列。管道%>% 来自于magrittr 包。因为tidyverse 中的包会自动加载%>%,所以一...

    生信编程日常
  • VC和GCC成员函数指针实现的研究(二)

    调用的时候主要看(c.*vptr2)()的代码。因为(c.vptr1)()生成的和单继承一样。而由于它们最终都转向vcall,所以vptr2的时候调整了虚表指针...

    owent
  • python expect

    py3study
  • 你不知道的javaScript笔记(2)

    this和对象原型 this是一个很特别的关键字,被自动定义在所有函数的作用域中 // foo.count 是0,字面理解是错误的     function f...

    用户1197315
  • 你所不知道的“foo”和“bar”

    “foo” 和“foobar”等单词经常会作为示例名称出现在各种程序和技术文档中。据统计,在各种计算机和通信技术文档中,大约有百分之七的文档出现了这些词语。...

    Jean
  • 在js中关于同名变量和函数的地位争夺问题

    其实,在浏览器解析js代码的过程中,会有一个预编译的过程,遇到function 函数定义的部分,会先将该部分的代码提前,所以我们在第一个console.log(...

    Theone67

扫码关注云+社区

领取腾讯云代金券