1

Тема: Я воно працює?!?

Доброго дня!

Розв'язував задачу "Пошук не парного елементу в масиві" і натрапив на такий розв'язок:

def solution(A):
    result = 0
    for number in A:
        result ^= number

    return result

Хтось може пояснити як ЦЕ працює "result ^= number"?

2

Re: Я воно працює?!?

ну це бітова операція, коротше. Здається, зветься xor

3

Re: Я воно працює?!?

Логіка операції ^= така ж, як і +=, -=, *= і т. д: result ^= number є просто скороченою формою result = result ^ number.

^ — це побітовий XOR. Очевидно, якщо xor'ити два однакових числа, то отримаєте нуль — на однакових позиціях у них однакові біти, а 1 xor 1 = 0 і 0 xor 0 = 0. Таким чином, всі числа, що мають пару, дадуть нуль, а 0 xor A = A, в цьому теж легко переконатись.

Подякували: Chemist-i, vitek_z, koala, leofun014

4

Re: Я воно працює?!?

чому так???
в чому тут логіка саме таких алгоритмів отримання результатів?

#! python3

print(-99//100)   #  -1
print(99//-100)   #  -1

print(1%-10)      #  -9
print(-1%100)     #  99
print(-99%100)   #  1

5 Востаннє редагувалося koala (19.02.2017 22:24:14)

Re: Я воно працює?!?

Все випливає зі співвідношення b*x+r=a, де a - ділене, b - дільник, x - частка, r - залишок. Для додатних знаменників маємо r ∈ [0,b) і взагалі не має бути питань. Для від'ємних дільників в Python, на відміну від математики, прийняті від'ємні залишки: r ∈ (b,0], це дозволяє іноді зробити цікаві речі.

Перевіряємо:

100 * -1 + 1 = -99
-100 * -1 + -1 = 99
-10 * -1 + -9 = 1
100 * -1 + 99 = -1
100 * -1 + 1 = -99

Все працює.

Довідково

Подякували: varkon, ADR, leofun013

6

Re: Я воно працює?!?

lst = []
for i in range(3):
    lst.append(lambda: i)
print([i() for i in lst])

ану, хто без запуску напише відповідь?

7

Re: Я воно працює?!?

[3 3 3]

нє?

Подякували: leofun011

8

Re: Я воно працює?!?

нє... :(
але майже :)

9

Re: Я воно працює?!?

koala написав:

нє... :(
але майже :)

не майже, а точно в ціль.
суть же не в тому, як визначається range

10

Re: Я воно працює?!?

Я взагалі не розумію, якого біса в Python змінна живе після циклу. Але факт - живе.

11 Востаннє редагувалося ping (21.04.2017 12:04:03)

Re: Я воно працює?!?

koala написав:

Я взагалі не розумію, якого біса в Python змінна живе після циклу. Але факт - живе.

ну, вона ж визначена  - чом би їй не жити?
якби ми робили цикл через while - останнє значення лічильника б теж лишилося жити.

але ми її приберемо - немає в нас імені "  і  " поза межами двох інструкцій

lst = []
[lst.append(lambda: i) for i in range(3)]
print([i() for i in lst])

а результат?

12

Re: Я воно працює?!?

ping написав:

ну, вона ж визначена  - чом би їй не жити?

Ну, за цією логікою треба всі змінні робити глобальними, вони ж визначені, то чом би їм не жити, так?

ping написав:
[lst.append(lambda: i) for i in range(3)]

Краще вже

lst=[lambda: i for i in range(3)]

Але б будь-якому разі лябмда захоплює змінну за посиланням. А от якщо за значенням

lst=[lambda i=i: i for i in range(3)]

то буде [0, 1, 2].

Подякували: ADR, leofun012

13

Re: Я воно працює?!?

ping написав:
lst = []
for i in range(3):
    lst.append(lambda: i)
print([i() for i in lst])

ану, хто без запуску напише відповідь?

мені виводить
[<function <lambda> at 0x038A3BF0>, <function <lambda> at 0x038A3F70>, <function <lambda> at 0x038A3FB0>]

14 Востаннє редагувалося ping (21.04.2017 16:32:53)

Re: Я воно працює?!?

Patlatus написав:
ping написав:
lst = []
for i in range(3):
    lst.append(lambda: i)
print([i() for i in lst])

ану, хто без запуску напише відповідь?

мені виводить
[<function <lambda> at 0x038A3BF0>, <function <lambda> at 0x038A3F70>, <function <lambda> at 0x038A3FB0>]

ви забули дужки після " і " в прінті

Подякували: koala, ostap34PHP2

15

Re: Я воно працює?!?

s=2

def f1():
    return s+1

def f2():
    s += 1
    return s

print(f1())
print(f2())

чи буде результат ідентичний?

16

Re: Я воно працює?!?

Думаю, що так.

В першій функції результат s+1 не присвоювався в s. Отже ідентично

17 Востаннє редагувалося ping (28.07.2017 12:50:51)

Re: Я воно працює?!?

Q-bart написав:

Думаю, що так.

В першій функції результат s+1 не присвоювався в s. Отже ідентично

LEGB

я теж так думав...

18

Re: Я воно працює?!?

Ха, підловили

19

Re: Я воно працює?!?

def foo(bar=[]):        
    bar.append("baz")    
    return bar

f1 = foo()
s1 = str(f1)

f2 = foo()
s2 = str(f2)

print(f1 == f2, s1 == s2)

написати відповідь без комп'ютера  : )

20

Re: Я воно працює?!?

Думаю, що

True, True