现在展示一个可以用字符串实现的酷技巧:

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 = 0b = 1c = 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_indexlast_index,默认使用字符串的开始或结束:text[:5] 给出 "STRIN"。对于 first_indexlast_index,我们可以使用红色和蓝色的两种编号方式:text[:-1]text[:5] 给出的结果相同,因为在这种情况下,索引 -15 位置相同。如果不使用包含冒号的参数,数字会以不同方式处理: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
最后修改: 2025年01月11日 星期六 11:32