Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 18, 2014 18:37:41

NotDeadAlready
От:
Зарегистрирован: 2012-01-28
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

Написание функции

def modify_list(lst):
    i = 0
    while i < len(lst):
        if lst[i] % 2 == 0:
            lst[i] //= 2
            i += 1
        else:
            lst.pop(i)



Синтаксис Питона сосредоточил в себе несуразности Лиспа и Фортрана. – Ларри Уолл, создатель Перла.

Офлайн

#2 Дек. 22, 2014 02:20:20

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Написание функции

py.user.next
>>> def f(lst):
… i, n = 0, len(lst)
… while i < n:
… if lst % 2:
… lst.pop(i)
… n -= 1
… else:
… lst = int(lst / 2)
… i += 1

>>> lst =
>>> f(lst)
>>> lst

>>>

Ну что вы за люди такие.
def f(lst):
    lst[:] = (k//2 for k in lst if not k&1)



Офлайн

#3 Дек. 22, 2014 02:41:13

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Написание функции

NotDeadAlready
Синтаксис Питона сосредоточил в себе несуразности Лиспа и Фортрана. – Ларри Уолл, создатель Перла.

«Perl — это единственный язык, программы на котором выглядят одинаково до и после RSA-шифрования.»
Keith Bostic. Программист, создатель Sleepycat, контрибьютор BSD.



Офлайн

#4 Янв. 30, 2017 11:46:02

MrWild
Зарегистрирован: 2016-12-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Написание функции

doza_and
Я в недоумении.

 def strange_function(a):
    for i in range(len(a))[::-1]:
        if (a[i]%2)>0:
            a.pop(i)
        else:
            a[i]=int(a[i]/2)

Поясните, пожалуйста, этот кусок кода. Понял все кроме
 for i in range(len(a)) [::-1]
.
Зачем тут срез?


И, если не затруднит, этот кусок:

Isem
Ну что вы за люди такие.
d
 ef f(lst):
    lst[:] = (k//2 for k in lst if not k&1)
В функцию передается список. Список модифицируется при помощи генератора.
Какая разница между
 lst[:]
и просто lst ?
Данная функция генерирует новый список из элементов старого, новый список заполняется целыми частями от деления старых элементов, но при условии if not k&1. Что значит k&1 ?

Отредактировано MrWild (Янв. 30, 2017 12:18:17)

Офлайн

#5 Янв. 30, 2017 12:40:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Написание функции

MrWild
Зачем тут срез?
Во втором питоне
  
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(10)[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>>

В третьем питоне
  
>>> range(10)
range(0, 10)
>>> range(10)[::-1]
range(9, -1, -1)
>>>

Но лучше применять reversed()
  
>>> range(10)
range(0, 10)
>>> 
>>> reversed(range(10))
<range_iterator object at 0xb7581de8>
>>> list(_)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>>

MrWild
Какая разница между lst и просто lst
Это имя внутри функции и привязывание этого внутреннего имени к новому объекту, либо это взятие объекта по внутреннему имени и изменение этого объекта.
  
>>> def f(name):
...   name = [3, 4, 5]
... 
>>> lst = [1, 2, 3]
>>> 
>>> lst
[1, 2, 3]
>>> 
>>> f(lst)
>>> 
>>> lst
[1, 2, 3]
>>> 
>>> 
>>> def f(name):
...   name[:] = [3, 4, 5]
... 
>>> 
>>> lst
[1, 2, 3]
>>> 
>>> f(lst)
>>> 
>>> lst
[3, 4, 5]
>>>



Отредактировано py.user.next (Янв. 30, 2017 12:45:33)

Офлайн

#6 Янв. 30, 2017 14:55:25

MrWild
Зарегистрирован: 2016-12-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Написание функции

py.user.next
Но лучше применять reversed()
Спасибо большое за ответ.
Единственное, что остается непонятным, так это смыл “переворачивать” индексацию списка.
Что с первого до последнего элемента я его пройду, что наоборот, все равно выполнится удаление элементов по условию.

Офлайн

#7 Янв. 30, 2017 16:22:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Написание функции

MrWild
Единственное, что остается непонятным, так это смыл “переворачивать” индексацию списка.
У тебя на каждом шаге цикла i растёт - 0, 1, 2, … . И когда там удаляется элемент в начале, то элементы справа от него сдвигаются влево, и на месте удалённого элемента появляется новый элемент, который надо проверять ещё. Но он не проверяется, потому что наступает следующий шаг и i вырастает, как бы пропуская его.

Вот пример по шагам (разложенный цикл)
i = 0
[1, 1, 2, 2, 3, 3, 4, 4] -> 1 надо удалить -> [1, 2, 2, 3, 3, 4, 4]

i = 1
[1, 2, 2, 3, 3, 4, 4] -> 2 надо оставить и поделить -> [1, 1, 2, 3, 3, 4, 4]

i = 2
[1, 1, 2, 3, 3, 4, 4] -> 2 надо оставить и поделить -> [1, 1, 1, 3, 3, 4, 4]

i = 3
[1, 1, 1, 3, 3, 4, 4] -> 3 надо удалить -> [1, 1, 1, 3, 4, 4]

...
Видишь, там вторая единица осталась, хотя должна быть удалена. Это из-за того, что i перебираются по порядку, а при удалении одного элемента все остальные элементы справа от него сдвигаются влево. И поэтому цикл как бы не видит эту единицу.

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



Отредактировано py.user.next (Янв. 30, 2017 16:24:30)

Офлайн

#8 Янв. 30, 2017 17:56:20

MrWild
Зарегистрирован: 2016-12-16
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Написание функции

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

Офлайн

#9 Янв. 31, 2017 08:27:15

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Написание функции

NotDeadAlready
Синтаксис Питона сосредоточил в себе несуразности Лиспа и Фортрана. – Ларри Уолл, создатель Перла.
Судя по перманентно выдаваемому на протяжении пяти лет говнокоду вы не осисили ни того, ни другого, ни третьего. Может быть вам немного приумерить пыл и не говорить о том, чего вы не знаете?



Офлайн

#10 Янв. 31, 2017 09:14:46

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

Написание функции

FishHook
2014 год же

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version