понедельник, 7 декабря 2015 г.

Некоторые встроенные функции в Python; Объект итератор

Некоторые встроенные функции в Python



Рассмотрим некоторые встроенные функции python. Это те функции, которые идут, как говориться, из "коробки". С некоторыми из них, мы уже сталкивались, кпримеру функции преобразования(приведения) типов данных, такие как int(), float(), str(), list(), tuple(), dict().
Эти функции всегда в нашем распоряжении и они значительно облегчают нам жизнь. Мы не будем рассматривать все встроенные функции python, Т.К. их достаточно много, далеко не все востребованы, да и данные материалы не претендуют на роль полноценных справочников.


Функции, которые мы уже использовали



int();

float();

str();

list();

dict();

tuple();

len();

raw_input();


Продолжим с двух функций, которые при минимальном понимании английского языка, на несколько уровней упростят ваше изучение Python и дальнейшую работу, как со старыми, так и с новыми функциями и методами.


dir()



Данная функция, позволяет посмотреть набор методов для какого-то объекта. Причем как абстрактно, Т.Е. указав кпримеру тип строки dir(str), так и сославшись на вполне конкретную строку.

>>> dir(str)

'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper','join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

>>>


При применении данной функции к объекту, вам вылезет еще много названий, которые начинаются с одного или двух знаков "_". На данном этапе, мы просто не обращаем внимание на эти элементы, для нас - это всего лишь системные методы, которые необходимы в первую очередь самому Python.


help()



Функция, которая выдаст нам краткую информацию по функции или методу.

>>> a = 'Hello'

>>> dir(a)

'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper','join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', '

rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

>>> help(a.split)

Help on built-in function split:



split(...)

    S.split([sep [,maxsplit]]) -> list of strings



    Return a list of the words in the string S, using sep as the

    delimiter string.  If maxsplit is given, at most maxsplit    splits are done. If sep is not specified or is None, any

    whitespace string is a separator and empty strings are removed    from the result.



>>>


Обратите внимание, чтобы узнать информацию по методу объекта, мы передаем путь к этому методу также, как мы обращаемся к методу объекта при необходимости его задействовать, но не передаем круглые скобки после функции или метода. help(объект.метод). Поиграйтесь, посмотрите при помощи функции dir(), методы списка, словаря, строки... Посмотрите краткую информацию по этим методам при помощи функции help().

Чтобы посмотреть встроенные функции в Python, необходимо передать функции dir(), аргумент __builtins__. Чтобы посмотреть информацию по функции, ее просмто передают в функцию help(). Кпримеру help(len).

Это великолепно! Находясь в интерпретаторе Python, мы имеем динамическую, лаконичную справку, которая неимоверно облегчает процесс программирования. Вам даже не нужно знать, какой тип данных храниться в объекте, мы даже можем не знать толком что-то про объект, но мы всегда можем посмотреть его методы и короткую справочную информацию, которая значительно поможет разобраться с взаимодействием с данным объектом.


len()



С данной функцией мы уже имели дело. Она возвращает длинну списка, кортежа, строки или количество пар ключ-значение у словаря.


min(), max()



Как подсказывает логика, эти методы возвращают минимальный и максимальный элемент списка или строки. При получении строчного типа с буквами, будет возвращать элемент, ориентируясь по алфавиту.

>>> a = [5,2,64,3,8]

>>> min(a)

2

>>> max(a)

64

>>> a = 'abc'

>>> min(a)

'a'

>>> max(a)

'c'

>>>



sum()



Возвращает сумму элементов списка.

>>> a = [1,3,4,5,7]

>>> sum(a)

20

>>>



zip()



Данная функция возвращает список кортежей значений переданных в нее списков.

>>> a = ["Red", "Blue", "Green", "Magenta"]

>>> a

['Red', 'Blue', 'Green', 'Magenta']

>>> b = [1,2,3,4]

>>> b

[1, 2, 3, 4]

>>> zip(a,b)

[('Red', 1), ('Blue', 2), ('Green', 3), ('Magenta', 4)]

>>>


Функция берет первые элементы двух списков, соединяет их в первый кортеж. Затем вторые элементы двух списков и также соединяет их в кортеж. Таким образом, списки склеиваются  до конца и возвращаются в виде списка кортежей. Если вспомнить правило преобразования типов со списка в словарь, мы поймем, что это как раз тот случай, который позволяет легким движением руки, превратить список кортежей, в словарь:

>>> dict(zip(a,b))

{'Blue': 2, 'Magenta': 4, 'Green': 3, 'Red': 1}

>>>


В функцию zip(), при необходимости, можно передавать более 2х списков. Также функция zip(), обрежет возвращаемый список кортежей, по самому короткому переданному списку:

>>> a

['Red', 'Blue', 'Green', 'Magenta']

>>> b = [1,2,3]

>>> zip(a,b)

[('Red', 1), ('Blue', 2), ('Green', 3)]

>>>


Как видно, были обрезаны 2 последних элемента в списке "a".


range()



Эта функция возвращает список натуральных чисел в заданном диапазоне.

>>> range(0,10)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>>


Третий аргумент этой функции, возвращает последовательность чисел с заданным шагом А-ля срез:

>>> range(0,10,2)

[0, 2, 4, 6, 8]

>>>


Также можно задавать обратную последовательность, числа могут быть минусовыми, чтобы задать ряд в обратном порядке, третий аргумент, должен иметь знак минус:

>>> range(10,0,-1)

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

>>> range(10,0,-2)

[10, 8, 6, 4, 2]

>>> range(10,-10,-1)

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

>>>



map()



Эта функция служит для решения нескольких задач. Она может вернуть список кортежей значений также, как это делает функция zip(), но не будет резать возвращаемый список по самому короткому переданному списку. Наоборот, вернет список кортежей, равный длине самого длинного переданного списка, доставив None вместо значений у более коротких списков:

>>> a = [1,2,3,4,5]

>>> b = [5,4,3]

>>> map(None,a,b)

[(1, 5), (2, 4), (3, 3), (4, None), (5, None)]

>>>


Как видно, вместо недостающих элементов списка "b", в кортежи были переданы значения None.

Второе использование функции map(), заключается в том, что мы можем передать первым аргументом какую-то функцию, вторым какой-то список и функция map() применит для каждого элемента переданного списка функцию, которую мы передали в первом аргументе. Кпримеру, создадим строку '12345', разделим ее поэлементно на список из 5 элементов строчных значений, а потом суммируем все при помощи функции sum():

>>> a = '12345'

>>> a

'12345'

>>> a = list(a)

>>> a

['1', '2', '3', '4', '5']

>>> map(int,a)

[1, 2, 3, 4, 5]

>>> sum(map(int,a))

15

>>>


Что произошло? Начало вполне очевидно, со строки, мы получили список строчных элементов, затем передали ее функции map(), указав первым аргументом функцию int без скобочек. Для каждого элемента списка, была применена функция int(), которая преобразовала строчный тип в численный и функция map(), вернула нам список уже с элементами типа число, что позволило нам передать все это в функцию sum() и получить сумму этих элементов.


sorted()



Данная функция похожа на метод списка sort(). Стоит обратить внимание, что функция sorted() при применении ее к списку, не изменит последний, а вернет новый список отсортированных значений:

>>> a = [4,3,7,5,8,3,8,4,6,1,4,3]

>>> a

[4, 3, 7, 5, 8, 3, 8, 4, 6, 1, 4, 3]

>>> sorted(a)

[1, 3, 3, 3, 4, 4, 4, 5, 6, 7, 8, 8]

>>> a

[4, 3, 7, 5, 8, 3, 8, 4, 6, 1, 4, 3]

>>>



reversed()



Эта функция аналогична методу списка reverse(). Она не изменит список при применении, а вернет новый зеркально перевернутый список. Обратите внимание, что вызов этой функции в примере, я оборачиваю функцией list(). Для чего - это я объясню в конце этой темы.

>>> a = [1,2,3,4,5]

>>> a

[1, 2, 3, 4, 5]

>>> list(reversed(a))

[5, 4, 3, 2, 1]

>>> a

[1, 2, 3, 4, 5]

>>>



enumerate()



Данная функция позволяет пронумеровать какой-то список, вернув список кортежей попарных элементов, где первый элемент - это номер, а второй - это элемент нумеруемого списка. Вторым аргументом функции enumerate, мы можем указать, с какого числа начинать нумерацию, по умолчанию 0. Обратите внимание, что эту функцию я также заключаю в функцию list().

>>> a = ['Red', 'Green', 'Blue', 'Magenta', 'Black', 'White']

>>> a

['Red', 'Green', 'Blue', 'Magenta', 'Black', 'White']

>>> enumerate(a)



>>> list(enumerate(a))

[(0, 'Red'), (1, 'Green'), (2, 'Blue'), (3, 'Magenta'), (4, 'Black'), (5, 'White

')]

>>> list(enumerate(a,1))

[(1, 'Red'), (2, 'Green'), (3, 'Blue'), (4, 'Magenta'), (5, 'Black'), (6, 'White

')]

>>>


Как видно по структуре, мы легко можем превратить это в словарь:

>>> dict(list(enumerate(a,1)))

{1: 'Red', 2: 'Green', 3: 'Blue', 4: 'Magenta', 5: 'Black', 6: 'White'}

>>>



Объект итератор и метод next()



Зачем я оборачивал функции reversed() и enumerate() функцией list()?

Дело в том, что у нас существует вид объекта, который мы называем объект итератор. Штатно, он позволяет получать с него элементы при помощи метода next(). Элементы он возвращает с начала и удаляет их с объекта. Это чем-то похоже на метод списка pop(). Причем посмотреть элементы этого объекта мы неможем, можем только получать их при помощи метода next(). Чтобы превратить такой объект в список, мы должны явно преобразовать его при помощи функции list(). Давайте посмотрим, что произойдет, если мы не заключим функцию reversed() в функцию list():

>>> a = [1,2,3,4,5]

>>> a

[1, 2, 3, 4, 5]

>>> reversed(a)



>>> b = reversed(a) # Сохраним объект под переменной b

>>> b



>>> dir(b) # посмотрим методы объекта

['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__has

h__', '__init__', '__iter__', '__length_hint__', '__new__', '__reduce__', '__red

uce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__

', 'next']

>>> b.next() # применяем метод next()

5

>>> b.next()

4

>>> b.next()

3

>>> b.next()

2

>>> b.next()

1

>>> b.next()

Traceback (most recent call last):

  File "", line 1, in

StopIteration

>>>


Объект итератор - это такой же полноценный объект, как и объект списка, но имеет всего один метод next() и возвращает свои элементы только 1 раз и начиная с конца. Никакой особой логики, по которой можно было бы ориентироваться в том, какая функция или метод вернет нам не список, а объект итератор, в python 2.7 нет. Мы просто помним, что такое вполне может иметь место.


Напоследок



Естественно - это не все встроенные функции, а только наиболее часто используемые в начале обучения. В дальнейшем, мы расширим наши знания по этим функциям и возьмем их на вооружение, но на данном этапе, вы можете использовать этот материал, как справку при необходимости

Комментариев нет:

Отправить комментарий