Найти - Пользователи
Полная версия: Написание функции
Начало » Центр помощи » Написание функции
1 2 3
NotDeadAlready
def modify_list(lst):
    i = 0
    while i < len(lst):
        if lst[i] % 2 == 0:
            lst[i] //= 2
            i += 1
        else:
            lst.pop(i)
Isem
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)
Isem
NotDeadAlready
Синтаксис Питона сосредоточил в себе несуразности Лиспа и Фортрана. – Ларри Уолл, создатель Перла.

«Perl — это единственный язык, программы на котором выглядят одинаково до и после RSA-шифрования.»
Keith Bostic. Программист, создатель Sleepycat, контрибьютор BSD.
MrWild
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 ?
py.user.next
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]
>>>
MrWild
py.user.next
Но лучше применять reversed()
Спасибо большое за ответ.
Единственное, что остается непонятным, так это смыл “переворачивать” индексацию списка.
Что с первого до последнего элемента я его пройду, что наоборот, все равно выполнится удаление элементов по условию.
py.user.next
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 перебираются по порядку, а при удалении одного элемента все остальные элементы справа от него сдвигаются влево. И поэтому цикл как бы не видит эту единицу.

А перебирая справа налево элементы, при удалении элемента в списке все элементы, которые сдвигаются влево, уже обработаны, и там точно ничего не затеряется.
MrWild
О, еще раз благодарю. Я этот кусок кода крутил и так и эдак, а он некоторые значения в списке пропускал. Теперь стало понятно почему.
FishHook
NotDeadAlready
Синтаксис Питона сосредоточил в себе несуразности Лиспа и Фортрана. – Ларри Уолл, создатель Перла.
Судя по перманентно выдаваемому на протяжении пяти лет говнокоду вы не осисили ни того, ни другого, ни третьего. Может быть вам немного приумерить пыл и не говорить о том, чего вы не знаете?
noob_saibot
FishHook
2014 год же
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB