Числа: целые, вещественные, комплексные

Введение

Чем дальше мы изучаем си, тем больше становятся программы. Мы собираем все действия в одну функцию main и по несколько раз копируем
одни и те же действия, создаём десятки переменных с уникальными именами. Наши программы распухают и становятся всё менее и менее понятными, ветвления становятся всё длиннее
и ветвистее.

Но из сложившейся ситуации есть выход! Теперь мы научимся создавать функции на си. Функции, во-первых, помогут выделить в отдельные подпрограммы дублирующийся код, во-вторых,
помогут логически разбить программу на части, в-третьих, с функциями в си связано много особенностей, которые позволят использовать новые подходы к структурированию приложений.

Функция – это именованная часть программы, которая может быть многократно вызвана из другого участка программы (в котором эта функция видна). Функция может принимать
фиксированное либо переменное число аргументов, а может не иметь аргументов. Функция может как возвращать значение, так и быть пустой (void) и ничего не возвращать.

 ( ,  , ...) {
	
}

Самый простой пример – функция, которая принимает число типа float и возвращает квадрат этого числа

#include <conio.h>
#include <stdio.h>

float sqr(float x) {
	float tmp = x*x;
	return tmp;
}

void main() {
	printf("%.3f", sqr(9.3f));
	getch();
}

Внутри функции sqr мы создали локальную переменную, которой присвоили значение аргумента. В качестве аргумента функции передали число 9,3.
Служебное слово return возвращает значение переменной tmp. Можно переписать функцию следующим образом:

float sqr(float x) {
	return x*x;
}

В данном случае сначала будет выполнено умножение, а после этого возврат значения. В том случае, если функция ничего не возвращает, типом возвращаемого значения будет void.
Например, функция, которая печатает квадрат числа:

void printSqr(float x) {
	printf("%d", x*x);
	return;
}

в данном случа return означает выход из функции. Если функция ничего не возвращает, то return можно не писать. Тогда функция доработает до конца и произойдёт возврат
управления вызывающей функции.

void printSqr(float x) {
	printf("%d", x*x);
}

Если функция не принимает аргументов, то скобки оставляют пустыми. Можно также написать слово void:

void printHelloWorld() {
	printf("Hello World");
}

эквивалентно

void printHelloWorld(void) {
	printf("Hello World");
}

Функция zip

Следующая весьма
полезная функция позволяет объединять между собой соответствующие элементы
упорядоченных коллекций. Например, у нас имеется два списка:

a = 1,2,3,4
b = 5,6,7,8

И вызывая для
них функцию zip:

it = zip(a, b)
print(it)

Получим
итератор, который возвращает следующую коллекцию:

print( list(it ) )

и мы увидим:

То есть, у нас
были объединены в кортеж соответствующие элементы этих двух списков.

Давайте теперь
добавим еще один итерируемый объект – строку:

c = "abracadabra"

И вызовем
функцию zip для всех этих
трех объектов:

it = zip(a, b, c)
print( list(it ) )

В результате
получим коллекцию:

Смотрите, мы
здесь имеем всего четыре кортежа, в каждом из которых по три элемента. То есть,
все оставшиеся символы строки «abracadabra» были
просто отброшены. Получается, что функция zip формирует
выходной список, длина которого равна длине наименьшей из указанных коллекций.
Если, например, мы уменьшим коллекцию a до двух
элементов:

a = 1,2

то на выходе также
получим список из двух элементов:

Вот в этом и
заключается удобство этой функции: она позволяет автоматически объединить
несколько списков в наборы кортежей из соответствующих значений.

Следующие
задания для самостоятельного решения не связаны с материалом этого урока, а
охватывают все предыдущие занятия. Попробуйте реализовать их на Python и проверить
свои знания.

Best practices

Как из строки выделить числа

Для извлечения чисел из строки можно воспользоваться методами строк:

Данный пример извлекает только целые положительные числа. Более универсальный вариант – регулярные выражения:

Как перевернуть строку

Существует несколько способов перевернуть строку, начиная от классического – запустить цикл в обратной последовательности, выбирая каждый символ с конца и вставляя его в новую строку, и заканчивая срезами – вариант только для Питона.

С помощью среза – самый быстрый способ:

Использование и

Как удалить последний символ в строке

Как и в предыдущем случае – чтобы убрать последний символ наиболее простым и быстрым вариантом будет использование среза:

Как убрать пробелы из строки

В случае удаления пробелов со строки может быть два варианта:

1. Обрезать строку так, чтобы удалить с нее первый и последний пробел, такой вариант может пригодиться, когда пользователь случайно поставит пробел в конце введенного текста:

2. Удалить со строки все пробелы:

Работа со строками – неотъемлемая часть создания практически любого приложения, где используется текст, и язык программирования Python предоставляет широкие возможности работы с такими данными.

5 функций для отладки

Эти функции часто игнорируются, но будут полезны для отладки и устранения неисправностей кода.

breakpoint

Если нужно приостановить выполнение кода и перейти в командную строку Python, эта функция вам пригодится. Вызов перебросит вас в отладчик Python.

Эта встроенная функция была добавлена в Python 3.7, но если вы работаете в более старых версиях, можете получить тот же результат с помощью .

dir

Эта функция может использоваться в двух случаях:

  • просмотр списка всех локальных переменных;
  • просмотр списка всех атрибутов конкретного объекта.

Из примера можно увидеть локальные переменные сразу после запуска и после создания новой переменной .

Если в передать созданный список , на выходе можно увидеть все его атрибуты.

В выведенном списке атрибутов можно увидеть его типичные методы (, , и т. д.) , а также множество более сложных методов для перегрузки операторов.

vars

Эта функция является своего рода смесью двух похожих инструментов: и .

Когда вызывается без аргументов, это эквивалентно вызову , которая показывает словарь всех локальных переменных и их значений.

Когда вызов происходит с аргументом, получает доступ к атрибуту , который представляет собой словарь всех атрибутов экземпляра.

Перед использованием было бы неплохо сначала обратиться к .

type

Эта функция возвращает тип объекта, который вы ей передаете.

Тип экземпляра класса есть сам класс.

Тип класса — это его метакласс, обычно это .

Атрибут даёт тот же результат, что и функция , но рекомендуется использовать второй вариант.

Функция , кроме отладки, иногда полезна и в реальном коде (особенно в объектно-ориентированном программировании с наследованием и пользовательскими строковыми представлениями).

Обратите внимание, что при проверке типов обычно вместо используется функция. Также стоит понимать, что в Python обычно не принято проверять типы объектов (вместо этого практикуется утиная типизация)

help

Если вы находитесь в Python Shell или делаете отладку кода с использованием , и хотите знать, как работает определённый объект, метод или атрибут, функция поможет вам.

В действительности вы, скорее всего, будете обращаться за помощью к поисковой системе. Но если вы уже находитесь в Python Shell, вызов будет быстрее, чем поиск документации в Google.

Преобразование типов чисел Python

Мы можем преобразовать int в float с помощью функции float(). Точно так же мы можем использовать функцию int() для преобразования числа с плавающей запятой в int.

Мы можем использовать функцию complex() для преобразования int или float в комплексное число, мнимая часть будет 0j.

Мы не можем преобразовать комплексное число в int или float.

i = 10
f = 10.55

# int to float conversion
f1 = float(i)
print(f1)
print(type(f1))

# float to int conversion
i1 = int(f)
print(i1)
print(type(i1))

# int and float to complex number conversion
c = complex(i)
print(c)
print(type(c))

c = complex(f)
print(c)
print(type(c))

Вывод:

10.0
<class 'float'>
10
<class 'int'>
(10+0j)
<class 'complex'>
(10.55+0j)
<class 'complex'>

Операции сравнения

Для сравнения чисел имеется \(8\) операций, но для комплексных чисел доступно только \(4\) причем все они имеют одинаковый приоритет:

Операция Результат Замечание
1 True если x меньше y, иначе False (I)
2 True если x меньше или равно y, иначе False (I)
3 True если x больше y, иначе False (I)
4 True если x больше или равно y, иначе False (I)
5 True если x равно y, иначе False
6 True если x не равно y, иначе False
7 True если x и y это один и тот же объект, иначе False
8 True если x и y это не один и тот же объект, иначе False

Важно: приоритет операций сравнения ниже математических.

I. эти операции могут присутствовать в математических выражениях, но если операндами являются комплексные числа или одним из них является комплексным числом, то это приведет к ошибке и вызовет исключение TypeError:

Игра в кости с использованием модуля random в Python

Далее представлен код простой игры в кости, которая поможет понять принцип работы функций модуля random. В игре два участника и два кубика.

  • Участники по очереди бросают кубики, предварительно встряхнув их;
  • Алгоритм высчитывает сумму значений кубиков каждого участника и добавляет полученный результат на доску с результатами;
  • Участник, у которого в результате большее количество очков, выигрывает.

Код программы для игры в кости Python:

Python

import random

PlayerOne = «Анна»
PlayerTwo = «Алекс»

AnnaScore = 0
AlexScore = 0

# У каждого кубика шесть возможных значений
diceOne =
diceTwo =

def playDiceGame():
«»»Оба участника, Анна и Алекс, бросают кубик, используя метод shuffle»»»

for i in range(5):
#оба кубика встряхиваются 5 раз
random.shuffle(diceOne)
random.shuffle(diceTwo)
firstNumber = random.choice(diceOne) # использование метода choice для выбора случайного значения
SecondNumber = random.choice(diceTwo)
return firstNumber + SecondNumber

print(«Игра в кости использует модуль random\n»)

#Давайте сыграем в кости три раза
for i in range(3):
# определим, кто будет бросать кости первым
AlexTossNumber = random.randint(1, 100) # генерация случайного числа от 1 до 100, включая 100
AnnaTossNumber = random.randrange(1, 101, 1) # генерация случайного числа от 1 до 100, не включая 101

if( AlexTossNumber > AnnaTossNumber):
print(«Алекс выиграл жеребьевку.»)
AlexScore = playDiceGame()
AnnaScore = playDiceGame()
else:
print(«Анна выиграла жеребьевку.»)
AnnaScore = playDiceGame()
AlexScore = playDiceGame()

if(AlexScore > AnnaScore):
print («Алекс выиграл игру в кости. Финальный счет Алекса:», AlexScore, «Финальный счет Анны:», AnnaScore, «\n»)
else:
print(«Анна выиграла игру в кости. Финальный счет Анны:», AnnaScore, «Финальный счет Алекса:», AlexScore, «\n»)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

importrandom

PlayerOne=»Анна»

PlayerTwo=»Алекс»

AnnaScore=

AlexScore=

 
# У каждого кубика шесть возможных значений

diceOne=1,2,3,4,5,6

diceTwo=1,2,3,4,5,6

defplayDiceGame()

«»»Оба участника, Анна и Алекс, бросают кубик, используя метод shuffle»»»

foriinrange(5)

#оба кубика встряхиваются 5 раз

random.shuffle(diceOne)

random.shuffle(diceTwo)

firstNumber=random.choice(diceOne)# использование метода choice для выбора случайного значения

SecondNumber=random.choice(diceTwo)

returnfirstNumber+SecondNumber

print(«Игра в кости использует модуль random\n»)

 
#Давайте сыграем в кости три раза

foriinrange(3)

# определим, кто будет бросать кости первым

AlexTossNumber=random.randint(1,100)# генерация случайного числа от 1 до 100, включая 100

AnnaTossNumber=random.randrange(1,101,1)# генерация случайного числа от 1 до 100, не включая 101

if(AlexTossNumber>AnnaTossNumber)

print(«Алекс выиграл жеребьевку.»)

AlexScore=playDiceGame()

AnnaScore=playDiceGame()

else

print(«Анна выиграла жеребьевку.»)

AnnaScore=playDiceGame()

AlexScore=playDiceGame()

if(AlexScore>AnnaScore)

print(«Алекс выиграл игру в кости. Финальный счет Алекса:»,AlexScore,»Финальный счет Анны:»,AnnaScore,»\n»)

else

print(«Анна выиграла игру в кости. Финальный счет Анны:»,AnnaScore,»Финальный счет Алекса:»,AlexScore,»\n»)

Вывод:

Shell

Игра в кости использует модуль random

Анна выиграла жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 5 Финальный счет Алекса: 2

Анна выиграла жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 10 Финальный счет Алекса: 2

Алекс выиграл жеребьевку.
Анна выиграла игру в кости. Финальный счет Анны: 10 Финальный счет Алекса: 8

1
2
3
4
5
6
7
8
9
10

Игравкостииспользуетмодульrandom

 
Аннавыигралажеребьевку.

Аннавыигралаигрувкости.ФинальныйсчетАнны5ФинальныйсчетАлекса2

 
Аннавыигралажеребьевку.

Аннавыигралаигрувкости.ФинальныйсчетАнны10ФинальныйсчетАлекса2

 
Алексвыигралжеребьевку.

Аннавыигралаигрувкости.ФинальныйсчетАнны10ФинальныйсчетАлекса8

Вот и все. Оставить комментарии можете в секции ниже.

Функция ord()

Функция ord() принимает строковый аргумент из одного символа Юникода и возвращает его целочисленное значение кодовой точки Юникода. Делает наоборот .

Принимает один символ Юникода (строка длиной 1) и возвращает целое число, поэтому формат следующий:

i = ord(c)

Чтобы убедиться, что он работает наоборот, чем , давайте протестируем функцию на нескольких примерах.

# Convert ASCII Unicode Character 'A' to 65
y = ord('A')
print(type(y), y)

alphabet_list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

# Print 65-90
for i in alphabet_list:
    print(ord(i), end = " , ")

Выход

<class 'int'> 65
65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 

Это вызывает если длина входной строки не равна единице.

y = ord('Hi')

Выход

TypeError: ord() expected a character, but string of length 2 found

Генерация случайного n-мерного массива целых чисел

Для генерации случайного n-мерного массива целых чисел используется :

Python

import numpy

random_integer_array = numpy.random.random_integers(1, 10, 5)
print(«1-мерный массив случайных целых чисел \n», random_integer_array,»\n»)

random_integer_array = numpy.random.random_integers(1, 10, size=(3, 2))
print(«2-мерный массив случайных целых чисел \n», random_integer_array)

1
2
3
4
5
6
7
8

importnumpy

random_integer_array=numpy.random.random_integers(1,10,5)

print(«1-мерный массив случайных целых чисел \n»,random_integer_array,»\n»)

random_integer_array=numpy.random.random_integers(1,10,size=(3,2))

print(«2-мерный массив случайных целых чисел \n»,random_integer_array)

Вывод:

Shell

1-мерный массив случайных целых чисел

2-мерный массив случайных целых чисел

]

1
2
3
4
5
6
7

1-мерныймассивслучайныхцелыхчисел

101421

2-мерныймассивслучайныхцелыхчисел

26

910

36

Арифметические операции

Целые числа поддерживают следующие математические операции, которые отсортированы по убыванию приоритета:

Операция Результат Замечание
1 возводит x в степень y (I)
2 возводит x в степень y по модулю z, где z – необязательный аргумент (I)
3 возвращает кортеж с парой чисел (II)
4 возвращает \(\bar{x}\) — число, которое комплексно сопряжено с \(x\)
5 преобразует re в комплексное число (по умолчанию ) (V)
6 преобразует x в вещественное число (число с плавающей точкой) (V)
7 переобразует x в целое число, представленное в десятичной системе счисления (V)
8 абсолютное значение (модуль) числа x
9 делает число x положительным
10 делает число x отрицательным
11 остаток от деления x на y (II)
12 результат целочисленного деления x на y (III) (II)
13 результат «истинного» деления x на y
14 произведение x и y
15 разность x и y
16 сумма x и y

Важно: приоритет математических операций выше побитовых логических операций и операций сравнения.

Замечания:

I. возведение \(0\) в степень \(0\) возвращает \(1\):

Извлечение корней четной степени из отрицательных чисел не вызывает ошибки, а возвращает комплексное число:

Использование в выражении слишком больших значений x и y типа может привести к ошибке OverflowError.

II. функция и операции , не работают для комплексных чисел. Для вас это может быть и очевидно, но не пользователя для которого вы пишите программу.

III. Данная операция всегда возвращает целое число, т.е. если число x можно представить в виде , то (r – остаток от деления). Так же следует иметь ввиду, что результат данной операции всегда округляется в сторону минус бесконечности:

Это немного сбивает с толку, но проверив результат по формуле , вы убедитесь что все верно.

IV. встроенная функция отбрасывает дробную часть вещественных чисел:

V. строго говоря эти функции не являются математическими, но они могут учавствовать в математических выражениях Python и поэтому должны обладать приоритетом.

Условный оператор

В языке python синтаксис обладает интересной особенностью: дело в том, что в коде нет операторных скобок ( или ); вместо них отступы указывают, какие операторы выполнять внутри той или иной конструкции.
Зачем отступы и где их ставить?

1
2
3
4
if x > :
  if x < 2:
else:
  оператор

Следует обратить внимания, что знак сравнения в Питоне записывается, как два знака :

1
2
3
4
5
6
if x < :
  блок1
elif x == : # сравнение!
  блок2
else:
  блок3

Другой пример использования условия:

1
2
3
4
5
6
if x < :
    print('мало')
elif x == :
    print('средне')
else:
    print('много')

Сложные условия

  • Использование двойных неравенств разрешено:
1
2
3
4
if  < x < 2:
  if  < y < 2:
else:
  оператор

Пример использования условия c :

1
2
3
4
5
6
if x < :
    print('мало')
elif - <= x <= :
    print('средне')
else:
    print('много')

Кроме того, можно применять логический оператор (И):

if x >= 30 and x <= 40:
 ...

Использование с оператором :

site = "my.ru"
 
if "ru" in site:
    print("Условие выполнено!") # Условие выполнено!

Кроме того, можно применять логический оператор (ИЛИ):

site = "my.ru"
 
if "my" in site or site.endswith(".ru"): # заканчивается на ...
    print("Условие выполнено!")

Аналог тернарного оператора:

uchenik_1 = 5
uchenik_2 = 2
 
otlichnik = "первый ученик" if uchenik_1 > uchenik_1  else "второй ученик"
 
print(otlichnik) # первый ученик

Задание Python 1_6: Запрашивается количество часов и заработок в час. Рассчитать зарплату. Если работник работал более 40 часов, — то зарплата умножается на коэффициент 1,5. Оформить в формате дружелюбного интерфейса.

Пример: Дан год. Определить високосный ли год или нет? Вывести или (логическое значение).Указания: Год является високосным если он кратен 4, но при этом не кратен 100, либо кратен 400.

Решение:

year = 2017
is_true = year % 4 ==  and (year % 100 !=  or year % 400 == )
print(is_true)

Задание Python 1_7: Напишите программу, которая определяет, верно ли, что введённое число – четырёхзначное. Вывести или (логическое значение).

Задание Python 1_8: Напишите программу, которая вводит с клавиатуры номер месяца и определяет, сколько дней в этом месяце. Предусмотреть сообщение об ошибке в случае ввода неверного числа.

! Решения заданий можно попросить у администратора, выслав письмо с запросом на электронный адрес (внизу веб-страницы). В письме укажите Ваши ФИО, город, должность (учитель/ученик/студент). Укажите, занимаетесь ли самостоятельно и номер урока, решения которого необходимо выслать.

Данные и их типы

В реальной жизни мы совершаем различные действия над окружающими нас предметами, или объектами. Мы меняем их свойства, наделяем новыми функциями. По аналогии с этим компьютерные программы также манипулируют объектами, только виртуальными, цифровыми. Пока не дойдем до уровня объектно-ориентированного программирования, будем называть такие объекты данными.

Очевидно, данные бывают разными. Часто компьютерной программе приходится работать с числами и строками. Так на прошлом уроке мы работали с числами, выполняя над ними арифметические операции. Операция сложения выполняла изменение первого числа на величину второго, а умножение увеличивало одно число в количество раз, соответствующее второму.

Числа в свою очередь также бывают разными: целыми, вещественными, могут иметь огромное значение или очень длинную дробную часть.

При знакомстве с языком программирования Python мы столкнемся с тремя типами данных:

  • целые числа (тип int) – положительные и отрицательные целые числа, а также 0 (например, 4, 687, -45, 0).

  • числа с плавающей точкой (тип float) – дробные, они же вещественные, числа (например, 1.45, -3.789654, 0.00453). Примечание: для разделения целой и дробной частей здесь используется точка, а не запятая.

  • строки (тип str) — набор символов, заключенных в кавычки (например, «ball», «What is your name?», ‘dkfjUUv’, ‘6589’). Примечание: кавычки в Python могут быть одинарными или двойными; одиночный символ в кавычках также является строкой, отдельного символьного типа в Питоне нет.

КомментарииRemarks

Как правило, следует использовать функции преобразования типа Visual Basic в качестве предпочтений для методов .NET Framework, таких как , в Convert классе или в отдельной структуре типа или классе.As a rule, you should use the Visual Basic type conversion functions in preference to the .NET Framework methods such as , either on the Convert class or on an individual type structure or class. Функции Visual Basic предназначены для оптимального взаимодействия с Visual Basicным кодом, а также для сокращения исходного кода и упрощения его чтения.The Visual Basic functions are designed for optimal interaction with Visual Basic code, and they also make your source code shorter and easier to read. Кроме того, методы преобразования .NET Framework не всегда дают те же результаты, что и функции Visual Basic, например при преобразовании в .In addition, the .NET Framework conversion methods do not always produce the same results as the Visual Basic functions, for example when converting to . Дополнительные сведения см. в разделе Устранение неполадок типов данных.For more information, see Troubleshooting Data Types.

Начиная с Visual Basic 15,8, производительность преобразования с плавающей запятой в целое число оптимизируется при передаче Single значения или, Double возвращаемого следующими методами, в одну из целочисленных функций преобразования (,,,,,, , ):Starting with Visual Basic 15.8, the performance of floating-point-to-integer conversion is optimized when you pass the Single or Double value returned by the following methods to one of the integer conversion functions (, , , , , , , ):

Такая оптимизация позволяет выполнять код, выполняющий большое количество целочисленных преобразований, в два раза быстрее.This optimization allows code that does a large number of integer conversions to run up to twice as fast. В следующем примере демонстрируются эти оптимизированные преобразования с плавающей запятой в целые числа:The following example illustrates these optimized floating-point-to-integer conversions:

Встроенные типы

Хоть вы и можете использовать стандартные типы в качестве аннотаций, много полезного сокрыто в модуле .

Optional

Если вы пометите переменную типом и попытаетесь присвоить ей , будет ошибка:

Для таких случаев предусмотрена в модуле typing аннотация с указанием конкретного типа

Обратите внимание, тип опциональной переменной указывается в квадратных скобках

Any

Иногда вы не хотите ограничивать возможные типы переменной

Например, если это действительно не важно, или если вы планируете сделать обработку разных типов самостоятельно. В этом случае, можно использовать аннотацию

На следующий код mypy не будет ругаться:

Может возникнуть вопрос, почему не использовать ? Однако в этом случае предполагается, что хоть передан может быть любой объект, обращаться с ним можно только как с экземпляром .

Union

Для случаев, когда необходимо допустить использование не любых типов, а только некоторых, можно использовать аннотацию с указанием списка типов в квадратных скобках.

Кстати, аннотация эквивалентна , хотя такая запись и не рекомендуется.

Коллекции

Механизм аннотаций типов поддерживает механизм дженериков (, подробнее во второй части статьи), которые позволяют специфицировать для контейнеров типы элементов, хранящихся в них.

Списки

Для того, чтобы указать, что переменная содержит список можно использовать тип list в качестве аннотации. Однако если хочется конкретизировать, какие элементы содержит список, он такая аннотация уже не подойдёт. Для этого есть . Аналогично тому, как мы указывали тип опциональной переменной, мы указываем тип элементов списка в квадратных скобках.

Предполагается, что список содержит неопределенное количество однотипных элементов. Но при этом нет ограничений на аннотацию элемента: можно использовать , , и другие. Если тип элемента не указан, предполагается, что это .

Кроме списка аналогичные аннотации есть для множеств: и .

Кортежи

Кортежи в отличие от списков часто используются для разнотипных элементов. Синтаксис похож с одним отличием: в квадратных скобках указывается тип каждого элемента кортежа по отдельности.

Если же планируется использовать кортеж аналогично списку: хранить неизвестное количество однотипных элементов, можно воспользоваться многоточием ().

Аннотация без указания типов элементов работает аналогично

Словари

Для словарей используется . Отдельно аннотируется тип ключа и тип значений:

Аналогично используются и

Результат выполнения функции

Для указания типа результата функции можно использовать любую аннотацию. Но есть несколько особенных случаев.

Если функция ничего не возвращает (например, как ), её результат всегда равен . Для аннотации так же используем .

Корректными вариантами завершения такой функции будут: явный возврат , возврат без указания значения и завершение без вызова .

Если же функция никогда не возвращает управление (например, как ), следует использовать аннотацию :

Если это генераторная функция, то есть её тело содержит оператор , для возвращаемого можно воспользоватьтся аннотацией , либо :

Комплексное

Комплексное число состоит из двух частей — действительной и мнимой. Мнимая часть пишется с суффиксом «j».

Мы также можем использовать функцию complex() для создания комплексного числа. Мы можем передать два аргумента типа int или float в функцию complex(). Первый аргумент — действительная часть, а второй аргумент — сложная часть.

x = 1 + 2j
print(x)
print(type(x))

x = -1 - 4j
print(x)
print(type(x))

x = complex(1, 2)
print(x)
print(type(x))

x = complex(1)
print(x)
print(type(x))

x = complex(-1, -2.5)
print(x)
print(type(x))

Вывод:

(1+2j)
<class 'complex'>
(-1-4j)
<class 'complex'>
(1+2j)
<class 'complex'>
(1+0j)
<class 'complex'>
(-1-2.5j)
<class 'complex'>

Мы также можем получить представление комплексного числа объекта, определив метод __complex __(). Этот метод должен возвращать комплексное число.

class Data:

    def __init__(self, r, i):
        self.real = r
        self.imaginary = i

    def __complex__(self):
        return complex(self.real, self.imaginary)


d = Data(10, 20)
c = complex(d)
print(c)
print(type(c))

Выход:

Мы также можем преобразовать строку в комплексное число. Между реальной и мнимой частью не должно быть пробелов.

c = complex("1+2j")  # works fine

c = complex("1 + 2j") # ValueError: complex() arg is a malformed string

Мы можем получить действительную часть комплексного числа, используя свойство «real». Мы можем получить мнимую часть комплексного числа, используя свойство «imag».

c = 10 + 20j
print(c.real)  # real part
print(c.imag)  # imaginary part

Некоторые другие методы комплексных чисел:

  • conugate(): возвращает комплексное сопряженное число. Знак мнимой части меняется на противоположный.
  • abs(): возвращает величину комплексного числа.
c = 1 + 2j

print(c.conjugate())  # (1-2j)
print(abs(c))  # 2.23606797749979
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector