Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

and и or для объектов

30.11.2018, 16:16. Показов 1340. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такой код:
Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
"""
 
Python AVL tree example based on 
 
https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/lecture-videos/lec06_code.zip
 
Simplified for Rosetta Code example.
 
See also:
 
https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/lecture-videos/MIT6_006F11_lec06_orig.pdf
 
https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-006-introduction-to-algorithms-fall-2011/lecture-videos/lecture-6-avl-trees-avl-sort/
 
"""
 
class AVLNode(object):
    """A node in the AVL tree."""
 
    def __init__(self, parent, k):
        """Creates a node.
 
        Args:
            parent: The node's parent.
            k: key of the node.
        """
        self.key = k
        self.parent = parent
        self.left = None
        self.right = None
 
    def _str(self):
        """Internal method for ASCII art."""
        label = str(self.key)
        if self.left is None:
            left_lines, left_pos, left_width = [], 0, 0
        else:
            left_lines, left_pos, left_width = self.left._str()
        if self.right is None:
            right_lines, right_pos, right_width = [], 0, 0
        else:
            right_lines, right_pos, right_width = self.right._str()
        middle = max(right_pos + left_width - left_pos + 1, len(label), 2)
        pos = left_pos + middle // 2
        width = left_pos + middle + right_width - right_pos
        while len(left_lines) < len(right_lines):
            left_lines.append(' ' * left_width)
        while len(right_lines) < len(left_lines):
            right_lines.append(' ' * right_width)
        if (middle - len(label)) % 2 == 1 and self.parent is not None and \
           self is self.parent.left and len(label) < middle:
            label += '.'
        label = label.center(middle, '.')
        if label[0] == '.': label = ' ' + label[1:]
        if label[-1] == '.': label = label[:-1] + ' '
        lines = [' ' * left_pos + label + ' ' * (right_width - right_pos),
                 ' ' * left_pos + '/' + ' ' * (middle-2) +
                 '\\' + ' ' * (right_width - right_pos)] + \
          [left_line + ' ' * (width - left_width - right_width) + right_line
           for left_line, right_line in zip(left_lines, right_lines)]
        return lines, pos, width
 
    def __str__(self):
        return '\n'.join(self._str()[0])
 
    def find(self, k):
        """Finds and returns the node with key k from the subtree rooted at this 
        node.
 
        Args:
            k: The key of the node we want to find.
 
        Returns:
            The node with key k.
        """
        if k == self.key:
            return self
        elif k < self.key:
            if self.left is None:
                return None
            else:
                return self.left.find(k)
        else:
            if self.right is None:  
                return None
            else:
                return self.right.find(k)
 
    def find_min(self):
        """Finds the node with the minimum key in the subtree rooted at this 
        node.
 
        Returns:
            The node with the minimum key.
        """
        current = self
        while current.left is not None:
            current = current.left
        return current
 
    def next_larger(self):
        """Returns the node with the next larger key (the successor) in the BST.
        """
        if self.right is not None:
            return self.right.find_min()
        current = self
        while current.parent is not None and current is current.parent.right:
            current = current.parent
        return current.parent
 
    def insert(self, node):
        """Inserts a node into the subtree rooted at this node.
 
        Args:
            node: The node to be inserted.
        """
        if node is None:
            return
        if node.key < self.key:
            if self.left is None:
                node.parent = self
                self.left = node
            else:
                self.left.insert(node)
        else:
            if self.right is None:
                node.parent = self
                self.right = node
            else:
                self.right.insert(node)
 
    def delete(self):
        """Deletes and returns this node from the tree."""
        if self.left is None or self.right is None:
            if self is self.parent.left:
                self.parent.left = self.left or self.right
                if self.parent.left is not None:
                    self.parent.left.parent = self.parent
            else:
                self.parent.right = self.left or self.right
                if self.parent.right is not None:
                    self.parent.right.parent = self.parent
            return self
        else:
            s = self.next_larger()
            self.key, s.key = s.key, self.key
            return s.delete()
 
def height(node):
    if node is None:
        return -1
    else:
        return node.height
 
def update_height(node):
    node.height = max(height(node.left), height(node.right)) + 1
 
class AVL(object):
    """
    AVL binary search tree implementation.
    """
 
    def __init__(self):
        """ empty tree """
        self.root = None
 
    def __str__(self):
        if self.root is None: return '<empty tree>'
        return str(self.root)
 
    def find(self, k):
        """Finds and returns the node with key k from the subtree rooted at this 
        node.
 
        Args:
            k: The key of the node we want to find.
 
        Returns:
            The node with key k or None if the tree is empty.
        """
        return self.root and self.root.find(k)
 
    def find_min(self):
        """Returns the minimum node of this BST."""
 
        return self.root and self.root.find_min()
 
    def next_larger(self, k):
        """Returns the node that contains the next larger (the successor) key in
        the BST in relation to the node with key k.
 
        Args:
            k: The key of the node of which the successor is to be found.
 
        Returns:
            The successor node.
        """
        node = self.find(k)
        return node and node.next_larger()   
 
    def left_rotate(self, x):
        y = x.right
        y.parent = x.parent
        if y.parent is None:
            self.root = y
        else:
            if y.parent.left is x:
                y.parent.left = y
            elif y.parent.right is x:
                y.parent.right = y
        x.right = y.left
        if x.right is not None:
            x.right.parent = x
        y.left = x
        x.parent = y
        update_height(x)
        update_height(y)
 
    def right_rotate(self, x):
        y = x.left
        y.parent = x.parent
        if y.parent is None:
            self.root = y
        else:
            if y.parent.left is x:
                y.parent.left = y
            elif y.parent.right is x:
                y.parent.right = y
        x.left = y.right
        if x.left is not None:
            x.left.parent = x
        y.right = x
        x.parent = y
        update_height(x)
        update_height(y)
 
    def rebalance(self, node):
        while node is not None:
            update_height(node)
            if height(node.left) >= 2 + height(node.right):
                if height(node.left.left) >= height(node.left.right):
                    self.right_rotate(node)
                else:
                    self.left_rotate(node.left)
                    self.right_rotate(node)
            elif height(node.right) >= 2 + height(node.left):
                if height(node.right.right) >= height(node.right.left):
                    self.left_rotate(node)
                else:
                    self.right_rotate(node.right)
                    self.left_rotate(node)
            node = node.parent
 
    def insert(self, k):
        """Inserts a node with key k into the subtree rooted at this node.
        This AVL version guarantees the balance property: h = O(lg n).
 
        Args:
            k: The key of the node to be inserted.
        """
        node = AVLNode(None, k)
        if self.root is None:
            # The root's parent is None.
            self.root = node
        else:
            self.root.insert(node)
        self.rebalance(node)
 
    def delete(self, k):
        """Deletes and returns a node with key k if it exists from the BST.
        This AVL version guarantees the balance property: h = O(lg n).
 
        Args:
            k: The key of the node that we want to delete.
 
        Returns:
            The deleted node with key k.
        """
        node = self.find(k)
        if node is None:
            return None
        if node is self.root:
            pseudoroot = AVLNode(None, 0)
            pseudoroot.left = self.root
            self.root.parent = pseudoroot
            deleted = self.root.delete()
            self.root = pseudoroot.left
            if self.root is not None:
                self.root.parent = None
        else:
            deleted = node.delete()   
        ## node.parent is actually the old parent of the node,
        ## which is the first potentially out-of-balance node.
        self.rebalance(deleted.parent)
 
def test(args=None):
    import random, sys
 
    items = list(range(1, 10))
    random.shuffle(items)
 
    tree = AVL()
    print(tree)
    for item in items:
        tree.insert(item)
        print()
        print(tree)
 
    for item in items:
        tree.insert(item)
        print()
        print(tree)
 
if __name__ == '__main__': test()

Что в нём означает and:
Python
1
2
    def find(self, k):
        return self.root and self.root.find(k) # <-- Что значит and?
?
Что в нём означает or:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    def delete(self):
        """Deletes and returns this node from the tree."""
        if self.left is None or self.right is None:
            if self is self.parent.left:
                self.parent.left = self.left or self.right # <-- Что значит or?
                if self.parent.left is not None:
                    self.parent.left.parent = self.parent
            else:
                self.parent.right = self.left or self.right
                if self.parent.right is not None:
                    self.parent.right.parent = self.parent
            return self
        else:
            s = self.next_larger()
            self.key, s.key = s.key, self.key
            return s.delete()
?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.11.2018, 16:16
Ответы с готовыми решениями:

Создание объекта. Использование объектов в программе. Создание объектов в модулях для программы. Использование объектов
я не могу понять как строить конструктор Создать собственный объект и использовать его в программе. Объект - квадрат. 1. Свойства -...

Разработать программу с использованием класса объектов. Для класса объектов разработать подпрограммы
Разработать программу с использованием класса объектов.Треугольник Периметр, площадь Для класса объектов разработать подпрограммы...

Как сделать запрет для пользователя для изменения/удаления объектов и директорий и тд
есть компьютер не подключенный к нэту. Как на нем организовать запрет на все действия кроме чтения. К примеру как в вузе+ запрет...

12
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
30.11.2018, 16:40
and - логическое И
or - логическое ИЛИ
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
30.11.2018, 16:41  [ТС]
ioprst, как в данном случае будет работать and и or?
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
30.11.2018, 16:49
Python
1
if self.left is None or self.right is None:
если какой-то из этих объектов есть None, то выполнится блок условия ИСТИНА

self.root - какой-то объект (в код не вникал), изначально None - пустой. Если объект не пустой, то условие вида if self.root вернет Истину, иначе Ложь. Как-то так...
Значит self.root and self.root.find(k) вернет True если self.root существует (не None) и если он не равен какому-то пустому объекту и для self.root.find(k) выполняется такое же условие.
код
Python
1
2
lst_ = []
print('не пустой' if lst_ else 'пустой')
вернет "пустой", т.к. список пустой.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
30.11.2018, 16:49  [ТС]
deleted
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.11.2018, 16:49
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Что значит and?
Логическую операцию И. Оба операнда должны быть истинными, чтобы вернуть True, иначе - False.
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
<-- Что значит or?
Дизъюнкцию. Или. Второй операнд будет выполнен только при ложности первого.

Правила выполнения данных операций - в любых учебниках по логике.
Ваш КЭП.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
30.11.2018, 16:53  [ТС]
Garry Galler, Вы к тому, что:
Python
1
self.parent.left = self.left or self.right
тут self.parent.left будет иметь логический тип?
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
30.11.2018, 16:54
Соколиный глаз, да
1
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
30.11.2018, 16:56  [ТС]
А как тогда я к parent строчкой через одну доступ получу, если это True/False?
Python
1
2
                if self.parent.left is not None:
                    self.parent.left.parent = self.parent
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
30.11.2018, 17:03
Странный вопрос. and и or это логические операторы. A and B возвращает True если A и B одновременно являются истиной. Истиной в Python является не только значение True но и любой не нулевой и не пустой объект. Например любое число, кроме нуля, является истиной, а нуль является ложью. Аналогично любой не пустой контейнер является истиной, а пустой контейнер ложью. Например не пустой список это истина, а пустой список [] ложью. Аналогично для or, только там выражение будет истина, если хотя бы один элемент является истиной (в том смысле как объяснено выше).
Python
1
2
    def find(self, k):
        return self.root and self.root.find(k)
В этой функции, если self.root истина и self.root.find(k) истина, то функция вернет True, в противном случае она вернет False. Что в Python является истинной я написал выше. Просто в отладчике посмотрите чем являются self.root и self.root.find(k) и что возвращает функция и все станет понятно.
Основной текст я не смотрел, поскольку для данного вопроса он не имеет значение. Насколько правилен основной текст, это уже другой вопрос, и если в нем ошибка, то нужно отлаживать с отладчиком, но мне лень с ним разбираться.
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
30.11.2018, 17:23  [ТС]
А как тогда я к parent строчкой через одну доступ получу, если это True/False?
Я так и не получил ответа на этот вопрос.

Добавлено через 6 минут
Вопрос про строчку кода из метода delete актуален.

Добавлено через 9 минут
Правильно ли я понимаю, что:
Python
1
self.parent.left = self.left or self.right
это равно:
Python
1
self.parent.left = self.left if self.left else self.right
Читаю эту статью.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
30.11.2018, 22:10
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
self.parent.left = self.left or self.right
и
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
self.parent.left = self.left if self.left else self.right
не одно и то же.

Добавлено через 20 минут
Поставил точку останова на строку
return self.root and self.root.find(k)
в функции
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
1
2
def find(self, k):
return self.root and self.root.find(k)
и запустил сценарий в бесконечном режиме:
Python
1
2
3
if __name__ == '__main__':
    while 1:
        test()
Уже 30 минут молотит и на эту функцию не разу не вышел (в точку останова программа не пришла).
Так как здесь для тестирования запускается генерация случайных чисел, то или эта функция работает только в каком то редком случае или она вообще в этом сценарии не нужна. Проверить это не возможно, разве только запустить сценарий, что бы работал лет сто. Вдруг проявиться этот исключительный случай, а может он в принципе не возможен.
Поэтому советую Вам не зацикливаться на этой функции, а разбирать сценарий дальше.

Добавлено через 29 минут
Уже больше часа молотит и на эту функцию так и не вышел. Все, отключаю тестирование.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
03.12.2018, 16:03
Лучший ответ Сообщение было отмечено Соколиный глаз как решение

Решение

Цитата Сообщение от Соколиный глаз Посмотреть сообщение
тут self.parent.left будет иметь логический тип?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> x = None
>>> res = x and x.count('1')  # ошибки обращения к объекту None нет, так как вычисление ленивое
>>> res # None
>>> x = '1'
>>> res = x and x.count('1')
>>> res
1
>>> x=None
>>> res = x or '1'
>>> res
'1'
>>> x='2'
>>> res = x or '1'
>>> res
'2'
1
В python любой объект может быть оценен в логическом контексте. Правила просты:
1) объект имеет магический метод __bool__ (числа имеют его) и тогда оценка делается им
2) объект не имеет метода __bool__, но имеет магический метод __len__ (списки\словари\кортежи\строки и т.д. ) и тогда объект оценивается как True, если его размер более 0 и False, если его размер 0.
3) Объект не имеет методов __bool__ и __len__ - в этом случае он будет оцениваться в логическом контексте всегда как True.

Таким образом в логическом контексте любой объект сначала оценивается как трушный или фальшивый, а затем осуществляется возврат операндов по правилам логических операций.
Кроме того следует помнить, что в python вычисление значений логических операндов ленивое:

Python
1
2
>>> 1 or math.factorial(1000000)
1
Никаких вычислений в правом операнде не будет, поскольку он будет просто отброшен исходя из того, что левый оператор в логическом контексте True.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.12.2018, 16:03
Помогаю со студенческими работами здесь

Переопределить операции сдвига для созданного класса для ввода/вывода объектов
Переопределить операции сдвига(&lt;&lt; и &gt;&gt; ) для Вашего класса для ввода/вывода объектов на экран монитора и с клавиатуры.

Описать набор функций для работы со списками (память для объектов выделять динамически из приватной кучи)
Здравствуйте Ув. форумчане! Помогите пожалуйста реализовать программу... Задание: Описать набор функций для работы со списками....

Для разработанного класса объектов разработать asp-страницы для ввода данных объекта и передачу на сервер
Для разработанного класса объектов(класс был создан раннее). Нужно разработать asp-страницы для ввода данных объекта и передачу на...

Сколько существует способов выбора 20 объектов из множества объектов пяти типов
Сколько существует способов выбора 20 объектов из множества объектов пяти типов, если число выбранных объектов первого типа кратно 5, ...

Размещение объектов в пределах формы и отражение двух объектов при соприкосновении
Помогите с задачей, чтобы круг летал по форме и соприкасаясь с квадратом отталкивался от него. Shape2.Top = Shape2.Top - 50 End If If...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru