Python списки

5.7. More on Conditions¶

The conditions used in and statements can contain any
operators, not just comparisons.

The comparison operators and check whether a value occurs
(does not occur) in a sequence. The operators and compare
whether two objects are really the same object; this only matters for mutable
objects like lists. All comparison operators have the same priority, which is
lower than that of all numerical operators.

Comparisons can be chained. For example, tests whether is
less than and moreover equals .

Comparisons may be combined using the Boolean operators and , and
the outcome of a comparison (or of any other Boolean expression) may be negated
with . These have lower priorities than comparison operators; between
them, has the highest priority and the lowest, so that is equivalent to . As always, parentheses
can be used to express the desired composition.

The Boolean operators and are so-called short-circuit
operators: their arguments are evaluated from left to right, and evaluation
stops as soon as the outcome is determined. For example, if and are
true but is false, does not evaluate the expression
. When used as a general value and not as a Boolean, the return value of a
short-circuit operator is the last evaluated argument.

It is possible to assign the result of a comparison or other Boolean expression
to a variable. For example,

>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'

Несколько слов о «document.write»

Есть ещё один, очень древний метод добавления содержимого на веб-страницу: .

Синтаксис:

Вызов записывает на страницу «прямо здесь и сейчас». Строка может быть динамически сгенерирована, поэтому метод достаточно гибкий. Мы можем использовать JavaScript, чтобы создать полноценную веб-страницу и записать её в документ.

Этот метод пришёл к нам со времён, когда ещё не было ни DOM, ни стандартов… Действительно старые времена. Он всё ещё живёт, потому что есть скрипты, которые используют его.

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

Вызов работает только во время загрузки страницы.

Если вызвать его позже, то существующее содержимое документа затрётся.

Например:

Так что после того, как страница загружена, он уже непригоден к использованию, в отличие от других методов DOM, которые мы рассмотрели выше.

Это его недостаток.

Есть и преимущество. Технически, когда запускается во время чтения HTML браузером, и что-то пишет в документ, то браузер воспринимает это так, как будто это изначально было частью загруженного HTML-документа.

Поэтому он работает невероятно быстро, ведь при этом нет модификации DOM. Метод пишет прямо в текст страницы, пока DOM ещё в процессе создания.

Так что, если нам нужно динамически добавить много текста в HTML, и мы находимся на стадии загрузки, и для нас очень важна скорость, это может помочь. Но на практике эти требования редко сочетаются. И обычно мы можем увидеть этот метод в скриптах просто потому, что они старые.

Устаревшие методы вставки/удаления

Старая школа

Эта информация помогает понять старые скрипты, но не нужна для новой разработки.

Есть несколько других, более старых, методов вставки и удаления, которые существуют по историческим причинам.

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

Мы упоминаем о них только потому, что их можно найти во многих старых скриптах:

Добавляет в конец дочерних элементов .

Следующий пример добавляет новый в конец :

Вставляет перед в .

Следующий пример вставляет новый элемент перед вторым :

Чтобы вставить в начало, мы можем сделать вот так:

Заменяет на среди дочерних элементов .

Удаляет из (предполагается, что он родитель ).

Этот пример удалит первый из :

Все эти методы возвращают вставленный/удалённый узел. Другими словами, вернёт . Но обычно возвращаемое значение не используют, просто вызывают метод.

Значение Истины

False True
False (== 0) True (== 1)
«» (пустая строка) любая строка кроме «» (» «, «что-нибудь»)
0, 0.0 любое число кроме 0 (1, 0.1, -1, 3.14)
[], (), {}, set() любой не пустой контейнер (, (None,), )
None почти любой объект, который явно не False
>>> class C:
...  pass
...
>>> o = C()
>>> bool(o)
True
>>> bool(C)
True

truth.py

class MyContainer(object):

    def __init__(self, data):
        self.data = data

    def __len__(self):
        """Return my length."""
        return len(self.data)
class MyClass(object):

    def __init__(self, value):
        self.value = value

    def __nonzero__(self):
        """Return my truth value (True or False)."""
        # This could be arbitrarily complex:
        return bool(self.value)
__bool__ = __nonzero__

5.6. Looping Techniques¶

When looping through a sequence, the position index and corresponding value can
be retrieved at the same time using the function.

>>> for i, v in enumerate():
...     print i, v
...
0 tic
1 tac
2 toe

To loop over two or more sequences at the same time, the entries can be paired
with the function.

>>> questions = 'name', 'quest', 'favorite color'
>>> answers = 'lancelot', 'the holy grail', 'blue'
>>> for q, a in zip(questions, answers):
...     print 'What is your {0}?  It is {1}.'.format(q, a)
...
What is your name?  It is lancelot.
What is your quest?  It is the holy grail.
What is your favorite color?  It is blue.

To loop over a sequence in reverse, first specify the sequence in a forward
direction and then call the function.

>>> for i in reversed(xrange(1,10,2)):
...     print i
...
9
7
5
3
1

To loop over a sequence in sorted order, use the function which
returns a new sorted list while leaving the source unaltered.

>>> basket = 'apple', 'orange', 'apple', 'pear', 'orange', 'banana'
>>> for f in sorted(set(basket)):
...     print f
...
apple
banana
orange
pear

When looping through dictionaries, the key and corresponding value can be
retrieved at the same time using the method.

>>> knights = {'gallahad' 'the pure', 'robin' 'the brave'}
>>> for k, v in knights.iteritems():
...     print k, v
...
gallahad the pure
robin the brave

It is sometimes tempting to change a list while you are looping over it;
however, it is often simpler and safer to create a new list instead.

Методы списков

len()

Метод возвращает длину объекта (списка, строки, кортежа или словаря).

принимает один аргумент, который может быть или последовательностью (например, строка, байты, кортеж, список, диапазон), или коллекцией (например, словарь, множество, frozenset).

list1 =   # список
print(len(list1)) # в списке 3 элемента, в выводе команды будет "3"

str1 = 'basketball'  # строка
print(len(str1))  # в строке 9 букв, в выводе команды будет "9"

tuple1 = (2, 3, 4, 5)  # кортеж
print(len(tuple1))  # в кортеже 4 элемента, в выводе команды будет "4"

dict1 = {'name': 'John', 'age': 4, 'score': 45} # словарь
print(len(dict1))  # в словаре 3 пары ключ-значение, в выводе команды будет "3"

index()

возвращает индекс элемента. Сам элемент передается методу в качестве аргумента. Возвращается индекс первого вхождения этого элемента (т. е., если в списке два одинаковых элемента, вернется индекс первого).

numbers = 
words = 

print(numbers.index(9)) # 4
print(numbers.index(2)) # 1
print(words.index("I")) # 0
print(words.index("JavaScript")) # возвращает ValueError, поскольку 'JavaScript' в списке 'words' нет

Первый результат очевиден. Второй и
третий output демонстрируют возврат индекса
именно первого вхождения.

Цифра «2» встречается в списке дважды,
первое ее вхождение имеет индекс 1,
второе — 2. Метод index() возвращает индекс
1.

Аналогично возвращается индекс 0 для элемента «I».

Если элемент, переданный в качестве аргумента, вообще не встречается в списке, вернется ValueError. Так получилось с попыткой выяснить индекс «JavaScript» в списке .

Опциональные аргументы

Чтобы ограничить поиск элемента
конкретной подпоследовательностью,
можно использовать опциональные
аргументы.

words = 
print(words.index("am", 2, 5)) # 4

Метод index() будет искать элемент «am» в диапазоне от элемента с индексом 2 (включительно) до элемента с индексом 5 (этот последний элемент не входит в диапазон).

При этом возвращаемый индекс — индекс
элемента в целом списке, а не в указанном
диапазоне.

pop()

Метод удаляет и возвращает последний элемент списка.

Этому методу можно передавать в качестве параметра индекс элемента, который вы хотите удалить (это опционально). Если конкретный индекс не указан, метод удаляет и возвращает последний элемент списка.

Если в списке нет указанного вами индекса, метод выбросит exception .

cities = 

print "City popped is: ", cities.pop() # City popped is: San Francisco
print "City at index 2 is  : ", cities.pop(2) # City at index 2 is: San Antonio

Базовый функционал стека

Для реализации базового функционала
стека в программах на Python часто
используется связка метода pop() и метода
append():

stack = []

for i in range(5):
    stack.append(i)

while len(stack):
    print(stack.pop())

Срезы

В начале статьи что-то гово­рилось о «срезах». Давайте разберем подробнее, что это такое. Срезом называется неко­торая подпос­ледователь­ность. Принцип действия срезов очень прост: мы «отре­заем» кусок от исходной последова­тель­ности элемента, не меняя её при этом. Я сказал «последо­вательность», а не «спи­сок», потому что срезы работают и с другими итерируемыми типами данных, например, со строками.

fruits =

part_of_fruits = fruits
print(part_of_fruits)

>>>

Детально рассмотрим синтаксис срезов:

итерируемая_переменная

Обращаю ваше внимание, что мы делаем срез от начального индекса до конечного индекса — 1. То есть i = начальный_индекс и i. Больше примеров!

Больше примеров!

fruits =
print(fruits)
# Если начальный индекс равен 0, то его можно опустить
print(fruits)
print(fruits)
print(fruits)
print(fruits)
# Если конечный индекс равен длине списка, то его тоже можно опустить
print(fruits)
print(fruits)

>>>
>>>
>>>
>>>
>>>
>>>
>>>

Самое время понять, что делает третий параметр среза — длина шага!

fruits =
print(fruits)
print(fruits)
# Длина шага тоже может быть отрицательной!
print(fruits)
print(fruits)
print(fruits)

>>>
>>>
>>>
>>>
>>>

А теперь вспоминаем всё, что мы знаем о циклах. В Python их целых два! Цикл for и цикл while Нас интересует цикл for, с его помощью мы можем перебирать зна­чения и индексы наших последовательностей. Начнем с перебора значений:

fruits =
for fruit in fruits:

    print(fruit, end=’ ‘)

>>> Apple Grape Peach Banan Orange

Выглядит несложно, правда? В переменную fruit объявлен­ную в цикле по очереди записываются значения всех элементов списка fruits

А что там с перебором индексов?

for index in range(len(fruits)):

    print(fruits, end=’ ‘)

Этот пример гораздо интереснее предыдущего! Что же здесь происходит? Для начала разбе­ремся, что делает функция range(len(fruits))

Мы с вами знаем, что функция len() возвращает длину списка, а range() генерирует диапазон целых чисел от 0 до len()-1.

Сложив 2+2, мы получим, что переменная index принимает значения в диапазоне от 0 до len()-1. Идем дальше, fruits — это обращение по индексу к элементу с индексом index списка fruits. А так как переменная index принимает значения всех индексов списка fruits, то в цикле мы переберем значения всех элементов нашего списка!

Discussion

Is the result of appending one list to another a list?

EE, PYK: No. The result of an appending one list to another might happen to be a list, but there’s no guarantee, and even if the result is a list, it might not be the list one expects:

set a 
set b 
append a $b
puts $a ;# -> a b c1 2 3

The third word in this new list is not c, but c1. Does anyone know if there are cases where an append would result in something not a list?

Here’s an example of such a case:

set l1 
set l2 
append l1 $l2
llength $l1 ;# -> list element in braces followed by "{d" instead of space

RS PYK: The intended functionality seems to me to be closer to concat. But if you wish to use append, just add an extra space to separate the parts, which always guarantees that the result is a list composed of the original lists:

append l1 { } $l2

AMG: For performance reasons, when concatenating the results of multiple substitutions or interspersing substitutions with literal text, it’s better to give many arguments than to give it a single value argument.

append var xxx$a$b$c    ;# Has to generate temporary string xxx$a$b$c
append var xxx $a $b $c ;# No temporary strings needed

AMG: Single-argument append works just like single-argument set: it returns the value of the named variable. This isn’t normally useful, but it might come in handy if the {*} expansion operator is used to produce the argument list.

If the variable doesn’t exist, append dies with the same error that set would in the same situation. This is the only time append will complain about the variable not existing, since it’s normally a creative writer. If the variable exists but is an array, once again single-argument append gives the same error as set, complaining about its inability to «read» it, once again showing single-argument append and set to be identical. The rest of the time, the errors given by append complain about not being able to «set» the variable.

AMG, update: I feel this is a bug and is inconsistent with the documentation. It makes more sense to me that single-argument create the variable with empty string as its initial value, same as append var {} described below.

foo: by traditional wisdom, append var, when var doesn’t exist, is very likely to be a mistake, which should raise an error to alert the programmer. OTOH, the TIP #323: Do Nothing Gracefully revision has lead to many commands now accepting essentially meaningless argument lists (not a criticism). append var could be handled like those, but it still remains to decide how it should act:

  • no-op (like most of the changed commands — does not assign to var)
  • equivalent to append var {} (as per AMG’s suggestion, but not really in line with other changed commands)
  • equivalent to variable var (i.e. var is created but remains undefined — probably not a good idea)

AMG: append can be used in a one-liner to initialize a variable’s value to empty string if it doesn’t exist.

append var {} 

In the above code, if $var doesn’t exist, it is created and the value set to the empty string. If it does exist, its value will be left unchanged. According to tcl::unsupported::representation, no shimmering is induced.

Tcl syntax help Arts and Crafts of Tcl-Tk Programming Category Command

Удаление узлов

Удаление узла из дерева осуществляется в 2 этапа:

  1. Получить (найти) этот узел в дереве. Это действие обычно осуществляется одним из следующих методов: , , , , или .
  2. Вызвать у родительского узла метод removeChild(), которому в качестве параметра необходимо передать узел, который мы хотим у него удалить.Метод возвращает в качестве значения удалённый узел или , если узел, который мы хотели удалить, не существовал.
//найти узел, который мы хотим удалить
var findElement = document.getElementById("notebook");
//вызвать у родительского узла метод removeChild
//и передать ему в качестве параметра найденный узел
findElement.parentNode.removeChild(findElement);

Например, удалить последний дочерний элемент у элемента, имеющего :

//получить элемент, имеющий id="myID"
var myID = document.getElementById("myID");
//получить последний дочерний узел у элемента myID
var lastNode = myID.lastChild;
//т.к. мы не знаем, является ли последний дочерний узел элемента элементом,
//то воспользуемся циклом while для поиска последнего дочернего элемента у элемента myID 
//пока у элемента есть узел и его тип не равен 1 (т.е. он не элемент) выполнять
while(lastNode && lastNode.nodeType!=1) {
  //перейти к предыдущему узлу
  lastNode = lastNode.previousSibling;
}
//если у узла myID мы нашли элемент
if (lastNode) {
  //то его необходимо удалить
  lastNode.parentNode.removeChild(lastNode);
}

Например, удалить все дочерние узлы у элемента, имеющего :

//получить элемент, у которого мы хотим удалить все его дочерние узлы
var elementQuestion = document.getElementById("myQuestion");
//пока есть первый элемент
while (elementQuestion.firstElement) {
  //удалить его
  elementQuestion.removeChild(element.firstChild);
}

Задание

  1. Напишите функцию, удаляющую все текстовые узлы у элемента.
  2. Имеется 2 списка (…), напишите код на языке JavaScript, удаляющий все элементы из 1 и 2 списка.

Как удалить элемент в jQuery?

В jQuery имеется несколько методов для удаления элементов из DOM.

Первый метод – это .

Данный метод позволяет удалить все или часть элементов из выбранного набора.

Синтаксис метода :

.detach(  )

Параметр является не обязательным. Он используется для указания селектора, в соответствии с которым будут удаляться не все элементы из набора, а только те которые ему соответствуют.

Например, удалим все элементы с классом info на странице:

$('.info').detach();

Метод при удалении элементов не удаляет связанные с ними данные jQuery и обработчики событий. Таким образом при восстановлении элементов, удалённых с помощью метода , они будут связаны со всеми своими данными jQuery и обработчиками событий.

Рассмотрим это на примере:

<div id="detach-wrapper">
  <p>Кнопка, удалять которую будем с помощью метода detach:</p>
  <button id="detach">Нажмите для удаления</button>
</div>
<div id="remove-wrapper">
  <p>Кнопка, удалять которую будем с помощью метода remove</p>
  <button id="remove">Нажмите для удаления</button>
</div>
<div>
  <button id="action-add">Восстановить удалённые кнопки</button>
</div>

<script>
  // переменные, в которые будем сохранять кнопки, чтобы их можно было вернуть обратно
  var detachBtn, removeBtn;

  $('#detach').click(function () {
    // удаляем кнопку с помощью метода detach, сохраняем её в переменную detachBtn
    detachBtn = $(this).detach();
  });

  $('#remove').click(function () {
    // удаляем кнопку с помощью метода remove, сохраняем её в переменную removeBtn
    removeBtn = $(this).remove();
  });
  
  // при нажатию на кнопку #action-add добавляем удалённые кнопки detachBtn и removeBtn на страницу
  $('#action-add').click(function () {
    if ($('#detach').length === 0) {
      $('#detach-wrapper').append(detachBtn);
    }
    if ($('#remove').length === 0) {
      $('#remove-wrapper').append(removeBtn);
    }
  });
</script>

Второй метод – это .

Это метод предназначен для удаления все дочерних узлов у каждого элемента из текущего набора.

Синтаксис метода :

.empty()

Пример, в котором удалим все дочерние узлы у элемента с идентификатором «message»:

$('#message').empty();

Пример, в котором при нажатии на кнопку, получим элемент в котором она находится по селектору и удалим его содержимое:

<div class="content">
  <p>Содержимое 1...</p>
  <button>Удалить содержимое</button>
</div>

<script>
  $('button').click(function () {
    // получим блок с .content в котором находится эта кнопка и удалим всё его содержимое
    $(this).closest('.content').empty(); 
  })
</script>

Чтобы избежать утечек памяти, jQuery удаляет другие конструкции, такие как данные и обработчики событий, из дочерних элементов перед удалением самих элементов.

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

Третий метод – это .

Он используется для удаления выбранных элементов из DOM.

Синтаксис метода remove:

.remove(  )

Параметр является не обязательным. Его нужно использовать, когда вам нужно удалить из набора не все элементы, а только те которые соответствуют селектору.

Метод похож на , но в отличии от него он удаляет не только все дочерние узлы, но и сам элемент. В дополнение вместе с элементами удаляются все связанные с ними события и данные jQuery. Если вам нужно удалить элементы без удаления данных и событий, то используйте метод .

Пример, в котором будем удалять кнопку при нажатии на неё.

  $('button').click(function() {
    $(this).remove();
  });

Четвёртый метод для удаления элементов из DOM – это .

Метод применяется для удаления только родительских элементов у каждого элемента из текущего набора оставляя при этом соответствующие элементы на месте.

Синтаксис метода :

.unwrap(  )

Метод имеет один необязательный параметр . В качестве данного параметра задаётся селектор, который будет использоваться для проверки родительского элемента. Если родительский элемент не соответствует селектору, то он не будет убран из DOM.

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

<div class="container-1">
  <div class="inner"></div>
</div>
<div class="container-2">  
  <div class="inner"></div>  
</div>

<script>
$('.inner').unwrap();

// после выполнения:
// <div class="inner"></div>
// <div class="inner"></div>
</script>

С использованием . Например будем удалять только те оборачиваемые элементы, которые соответсвуют селектору «.container-1»:

$('.inner').unwrap('.container-1');
    
// после выполнения:
// <div class="inner"></div>
// <div class="container-2">  
//   <div class="inner"></div>  
// </div>

Как переместить элемент в jQuery

Если вам нужно именно переместить элемент, а не скопировать, то в jQuery это можно выполнить посредством использования нескольких методов.

Пример:

<div class="content-1">
  <p>...</p>
  <button id="move">Переместить кнопку в .content-2</button>
</div>
<div class="content-2">
  <p>...</p>
</div>

<script>
  $('#move').detach().appendTo('.content-2');

  // после выполнения:
  // <div class="content-1">
  //   <p>...</p>
  // </div>
  // <div class="content-2">
  //   <p>...</p>
  //   <button id="move">Переместить кнопку в .content-2</button>
  // </div>
</script>

Как в этом примере осуществляется перемещение? Сначала мы получаем элемент, который мы хотим переместить, в данном случае «#move». После этого вызываем метод , который удалит элемент из текущего места. В качестве результата он нам возвратит удалённый элемент. Далее удалённый элемент с помощью метода вставляем в нужное место.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *