Python文本(字面值)

时间:2023-03-10 02:48:48
Python文本(字面值)

Python中的文本是一些内置类型的常量表示方法。

字符串和字节

字符串是一系列的字符序列,Python中用单引号(''),双引号(""),或者三个单引号(''' ''')三个双引号(""" """)来表示字符串常量。

#fileName:lexical
str_1 = 'hello python'
str_2 = "What's your name?"
str_3 = '''mile and silence are two powerful tools.
Smile is the way to solve many problems and silence
is the way to avoid many problems'''
str_4 = """It is our choices that show what we truly are,
far more than our abilities. """
print(str_1)
print(str_2)
print(str_3)
print(str_4)

利用三引号,你可以表示一个多行的字符串。

转义符

假设你想要在一个字符串中包含一个单引号('),那么你该怎么指示这个字符串?例如,这个字符串是what's your name?。你肯定不会用'what's your name?'来指示它,因为Python会弄不明白这个字符串从何处开始,何处结束。所以,你需要指明单引号而不是字符串的结尾。可以通过 转义符 来完成这个任务。你用\'来指示单引号——注意这个反斜杠。现在你可以把字符串表示为'what\'s your name?'。

另一个表示这个特别的字符串的方法是"what's your name?",即用双引号。类似地,要在双引号字符串中使用双引号本身的时候,也可以借助于转义符。另外,你可以用转义符\\来指示反斜杠本身。

值得注意的一件事是,在一个字符串中,行末的单独一个反斜杠表示字符串在下一行继续,而不是开始一个新的行。例如:

str_5 = "This is the first sentence.\
This is the second sentence."
print(str_5)

转义序列如下:

转义序列 意义 注意事项
\newline 反斜线且忽略换行  
\\ 反斜线(\)  
\’ 单引号(’)  
\"  双引号(”)  
\a ASCII Bell(BEL)  
\b ASCII 退格(BS)  
\f ASCII 换页符(FF)  
\n ASCII 换行符(LF)  
\r ASCII 回车符(CR)  
\t ASCII 水平制表符(TAB)  
\v ASCII 垂直制表符(VT)  
\ooo 八进制值为 ooo 的字符 (1,3)
\xhh 十六进制值为 hh 的字符 (2,3)

字符串文本中的转义序列规则如下:

转义序列 意    义 注意事项
\N{name} Unicode 数据库中以 name 命名的字符 (4)
\uxxxx 16位16进制字符值:xxxx (5)
\Uxxxxxxxx 32位16进制字符值:xxxxxxxx (6)

注意:

  1. 与标准 C 相同的是,最多只可以接受三位八进制数字。
  2. 与标准 C 不同的是,只能接收两个十六进制数字。
  3. 在字节文本中,十六进制和八进制转义字符表示给定值的字节数。在字符串文本中,这些转义字符表示给定值的 Unicode 字符。
  4. 与 3.3 版本不同之处:增加了对别名[ 1 ]的支持。
  5. 可以使用该转义序列为那些构成代理对的单个代码单元编码。只能使用四个十六进制数表示。
  6. 任何 Unicode 字符都可以采用这样的编码方式。需要注意的是只能使用八个十六进制数表示。
print('\123')
print('\x02')
print("\N{SOLIDUS}")
print("\N{BLACK SPADE SUIT}")
print('\u3333')
print('\U00004e60')

结果:

Python文本(字面值)

不像标准 C,所有不能被识别的转义序列都保留在串中且不做改变,例如,反斜线会保留在结果中。(这个行为在调试过程中非常有用:如果输入了一个错误的转义序列,在输出结果中更容易识别出错误。)此外,至关重要的是要注意转义字符只能在字符串文本中起作用,在字节文本类别中无法被识别。

print('\k see you later')
#result:\k see you later

在三重引用串中,允许出现未转义的新行和引用字符(并被保留),除非三个连续的引用字符串中断了该串。(引用字符是用于引用字符串的字符,如,' 或 "。)

str_6 = """this' a dog,what's
you pat?"""
print(str_6)

Python中定义的字符串的格式:参见:https://docs.python.org/3/reference/lexical_analysis.html?highlight=identifier#string-and-bytes-literals

stringliteral   ::=  [stringprefix](shortstring | longstring)
stringprefix ::= "r" | "u" | "R" | "U"

如果你想要指示某些不需要如转义符那样的特别处理的字符串,那么你需要指定一个自然字符串。自然字符串通过给字符串加上前缀r或R来指定。

print(r"Newlines are indicated by \n")
#result:Newlines are indicated by \n 此处\n将不会按照转义被处理

即使在自然字符中,可以使用反斜线将引号转义,但是反斜线本身会在结果中保留;比如 r"\"" 是一个由两个字符组成的合法字符串:一个反斜线与一个双引号;但 r"\" 却是一个非法字符串(即原始的字符串也不能以奇数个反斜杠结尾)。 具体而言,一个原始的文本不能以单个反斜杠结尾(由于反斜线会将跟在其后的引号转义)。另外需要注意的是,如果一个反斜线跟在换行符后,反斜线与换行符会被当做文本的两个字符,而不是一个连续行。

Python文本(字面值)

字符串的连接

多个相邻的字符串文本或字节文本(由空白分隔),允许使用不同的引用习惯,并且其含义与连接在一起时是一样的。因此, "hello" ‘world’ 与 "helloworld"是等价的。这个特性可以用来减少反斜线的使用数量,可以很方便的将一个长字符串分隔在多行上,甚至可以在字符串的某一部分添加注释:

re.compile("[A-Za-z_]"           # letter or underscore
"[A-Za-z0-9_]*" # letter, digit or underscore
)

需要注意的是,这个特性是定义在句法层次上的,但是是在编译时实现的。在运行时连接串必须使用 ‘+’ 运算符。并且不同的引用字符可以混用,甚至可以将原始串与三重引用串混合使用。

字符串读取

python的字串列表有2种取值顺序:

  • 从左到右索引默认0开始的,最大范围是字符串长度少1
  • 从右到左索引默认-1开始的,最大范围是字符串开头

如果你的实要取得一段子串的话,可以用到变量[头下标:尾下标],就可以截取相应的字符串,其中下标是从0开始算起,可以是正数或负数,下标可以为空表示取到头或尾。

str = 'Hello World!'
print(str) # 输出完整字符串
print(str[0]) # 输出字符串中的第一个字符
print(str[2:5]) # 输出字符串中第三个至第五个之间的字符串
print(str[2:])# 输出从第三个字符开始的字符串
print(str * 2) # 输出字符串两次
print(str + "TEST") # 输出连接的字符串
##############result############
#Hello World!
#H
#llo
#llo World!
#Hello World!Hello World!
#Hello World!TEST
#############################

字节文本总是以 'b' 或 'B' 开头;它们会生成 bytes 类型实例而不是 str 类型。它们可能只包含 ASCII 字符;大于或等于 128 的数字必须使用转义字符表示。

one_byte = b"abcd\x64"
print(one_byte)
print(type(one_byte)) #type为内置函数,查看one_byte的类型
print(len(one_byte)) #len为内置函数,计算one_byte的长度
print(one_byte[4])
#######result##########
#b'abcdd'
#<class 'bytes'>
#
#100 #100用十六进制表示就是\x64
####################

内置函数说明参见:https://docs.python.org/3/library/functions.html

如果想要修改一个字节串中的某个字节,不能够直接修改,需要将其转化为bytearray后再进行修改:

barr = bytearray(one_byte)
print(type(barr))
barr[0] = 110
print(barr)
#####result########
#<class 'bytearray'>
#bytearray(b'nbcdd')
################

bytearray为内置函数,将字节文本转换为字节数组。参见:https://docs.python.org/3/library/functions.html#bytearray

字节与字符之间的相互转换:

one_str = "少壮不努力,老大学Python"
str_to_byte = one_str.encode('utf-8')
print(str_to_byte)
byte_to_str = str_to_byte.decode('utf-8')
print(byte_to_str)
###############result#############
#b'\xe5\xb0\x91\xe5\xa3\xae\xe4\xb8\x8d\xe5\x8a\xaa\xe5\x8a\x9b\xef\xbc\x8c\xe8\x80\x81\xe5\xa4\xa7\xe5\xad\xa6Python'
#少壮不努力,老大学Python
###############################

因为每种编码方式包含的字节种类数目不同,编码和解码必须使用相同的编码方式,否则就会产生乱码,甚至转换失败。

数字

Python共有三种类型数字文本:整型(int有符号整形、long长整型)、浮点型(float)以及虚数型(complex)。不存在复数文本(复数可以由一个实数加一个虚数的形式给出)。

注意,数字文本不包含符号(正负号);像 -1 实际上是一个组合了一元运算符 '-' 和数字 1 的表达式。

整形文本表示方式包括二进制、八进制、十进制、十六进制定义如下:

  定义 举例 值(十进制值)
二进制 0b(0或1) b11111110 254
八进制 0o(0~7) 0o10 8
十进制 0或以非0开头+0~9 12 12
十六进制 0x(0~9|a~f|A~F) 0x10 16

除了可用内存的容量限制, 整数长度没有其他限制.

注意, 非零十进制数字中不允许用0作为前缀, 这种写法会与 C 语言风格的八进制字面值产生歧义 (用于3.0之前版本的Python)

Python使用"L"来显示长整型。在整数之后加"L"或者"l(小写字母L)",建议您使用大写"L",避免与数字"1"混淆。

浮点型文本

浮点数有两种表示格式,小数、指数形式。

小数表示形式:小数点前或者后必须有一部分存在。

指数表示形式:整数部分和指数部分都看作是十进制的. 例如, 077e010 是合法的, 它等价于 77e10. 浮点型字面值的取值范围依赖于实现。

以下是一些浮点数的例子:

3.14    10.    .001    1e100    3.14e-10    0e0

虚数

虚数是实部为零的复数. 复数由一对有着相同取值范围的浮点数表示. 为了创建一个非零实部的复数, 可以对它增加一个浮点数, 例如, (3+4j). 下面是一些例子:

3.14j   10.j    10j     .001j   1e100j  3.14e-10j