python questions Flashcards
В чем разница между списком и кортежем
Список можно изменить после создания.
Кортеж нельзя изменить после создания.
Список упорядочен. Он представляет собой упорядоченные последовательности объектов, как правило, одного и того же типа. Например, все имена пользователей упорядочены по дате создания: [“Seth”, “Ema”, “Eli”].
У кортежа есть структура. В каждом индексе могут сосуществовать различные типы данных. Например, такая запись базы данных в памяти: (2, “Ema”, “2020–04–16”) # id, name, created_at.
Как выполняется интерполяция строк?
name = ‘Chris’
# 1. f strings print(f'Hello {name}')
# 2. % operator print('Hey %s %s' % (name, name))
# 3. format print( "My name is {}".format((name)) )
В чем разница между is и ==?
is проверяет идентичность, а == проверяет равенство
a = [1,2,3]
b = a
c = [1,2,3]
print(a == b) print(a == c) #=> True #=> True
print(a is b) print(a is c) #=> True #=> False
Что такое декоратор?
Декоратор позволяет добавить новую функциональность к существующей функции. Это делается следующим образом. Функция передается декоратору, а он выполняет и существующий, и дополнительный код.
Объясните функцию range
Range генерирует список целых чисел. Ее можно использовать тремя способами.
range(start, stop, step)
Определите класс car с двумя атрибутами: color и speed. Затем создайте экземпляр и верните speed
class Car : def \_\_init\_\_(self, color, speed): self.color = color self.speed = speed car = Car('red','100mph') car.speed #=> '100mph'
В чем разница между методами экземпляра, класса и статическими методами в Python?
Методы экземпляра: принимают параметр self и относятся к определенному экземпляру класса.
Статические методы: используют декоратор @staticmethod, не связаны с конкретным экземпляром и являются автономными (атрибуты класса или экземпляра не изменяются).
Методы класса: принимают параметр cls, можно изменить сам класс. class CoffeeShop: specialty = 'espresso'
def \_\_init\_\_(self, coffee_price): self.coffee_price = coffee_price
# instance method def make_coffee(self): print(f'Making {self.specialty} for ${self.coffee_price}')
# static method @staticmethod def check_weather(): print('Its sunny')
# class method @classmethod def change_specialty(cls, specialty): cls.specialty = specialty print(f'Specialty changed to {specialty}')
как работает функция reduce?
reduce принимает функцию и последовательность — и проходит по этой последовательности. На каждой итерации в функцию передаются как текущий элемент, так и выходные данные предыдущего элемента. В конце концов, возвращается одно значение:
from functools import reduce def add_three(x,y): return x + y li = [1,2,3,5] reduce(add_three, li) #=> 11
как работает функция filter?
Каждый элемент передается функции, которая включает его в последовательность, если по условию получает True, и отбрасывает в случае False:
def add_three(x): if x % 2 == 0: return True else: return False
li = [1,2,3,4,5,6,7,8]
[i for i in filter(add_three, li)] #=> [2, 4, 6, 8]
Переменные в Python передаются по ссылке или по значению?
В общем, все имена передаются по ссылке, но в некоторых ячейках памяти хранятся объекты, а в других — указатели на другие ячейки памяти.
name = ‘object’
Давайте посмотрим, как это работает со строками. Создадим экземпляр имени и объекта, на который указывают другие имена. Затем удалим первое:
x = ‘some text’
y = x
x is y #=> True
del x # удаляем имя ‘a’ , но не объект в памяти
z = y
y is z #=> True
Мы видим, что все имена указывают на один и тот же объект в памяти, который остался нетронутым после операции удаления имени del x.
Вот еще один интересный пример с функцией:
name = 'text' def add_chars(str1): print( id(str1) ) #=> 4353702856 print( id(name) ) #=> 4353702856
# новое имя, тот же объект str2 = str1
# создаем новое имя (не отличается от предыдущего) и новый объект str1 += 's' print( id(str1) ) #=> 4387143328
# объект не изменился print( id(str2) ) #=> 4353702856
add_chars(name)
print(name) #=>text
Обратите внимание, что добавление буквы s в строку внутри функции создает новое имя — и новый объект тоже. Даже если у нового объекта то же самое имя, что и у существующего.
Как развернуть список?
Обратите внимание, что reverse() вызывается в списке и изменяет его. Сама функция не возвращает измененный список:
li = [‘a’,’b’,’c’]
print(li) li.reverse() print(li) #=> ['a', 'b', 'c'] #=> ['c', 'b', 'a']
Как работает умножение строк?
'cat' * 3 #=> 'catcatcat'
Как работает умножение списка?
[1,2,3] * 2 #=> [1, 2, 3, 1, 2, 3]
Что означает self в классе?
Self ссылается на экземпляр класса. Так метод может обновлять объект, к которому принадлежит.
Как объединить списки в Python?
Списки объединяются при сложении. Обратите внимание, что с массивами так не получается:
a = [1,2] b = [3,4,5]
a + b #=> [1, 2, 3, 4, 5]
В чем разница между списками и массивами?
Примечание: в стандартной библиотеке Python есть объект array, но здесь мы специально обсуждаем массив из популярной библиотеки Numpy.
Списки в каждом индексе можно заполнять разными типами данных. Массивы требуют однородных элементов.
Арифметические действия в списках добавляют или удаляют элементы из списка. Арифметические действия на массивах соответствуют функциям линейной алгебры.
Массивы используют меньше памяти и обладают значительно большей функциональностью.
Как объединить два массива?
Помните, что массивы — это не списки. Это библиотека Numpy и здесь работает линейная алгебра.
Для объединения массивов нужно использовать соответствующую функцию Numpy:
import numpy as np
a = np.array([1,2,3]) b = np.array([4,5,6])
np.concatenate((a,b)) #=> array([1, 2, 3, 4, 5, 6])
Назовите изменяемые и неизменяемые объекты
Неизменяемость означает, что состояние нельзя изменить после создания. Примеры: int, float, bool, string и tuple.
Состояние изменяемых объектов можно изменить. Примеры: list, dict и set.
Как округлить число до трех десятичных знаков?
Используйте функцию round(value, decimal_places):
a = 5.12345 round(a,3) #=> 5.123
Что нужно сделать с классом, чтобы он стал итерируемым?
Реализовать функцию __iter__
методы итератора
next с exception stop iteration
Как разбить список?
Синтаксис функции включает три аргумента: list[start:stop:step], где step — это интервал, через который возвращаются элементы:
a = [0,1,2,3,4,5,6,7,8,9]
print(a[:2]) #=> [0, 1]
print(a[8:]) #=> [8, 9]
print(a[2:8]) #=> [2, 3, 4, 5, 6, 7]
print(a[2:8:2]) #=> [2, 4, 6]
Что такое pickle?
Pickle — это модуль сериализации и десериализации объектов в Python.
В примере ниже мы сериализуем и десериализуем список словарей:
import pickle
obj = [
{‘id’:1, ‘name’:’Stuffy’},
{‘id’:2, ‘name’: ‘Fluffy’}
]
with open('file.p', 'wb') as f: pickle.dump(obj, f)
with open('file.p', 'rb') as f: loaded_obj = pickle.load(f)
print(loaded_obj) #=> [{'id': 1, 'name': 'Stuffy'}, {'id': 2, 'name': 'Fluffy'}]
Какая разница между словарями и JSON?
Dict (словарь) — это тип данных Python, представляющий собой набор индексированных, но неупорядоченных пар ключ-значение.
JSON — просто строка, которая следует заданному формату и предназначена для передачи данных.
Как работают any() и all()?
Any возвращает true, если хоть один элемент в последовательности соответствует условию, то есть является true.
All возвращает true только в том случае, если условию соответствуют все элементы в последовательности.
Где быстрее поиск: в словарях или списках?
Поиск значения в списке занимает O(n) времени, потому что нужно пройти весь список.
Поиск ключа в словаре занимает O(1) времени, потому что это хэш-таблица.
В чем разница между модулем и пакетом?
Модуль — это файл или набор файлов, которые импортируются вместе:
import sklearn
Пакет — это каталог с модулями:
from sklearn import cross_validation
Таким образом, пакеты — это модули, но не все модули являются пакетами.
Как увеличить и уменьшить целое число в Python?
Инкремент и декремент можно сделать с помощью += и -=:
value = 5
value += 1 print(value) #=> 6
value -= 1
value -= 1
print(value)
#=> 4
Что нужно чтобы класс реализовал менеджер контекста?
Класс должен содержать методs enter и exit
Как вернуть двоичный код целого числа?
Используйте функцию bin():
bin(5) #=> '0b101'
Как удалить из списка дубликаты?
Это можно сделать путем преобразования списка в набор, а затем обратно в список:
a = [1,1,1,2,3] a = list(set(a)) print(a) #=> [1, 2, 3]
Как проверить, существует ли значение в списке?
Используйте in:
'a' in ['a','b','c'] #=> True
'a' in [1,2,3] #=> False
В чем разница между append и extend?
append добавляет значения в список, а extend добавляет в список значения из другого списка:
a = [1,2,3] b = [1,2,3]
a.append(6) print(a) #=> [1, 2, 3, 6]
b.extend([4,5]) print(b) #=> [1, 2, 3, 4, 5]
Как объединить два списка в список кортежей?
Для объединения в список кортежей можно использовать функцию zip, причем не только двух, но трех и более списков.
a = ['a','b','c'] b = [1,2,3]
[(k,v) for k,v in zip(a,b)] #=> [('a', 1), ('b', 2), ('c', 3)]
Как отсортировать словарь по ключам, в алфавитном порядке?
Нельзя «отсортировать» словарь, поскольку словари не поддерживают упорядочение, но можно вернуть отсортированный список кортежей с ключами и значениями из словаря:
d = {‘c’:3, ‘d’:4, ‘b’:2, ‘a’:1}
sorted(d.items()) #=> [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
Как реализуется наследование классов в Python?
В приведенном ниже примере класс Audi является наследником Car. И вместе с этим наследуются методы экземпляра родительского класса:
class Car(): def drive(self): print('vroom') class Audi(Car): pass audi = Audi() audi.drive()
Как удалить все пробелы из строки?
Можно разделить строку в местах пробелов, а затем снова соединить без пробелов:
s = ‘A string with white space’
''.join(s.split()) #=> 'Astringwithwhitespace'
#более каноничный способ замены s = 'A string with white space' s.replace(' ', '') #=> 'Astringwithwhitespace'
Почему мы используем enumerate() при итерации последовательности?
enumerate() позволяет отслеживать индекс при итерации последовательности. Это более нативный способ, чем определение и приращение целого числа, представляющего индекс:
модуль collections
namedtuple() - factory function for creating tuple subclasses with named fields
deque - list-like container with fast appends and pops on either end
ChainMap - dict-like class for creating a single view of multiple mappings
Counter - dict subclass for counting hashable objects
OrderedDict - dict subclass that remembers the order entries were added
defaultdict - dict subclass that calls a factory function to supply missing values
UserDict - wrapper around dictionary objects for easier dict subclassing
UserList - wrapper around list objects for easier list subclassing
UserString - wrapper around string objects for easier string subclassing
В чем разница между pass, continue и break?
Заглушка pass означает «ничего не делать». Обычно мы используем эту функцию, потому что Python не позволяет создавать класс, функцию или оператор if без кода внутри.
В приведенном ниже примере вылетит ошибка, если внутри i > 3 не будет кода, поэтому мы используем pass:
a = [1,2,3,4,5] for i in a: if i > 3: pass print(i) #=> 1 #=> 2 #=> 3 #=> 4 #=> 5
В чем разница между pass, continue и break?
Заглушка pass означает «ничего не делать». Обычно мы используем эту функцию, потому что Python не позволяет создавать класс, функцию или оператор if без кода внутри.
continue отправляет вас к следующему элементу в цикле, останавливая выполнение для текущего элемента. Таким образом, print(i) никогда не получает значения i < 3
break прерывает цикл, и последовательность больше не повторяется. Таким образом, на цифре 3 цикл прерывается, а этот и следующие элементы не печатаются:
Приведите пример тернарного оператора
Тернарный (условный) оператор — это однострочный оператор if/else.
Синтаксис такой: a if condition else b.
Проверьте, что в строке только числа
Можно использовать isnumeric():
'123a'.isnumeric() #=> False
'123'.isnumeric() #=> True
Проверьте, что в строке только буквы
Можно использовать isalpha():
'123a'.isalpha() #=> False
'a'.isalpha() #=> True
Проверьте, что в строке только буквы и цифры
Здесь можно использовать isalnum():
'123abc...'.isalnum() #=> False
'123abc'.isalnum() #=> True
Получите список ключей из словаря
Это можно сделать через передачу словаря в конструктор list():
d = {‘id’:7, ‘name’:’Shiba’, ‘color’:’brown’, ‘speed’:’very slow’}
list(d) #=> ['id', 'name', 'color', 'speed']
Как перевести строку в верхний/нижний регистр?
Можно использовать строковые методы upper() и lower():
small_word = 'potatocake' big_word = 'FISHCAKE'
small_word.upper() #=> 'POTATOCAKE'
big_word.lower() #=> 'fishcake'
В чем разница между remove, del и pop?
remove() удаляет первое совпадающее значение:
li = [‘a’,’b’,’c’,’d’]
li.remove(‘b’)
li
#=> [‘a’, ‘c’, ‘d’]
del удаляет элемент по его индексу:
li = [‘a’,’b’,’c’,’d’]
del li[0] li #=> ['b', 'c', 'd']
pop() удаляет элемент по индексу и возвращает этот элемент:
li = [‘a’,’b’,’c’,’d’]
li.pop(2) #=> 'c'
li #=> ['a', 'b', 'd']
Приведите пример генератора словарей (dict comprehension)
# создаем список букв import string list(string.ascii_lowercase) alphabet = list(string.ascii_lowercase)
# генерация словаря d = {val:idx for idx,val in enumerate(alphabet)}
Как выполняется обработка исключений в Python?
Для обработки исключений Python предоставляет конструкцию из трех слов: try, except и finally.
Синтаксис выглядит примерно так:
try: # попробовать сделать это except: # если блок try не сработал, попробовать это finally: # всегда делать это
Ниже упрощенный пример такой конструкции. Здесь блок try терпит неудачу, поскольку мы не можем складывать целые числа со строками. Блок except устанавливает val = 10, а затем блок finally выводит complete:
try: val = 1 + 'A' except: val = 10 finally: print('complete')
print(val) #=> complete #=> 10
Что такое лямбда-функция?
Анонимная или неназванная функция называется лямбда-функцией. Она может иметь любое количество параметров, но только один оператор. Она часто используется как одноразовая функция, а не многоразовая.
Что такое словарь в Python?
Словарь Python — это один из поддерживаемых типов данных. Это неупорядоченная коллекция элементов. Элементы в словарях хранятся в виде пар ключ-значение. Словари индексируются по ключам. Тип данных представлен в виде {}
Инкапсуляция (encapsulation)
Инкапсуляция (encapsulation) - это механизм, который объединяет данные и код, манипулирующий этими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования. (from codenet.ru). Инкапсуляция нужна для того, что бы пользователь не мог использовать не предназначенный для него функционал.