Python

Z PUTwiki
Przejdź do nawigacjiPrzejdź do wyszukiwania
Python
Logo języka Python
Logo języka
Pojawienie się

20 lutego 1991

Typowanie

dynamiczne (chujowe)

Pochodne

f '(x), f ''(x)

Aktualna wersja stabilna

brak

Twórca

Szatan

Licencja

Driving License (License to kill)

Python – (pseudo)język programowania wysokiego poziomu klasyfikowany jako język ogólnego przeznaczenia; praktycznie służy głównie do szybkiego klejenia skryptów, które jakoś działają na mojej maszynie. Posiada rozbudowany pakiet bibliotek standardowych, z czego większość napisana jest w prawdziwych językach programowania. Nie zmienia to jednak faktu, że w tym języku nic się nie da zrobić.

Możliwości

Python jest znany z tego, że niemożliwe w nim jest m.in:

Problemy

Wcięcia jako struktura sterująca

Python wyróżnia się tym, że:

  • nie posiada jawnych znaczników bloków (np. {}),
  • strukturę programu wyznaczają wcięcia i spacje.

Podejście to umożliwia ono generowanie błędów trudnych do znalezienia, polegających na tym, że jeden blok jest wcięty trzema spacjami, a inny czterema.

GIL

Centralnym elementem implementacji referencyjnej (CPython) jest Global Interpreter Lock (GIL) – mechanizm, który:

  • uniemożliwia równoczesne wykonywanie bajtkodu w wielu wątkach,
  • zapewnia, że każdy problem związany z równoległością zostanie automatycznie zastąpiony problemem z wydajnością.

W praktyce oznacza to, że:

  • w Pythonie można tworzyć wiele wątków,
  • ale tylko jeden może naprawdę wykonywać kod Pythona w danym momencie.

Zastosowania

Jedynymi znanymi zastosowaniami języka Python od 25 lat jego istnienia są:

  • Szybkie skrypty i „klejenie” systemów – Python pełni rolę spoiwa pomiędzy bardziej poważnymi komponentami.
  • Data science, uczenie maszynowe i AI – do Pythona podpinane są wysoko wydajne biblioteki wykonane np. w Delphi, dzięki czemu obliczenia są szybkie, bo nie są wykonywane w Pythonie,
  • Aplikacje webowe – frameworki typu Django czy Flask pozwalają napisać serwis, który:
    • działa wystarczająco dobrze, dopóki ruch nie przekroczy pewnego, niewygodnego progu (np. dwóch użytkowników jednocześnie),
    • a potem można go przepisać na node.js (generując zyski dla teamu deweloperów).

Opinie eksperckie

Opinie nadeksperckie

Student:

chciałbym napisać choinkę w konsoli w pythonie. da się?

Ekspert:

…choinkę… w Pythonie… 🤦‍♂️

Pan naprawdę przyszedł na politechnikę, żeby rysować drzewka w konsoli tym swoim Pythonie? To ja już widzę przyszłość polskiej informatyki…

Ale dobrze, niech będzie — odpowiem, zanim pan znowu zacznie instalować trzy biblioteki do wypisania gwiazdki.

Tak, da się.

Bo to jest trywialne. To nie jest żaden sukces Pythona, tylko poziom „pierwszy tydzień programowania”.

I to działa — bez frameworków, bez „magii”, bez AI, bez cudów.

Ale proszę zauważyć jedną rzecz…

To nie jest zasługa Pythona. To by pan zrobił w Delphi, w C, w Pascalu, nawet na kartce papieru.

Różnica jest taka, że w Delphi:

pan by wiedział co się dzieje,

a nie tylko „działa, bo działa”.

No, proszę. Uruchomić, zobaczyć, i proszę mi nie mówić, że to „potęga Pythona”… 😒

Student:

no nie działa

Ekspert:

No oczywiście, że „nie działa”. Klasyka studenta-pythoniarza: wkleił, uruchomił, zobaczył coś innego niż sobie wyobraził i już „nie działa”… 🙄

Ale skoro chce pan to zrobić porządnie, to proszę, Delphi. Tak wygląda choinka w konsoli:

program Choinka;

{$APPTYPE CONSOLE}

uses

  SysUtils;

var

  h, i: Integer;

begin

  h := 5;

  for i := 0 to h - 1 do

  begin

    Write(StringOfChar(' ', h - i - 1));

    Writeln(StringOfChar('*', 2 * i + 1));

  end;

  Write(StringOfChar(' ', h - 1));

  Writeln('|');

  Readln;

end.

Dla h := 5; dostanie pan:

    *

   ***

  *****

*******

*********

    |

Jak pan chce wersję „bardziej inżynierską”, z wysokością wczytywaną z klawiatury, to też się da:

program Choinka;

{$APPTYPE CONSOLE}

uses

  SysUtils;

var

  h, i: Integer;

begin

  Write('Podaj wysokosc choinki: ');

  Readln(h);

  if h <= 0 then

  begin

    Writeln('Wysokosc musi byc dodatnia.');

    Readln;

    Exit;

  end;

  for i := 0 to h - 1 do

  begin

    Write(StringOfChar(' ', h - i - 1));

    Writeln(StringOfChar('*', 2 * i + 1));

  end;

  Write(StringOfChar(' ', h - 1));

  Writeln('|');

  Readln;

end.

W Delphi przynajmniej człowiek widzi strukturę programu, a nie festiwal domyślania się, co interpreter „miał na myśli”.