跳转到内容

使用 Linkbot 学习 Python 3/字符串的复仇

来自维基教科书,开放书籍,为开放的世界

现在展示一个可以用字符串完成的酷炫技巧

def shout(string):
    for character in string:
        print("Gimme a " + 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 a L
'L'
Gimme a o
'o'
Gimme a s
's'
Gimme a 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):
    ## Converts a string to upper case
    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':,它检查字母是否为小写。如果是,则使用下一行。首先,它被转换为一个位置,以便 a = 0,b = 1,c = 2,依此类推,使用这一行:location = ord(character) - ord('a')。接下来,使用 new_ascii = location + ord('A') 找到新值。这个值被转换回一个现在是大写的字符。请注意,如果你真的需要字母的大写形式,你应该使用 u=var.upper(),它也适用于其他语言。

现在进行一些交互式打字练习

>>> # Integer to String
>>> 2
2
>>> repr(2)
'2'
>>> -123
-123
>>> repr(-123)
'-123'
>>> # String to Integer
>>> "23"
'23'
>>> int("23")
23
>>> "23" * 2
'2323'
>>> int("23") * 2
46
>>> # Float to String
>>> 1.23
1.23
>>> repr(1.23)
'1.23'
>>> # Float to Integer
>>> 1.23
1.23
>>> int(1.23)
1
>>> int(-1.23)
-1
>>> # String to Float
>>> float("1.23")
1.23
>>> "1.23" 
'1.23'
>>> float("123")
123.0

如果你还没有猜到,函数 repr() 可以将整数转换为字符串,函数 int() 可以将字符串转换为整数。函数 float() 可以将字符串转换为浮点数。repr() 函数返回某个事物的可打印表示。这里有一些例子

>>> repr(1)
'1'
>>> repr(234.14)
'234.14'
>>> repr([4, 42, 10])
'[4, 42, 10]'

int() 函数试图将字符串(或浮点数)转换为整数。还有一个类似的函数叫做 float(),它将整数或字符串转换为浮点数。Python 拥有的另一个函数是 eval() 函数。eval() 函数接受一个字符串并返回 python 认为它找到的类型的數據。例如

>>> v = eval('123')
>>> print(v, type(v))
123 <type 'int'>
>>> v = eval('645.123')
>>> print(v, type(v))
645.123 <type 'float'>
>>> v = eval('[1, 2, 3]')
>>> print(v, type(v))
[1, 2, 3] <type '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() 如何将字符串转换为字符串列表。默认情况下,字符串以空格分隔,也可以使用可选参数(在本例中为逗号)分隔。你还可以添加另一个参数,告诉 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]为我们提供了所有text剪切位置 1 和 4 之间的字符串,“TRI”。如果你省略了 [first_index:last_index] 参数中的一个,你将获得字符串的开头或结尾作为默认值text[:5]给出“STRIN”。对于两者first_indexlast_index我们可以使用红色和蓝色编号方案text[:-1]给出与text[:5]相同,因为在本例中,索引 -1 与 5 在同一个位置。如果我们不使用包含冒号的参数,则数字的处理方式不同text[2]为我们提供了第二个剪切点之后的一个字符,“R”。特殊的切片操作text[:]意味着“从开头到结尾”,并生成整个字符串(或列表,如上一章所示)的副本。

最后但并非最不重要的一点是,切片操作可以有两个冒号和第三个参数,该参数被解释为“步长”。text[::-1]text从开头到结尾,步长为 -1。-1 意味着“每个字符,但方向相反”。“STRING”向后是“GNIRTS”(如果你还没有明白,请测试一下 2 的步长)。

所有这些切片操作也适用于列表。从这个意义上说,字符串只是列表的一种特殊情况,其中列表元素是单个字符。只要记住剪切位置的概念,切片事物的索引就会变得不那么令人困惑。

# This program requires an excellent understanding of decimal numbers.
def to_string(in_int):
    """Converts an integer to a string"""
    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):
    """Converts a string to an integer"""
    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
使用 Linkbot 学习 Python 3
 ← 更多关于列表的内容 字符串的复仇 文件 I/O → 
华夏公益教科书