Стоки возвращаются
Keywords: easytut

Далее: Работа с файлами Наверх: Курс языка Python для начинающих Назад: Возвращаемся к спискам Содержание
В этой главе

- Примеры

# Строки возвращаются

Представляем интересный прием, который можно проделать со строками:

    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

Далее: Работа с файлами Наверх: Курс языка Python для начинающих Назад: Возвращаемся к спискам Содержание