#!/usr/bin/python
# -*- coding: utf-8 -*-

# Создаем пустой кортеж

print()
# ######################################################################################################################
# Преобразуем строку в кортеж
# _(String)

print()
# ######################################################################################################################
# Преобразуем список в кортеж
print(_([1, 2, 3, 4, 5]))

print()
# ######################################################################################################################
# Создаем пустой кортеж
# t1

print()
# ######################################################################################################################
# Создаем кортеж из одного элемента
# t2 5

print()
# ######################################################################################################################
# Кортеж из трех элементов
# t3 1 str 3, 4
# t4 1 str 3 4

print()
# ######################################################################################################################
# Получаем значение первого элемента кортежа
t = (1, 2, 3, 4, 5, 6, 7, 8, 9)
# print(_)

print()
# ######################################################################################################################
# Изменяем порядок следования элементов
t = (1, 2, 3, 4, 5, 6, 7, 8, 9)
# print(_[___])

print()
# ######################################################################################################################
# Получаем срез
t = (1, 2, 3, 4, 5, 6, 7, 8, 9)
# print(_[2_5])

print()
# ######################################################################################################################
# Проверка на вхождение
t = (1, 2, 3, 4, 5, 6, 7, 8, 9)
# print(8 _ _, 0 _ _)

print()
# ######################################################################################################################
# Повторение
print((1, 2, 3) * 3)

print()
# ######################################################################################################################
# Конкатенация
print((1, 2, 3) + (4, 5, 6))

print()
# ######################################################################################################################
# Изменить элемент по индексу нельзя!
t = (1, 2, 3)
# print(t[0])
# t[0] = 50  # error

print()
# ######################################################################################################################
# Получаем количество элементов
t = (1, 2, 3)
print(_(_))

print()
# ######################################################################################################################
# Ищем элементы в кортеже
t = (1, 2, 1, 2, 1)
# print(t._(1), t._(2))

print()
# ######################################################################################################################
# Make a list from a tuple's items
T = ('cc', 'aa', 'dd', 'bb')
# tmp = _(_)

print()
# ######################################################################################################################
# Sort the list
T = ('cc', 'aa', 'dd', 'bb')
# tmp = _(_)
# tmp._
# print(_)

print()
# ######################################################################################################################
# Make a tuple from the list's items
T = ('cc', 'aa', 'dd', 'bb')
# tmp = _(_)
# tmp._
# print(_)
# T = _(_)
# print(_)

print()
# ######################################################################################################################
# Create tuple
# But the parentheses are not what indicate a tuple - it is the commas:
a = ('a', 10, True)
b = 'b', 20, False

print()
# ######################################################################################################################
#  'extend' tuples
# creating a new tuple
a = 1, 2, 3
# print(_(_))
# a = a + (4, 5, 6)
# print(_)
# print(_(_))

print()
# ######################################################################################################################
# represent a city using a tuple
# We can even have a list of these tuples:
# We can obtain a list of all the cities in the list using a simple list comprehension
# We could even calculate the total population of all these cities.
london = 'London', 'UK', 8_780_000
new_york = 'New York', 'USA', 8_500_000
beijing = 'Beijing', 'China', 21_000_000

# cities = l_, n_, b_
# print(_)
# city_names =  [t[_] _ t _ c_]

total = 0
# _ city _ c_
#     total += +[_]
# print (f'total={_}')

# _([_[_] _ c_ _ c_])

print()
# ######################################################################################################################
# unpacking to extract values from the tuple:
new_york = 'New York', 'USA', 8_500_000
# city, country, population =
# print(_)
# print(_)
# print(_)

print()
# ######################################################################################################################
# create a Point named tuple that will contain an x-coordinate and a y-coordinate.
from collections import namedtuple

# Point2D = _(Point2D (x y)
# Pt = _(Point2D (x y)
# pt1 = Pt(10, 20)
# print(_)

print()
# ######################################################################################################################
# There are a number of ways we can specify the field names for the named tuple:
#
# we can provide a sequence of strings containing each property name
# we can provide a single string with property names separated by whitespace or a comma

# Circle = _(Circle center_x center_y radius
# circle_1 = _(0 0 10)
# circle_2 = _(center_x=10, center_y=20, radius=100)
# print(_)
# print(_)

# Second option

# City = _('City', 'name country population')
# new_york = _('New York', 'USA', 8_500_000)
# print(_)

print()
# ######################################################################################################################
# Accessing Items in a Named Tuple
# Point2D = _(Point2D x y)
# Pt = _(Point2D x y)
# pt1 = _(10, 20)
# print(_)

print()
# ######################################################################################################################
# We can also choose to let the namedtuple function replace invalid field names automatically for us,
# by using the keyword argument rename
# Person = _(Person firstname lastname _age ssn _=_)
# eric = _(Eric Idle 42 unknown)
# print(_)

print()
# # ####################################################################################################################
# Extending Named Tuples
# Point2D = _(Point2D x y)
# Point3D = _(Point3D x y z)

print()
# ######################################################################################################################
# Named Tuples - Application - Returning Multiple Values

from random import randint, random

# _ random_color
#     red = _(0, 255)
#     green = _(0,255)
#     blue = _(0, 255)
#     alpha = _(_(), 2)
#     return _, _, _, _
#
# random_color()
# _, _, _, _ = _()
# print(_'red={red}, green={green}, blue={blue}, alpha={alpha}')

### But it might be nicer to use a named tuple: ###

from collections import namedtuple
# Color = _(Color red green blue alpha)

# _ random_color
#     red = _(0, 255)
#     green = _(0,255)
#     blue = _(0, 255)
#     alpha = _(_(), 2)
#     return _(_, _, _, _)
#
# color = _()
# _._
