Представляем интересный прием, который можно проделать со строками:
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):
## Переводит буквы строки в заглавные
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 (сокращение от ordinal), которая выдает число, соответствующее данной литере. Есть также обратная функция chr, которая переводит число в литеру. После этих пояснений программа должна стать понятнее. Первая деталь – команда if 'a' <= character <= 'z':, которая проверяет, прописная ли данная литера. Если так, то выполняются последующие команды. Сначала литеры представляются числами, так, что a=0, b=1, c=2, и т.д. командой location = ord(character) - ord('a'). Далее находится новое значение как new_ascii = location + ord('A'). Оно переводится назад в литеру, которая стала заглавной.
А сейчас небольшое упражнение на работу в диалоговом режиме:
>>> #Перевод целого в строку
...
>>> 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
Если вы еще не догадались, то функция repr переводит целое число в строку, а функция int переводит строку в целое число. Функция float переводит строку в число с десятичной точкой. Функция repr выдает печатную форму чего-либо. Примеры этого:
>>> repr(1) '1' >>> repr(234.14) '234.14' >>> repr([4,42,10]) '[4, 42, 10]'Функция int пытается перевести строку (или число с десятичной точкой) в целое число. Есть также похожая функция float, которая переводит строку или целое число в число с десятичной точкой. Еще одна функция – eval. Она использует строку как аргумент и возвращает данное того типа, который, по ее мнению, представлен этой строкой. Например:
>>> 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. Пример:
>>> import string
>>> string.split("This is a bunch of words")
['This', 'is', 'a', 'bunch', 'of', 'words']
>>> string.split("First batch, second batch, third, fourth",",")
['First batch', ' second batch', ' third', ' fourth']
Обратите внимание, что split переводит строку в список строк. Строка делится по пробелам по умолчанию, или по необязательному второму аргументу (в нашем случае – запятой).
#Требуется хорошее понимание десятичных чисел
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