Встроенные функции и методы для работы с числами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Встроенные функции и методы для работы с числами



>>> int(7.5), int("71", 10), int("0o71", 8), int("0xA", 16)

(7, 71, 57, 10)

>>> int(), int("0b11111111", 2)

(0, 255)

 

 

>>> float(7), float("7.1"), float("12.")

(7.0, 7.1, 12.0)

>>> float("inf"), float("-Infinity"), float("nan")

(inf, -inf, nan)

>>> float()

0.0

 

 

>>> bin(255), bin(1), bin(-45)

('0b11111111', '0b1', '-0b101101')

 

 

>>> oct(7), oct(8), oct(64)

('0o7', '0o10', '0o100')

 

 

>>> hex(10), hex(16), hex(255)

('0xa', '0x10', '0xff')

 

 

>>> round(0.49), round(0.50), round(0.51)

(0, 0, 1)

>>> round(1.49), round(1.50), round(1.51)

(1, 2, 2)

>>> round(2.49), round(2.50), round(2.51)

(2, 2, 3)

>>> round(3.49), round(3.50), round(3.51)

(3, 4, 4)

 

 

>>> round(1.524, 2), round(1.525, 2), round(1.5555, 3)

(1.52, 1.52, 1.556)

 

 

>>> abs(-10), abs(10), abs(-12.5)

(10, 10, 12.5)

 

 

>>> pow(10, 2), 10 ** 2, pow(3, 3), 3 ** 3

(100, 100, 27, 27)

 

 

>>> pow(10, 2, 2), (10 ** 2) % 2, pow(3, 3, 2), (3 ** 3) % 2

(0, 0, 1, 1)

 

 

>>> max(1, 2, 3), max(3, 2, 3, 1), max(1, 1.0), max(1.0, 1)

(3, 3, 1, 1.0)

 

 

>>> min(1, 2, 3), min(3, 2, 3, 1), min(1, 1.0), min(1.0, 1)

(1, 1, 1, 1.0)

 

 

>>> sum((10, 20, 30, 40)), sum([10, 20, 30, 40])

(100, 100)

>>> sum([10, 20, 30, 40], 2), sum([], 2)

(102, 2)

 

 

>>> divmod(13, 2) # 13 == 6 * 2 + 1

(6, 1)

>>> 13 // 2, 13 % 2

(6, 1)

>>> divmod(13.5, 2.0) # 13.5 == 6.0 * 2.0 + 1.5

(6.0, 1.5)

>>> 13.5 // 2.0, 13.5 % 2.0

(6.0, 1.5)

 

 

>>> (2.0).is_integer()

True

>>> (2.3).is_integer()

False

 

 

>>> (0.5).as_integer_ratio()

(1, 2)

>>> (2.3).as_integer_ratio()

(2589569785738035, 1125899906842624)

5.2. Модуль math. Математические функции

import math

 

 

>>> import math

>>> math.pi

3.141592653589793

 

 

>>> math.e

2.718281828459045

 

 

>>> math.degrees(math.pi)

180.0

 

 

>>> math.radians(180.0)

3.141592653589793

 

 

>>> math.sqrt(100), math.sqrt(25)

(10.0, 5.0)

 

 

>>> math.ceil(5.49), math.ceil(5.50), math.ceil(5.51)

(6, 6, 6)

 

 

>>> math.floor(5.49), math.floor(5.50), math.floor(5.51)

(5, 5, 5)

 

 

>>> math.pow(10, 2), 10 ** 2, math.pow(3, 3), 3 ** 3

(100.0, 100, 27.0, 27)

 

 

>>> math.fabs(10), math.fabs(-10), math.fabs(-12.5)

(10.0, 10.0, 12.5)

 

 

>>> math.fmod(10, 5), 10 % 5, math.fmod(10, 3), 10 % 3

(0.0, 0, 1.0, 1)

 

 

>>> math.factorial(5), math.factorial(6)

(120, 720)

 

 

>>> sum([.1,.1,.1,.1,.1,.1,.1,.1,.1,.1])

0.9999999999999999

>>> fsum([.1,.1,.1,.1,.1,.1,.1,.1,.1,.1])

1.0

5.3. Модуль random.
Генерация случайных чисел

import random

 

 

>>> import random

>>> random.random()

0.9753144027290991

>>> random.random()

0.5468390487484339

>>> random.random()

0.13015058054767736

 

 

>>> random.seed(10)

>>> random.random()

0.5714025946899135

>>> random.seed(10)

>>> random.random()

0.5714025946899135

 

 

>>> random.uniform(0, 10)

9.965569925394552

>>> random.uniform(0, 10)

0.4455638245043303

 

 

>>> random.randint(0, 10)

>>> random.randint(0, 10)

 

 

>>> random.randrange(10)

>>> random.randrange(0, 10)

>>> random.randrange(0, 10, 2)

 

 

>>> random.choice("string") # Строка

'i'

>>> random.choice(["s", "t", "r"]) # Список

'r'

>>> random.choice(("s", "t", "r")) # Кортеж

't'

 

 

>>> arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> random.shuffle(arr)

>>> arr

[8, 6, 9, 5, 3, 7, 2, 4, 10, 1]

 

 

>>> random.sample("string", 2)

['i', 'r']

>>> arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> random.sample(arr, 2)

[7, 10]

>>> arr # Сам список не изменяется

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> random.sample((1, 2, 3, 4, 5, 6, 7), 3)

[6, 3, 5]

>>> random.sample(range(300), 5)

[126, 194, 272, 46, 71]

 

Листинг 5.1. Генератор паролей

# -*- coding: utf-8 -*-

import random # Подключаем модуль random

def passw_generator(count_char=8):

arr = ['a','b','c','d','e','f','g','h','i','j','k','l','m',

'n','o','p','q','r','s','t','u','v','w','x','y','z',

'A','B','C','D','E','F','G','H','I','J','K','L',

'M','N','O','P','Q','R','S','T','U','V', 'W',

'X','Y','Z','1','2','3','4','5','6','7','8','9','0']

passw = []

for i in range(count_char):

passw.append(random.choice(arr))

return "".join(passw)

 

# Вызываем функцию

print(passw_generator(10)) # Выведет что-то вроде ngODHE8J8x

print(passw_generator()) # Выведет что-то вроде ZxcpkF5O

input()

Строки и двоичные данные

Листинг 6.1. Попытка изменить символ по индексу

>>> s = "Python"

>>> s[0] # Можно получить символ по индексу

'P'

>>> s[0] = "J" # Изменить строку нельзя

Traceback (most recent call last):

File "<pyshell#2>", line 1, in <module>

s[0] = "J" # Изменить строку нельзя

TypeError: 'str' object does not support item assignment

 

 

>>> type("строка")

<class 'str'>

>>> "строка".encode(encoding="cp1251")

b'\xf1\xf2\xf0\xee\xea\xe0'

>>> "строка".encode(encoding="utf-8")

b'\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0'

 

 

>>> s = bytes("стр str", "cp1251")

>>> s[0], s[5], s[0:3], s[4:7]

(241, 116, b'\xf1\xf2\xf0', b'str')

>>> s

b'\xf1\xf2\xf0 str'

 

 

>>> len("строка")

>>> len(bytes("строка", "cp1251"))

>>> len(bytes("строка", "utf-8"))

 

 

>>> s = bytearray("str", "cp1251")

>>> s[0] = 49; s # Можно изменить символ

bytearray(b'1tr')

>>> s.append(55); s # Можно добавить символ

bytearray(b'1tr7')

Создание строки

>>> str(), str([1, 2]), str((3, 4)), str({"x": 1})

('', '[1, 2]', '(3, 4)', "{'x': 1}")

>>> str(b"\xf1\xf2\xf0\xee\xea\xe0")

"b'\\xf1\\xf2\\xf0\\xee\\xea\\xe0'"

 

 

>>> str(b"\xf1\xf2\xf0\xee\xea\xe0", "cp1251")

'строка'

 

 

>>> obj1 = bytes("строка1", "utf-8")

>>> obj2 = bytearray("строка2", "utf-8")

>>> str(obj1, "utf-8"), str(obj2, "utf-8")

('строка1', 'строка2')

>>> str(obj1, "ascii", "strict")

Traceback (most recent call last):

File "<pyshell#16>", line 1, in <module>

str(obj1, "ascii", "strict")

UnicodeDecodeError: 'ascii' codec can't decode byte

0xd1 in position 0: ordinal not in range(128)

>>> str(obj1, "ascii", "ignore")

'1'

 

 

>>> 'строка', "строка", '"x": 5', "'x': 5"

('строка', 'строка', '"x": 5', "'x': 5")

>>> print('Строка1\nСтрока2')

Строка1

Строка2

>>> print("Строка1\nСтрока2")

Строка1

Строка2

 

 

>>> print("Строка1\\nСтрока2")

Строка1\nСтрока2

>>> print('Строка1\\nСтрока2')

Строка1\nСтрока2

 

 

>>> "\"x\": 5", '\'x\': 5'

('"x": 5', "'x': 5")

 

 

>>> "string

SyntaxError: EOL while scanning string literal

 

 

>>> "string1\

string2" # После \ не должно быть никаких символов

'string1string2'

>>> ("string1"

"string2") # Неявная конкатенация строк

'string1string2'

>>> ("string1" +

"string2") # Явная конкатенация строк

'string1string2'

 

 

>>> print("string\")

 

SyntaxError: EOL while scanning string literal

>>> print("string\\")

string\

 

 

>>> print('''Строка1

Строка2''')

Строка1

Строка2

>>> print("""Строка1

Строка2""")

Строка1

Строка2

 

 

>>> def test():

"""Это описание функции"""

pass

 

>>> print(test.__doc__)

Это описание функции

 

 

>>> print("Строка1\nСтрока2")

Строка1

Строка2

>>> print(r"Строка1\nСтрока2")

Строка1\nСтрока2

>>> print(r"""Строка1\nСтрока2""")

Строка1\nСтрока2

 

 

>>> print(r"C:\Python34\lib\site-packages")

C:\Python34\lib\site-packages

 

 

>>> print("C:\\Python34\\lib\\site-packages")

C:\Python34\lib\site-packages

 

 

>>> print(r"C:\Python34\lib\site-packages\")

 

SyntaxError: EOL while scanning string literal

>>> print(r"C:\Python34\lib\site-packages\\")

C:\Python34\lib\site-packages\\

 

 

>>> print(r"C:\Python34\lib\site-packages" + "\\") # Конкатенация

C:\Python34\lib\site-packages\

>>> print("C:\\Python34\\lib\\site-packages\\") # Обычная строка

C:\Python34\lib\site-packages\

>>> print(r"C:\Python34\lib\site-packages\\"[:-1]) # Удаление слэша

C:\Python34\lib\site-packages\

Специальные символы

>>> print("Этот символ \не специальный")

Этот символ \не специальный

 

 

>>> print("Этот символ \\не специальный")

Этот символ \не специальный

Операции над строками

>>> s = "Python"

>>> s[0], s[1], s[2], s[3], s[4], s[5]

('P', 'y', 't', 'h', 'o', 'n')

 

 

>>> s = "Python"

>>> s[10]

Traceback (most recent call last):

File "<pyshell#90>", line 1, in <module>

s[10]

IndexError: string index out of range

 

 

>>> s = "Python"

>>> s[-1], s[len(s)-1]

('n', 'n')

 

 

>>> s = "Python"

>>> s[0] = "J" # Изменить строку нельзя

Traceback (most recent call last):

File "<pyshell#94>", line 1, in <module>

s[0] = "J" # Изменить строку нельзя

TypeError: 'str' object does not support item assignment

>>> s = "Python"

 

 

>>> s[:] # Возвращается фрагмент от позиции 0 до конца строки

'Python'

 

 

>>> s[::-1] # Указываем отрицательное значение в параметре <Шаг>

'nohtyP'

 

 

>>> "J" + s[1:] # Извлекаем фрагмент от символа 1 до конца строки

'Jython'

 

 

>>> s[:-1] # Возвращается фрагмент от 0 до len(s)-1

'Pytho'

 

 

>>> s[0:1] # Символ с индексом 1 не входит в диапазон

'P'

 

 

>>> s[-1:] # Получаем фрагмент от len(s)-1 до конца строки

'n'

 

 

>>> s[2:5] # Возвращаются символы с индексами 2, 3 и 4

'tho'

 

 

>>> len("Python"), len("\r\n\t"), len(r"\r\n\t")

(6, 3, 6)

 

 

>>> s = "Python"

>>> for i in range(len(s)): print(s[i], end=" ")

 

 

>>> s = "Python"

>>> for i in s: print(i, end=" ")

 

 

>>> print("Строка1" + "Строка2")

Строка1Строка2

 

 

>>> print("Строка1" "Строка2")

Строка1Строка2

 

 

>>> s = "Строка1", "Строка2"

>>> type(s) # Получаем кортеж, а не строку

<class 'tuple'>

 

 

>>> s = "Строка1"

>>> print(s + "Строка2") # Нормально

Строка1Строка2

>>> print(s "Строка2") # Ошибка

SyntaxError: invalid syntax

 

 

>>> "string" + str(10)

'string10'

 

 

>>> "-" * 20

'--------------------'

>>> "yt" in "Python" # Найдено

True

>>> "yt" in "Perl" # Не найдено

False

>>> "PHP" not in "Python" # Не найдено

True

 

Форматирование строк

>>> "%s" % 10 # Один элемент

'10'

>>> "%s — %s — %s" % (10, 20, 30) # Несколько элементов

'10 — 20 — 30'

 

 

>>> "%(name)s — %(year)s" % {"year": 1978, "name": "Nik"}

'Nik — 1978'

 

 

>>> print("%#o %#o %#o" % (0o77, 10, 10.5))

0o77 0o12 0o12

>>> print("%#x %#x %#x" % (0xff, 10, 10.5))

0xff 0xa 0xa

>>> print("%#X %#X %#X" % (0xff, 10, 10.5))

0XFF 0XA 0XA

>>> print("%#.0F %.0F" % (300, 300))

300. 300

 

 

>>> "'%d' — '%05d'" % (3, 3) # 5 — ширина поля

"'3' — '00003'"

 

>>> "'%5d' — '%-5d'" % (3, 3) # 5 — ширина поля

"' 3' — '3 '"

>>> "'%05d' — '%-05d'" % (3, 3)

"'00003' — '3 '"

 

 

>>> "'% d' — '% d'" % (-3, 3)

"'-3' — ' 3'"

 

 

>>> "'%+d' — '%+d'" % (-3, 3)

"'-3' — '+3'"

 

 

>>> "'%10d' — '%-10d'" % (3, 3)

"' 3' — '3 '"

>>> "'%3s''%10s'" % ("string", "string")

"'string'' string'"

 

 

>>> "'%*s''%10s'" % (10, "string", "str")

"' string'' str'"

 

 

>>> import math

>>> "%s %f %.2f" % (math.pi, math.pi, math.pi)

'3.141592653589793 3.141593 3.14'

 

 

>>> "'%*.*f'" % (8, 5, math.pi)

"' 3.14159'"

 

 

>>> print("%s" % ("Обычная строка"))

Обычная строка

>>> print("%s %s %s" % (10, 10.52, [1, 2, 3]))

10 10.52 [1, 2, 3]

 

 

>>> print("%r" % ("Обычная строка"))

'Обычная строка'

 

 

>>> print("%a" % ("строка"))

'\u0441\u0442\u0440\u043e\u043a\u0430'

 

 

>>> for i in range(33, 127): print("%s => %c" % (i, i))

 

 

>>> print("%d %d %d" % (10, 25.6, -80))

10 25 -80

>>> print("%i %i %i" % (10, 25.6, -80))

10 25 -80

 

 

>>> print("%o %o %o" % (0o77, 10, 10.5))

77 12 12

>>> print("%#o %#o %#o" % (0o77, 10, 10.5))

0o77 0o12 0o12

 

 

>>> print("%x %x %x" % (0xff, 10, 10.5))

ff a a

>>> print("%#x %#x %#x" % (0xff, 10, 10.5))

0xff 0xa 0xa

 

 

>>> print("%X %X %X" % (0xff, 10, 10.5))

FF A A

>>> print("%#X %#X %#X" % (0xff, 10, 10.5))

0XFF 0XA 0XA

 

 

>>> print("%f %f %f" % (300, 18.65781452, -12.5))

300.000000 18.657815 -12.500000

>>> print("%F %F %F" % (300, 18.65781452, -12.5))

300.000000 18.657815 -12.500000

>>> print("%#.0F %.0F" % (300, 300))

300. 300

 

 

print("%e %e" % (3000, 18657.81452))

3.000000e+03 1.865781e+04

 

 

>>> print("%E %E" % (3000, 18657.81452))

3.000000E+03 1.865781E+04

 

 

>>> print("%g %g %g" % (0.086578, 0.000086578, 1.865E-005))

0.086578 8.6578e-05 1.865e-05

 

 

>>> print("%G %G %G" % (0.086578, 0.000086578, 1.865E-005))

0.086578 8.6578E-05 1.865E-05

 

 

>>> print("% %s" % ("- это символ процента")) # Ошибка

Traceback (most recent call last):

File "<pyshell#55>", line 1, in <module>

print("% %s" % ("- это символ процента")) # Ошибка

TypeError: not all arguments converted during string formatting

>>> print("%% %s" % ("- это символ процента")) # Нормально

% — это символ процента

 

Листинг 6.2. Пример использования форматирования строк

# -*- coding: utf-8 -*-

html = """<html>

<head><title>%(title)s</title>

</head>

<body>

<h1>%(h1)s</h1>

<div>%(content)s</div>

</body>

</html>"""

arr = {"title": "Это название документа",

"h1": "Это заголовок первого уровня",

"content": "Это основное содержание страницы"}

print(html % arr) # Подставляем значения и выводим шаблон

input()

 

 

>>> s = "1\t12\t123\t"

>>> "'%s'" % s.expandtabs(4)

"'1 12 123 '"

 

 

>>> s = "\t"

>>> "'%s' — '%s'" % (s.expandtabs(), s.expandtabs(4))

"' ' — ' '"

>>> s = "1234\t"

>>> "'%s'" % s.expandtabs(4)

"'1234 '"

 

 

>>> s = "12345\t123456\t1234567\t1234567890\t"

>>> "'%s'" % s.expandtabs(4)

"'12345 123456 1234567 1234567890 '"

 

 

>>> s = "str"

>>> s.center(15), s.center(11, "-")

(' str ', '----str----')

 

 

>>> s = "str"

>>> "'%15s' '%-15s' '%s'" % (s, s, s.center(15))

"' str' 'str ' ' str '"

 

 

>>> s = "string"

>>> s.center(6), s.center(5)

('string', 'string')

 

 

>>> s = "string"

>>> s.ljust(15), s.ljust(15, "-")

('string ', 'string---------')

>>> s.ljust(6), s.ljust(5)

('string', 'string')

 

 

>>> s = "string"

>>> s.rjust(15), s.rjust(15, "-")

(' string', '---------string')

>>> s.rjust(6), s.rjust(5)

('string', 'string')

 

 

>>> "5".zfill(20), "123456".zfill(5)

('00000000000000000005', '123456')

6.5. Метод format()

>>> print("Символы {{ и }} — {0}".format("специальные"))

Символы { и } — специальные

 

 

>>> "{0} — {1} — {2}".format(10, 12.3, "string") # Индексы

'10 — 12.3 — string'

>>> arr = [10, 12.3, "string"]

>>> "{0} — {1} — {2}".format(*arr) # Индексы

'10 — 12.3 — string'

>>> "{model} — {color}".format(color="red", model="BMW") # Ключи

'BMW — red'

>>> d = {"color": "red", "model": "BMW"}

>>> "{model} — {color}".format(**d) # Ключи

'BMW — red'

>>> "{color} — {0}".format(2015, color="red") # Комбинация

'red — 2015'

 

 

>>> arr = [10, [12.3, "string"] ]

>>> "{0[0]} — {0[1][0]} — {0[1][1]}".format(arr) # Индексы

'10 — 12.3 — string'

>>> "{arr[0]} — {arr[1][1]}".format(arr=arr) # Индексы

'10 — string'

>>> class Car: color, model = "red", "BMW"

 

>>> car = Car()

>>> "{0.model} — {0.color}".format(car) # Атрибуты

'BMW — red'

 

 

>>> "{} — {} — {} — {n}".format(1, 2, 3, n=4) # "{0} — {1} — {2} — {n}"

'1 — 2 — 3 — 4'

>>> "{} — {} — {n} — {}".format(1, 2, 3, n=4) # "{0} — {1} — {n} — {2}"

'1 — 2 — 4 — 3'

 

 

>>> print("{0!s}".format("строка")) # str()

строка

>>> print("{0!r}".format("строка")) # repr()

'строка'

>>> print("{0!a}".format("строка")) # ascii()

'\u0441\u0442\u0440\u043e\u043a\u0430'

 

 

>>> "'{0:10}' '{1:3}'".format(3, "string")

"' 3' 'string'"

 

 

>>> "'{0:{1}}'".format(3, 10) # 10 — это ширина поля

"' 3'"

 

 

>>> "'{0:<10}' '{1:>10}' '{2:^10}'".format(3, 3, 3)

"'3 ' ' 3' ' 3 '"

 

 

>>> "'{0:=10}' '{1:=10}'".format(-3, 3)

"'- 3' ' 3'"

 

 

>>> "'{0:=010}' '{1:=010}'".format(-3, 3)

"'-000000003' '0000000003'"

 

 

>>> "'{0:0=10}' '{1:0=10}'".format(-3, 3)

"'-000000003' '0000000003'"

>>> "'{0:*<10}' '{1:+>10}' '{2:.^10}'".format(3, 3, 3)

"'3*********' '+++++++++3' '....3.....'"

 

 

>>> "'{0:+}' '{1:+}' '{0:-}' '{1:-}'".format(3, -3)

"'+3' '-3' '3' '-3'"

>>> "'{0: }' '{1: }'".format(3, -3) # Пробел

"' 3' '-3'"

 

 

>>> "'{0:b}' '{0:#b}'".format(3)

"'11' '0b11'"

 

 

>>> "'{0:c}'".format(100)

"'d'"

 

 

>>> import locale

>>> locale.setlocale(locale.LC_NUMERIC, 'Russian_Russia.1251')

'Russian_Russia.1251'

>>> print("{0:n}".format(100000000).replace("\uffa0", " "))

100 000 000

 

 

>>> import locale

>>> locale.setlocale(locale.LC_NUMERIC, "Russian_Russia.1251")

'Russian_Russia.1251'

>>> print(locale.format("%d", 100000000, grouping = True))

100 000 000

>>> locale.localeconv()["thousands_sep"]

'\xa0'

 

 

>>> print("{0:,d}".format(100000000))

100,000,000

 

 

>>> "'{0:d}' '{0:o}' '{0:#o}'".format(511)

"'511' '777' '0o777'"

 

 

>>> "'{0:x}' '{0:#x}'".format(255)

"'ff' '0xff'"

 

 

>>> "'{0:X}' '{0:#X}'".format(255)

"'FF' '0XFF'"

 

 

>>> "'{0:f}' '{1:f}' '{2:f}'".format(30, 18.6578145, -2.5)

"'30.000000' '18.657815' '-2.500000'"

 

 

>>> "'{0:.7f}' '{1:.2f}'".format(18.6578145, -2.5)

"'18.6578145' '-2.50'"

 

 

>>> "'{0:e}' '{1:e}'".format(3000, 18657.81452)

"'3.000000e+03' '1.865781e+04'"

 

 

>>> "'{0:E}' '{1:E}'".format(3000, 18657.81452)

"'3.000000E+03' '1.865781E+04'"

 

 

>>> "'{0:.2e}' '{1:.2E}'".format(3000, 18657.81452)

"'3.00e+03' '1.87E+04'"

 

 

>>> "'{0:g}' '{1:g}'".format(0.086578, 0.000086578)

"'0.086578' '8.6578e-05'"

 

 

>>> "'{0:G}' '{1:G}'".format(0.086578, 0.000086578)

"'0.086578' '8.6578E-05'"

 

 

>>> "'{0:%}' '{1:.4%}'".format(0.086578, 0.000086578)

"'8.657800%' '0.0087%'"



Поделиться:


Последнее изменение этой страницы: 2016-06-23; просмотров: 261; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.221.174.248 (0.41 с.)