Python的非程序员教程3
现在展示一个可以用字符串实现的酷技巧:
def shout(string):
for character in string:
print("Gimme an " + character)
print("'" + character + "'")
shout("Lose")
def middle(string):
print("The middle character is:", string[len(string) // 2])
middle("abcdefg")
middle("The Python Programming Language")
middle("Atlanta")
输出结果是:
Gimme an L
'L'
Gimme an o
'o'
Gimme an s
's'
Gimme an e
'e'
The middle character is: d
The middle character is: r
The middle character is: a
这些程序展示了字符串在多个方面与列表类似。shout()
函数显示了字符串也可以像列表一样与 for
循环一起使用。middle()
函数展示了字符串同样可以使用 len()
函数和数组索引与切片。大多数列表的特性也适用于字符串。
接下来展示一些字符串特有的功能:
def to_upper(string):
## 将字符串转换为大写
upper_case = ""
for character in string:
if 'a' <= character <= 'z':
location = ord(character) - ord('a')
new_ascii = location + ord('A')
character = chr(new_ascii)
upper_case = upper_case + character
return upper_case
print(to_upper("This is Text"))
输出结果是:
THIS IS TEXT
这段代码之所以有效,是因为计算机将字符串中的字符表示为从 0 到 1,114,111 的数字。例如,'A'
是 65,'B'
是 66,א
是 1488。这些值是 Unicode 值。Python 有一个函数叫 ord()
(表示“序号”)返回字符的数字表示。还有一个对应的函数叫 chr()
,将数字转换为字符。理解这一点后,程序应该就变得清晰了。首先,if 'a' <= character
<= 'z':
检查字符是否为小写字母。如果是小写字母,接下来的代码将进行处理。首先通过 location =
ord(character) - ord('a')
将其转换为位置,使得 a = 0
,b =
1
,c = 2
,以此类推。接下来,new_ascii = location +
ord('A')
计算出对应的大写字母的 Unicode 值。最后,用 chr()
将其转换回大写字母。如果你需要更简便的方式将字母转换为大写,可以使用 u = var.upper()
,这也适用于其他语言。
现在进行一些交互式输入练习:
>>> # 整数转字符串
>>> 2
2
>>> repr(2)
'2'
>>> -123
-123
>>> repr(-123)
'-123'
>>> # 字符串转整数
>>> "23"
'23'
>>> int("23")
23
>>> "23" * 2
'2323'
>>> int("23") * 2
46
>>> # 浮点数转字符串
>>> 1.23
1.23
>>> repr(1.23)
'1.23'
>>> # 浮点数转整数
>>> 1.23
1.23
>>> int(1.23)
1
>>> int(-1.23)
-1
>>> # 字符串转浮点数
>>> float("1.23")
1.23
>>> "1.23"
'1.23'
>>> float("123")
123.0
这些示例展示了整数、浮点数和字符串之间的转换方法,帮助你理解如何在 Python 中进行类型转换。
如果你还没有猜到,repr()
函数可以将整数转换为字符串,而 int()
函数可以将字符串转换为整数。float()
函数可以将字符串转换为浮点数。repr()
函数返回某个对象的可打印表示。以下是一些示例:
>>> repr(1)
'1'
>>> repr(234.14)
'234.14'
>>> repr([4, 42, 10])
'[4, 42, 10]'
int()
函数尝试将字符串(或浮点数)转换为整数。类似地,float()
函数将整数或字符串转换为浮点数。Python 还有一个叫做 eval()
的函数,它接收一个字符串并返回 Python 认为它代表的数据类型。以下是一些示例:
>>> v = eval('123')
>>> print(v, type(v))
123 <class 'int'>
>>> v = eval('645.123')
>>> print(v, type(v))
645.123 <class 'float'>
>>> v = eval('[1, 2, 3]')
>>> print(v, type(v))
[1, 2, 3] <class 'list'>
使用 eval()
函数时,应该检查它返回的类型是否是你预期的类型。
一个有用的字符串函数是 split()
方法。以下是示例:
>>> "This is a bunch of words".split()
['This', 'is', 'a', 'bunch', 'of', 'words']
>>> text = "First batch, second batch, third, fourth"
>>> text.split(",")
['First batch', ' second batch', ' third', ' fourth']
注意,split()
会将字符串转换为字符串列表。默认情况下,字符串会根据空白字符进行分割,或者根据可选的参数(此处为逗号)进行分割。你还可以添加另一个参数,指定分割次数。例如:
>>> list = text.split(",")
>>> len(list)
4
>>> list[-1]
' fourth'
>>> list = text.split(",", 2)
>>> len(list)
3
>>> list[-1]
' third, fourth'
字符串(和列表)的切片
字符串可以像列表一样被切割——使用切片操作符 []
。切片操作符的用法与之前的列表切片相同:text[first_index:last_index]
(在极少数情况下,切片还可以有第三个参数,参见下面的示例)。
为了避免被索引数字弄乱,最容易理解的是将它们看作是“剪切位置”,即将字符串切割成部分的可能位置。以下是一个示例,展示了简单文本字符串的剪切位置(黄色)及其索引数字(红色和蓝色):
0 1 2 ... -2 -1
↓ ↓ ↓ ↓ ↓ ↓
text = " S T R I N G "
↑ ↑
[: :]
请注意,红色索引是从字符串的开头开始计数的,而蓝色索引是从字符串的末尾反向计数的。(注意:没有蓝色的 -0
,因为 -0 == 0
,因此 -0
也表示“字符串的开始”)。现在,我们可以使用这些索引进行切片操作:
text[1:4] → "TRI"
text[:5] → "STRIN"
text[:-1] → "STRIN"
text[-4:] → "RING"
text[2] → "R"
text[:] → "STRING"
text[::-1] → "GNIRTS"
text[1:4]
给我们字符串中从位置 1 到位置 4 之间的部分,即 "TRI"。如果省略 first_index
或 last_index
,默认使用字符串的开始或结束:text[:5]
给出 "STRIN"。对于 first_index
和 last_index
,我们可以使用红色和蓝色的两种编号方式:text[:-1]
和 text[:5]
给出的结果相同,因为在这种情况下,索引 -1
和 5
位置相同。如果不使用包含冒号的参数,数字会以不同方式处理:text[2]
给我们字符串中的第三个字符,即 "R"。特别的,text[:]
表示“从开始到结束”,并返回整个字符串(或列表,正如上一章所示)的副本。
最后,切片操作可以有第二个冒号和第三个参数,第三个参数表示“步长”:text[::-1]
表示从开始到结束,步长为 -1
。-1
表示“每个字符,但反向”。"STRING" 反向是 "GNIRTS"(如果你还没明白,可以尝试步长为 2 的情况)。
所有这些切片操作同样适用于列表。因此,字符串可以看作是列表的一种特殊情况,其中列表的元素是单个字符。只需记住剪切位置的概念,切片操作的索引就不再令人困惑。
示例
# 这个程序需要对十进制数有很好的理解
def to_string(in_int):
"""将整数转换为字符串"""
out_str = ""
prefix = ""
if in_int < 0:
prefix = "-"
in_int = -in_int
while in_int // 10 != 0:
out_str = str(in_int % 10) + out_str
in_int = in_int // 10
out_str = str(in_int % 10) + out_str
return prefix + out_str
def to_int(in_str):
"""将字符串转换为整数"""
out_num = 0
if in_str[0] == "-":
multiplier = -1
in_str = in_str[1:]
else:
multiplier = 1
for c in in_str:
out_num = out_num * 10 + int(c)
return out_num * multiplier
print(to_string(2))
print(to_string(23445))
print(to_string(-23445))
print(to_int("14234"))
print(to_int("12345"))
print(to_int("-3512"))
输出结果是:
2
23445
-23445
14234
12345
-3512