Last active
February 16, 2022 09:58
-
-
Save tumani1/8801673 to your computer and use it in GitHub Desktop.
Тестовые задания на вакансию python разработчика в Yandex. Подробнее: http://company.yandex.ru/job/vacancies/dev_python_mysql.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: utf-8 | |
import unittest | |
""" | |
Есть два списка разной длины. В первом содержатся ключи, а во втором значения. Напишите функцию, которая создаёт из этих ключей и значений словарь. Если ключу не хватило значения, в словаре должно быть значение None. Значения, которым не хватило ключей, нужно игнорировать. Подробнее: http://company.yandex.ru/job/vacancies/dev_python_mysql.xml | |
""" | |
def dictFromKeyAndValue(key, value): | |
return dict(zip(key, value)) if (len(key) <= len(value)) else dict(map(None, key, value)) | |
# Класс с юнит тестами | |
class createDict(unittest.TestCase): | |
def testLenKeyEqLenValue(self): | |
key = [1,2,3] | |
value = ['q','w','e'] | |
result = { | |
1: 'q', | |
2: 'w', | |
3: 'e' | |
} | |
self.assertEqual(dictFromKeyAndValue(key, value), result) | |
def testLenKeyGtLenValue(self): | |
key = [1,2,3,4,5] | |
value = ['q','w','e'] | |
result = { | |
1: 'q', | |
2: 'w', | |
3: 'e', | |
4: None, | |
5: None | |
} | |
self.assertEqual(dictFromKeyAndValue(key, value), result) | |
def testLenKeyLteLenValue(self): | |
key = [1,2,3] | |
value = ['q','w','e', 'r', 't'] | |
result = { | |
1: 'q', | |
2: 'w', | |
3: 'e' | |
} | |
self.assertEqual(dictFromKeyAndValue(key, value), result) | |
if __name__ == "__main__": | |
unittest.main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: utf-8 | |
import re | |
import os | |
import operator | |
from IPy import IP | |
from collections import Counter | |
""" | |
Предположим, у нас есть access.log веб-сервера. Как с помощью стандартных консольных средств найти десять IP-адресов, от которых было больше всего запросов? | |
Подробнее: http://company.yandex.ru/job/vacancies/dev_python_mysql.xml | |
""" | |
# Кол-во адресов версии 4 | |
COUNT_IPV4 = 2**32 - 1 | |
# Регулярные выражения для разбора стандарного access.log | |
# файла веб-сервера Apache (http://httpd.apache.org/docs/2.4/logs.html#common) | |
parts = [ | |
r'(?P<host>\S+)', # host %h | |
r'\S+', # indent %l (unused) | |
r'(?P<user>\S+)', # user %u | |
r'\[(?P<time>.+)\]', # time %t | |
r'"(?P<request>.+)"', # request "%r" | |
r'(?P<status>[0-9]+)', # status %>s | |
r'(?P<size>\S+)', # size %b (careful, can be '-') | |
r'"(?P<referer>.*)"', # referer "%{Referer}i" | |
r'"(?P<agent>.*)"', # user agent "%{User-agent}i" | |
] | |
class FileNotFound(Exception): | |
""" Raised when file not found """ | |
# Функция подсчитывает кол-во ip-адресов в access.log | |
# файле веб-сервера Apache | |
def count_ipaddress(filename, first=None, try_replace_ipv6=False, **kwargs): | |
# Проверяем, что файл существует | |
if not os.path.exists(filename): | |
raise FileNotFound | |
# Init | |
ipcounter = Counter() | |
pattern = re.compile(r'\s+'.join(parts) + r'\s*\Z') | |
first = validation_int(first) | |
# Читаем файл | |
with open(filename) as infile: | |
for line in infile: | |
match = pattern.match(line) | |
result = match.groupdict() | |
ipcounter[result['host']] += 1 | |
# Если выбрана опция замены адресов | |
if try_replace_ipv6 is True: | |
ipcounter = try_replace_ipv6_to_ipv4(ipcounter) | |
# Делаем сортировку и берем n-ое кол-во ip-адресов | |
ipcounter = sorted(ipcounter.iteritems(), key=operator.itemgetter(1), reverse=True)[:first] | |
return dict(ipcounter) | |
# Функция пытается конвертировать ipv6 адрес в ipv4 адрес. | |
# Если конвертируется то пытается создать или прибавить к значению ipv4 адреса | |
# и удаляет ipv6 адрес. | |
def try_replace_ipv6_to_ipv4(ipcounter, **kwargs): | |
ipv6_keys = filter((lambda x: x.version() == 6), map(IP, ipcounter.keys())) | |
for item in ipv6_keys: | |
if item.int() < COUNT_IPV4: | |
ipcounter[IP(item.int()).__str__()] += ipcounter[item.__str__()] | |
del ipcounter[item.__str__()] | |
return ipcounter | |
# Проверка на целое | |
def validation_int(number): | |
return number if (isinstance(number, int) and number > 0) else 10 | |
if __name__ == '__main__': | |
params = { | |
'filename': '/var/log/apache2/access.log', | |
} | |
result = count_ipaddress(**params) | |
print "Result: %s" % result | |
result = count_ipaddress(first=1, **params) | |
print "Result: %s" % result | |
result = count_ipaddress(try_replace_ipv6=True, **params) | |
print "Result: %s" % result |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# coding: utf-8 | |
import re | |
import unittest | |
""" | |
В системе авторизации есть ограничение: логин должен начинаться с латинской буквы, состоять из латинских букв, цифр, точки и минуса, но заканчиваться только латинской буквой или цифрой; минимальная длина логина — один символ, максимальная — 20. Напишите код, проверяющий соответствие входной строки этому правилу. Придумайте несколько способов решения задачи и сравните их. | |
Подробнее: http://company.yandex.ru/job/vacancies/dev_python_mysql.xml | |
""" | |
def check_password_var_1(value): | |
if not isinstance(value, basestring): | |
return False | |
len_value = len(value) | |
if not len_value: | |
return False | |
if len_value == 1: | |
if not re.match(r"^[a-zA-Z]$", value): | |
return False | |
else: | |
if not re.match(r"^[a-zA-Z][a-zA-Z0-9]$", value[::len_value-1]): | |
return False | |
if len_value > 2: | |
if not re.match(r"^[a-zA-Z0-9-\.]{0,18}$", value[1:-1]): | |
return False | |
return True | |
def check_password_var_2(value): | |
if not isinstance(value, basestring): | |
return False | |
if not re.match(r"^[a-zA-Z0-9-\.]{1,20}$", value): | |
return False | |
if not re.match(r"^[a-zA-Z]$", value[0]): | |
return False | |
if not re.match(r"^[^-\.]$", value[-1]): | |
return False | |
return True | |
class checkPassword(unittest.TestCase): | |
def testCheckPasswordVar1(self): | |
password = u"r" | |
self.assertTrue(check_password_var_1(password)) | |
password = u"r9" | |
self.assertTrue(check_password_var_1(password)) | |
password = u"r$" | |
self.assertFalse(check_password_var_1(password)) | |
password = u"r.9" | |
self.assertTrue(check_password_var_1(password)) | |
password = u"restkevegfv;eeeeeee8" | |
self.assertFalse(check_password_var_1(password)) | |
password = u"restkevegfveeee8e" | |
self.assertTrue(check_password_var_1(password)) | |
password = u"restkevegfveeeeeee8e" | |
self.assertTrue(check_password_var_1(password)) | |
password = u"restkevegfveeeeeee8ee" | |
self.assertFalse(check_password_var_1(password)) | |
def testCheckPasswordVar2(self): | |
password = u"" | |
self.assertFalse(check_password_var_2(password)) | |
password = u"r" | |
self.assertTrue(check_password_var_2(password)) | |
password = u"r9" | |
self.assertTrue(check_password_var_2(password)) | |
password = u"r$" | |
self.assertFalse(check_password_var_2(password)) | |
password = u"r.9" | |
self.assertTrue(check_password_var_2(password)) | |
password = u"restkevegfv;eeeeeee8" | |
self.assertFalse(check_password_var_2(password)) | |
password = u"restkevegfveeee8e" | |
self.assertTrue(check_password_var_2(password)) | |
password = u"restkevegfveeeeeee8e" | |
self.assertTrue(check_password_var_2(password)) | |
password = u"restkevegfveeeeeee8ee" | |
self.assertFalse(check_password_var_2(password)) | |
if __name__ == "__main__": | |
unittest.main() |
В следующей жизни)) Ты, главное, жди звонка)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
До обеда или после?)