资讯专栏INFORMATION COLUMN

PyTips 0x07 - Python 字符串

go4it / 766人阅读

摘要:项目地址所有用过的人应该都看过下面两行错误信息这就是界的锟斤拷今天和接下来几期的内容将主要关注中的字符串字节及两者之间的相互转换。

项目地址:https://git.io/pytips

所有用过 Python (2&3)的人应该都看过下面两行错误信息:

UnicodeEncodeError: "ascii" codec can"t encode characters in position 0-1: ordinal not in range(128)

UnicodeDecodeError: "utf-8" codec can"t decode bytes in position 0-1: invalid continuation byte

这就是 Python 界的"锟斤拷"!

今天和接下来几期的内容将主要关注 Python 中的字符串(str)、字节(bytes)及两者之间的相互转换(encode/decode)。也许不能让你突然间解决所有乱码问题,但希望可以帮助你迅速找到问题所在。

定义

Python 中对字符串的定义如下:

Textual data in Python is handled with str objects, or strings. Strings are immutable sequences of Unicode code points.

Python 3.5 中字符串是由一系列 Unicode 码位(code point)所组成的不可变序列

("S" "T" "R" "I" "N" "G")
"STRING"

不可变是指无法对字符串本身进行更改操作:

s = "Hello"
print(s[3])
s[3] = "o"
l
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

 in ()
      1 s = "Hello"
      2 print(s[3])
----> 3 s[3] = "o"


TypeError: "str" object does not support item assignment

序列(sequence)则是指字符串继承序列类型(list/tuple/range)的通用操作:

[i.upper() for i in "hello"]
["H", "E", "L", "L", "O"]

至于 Unicode 暂时可以看作一张非常大的地图,这张地图里面记录了世界上所有的符号,而码位则是每个符号所对应的坐标(具体内容将在后面的几期介绍)。

s = "雨"
print(s)
print(len(s))
print(s.encode())
雨
1
b"xe9x9bxa8"
常用操作

len:字符串长度;

split & join

find & index

strip

upper & lower & swapcase & title & capitalize

endswith & startswith & is*

zfill

# split & join
s = "Hello world!"
print(",".join(s.split())) # 常用的切分 & 重组操作

"https://github.com/rainyear/pytips".split("/", 2) # 限定切分次数
Hello,world!
["https:", "", "github.com/rainyear/pytips"]
s = "coffee"
print(s.find("f"))    # 从左至右搜索,返回第一个下标
print(s.rfind("f"))   # 从右至左搜索,返回第一个下表

print(s.find("a"))    # 若不存在则返回 -1
print(s.index("a"))   # 若不存在则抛出 ValueError,其余与 find 相同
2
3
-1
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

 in ()
      4 
      5 print(s.find("a"))    # 若不存在则返回 -1
----> 6 print(s.index("a"))   # 若不存在则抛出 ValueError,其余与 find 相同


ValueError: substring not found
print(" hello world    ".strip())
print("helloworld".strip("heo"))
print("["+"          i         ".lstrip() +"]")
print("["+"          i         ".rstrip() +"]")
hello world
lloworld
[i         ]
[          i]
print("{}
{}
{}
{}
{}".format(
    "hello, WORLD".upper(),
    "hello, WORLD".lower(),
    "hello, WORLD".swapcase(),
    "hello, WORLD".capitalize(),
    "hello, WORLD".title()))
HELLO, WORLD
hello, world
HELLO, world
Hello, world
Hello, World
print("""
{}|{}
{}|{}
{}|{}
{}|{}
{}|{}
{}|{}
""".format(
    "Python".startswith("P"),"Python".startswith("y"),
    "Python".endswith("n"),"Python".endswith("o"),
    "i23o6".isalnum(),"1 2 3 0 6".isalnum(),
    "isalpha".isalpha(),"isa1pha".isalpha(),
    "python".islower(),"Python".islower(),
    "PYTHON".isupper(),"Python".isupper(),
))
True|False
True|False
True|False
True|False
True|False
True|False

"101".zfill(8)
"00000101"

format / encode

格式化输出 format 是非常有用的工具,将会多带带进行介绍;encode 会在 bytes-decode-Unicode-encode-bytes 中详细介绍。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37807.html

相关文章

  • PyTips 0x08 - Python 字节与字节数组

    摘要:回到对字节和字节数组的定义为了用计算机可以理解的数字描述人类使用的字符,我们需要一张数字与字符对应的表。由于和字符串一样是序列类型,字节和字节数组可用的方法也类似,这里就不一一列举了。 项目地址:https://git.io/pytips 0x07 中介绍了 Python 中的字符串类型,字符串类型是对人类友好的符号,但计算机只认识一种符号,那就是二进制(binary)数,或者说是数字...

    Leo_chen 评论0 收藏0
  • PyTips 0x09 - Python 中 Unicode 的正确用法

    摘要:只包含了个基本拉丁字母阿拉伯数目字和英式标点符号一共个字符,因此只需要不占满一个字节就可以存储,而则涵盖的数据除了视觉上的字形编码方法标准的字符编码外,还包含了字符特性,如大小写字母,共可包含个字符,而到现在只填充了其中的个位置。 项目地址:https://git.io/pytips 0x07 和 0x08 分别介绍了 Python 中的字符串类型(str)和字节类型(byte),以及...

    shenhualong 评论0 收藏0
  • PyTips 0x0a - Python 符串的格式化

    摘要:项目地址相信很多人在格式化字符串的时候都用的语法,提出一种更先进的格式化方法并成为的标准用来替换旧的格式化语法,从开始已经实现了这一方法其它解释器未考证。 项目地址:https://git.io/pytips 相信很多人在格式化字符串的时候都用%s % v的语法,PEP 3101 提出一种更先进的格式化方法 str.format() 并成为 Python 3 的标准用来替换旧的 %s ...

    luqiuwen 评论0 收藏0
  • PyTips 0x01 - 迭代器与生成器

    摘要:项目地址迭代器与生成器迭代器与生成器是中比较常用又很容易混淆的两个概念,今天就把它们梳理一遍,并举一些常用的例子。生成器前面说到创建迭代器有种方法,其中第三种就是生成器。 项目地址:https://git.io/pytips 迭代器与生成器 迭代器(iterator)与生成器(generator)是 Python 中比较常用又很容易混淆的两个概念,今天就把它们梳理一遍,并举一些常用的例...

    chemzqm 评论0 收藏0
  • PyTips 0x0b - Python 无处不在的else

    摘要:可以通过一个简单的例子来展示当然,也可以用状态变量的做法来替代总结有人觉得的这些用法违反直觉或者是而非,不值得提倡。 项目地址:https://git.io/pytips 我们都知道 Python 中 else 的基本用法是在条件控制语句中的 if...elif...else...,但是 else 还有两个其它的用途,一是用于循环的结尾,另一个是用在错误处理的 try 中。这原本是 P...

    jaysun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<