Python 2.6 非程序员教程/字符串复仇
现在展示一个可以用字符串完成的酷技巧
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 到 255 的数字。Python 有一个名为ord()(表示序数)的函数,它将字符作为数字返回。还有一个对应的名为chr()的函数,它将数字转换为字符。考虑到这一点,程序应该开始变得清晰。第一个细节是这行代码:if 'a' <= character <= 'z':,它检查一个字母是否为小写字母。如果是,则使用下一行代码。首先,它被转换为一个位置,以便 a = 0,b = 1,c = 2 等等,使用这行代码:location = ord(character) - ord('a')。接下来,使用new_ascii = location + ord('A') 找到新的值。此值被转换回现在为大写的字符。
现在进行一些交互式打字练习
>>> # Integer to String
>>> 2
2
>>> repr(2)
'2'
>>> -123
-123
>>> repr(-123)
'-123'
>>> `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
>>> `float("1.23")`
'1.23'
如果你还没有猜到,函数repr()可以将整数转换为字符串,函数int()可以将字符串转换为整数。函数float()可以将字符串转换为浮点数。repr()函数返回某个对象的打印表示形式。`...` 也会将几乎所有内容转换为字符串。以下是一些示例:
>>> repr(1) '1' >>> repr(234.14) '234.14' >>> repr([4, 42, 10]) '[4, 42, 10]' >>> `[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] 给我们剪切位置 1 和 4 之间的整个text 字符串,“TRI”。如果你省略了 [first_index:last_index] 参数之一,则默认情况下你会得到字符串的开头或结尾:text[:5] 给出“STRIN”。对于first_index 和last_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 = chr(ord('0') + in_int % 10) + out_str
in_int = in_int / 10
out_str = chr(ord('0') + 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 x in range(0, len(in_str)):
out_num = out_num * 10 + ord(in_str[x]) - ord('0')
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