IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskusia – 16. diel - Typový systém a type hints v Pythone

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Antonín Martykán:14.5.2021 14:07

Nechápu jádro problému: k čemu je typování, když do "otypované" proměnné mohu uložit jiný datový typ?

 
Odpovedať
14.5.2021 14:07
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Antonín Martykán
DarkCoder:14.5.2021 20:24

To že má proměnná nějaký typ je nesmírně důležité. Podívejme se na následující inicializace (jazyk C):

char c1 = 65;
signed char c2 = 65;
unsigned char c3 = 65;
short int c4 = 65;
unsigned int c5 = 65;
long long int c6 = 65;

Všechny proměnné v sobě uchovávají hodnotu znaku 'A' (ASCII 65). První tři proměnné c1-c3 zabírají v paměti 1byte, c4 2 byty, c5 4 byty, c6 8 bytů ve 32 bitovém prostředí.

Říká tedy, kolik místa v paměti zabírá proměnná a pomáhá alokovat potřebnou paměť. Přístup k proměnné která zabírá v paměti 1 byte bude také rychlejší než přístup k proměnné typu long long int, která zabírá v paměti 8 bytů.

Dále specifikátory typu upřesňují rozsah hodnot jakých může proměnná nabývat.

Můžou znakové proměnné c1-c3 v sobě držet zápornou hodnotu?

U c1 záleží na implementaci, c2 ano, ale rozsah kladných hodnot je poloviční, c3 nikoli.

Dále to umožňuje udržovat vzájemnou vazbu mezi proměnnými a funkcemi. Pomáhá překladači najít chybu a upozornit na to programátora. Rovněž programátor si nemusí pomatovat co do proměnné uložil a ztrácet čas dohledáváním typu obsahu.

Důvodů, proč typy, je opravdu dost..

Odpovedať
14.5.2021 20:24
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovedá na DarkCoder
Antonín Martykán:14.5.2021 20:38

Asi jsme si nerozuměli :) rozumím tomu, že existují Tebou vyjmenované důvody (za výpis moc děkuji!) Ale přece není možné do proměnné char c1 uložit číslo 300. Nevím jak to je v C pořešené, ale taková proměnná by se neměla inicializovat. Zatímco v Pythonu si mohu “otypovat” proměnnou jako float a pak ji bez problému přepsat na Bool hodnoty, string, int... Jinými slovy: k čemu je typování v Pythonu, když ho překladač “nekontroluje”?

 
Odpovedať
14.5.2021 20:38
Avatar
DarkCoder
Člen
Avatar
Odpovedá na Antonín Martykán
DarkCoder:14.5.2021 21:10

Přiřadit hodnotu 300 do znakové (8-bitové) proměnné nepochybně správné není, neboť z důvodu přetečení rozsahu bude proměnná obsahovat nesmyslnou hodnotu. Je na programátorovi, aby posoudil že to co dělá je správné. Důvodem je zachování rychlosti.

V C se typ proměnné nemění, jde však proměnnou dočasně přetypovat při přiřazení nebo použití. Dále v C lze deklarovat proměnnou jako obecný ukazatel, která může ukazovat na libovolný typ. Bez přetypování však nelze tento ukazatel dereferencovat. Lze použít uniony k uložení libovolného typu který se předem stanoví. Pak může znaková proměnná obsahovat klidně i 8 bytů.

Pokud lze v Pythonu měnit typy proměnné z jednoho na druhý, mě osobně to nepřijde šťastné. Obtížně se kontroluje co aktuálně v proměnné je, dále celá operace je časově náročná (Alokace, převodní funkce, přesun na novou pozici, dealokace). Pokud by se cokoli kontrolovalo, ušetřilo by to jistě programátorovi práci, ale oproti tomu by bylo vše pomalé.

Nejsem Pythonista, osobně bych tento způsob programování nepoužíval. Ale každého věc..

Odpovedať
14.5.2021 21:10
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Jaroslav Toninger:18.9.2022 15:55

Ta první 1/4 textu byla v pohodě, líbilo se mi, jak to lze přesně deklarovat, o jaký datový typ se jedná, zbytek je asi potom potřebné do praxe v konkrétních případech.

Odpovedať
18.9.2022 15:55
Bez extrému by nebyl pokrok v přírodě.
Avatar
Tomáš Vacek:11.1.2023 13:58

Užitečný článek, díky.

 
Odpovedať
11.1.2023 13:58
Avatar
Johny
Člen
Avatar
Johny:13.9.2023 8:06

Třeba typovaný slovník moc nechápu. Proč musíme dvakrát deklarovat AdresaDomu ? asi protože je to slovník (klič:položka) ale proč to takto deklarujeme ?

 
Odpovedať
13.9.2023 8:06
Avatar
Karel Zaoral
Tvůrce
Avatar
Odpovedá na Johny
Karel Zaoral:15.9.2023 0:33

Ahoj, ono je to tak, že v tom kódu je ukázka deklarace toho typedictu 3x - jsou to tři různé způsoby, jak založit jeden stejný slovník, který se pak na posledním řádku naplní.
Je to bohužel nešťastně napsané a na nápravě už pracujeme.

moje_adresa: AdresaDomu = {'mesto': 'Stare Mesto', 'ulice': 'Nova ulice', 'cislo_domu': 52}
 
Odpovedať
15.9.2023 0:33
Avatar
Johny
Člen
Avatar
Odpovedá na Karel Zaoral
Johny:15.9.2023 6:41

Ahoj,
děkuji za odpověd. Takže je to takto :

class AdresaDomu(TypedDict):
    # toto je 1. deklarace
    mesto: str
    ulice: str
    cislo_domu: int
# toto je 2. deklarace, kde si určím datový typ klíče
AdresaDomu = TypedDict('AdresaDomu', mesto=str, ulice=str, cislo_domu=int)
# toto je 3. deklarace, kde si určím datový typ itemu
AdresaDomu = TypedDict('AdresaDomu', {'mesto': str, 'ulice': str, 'cislo_domu': int})

Takže by mi stačila třeba první deklarace a mohl bych si jí rovnou naplnit kódem v tvé odpovědi. Rozumím tomu správně?

Děkuji

 
Odpovedať
15.9.2023 6:41
Avatar
Karel Zaoral
Tvůrce
Avatar
Karel Zaoral:15.9.2023 9:00

Přesně tak,
tento kód:

from typing import TypedDict


class AdresaDomu(TypedDict):
    mesto: str
    ulice: str
    cislo_domu: int


moje_adresa: AdresaDomu = {'mesto': 'Stare Mesto', 'ulice': 'Nova ulice', 'cislo_domu': 52}

print(moje_adresa)

bude mít tento výstup:

{'mesto': 'Stare Mesto', 'ulice': 'Nova ulice', 'cislo_domu': 52}
 
Odpovedať
15.9.2023 9:00
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!