Добро пожаловать в канал 'Python: задачки и вопросы'! Если вы хотите подготовиться к собеседованию или прокачать свои навыки в программировании на Python, то этот канал идеально подойдет для вас. Здесь вы найдете множество интересных задачек и вопросов, которые помогут вам улучшить свои знания и навыки в этом языке программирования.
Канал представляет собой увлекательный и полезный ресурс для всех, кто увлечен программированием на Python. Здесь вы сможете не только проверить свои знания, но и узнать много нового. И не забудьте заглянуть в правила общения, чтобы все наши участники чувствовали себя комфортно и уверенно.
Не упустите возможность использовать этот канал для своего развития и самосовершенствования! Присоединяйтесь к 'Python: задачки и вопросы' прямо сейчас и начните свой путь к новым достижениям в программировании на Python!
07 Feb, 17:06
[(‘a’, ‘x’)]
из-за расположения return.myzip()
принимает произвольное количество последовательностей (в данном случае строки S1
и S2
).seqs = [list(S) for S in seqs]
преобразует каждую входную последовательность в список — [['a', 'b', 'c'], ['x', 'y', 'z', '1', '2', '3']]
.while
продолжает выполняться, пока все списки в seqs
содержат хотя бы один элемент. Входные списки имеют по одному элементу на данный момент (['a', 'b', 'c'] и ['x', 'y', 'z', '1', '2', '3'])
.res.append(...):
внутри цикла создается кортеж из первого элемента каждого списка и добавляется в res
. Первые элементы будут 'a' и 'x', так что в res добавится кортеж ('a', 'x')
.return
) находится внутри цикла while
. Это означает, что функция сразу же вернет res
после первой итерации цикла. Таким образом, функция завершает свое выполнение и возвращает res, который на этом моменте содержит [('a', 'x')]
. После этого выполнение функции прекращается, и дальнейшие итерации не происходят. 06 Feb, 17:06
zip()
принимает два или более итерируемых объекта (в данном случае, строки) и создает итератор, который генерирует кортежи, содержащие элементы, исходящие от каждого из итерируемых объектов на соответствующих позициях. Это значит, что zip
будет объединять первый элемент S1
с первым элементом S2
, второй элемент S1
со вторым элементом S2
и так далее.S1
содержит 3 элемента, а S2
— 6 элементов, zip()
объединит только столько элементов, сколько есть в наименьшем итерируемом объекте, то есть в S1
. 05 Feb, 17:06
L, S = [1, 2, 3], 'spam'
for i in range(len(S)): # Цикл с подсчетом 0.3
S = S[1:] + S[:1] # Перемещение головного элемента в конец
print(S, end=' ')
02 Feb, 17:06
01 Feb, 17:06
def f(a, b, c):
print('%s, %s и %s' % (a, b, c))
# Распаковка значений генераторного выражения
f(*(i for i in range(3)))
D = dict(а='Bob', b='dev', с=40.5)
# Нормальные ключевые аргументы
f(a='Bob’, b='dev’, с=40.5) # Bob, dev и 40.5
# Распаковка словаря: ключ=значение
f(**D) # Bob, dev и 40.5
# Распаковка итератора ключей
f(*D) # b, c и a
# Распаковка итератора представления
f(*D.values()) # Bob, dev и 40.5\nNone
31 Jan, 17:05
yield
, который делает возможным делегирование работы подгенератору с помощью конструкции from генератор
. В простых ситуациях он эквивалентен выдаче в цикле for
— в следующем коде вызов list
заставляет генератор выпустить все свои значения, а включение в круглых скобках является генераторным выражением:
def both(N):
for i in range(N): yield i
for i in (x ** 2 for x in range(N)): yield i
print(list(both(5))) # [0, 1, 2, 3, 4, 0, 1, 4, 9, 16]
23 Jan, 17:13
G.send(значение)
. Затем код генератора возобновляет выполнение, и выражение yield
в генераторе возвращает значение, переданное send
. Если вызывается обычный метод G.__next_() (или его эквивалент next(G))
для продвижения вперед, тогда yield
просто возвращает None
.
>>> next(G) # Сначала должен вызываться next(), чтобы запустить генератор
... 0
>>> G.send(77)
... 77
... 1
22 Jan, 17:07
def gen():
for i in range(10):
X = yield i
print(X)
G = gen()
print(next(G)) # Сначала должен вызываться next(), чтобы запустить генератор
20 Jan, 17:00
DataFrame.sort_values(by, *, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)
ascending
отвечает за тип сортировки и по умолчанию равен True, т.е. датафрейм сортируется по умолчанию от меньшего к большему. 19 Jan, 17:00
listoftuples = [('bob', 35, 'mgr'), ('sue', 40, 'dev'), ('jack', 51, 'cio')]
for
можно было бы извлечь все значения из выбранного[age for (name, age, job) in listoftuples] # 35, 40, 52
18 Jan, 17:00
17 Jan, 17:00
res = []
for row in М: # Эквиваленты в виде операторов
for col in row: # Отступ для частей, находящихся дальше справа
res.append(col + 10)
[[col + 10 for col in row] for row in M]
06 Jan, 17:06
:
) появляется перед стандартным значением (и символом =
). В показанном ниже коде а: 'spam' = 4
означает, что аргумент а имеет стандартное значение 4 и аннотирован строкой 'spam'
:>>> def func(a: 'spam' = 4, b: (1, 10) = 5, c: float = 6) -> int:
>>> return a + b + c
>>> func (1, 2, 3)
... 6
>>> func() # 4 + 5 + 6 (все стандартные значения)
... 15
>>> func(1, с=10) # 1+5 + 10 (ключевые аргументы нормально работают)
... 16
>>> func.__annotations__
{'с': <class 'float;>, 'b': (1, 10), 'a': 'spam', 'return': class 'int'>}
03 Jan, 17:02
func
складывает три аргумента: a
, b
и c
. Давайте разберем, что происходит в коде более подробно.func
: def func(a: 'spam', b: (1, 10), c: float) -> int:
a: 'spam'
: Это аннотация для параметра a
. Текст 'spam'
здесь не имеет особого значения в самом коде, скорее всего, это просто строка, которая может использоваться для документации или информации о том, какой тип ожидался. В действительности, это просто строка, и Python не проводит никаких проверок типов на основе этой аннотации.b: (1, 10)
: Это также аннотация, которая указывает, что b
должен быть значением, соответствующим кортежу (1, 10)
. Однако, как и в случае с аннотацией для a
, эта информация не проверяется в самом коде.c: float
: Это аннотация, указывающая, что параметр c
должен быть типа float
.-> int
: Это аннотация, которая указывает, что функция будет возвращать значение типа int
.func(1,2,3)
, переданная строка 1
, 2
и 3
становятся значениями a
, b
и c
соответственно. То есть:a = 1
b = 2
c = 3
>>> func.__annotations__
... {'с': class 'float’>, ’b’: (1, 10), 'a': 'spam', 'return': <class ’int’>}
02 Jan, 17:07
х = echo # Теперь x тоже ссылается на объект функции
х('Indirect call!') # Вызов объекта через имя х путем добавления ()
def indirect(func, arg) :
func(arg) # Вызов переданного объекта путем добавления ()
indirect (echo, 'Argument call!') # Передача функции другой функции
>>> schedule = [(echo, 'Spam!'), (echo, 'Ham?')]
>>> for (func, arg) in schedule:
>>> func(arg) # Вызов функций, встроенных в контейнер
... Spam!
... Ham!
schedule
и вызов функции echo
с одним аргументом на каждой итерации (обратите внимание в заголовке цикла for на распаковывающее присваивание кортежа, представленное в главе 13). Функции также можно создавать и возвращать для применения где-то в другом месте — замыкания, созданные в таком режиме, еще и предохраняют состояние из объемлющей области видимости. 01 Jan, 17:02
30 Dec, 17:02
1, [ ’ х ’ ], { ’ а ’ : ’ у ’ }
) — первое присваивание в функции не оказывает влияния на вызывающий код, но остальные два оказывают, поскольку они модифицируют переданный изменяемый объект на месте. 29 Dec, 17:02
1 { ’ Ь ’ : 2, ’ с ’ : 3}
, т.к. 1 передается а по имени и **kargs
собирает оставшиеся ключевые аргументы в словарь. Мы можем проходить по ключам словаря с добавочными ключевыми аргументами с помощью любого итерационного инструмента (скажем, for key in kargs: . .
.). Обратите внимание, что порядок следования ключей в словаре может варьироваться в зависимости от версии Python и других аспектов. 28 Dec, 17:00
1 (2, 3)
, поскольку 1 передается а
и *pargs
собирает оставшиеся позиционные аргументы в новый объект кортежа. Мы можем проходить по кортежу с добавочными позиционными аргументами посредством любого итерационного инструмента (например, for arg in pargs: . . .). 27 Dec, 17:00
*аргументы
для сбора всех переданных аргументов. Поскольку аргументы поступают в виде кортежа, мы можем обрабатывать произвольное число аргументов с целью сбора элементов, имеющихся во всех операндах:def foo(*args):
res = []
for x in args[0]: # Просмотр последовательности
if x in res: continue # Пропуск дубликатов
for other in args[1:]: # Для всех остальных аргументов
if x not in other: break # Элемент находится во всех последовательностях?
else: # Нет: выйти из цикла
res.append(x) # Да: добавить в конец
return res
lst = (1, 3, 4, 3, 5)
print(foo(lst)) # [5]
else
(выходу из цикла) и добавлению последнего элемента в res
.lst = ((1, 3, 4), (3, 4, 5))
print(foo(lst)) # [(3, 4, 5)]
26 Dec, 17:01
> <
их не сравнить, получим ошибку:TypeError: '>' not supported between instances of 'dict' and 'dict'
07 Dec, 17:01
def
, не вступают в конфликт с именами, находящимися за ее пределами, даже если и там и там присутствуют одинаковые имена. Имя X
, которому присвоено значение за пределами данной инструкции, полностью отлично от имени X
, которому присвоено значение внутри инструкции def
. 06 Dec, 10:03
05 Dec, 12:02
04 Dec, 17:01
имя=значение
и распаковывать произвольно много аргументов для отправки посредством снабжения аргументов звездочками — *args
(позиционные аргументы) и **kwargs
ключевые аргументы — Keyword arguments.def print_numbers(*args):
for number in args:
print(number)
# Вызов функции с произвольным количеством аргументов
print_numbers(1, 2, 3, 4, 5)
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
# Вызов функции с произвольным количеством ключевых аргументов
print_info(name="Alice", age=30, city="New York")
01 Dec, 17:01
sorted(testDict)
сгенерирует список упорядоченных ключей testDict
, то есть:sortedKeys = sorted(testDict)
print(sortedKeys) # ['a', 'b', 'c']
sortedKeys
мы генерируем пару "ключ: значение по ключу из testDict")# Для i = 0
print(sortedKeys[0], testDict['a']) # a: 2
30 Nov, 17:02
27 Nov, 17:02
enumerate
возвращает объект-генератор, который позволяет итерироваться по значению, создаваемому в процессе выполнения кода, без необходимости загружать все значения в память сразу. Это особенно полезно для работы с большими и динамически генерируемыми наборами данных.E = enumerate(S)
E # <enumerate object at 0x02765AA8>
c
— каждая из букв 'spam'
, i
— её индексы в строке. Первый элемент результирующего списка равен пустоте, потому что c * i = 's' * 0
('s'
повторяется 0
раз).p
, a
и m
по 1
, 2
и 3
раза соответственно (перемножение строки и целого числа дает повторение строки). 21 Nov, 17:01
# Простое вычисление
result = 5 + 3
# Инструкция выражения (выражение, которое вычисляется, но его результат не сохраняется)
5 * 2
# Использование функции print для вывода результата
print(5 * 2) # Это уже не просто инструкция выражения, а полноценная инструкция
print
вызывается в отдельной строке, как инструкция выражения, тем не менее она возвращает значение, как и любая другая функция (она возвращает значение None, что возвращается всеми функциями, которые явно не возвращают какого-либо значимого значения):>>> x = print(‘spam’) # print – это выражение вызова функции
spam
>>> print(x) # но может использоваться, как инструкция выражения
None
20 Nov, 17:01
_X
), не импортируются инструкцией from module import *__X__
) являются системными именами, которые имеют особый смысл для интерпретатора.__X
), являются локальными («искаженными») для объемлющего класса (смотрите псевдочастные атрибуты)._
), хранит результат последнего выражения при работе в интерактивной оболочке. 19 Nov, 17:01
_spam
, Spam_1
, а 1_Spam
, spam$ и @#! – недопустимыми.klass
и Class
являются вполне допустимыми. В таблице перечислены слова, которые в настоящее время зарезервированы языком Python (и, следовательно, запрещены для использования в качестве имен переменных). 19 Nov, 11:01
12 Nov, 11:01
11 Nov, 16:01
11 Nov, 10:30
09 Nov, 13:45
06 Nov, 07:00
04 Nov, 17:00
02 Nov, 13:02
02 Nov, 09:02
01 Nov, 17:00
27 Oct, 07:01
26 Oct, 17:00
25 Oct, 17:00
23 Oct, 11:01
22 Oct, 17:00
21 Oct, 17:00
20 Oct, 07:00
18 Oct, 11:01
17 Oct, 09:02
16 Oct, 07:00
15 Oct, 17:00