Библиотека knigago >> Компьютеры: Языки и системы программирования >> Python >> Самоучитель Python. Выпуск 0.2

Дмитрий Мусин - Самоучитель Python. Выпуск 0.2

Самоучитель Python. Выпуск 0.2
Книга - Самоучитель Python. Выпуск 0.2.  Дмитрий Мусин  - прочитать полностью в библиотеке КнигаГо
Название:
Самоучитель Python. Выпуск 0.2
Дмитрий Мусин

Жанр:

Python

Изадано в серии:

неизвестно

Издательство:

неизвестно

Год издания:

ISBN:

неизвестно

Отзывы:

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

Рейтинг:

Поделись книгой с друзьями!

Помощь сайту: донат на оплату сервера

Краткое содержание книги "Самоучитель Python. Выпуск 0.2"

Аннотация к этой книге отсутствует.

Читаем онлайн "Самоучитель Python. Выпуск 0.2". [Страница - 34]

sio.write("there!")
6
>>> sio.getvalue()
'Hello, there!'
>>> import array
>>> a = array.array('u', s)
>>> print(a)
array('u', 'Hello, world')
>>> a[0] = 'y'
>>> print(a)
array('u', 'yello, world')

32.16. Почему -22 // 10 равно -3?

134

Самоучитель Python, Выпуск 0.2

>>> a.tounicode()
'yello, world'

32.18 Как использовать строки для вызова функций/методов?
Существует несколько приёмов.
• Лучший - использование словаря, ставящего соответствие строке функцию. Его главное достоинство - строки не обязаны совпадать с названиями функций.
def a():
pass
def b():
pass
dispatch = {'go': a, 'stop': b}

# Note lack of parens for funcs

dispatch[get_input()]()

• Использование встроенной функции getattr:
import foo
getattr(foo, 'bar')()

• Использование locals или eval (не рекомендуется)
def myFunc():
print("hello")
fname = "myFunc"
f = locals()[fname]
f()
f = eval(fname)
f()

32.19 Как удалить все символы новой строки в конце строки?
Можно использовать S.rstrip("\r\n") для удаления символов новой строки, без удаления конечных пробелов:
>>> lines = ("line 1 \r\n"
...
"\r\n"
...
"\r\n")

32.18. Как использовать строки для вызова функций/методов?

135

Самоучитель Python, Выпуск 0.2

>>> lines.rstrip("\r\n")
'line 1 '

32.20 Как удалить повторяющиеся элементы в списке?
Существует несколько путей: http://code.activestate.com/recipes/52560/

32.21 Как создать многомерный список?
Возможно, вы попробуете этот неудачный вариант:
>>> A = [[None] * 2] * 3

Это выглядит правильно, если напечатать:
>>> A
[[None, None], [None, None], [None, None]]

Но если вы присвоите значение, то оно появится в нескольких местах:
>>> A[0][0] = 5
>>> A
[[5, None], [5, None], [5, None]]

Причина в том, что оператор * не создаёт копию, а только ссылку на существующий
объект. *3 создаёт список из 3 ссылок на один и тот же список. Изменение в одной строке
изменяют другие, что, вероятно, не то, что вы хотите.
Возможные пути решения:
A = [None] * 3
for i in range(3):
A[i] = [None] * 2
w, h = 2, 3
A = [[None] * w for i in range(h)]

Или, можно использовать специальные модули, предоставляющие матрицы. Наиболее
известным является NumPy.

32.20. Как удалить повторяющиеся элементы в списке?

136

Самоучитель Python, Выпуск 0.2

32.22 Почему a_tuple[i] += [’item’] не работает, а добавление работает?
Это из-за того, что расширенный оператор присваивания - оператор присваивания, а также из-за разницы между изменяемыми и неизменяемыми объектами в Python.
Это обсуждение относится в общем, когда расширенные операторы присваивания применяются к элементам кортежа, которые указывают на изменяемые объекты, но мы будем
использовать список и += , как образец.
Если вы напишете:
>>> a_tuple = (1, 2)
>>> a_tuple[0] += 1
Traceback (most recent call last):
...
TypeError: 'tuple' object does not support item assignment

Причина исключения должна быть понятна: 1 добавляется к объекту a_tuple[0] , но
когда мы пытаемся присвоить результат, 2 , к первому элементу в кортеже, мы получаем
ошибку, поскольку мы не можем изменить элемент кортежа.
То есть, это выражение делает следующее:
>>> result = a_tuple[0] + 1
>>> a_tuple[0] = result
Traceback (most recent call last):
...
TypeError: 'tuple' object does not support item assignment

Когда мы пишем что-то вроде:
>>> a_tuple = (['foo'], 'bar')
>>> a_tuple[0] += ['item']
Traceback (most recent call last):
...
TypeError: 'tuple' object does not support item assignment

Исключение немного более неожиданное, но более удивителен тот факт, что, несмотря
на ошибку, элемент добавился!
>>> a_tuple[0]
['foo', 'item']

Чтобы понять, что случилось, нужно знать, что:
• Если объект определяет метод __iadd__ , он вызывается, когда выполняется += , и
возвращенное значение используется для присваивания
• Для списков, __iadd__ эквивалентен вызову extend для списка
Таким образом,
32.22. Почему a_tuple[i] += [’item’] не работает, а добавление работает?

137

Самоучитель Python, Выпуск 0.2

>>> a_list = []
>>> a_list += [1]
>>> a_list
[1]

Эквивалентен:
>>> result = a_list.__iadd__([1])
>>> a_list = result

Таким образом, наш пример с кортежом эквивалентен:
>>> result = a_tuple[0].__iadd__(['item'])
>>> a_tuple[0] = result
Traceback (most recent call last):
...
TypeError: 'tuple' object does not support item assignment

__iadd__ завершился успешно, и список увеличился, но присваивание законилось
ошибкой.

32.22. Почему a_tuple[i] += [’item’] не работает, а добавление работает?

138

--">

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


Ваш e-mail является приватным и не будет опубликован в комментарии.