Представляем интересный прием, который можно проделать со строками:
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