Учебник Python/Типы данных: различия между версиями

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
Строка 88: Строка 88:
<syntaxhighlight lang="python"> word = 'Help' + 'A'
<syntaxhighlight lang="python"> word = 'Help' + 'A'
print(word)
print(word)
>>>'HelpA'
Вывод:'HelpA'
print('<' + word*5 + '>')
print('<' + word*5 + '>')
'<HelpAHelpAHelpAHelpAHelpA>'</syntaxhighlight>
Вывод:<HelpAHelpAHelpAHelpAHelpA>'</syntaxhighlight>


Два строковых литерала, расположенные друг за другом, автоматически конкатенируются; первая строка в предыдущем примере также могла быть записана как <code>word = 'Help' 'A'</code>; это работает только с двумя литералами — не с произвольными выражениями, содержащими строки.
Два строковых литерала, расположенные друг за другом, автоматически конкатенируются; первая строка в предыдущем примере также могла быть записана как <code>word = 'Help' 'A'</code>; это работает только с двумя литералами — не с произвольными выражениями, содержащими строки.

Версия от 16:50, 11 марта 2021

https://docs.google.com/document/d/1jvUoLezDe2wdsgYSJULR_oACjqcYbfqYFMhBHBHrmG4/pub

Учебник Python 3.1: https://ru.wikibooks.org/w/index.php?title=Python/%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA_Python_3.1&action=edit

int

int — целочисленный тип данных. Поддерживает работу с целыми числами, такими как 5, 7, - 13, 0, 555. Не поддерживает работу с дробями.

divmod(6,4) # возвращает tuple. первый элемент - целая часть частного, второй - остаток от деления
>>> (1,2)


преобразовать битовую маску в число
int('0101010101', 2)
получить целое число, введённое с клавиатуры
int(input())
получить шестнадцатеричное представление числа
hex(45464879498).rstrip("L")[2:]

float

float - вещественный (действительные числа, такие как -7.5, 8, 16) тип данных.

получить вещественное число, введённое с клавиатуры
float(input())

str

str - строковый тип данных

Например:

a = input()
b = 'строка'
c = 'string'
d = "Строка"
b[0] = 'с' # в строках существует индексация, и она начинается с нуля, то есть первая буква слова индексируется как нулевая, вторая - как первая, третья - как вторая, а n-ная буква - как (n - 1)-вая буква.

Строки могут быть записаны и в двойных, и в одинарных кавычках.

Строковые литералы могут быть разнесены на несколько строк различными способами. Могут быть использованы продолжающие строки, с обратным слэшем в качестве последнего символа строки, сообщающим о том, что следующая строка есть продолжение текущей[1]:

hello = "This is a rather long string containing\n\
 several lines of text just as you would do in C.\n\
    Note that whitespace at the beginning of the line is\
 significant."

print(hello)

Обратите внимание, что новые строки все ещё нужно подключать в строку через \n; символ новой строки, перед которым идёт обратный слэш — не обрабатывается. Запуск примера выведет следующее:

This is a rather long string containing
several lines of text just as you would do in C.
    Note that whitespace at the beginning of the line is significant.

Если мы объявим строковой литерал сырым (raw)[2] — символы \n не будут конвертированы в новые строки, но и обратный слэш в конце строки, и символ новой строки в исходном коде — будут добавлены в строку в виде данных. Следовательно, код из примера:

hello = r"This is a rather long string containing\n\
several lines of text much as you would do in C."

print(hello)

выведет:

This is a rather long string containing\n\
several lines of text much as you would do in C.

Или, строки могут быть обрамлены совпадающей парой тройных кавычек: """ или '''. Окончания строк не нужно завершать тройными кавычками — при этом будут включены в строку.

print("""
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
""")

выводит в результате следующее:

Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to

Строки могут конкатенироваться (склеиваться вместе) операцией + и быть повторенными операцией *:

 word = 'Help' + 'A'
print(word)
Вывод:'HelpA'
print('<' + word*5 + '>')
Вывод:<HelpAHelpAHelpAHelpAHelpA>'

Два строковых литерала, расположенные друг за другом, автоматически конкатенируются; первая строка в предыдущем примере также могла быть записана как word = 'Help' 'A'; это работает только с двумя литералами — не с произвольными выражениями, содержащими строки.

>>> 'str' 'ing'                   #  <-  Так — верно
'string'
>>> 'str'.strip() + 'ing'   #  <-  Так — верно
'string'
>>> 'str'.strip() 'ing'     #  <-  Так — не верно
  File "<stdin>", line 1, in ?
    'str'.strip() 'ing'
                      ^
SyntaxError: invalid syntax

Строки могут быть проиндексированы; также как и в C, первый символ строки имеет индекс 0. Отсутствует отдельный тип для символов; символ является строкой с единичной длиной. Как и в языке программирования Icon, подстроки могут определены через нотацию срезов (slice): два индекса, разделенных двоеточием.

>>> word[4]
'A'
>>> word[0:2]
'He'
>>> word[2:4]
'lp'

Индексы срезов имеют полезные значения по умолчанию; опущенный первый индекс заменяется нулём, опущенный второй индекс подменяется размером срезаемой строки.

>>> word[:2]    # Первые два символа
'He'
>>> word[2:]    # Всё, исключая первые два символа
'lpA'

Встроенная функция len() возвращает длину строки (число символов в строке).

length = len('Строка')  
print(length)  # Программа выведет на экран число 6.

dict

dict - словарь. Это такой тип данных, в котором каждому значению (ключу) соответствует "толкование". Пример:

A = {'key1': 8,
     'key2': 9,
     'Ключ': 'Толкование.',
     'Множество': 'Беспорядочный набор объектов без повторений.',
     8: 7,
     9: 'Ключом может быть и число'}
print(A['Ключ']) # Программа напишет на экране: "Толкование."
print(A['key1']) # Программа должна вывести на экран цифру 8.

прибавить к одному словарю другой — b.update(c) В качестве ключей словаря нельзя использовать unhashable объекты. Сам dict является unhashable объектом. list/tuple в dict + интересное обсуждение, как перенумеровать объекты

dict можно копировать:

myDict.copy()

get

оч. полезная функция:

a = myDict.get( "key", "defaulValue" ) ## a = myDict["key"] if "key" in myDict esle "defaultValue"

has_key

метод has_key проверяет, существует ли ключ у словаря. Вместо него лучше (быстрее) использовать проверку:

if dictKey in self.dictObj:
    pass

сравнение произовдительности:

from datetime import datetime

args = {"guiHi": 0}
a = datetime.now()
for i in xrange(1000000):
    if args.has_key("guiHi"):
        pass

b = datetime.now()
for i in xrange(1000000):
    if "guiHi" in args:
        pass

c = datetime.now()
print b-a
print c-b
>>>
0:00:00.391000
0:00:00.234000

обход по словарю

  • по ключам: keys(), iterkeys()
  • по значениям: values(), itervalues()
  • по парам (ключ, значение): items(), iteritems()

list (Список)

В языке Python доступно некоторое количество составных типов данных, использующихся для группировки прочих значений вместе. Наиболее гибкий из них — список (list). Его можно выразить в тексте программы через разделённые запятыми значения (элементы), заключённые в квадратные скобки. Элементы списка могут быть разных типов.

a = ['spam', 'word', 100, 1234]

Подобно индексам в строках, индексы списков начинаются с нуля, списки могут быть срезаны, объединены (конкатенированы) и так далее:

>>> a[0]
'spam'
>>> a[2]
1234
>>> a[-2]
100
>>> a[1:-1]
['word', 100]

В отличие от строк, являющихся неизменяемыми, изменить индивидуальные элементы списка вполне возможно:

>>> a[2] = a[2] + 23
>>> a
['spam', 'word', 123, 1234]


определить позицию элемента в списке

list.index( "11" )

сортировка

aa = [2,44,2,3,5]
aa.sort() # сортировка по возрастанию
print aa
aa.reverse() # изменить порядок на противоположный
print aa
>>> [2, 2, 3, 5, 44]
>>> [44, 5, 3, 2, 2]

сортировка списка объектов:

class a(object):
    def __init__(self, priority):
        self.priority = priority
    def __repr__(self):
        return str(self.priority)
m = [a(3), a(6), a(1), a(0), a(7)]
m.sort(lambda x,y: x.priority-y.priority) ## тут lambda должна возвращать положительное или отрицательное число
    ## если нужно более сложное сравнение, то делаем
m.sort(lambda x,y: -1 if x.priority-y.priority else 1)
print m

Генерация списков, списковые выражения

Часто для заполнения списка возникает желание использовать функцию append и это бывает зло. вместо этого надо использовать генерацию списков с помощью «списковых выражений»

m = [2*x for x in range(10) if x*2> 10]

стоит обратить внимание, что это выражение является списком, а выражение:

(x for x in (10,11,12) )

является генератором. Причём, если генератор зависит от списка g:

a = (x for x in g)

то при изменении списка g меняется и генератор. Такой генератор a используется только один раз.

  1. (Прим. перев.):
    hello = "Это довольно длинная строка, содержащая\n\
     несколько строк текста — такой вы бы представили её в C.\n\
        Обратите внимание, что пробельное пространство в начале строки\
     имеет значение."
    
    print(hello)
    
  2. (Прим. перев.) raw string — для описания сырой строки (не требующей последующей обработки) используется префикс r.