Python/Cobol - pojmenování množiny hodnot v proměnné – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Python/Cobol - pojmenování množiny hodnot v proměnné – Python – Fórum – Programujte.comPython/Cobol - pojmenování množiny hodnot v proměnné – Python – Fórum – Programujte.com

 

ČeV
~ Anonymní uživatel
12 příspěvků
19. 7. 2014   #1
-
0
-

po více než 40 letech programátorské praxe v jazyku Cobol se začínám učit programovat v Pythonu a v té souvislosti mám dotaz:

v Cobolu existuje praktická konstrukce "podmínkové jméno", která umožňuje samostatně pojmenovat 
množinu hodnot, kterých může nabývat určitá proměnná - tím se dá velice dobře oddělit algoritmus 
zpracování ve zdrojovém programu od konkretních dat, protože se nemusí testovat výčet prvků množiny, 
ale pouze "true" hodnota podmínkového jména

děkuji za sdělení, zda existuje něco podobného i v Pythonu - zatím se mi to nepodařilo najít 

Nahlásit jako SPAM
IP: 213.192.19.–
hanpari0
Stálý člen
19. 7. 2014   #2
-
0
-

#1 ČeV
Zdravím,

chtělo by to příklad. Nejsem si jistý, co myslíte.

Možná by pomohlo toto:

if x in (1,2,3,4):

    x += 1 #třeba

nebo zkrácený zápis:

x if x in (1,2,3,4) else 0

Popřípadě můžete použít typ set, což je přímo množina prvků.

Nahlásit jako SPAM
IP: 178.72.234.–
ČeV
~ Anonymní uživatel
12 příspěvků
30. 7. 2014   #3
-
0
-

dík za rychlou reakci - tady je příklad

(77 = deklarace proměnné a, 88 = definice podmínkových jmena a jejich true hodnot)

working-storage section.
77  a pic 999.
 88  ucty-x value 123, 255, 785, 400 thru 650.
 88  ucty-y value 100 thru 399. 
 ... atd dle potřeby

procedure division.
...
v rámci procedury příkazů, která může být značně rozsáhlá pak není nutné se zabývat konkretními hodnotami proměnné "a", ale testují se pouze symbolická podmínková jména a testy mohou být i na více místech 
...
if ucty-x
   perform vypocet-x

...

cílem je důsledné oddělení algoritmu výpočtu od definice dat - v tomto příkladu čísel účtů, která řídí výpočet - jestliže paní účetní si přidá do množiny ucet-x, zpracovávané algoritmem vypocet-x další číslo, nebo interval, není potřeba to ani složitě hledat, ani případně ošetřovat na více místech

děkuji za jakékoliv další postrčení :o))) - ČeV

Nahlásit jako SPAM
IP: 213.192.19.–
KIIV
~ Moderátor
+43
God of flame
30. 7. 2014   #4
-
+1
-
Zajímavé
Kit +

nadefinujes to jako objekt a hodnotu si osetris v nem

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ČeV
~ Anonymní uživatel
12 příspěvků
30. 7. 2014   #5
-
0
-

#4 KIIV
dík za radu, ale moc moudrý z ní nejsem - nejde o jednu hodnotu, ale o pojmenování různých množin hodnot jedné proměnné tak, abych při rozhodování, zda se použijee algoritmus "vypocet-x" či jiný  využíval pouze jejich uvedená symbolická pojmenování - můžeš mi pro uvedený příklad "ucet-x" načrtnout, jak to myslíš ? - dík

Nahlásit jako SPAM
IP: 213.192.19.–
hanpari0
Stálý člen
30. 7. 2014   #6
-
0
-

#5 ČeV
Nu, jde o několik mírně pokročilých témat. Nevím, jestli to bude dost jasné. Když tak se ptejte :)

V každém případě to není právě ideální případ, je to spíš java nebo c# :) Ale odděluje zpracování množiny účtu od jejich samotných hodnot.

EDIT: I když o tom tak přemýšlím, začínám mít dojem, že oddělení logiky od dat se děje u pythonu automaticky. Možná že hledáte něco, co se od dob Cobolu dramaticky změnilo v samotném návrhu jazyka :)

# Obecná třída účet, i když nemusí jít o třídu, ale třeba o cokoliv
class Ucet():
    pass


# funkce pro zpracování množiny účtů
def zpracuj_ucet(ucty):
    # Ve smyčce zpracuji všechny účty
    for ucet in ucty:
        ...

        
# Vytvořím instanci třídy účtu
ucet1 = Ucet()

# Vytvořím množinu účtů s jedním účtem
mnozina_uctu = [ucet1]

# zpracuj nějak ucty
zpracuj_ucet(mnozina_uctu)

# Přidám další účet
ucet2 = Ucet()
mnozina_uctu.append(ucet2)

# opět zpracuju všechny účty
zpracuj_ucet(mnozina_uctu)
    
Nahlásit jako SPAM
IP: 178.72.234.–
z
~ Anonymní uživatel
268 příspěvků
30. 7. 2014   #7
-
0
-

#3 ČeV
Hodnoty toho setu nemusíš pokaždé vypisovat. Můžeš ho definovat jednou. A pokud to chceš hodně podobné cobolu, tak tu proměnnou i hodnoty můžeš schovat do funkce.

a = 999
ucty_x = (1, 2, 3)
ucty_y = (12, 34, 56)

def is_ucet_y():
    return a in ucty_y

...

if a in ucty_x:
    neco
if is_ucet_y():
    cosi
Nahlásit jako SPAM
IP: 213.211.51.–
ČeV
~ Anonymní uživatel
12 příspěvků
31. 7. 2014   #8
-
0
-

dík za konkretní rady - podumám nad tím a uvidím, zda pochopím - ona je to úplně jiná filosofie, pokud jde o třídy a objekty - ale jinak se mi zatím Python jeví jako velice přehledný, především svojí formou zápisu bez povinných oddělovačů a s odsazováním, což je mému stylu psaní velice blízké - :o)))

Nahlásit jako SPAM
IP: 213.192.19.–
Kit+15
Guru
31. 7. 2014   #9
-
0
-

#8 ČeV
Na tvém místě bych využil své znalosti Cobolu a snažil se je využít v jazyku SQL (např. v MySQL nebo ještě lépe PostgreSQL). Ve vnořených procedurách se tohle dá využít tak, že tím seznamem účtů je tabulka, která slouží jako číselník. Z Pythonu se s tím pak pracuje velmi dobře.

Python je objektový. To znamená, že můžeš udělat třídu Ucet, která si bude hlídat rozsah '000'..'999'. Jako jeho potomky uděláš podmnožiny, které si budou hlídat platnost vstupu v konstruktoru. Když pak založíš nový účet, třeba 

pokladna = Penize('211')

tak třída Penize si v konstruktoru ohlídá, zda začíná číslicemi "21" a vytvoří objekt "pokladna".

Číslo účtu doporučuji deklarovat jako string. Z principu to totiž není číslo - nedá se sčítat, odečítat, násobit ani dělit. Je to stejné jako třeba s telefonním číslem. Také je to string složený (převážně) z číslic.

Nahlásit jako SPAM
IP: 88.103.124.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ČeV
~ Anonymní uživatel
12 příspěvků
31. 7. 2014   #10
-
0
-

#9 Kit

dík za radu - upřesnňuji, že programováním se zabývám už jen pro "cvičení šedých mozkových buněk" a důvod, který mě dovedl k Pythonu je prozaický - konec Windows XP znamená konec možnosti pracovat s MX COBOL free kompilátorem http://cev.cemotel.cz/cobol/, který dělá .exe přes historické Turbo C 2.0, které je prakticky v DOS 

protože si hraju se statickým generováním html/css/js pro vlastní stránky http://mim.cemotel.cz/ a s různými dalšími věcmi ve Windows, tak jsem hledal nějaký vhodný free nástroj především pro desktop práci - OpenCobol je až příliš vázán na překladač a knihovny C, což je pro "C-laika" dost složitá instalace a taky jsem si chtěl vyzkoušet něco nového - Python se mi zdá dost zajímavý - práce v PHP či SQL vyžaduje programování na serveru, do kterého se na stará kolena (*1938) už nechci pouštět

z příkladů, které jste mi s kolegy poradili jsem pochopil, že asi nejblíže podmínkovým jménům v Cobolu je porovnání, zda je hodnota proměnné v určitém setu "if a in ucty_x: atd ..." s tím, že případný test na interval hodnot by asi pomocí setu nešel, ale musela by se napsat funkce ...

doporučení využívat raději string je dobrá rada - s různými datovými typy, které jsou v nových jazycích Pascalovského typu, ke kterým patří i Python dost zápasím, protože příkazy v Cobolu dělají typovou kontrolu jen při skutečných výpočtech a jinak se všemi typy proměnných či skupinami pracují stejně

Nahlásit jako SPAM
IP: 213.192.19.–
KIIV
~ Moderátor
+43
God of flame
31. 7. 2014   #11
-
0
-
Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ČeV
~ Anonymní uživatel
12 příspěvků
31. 7. 2014   #12
-
0
-

#11 KIIV
no uvidíme - zatím zkouším Python a líbí se mně - :o)))

Nahlásit jako SPAM
IP: 213.192.19.–
Kit+15
Guru
31. 7. 2014   #13
-
0
-

#10 ČeV
MySQL, PostgreSQL i PHP provozuji normálně na desktopu, notebooku i tabletu. Nevidím žádné omezení, Apache k tomu není potřebný.

Nahlásit jako SPAM
IP: 46.174.37.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
hanpari0
Stálý člen
31. 7. 2014   #14
-
0
-

#10 ČeV

že případný test na interval hodnot by asi pomocí setu nešel,

Nu zdá se, že musím poděkovat za zajímavý nápad. Tohle by mne nikdy nenapadlo nebýt vaší poznámky. Takže si můžete připsat body za autorství. Doufám, že kód je jasný, případně se ptejte :). Sám se ale přiznám, že jsem nečekal, že to takto bude fungovat :)

V každém případě můžete pomocí této konstrukce zjišťovat přesně to, co asi chcete.

>>> testy = [(1),           # jedna hodnota
             (1,3),         # více hodnot
              range(6,10)]  # interval 6 až 9
>>> for test in testy:
	print(7 in test)

	
False
False
True
>>> 
Nahlásit jako SPAM
IP: 178.72.234.–
ČeV
~ Anonymní uživatel
12 příspěvků
1. 8. 2014   #15
-
0
-

#13 Kit
trochu jsem před časem oťukával i PHP, ale Python s odsazováním a bez středníků má pro mě určitě daleko větší kouzlo :o))

Nahlásit jako SPAM
IP: 213.192.19.–
Kit+15
Guru
1. 8. 2014   #16
-
0
-

#15 ČeV
Python má své kouzlo. I mne očaroval svou syntaxí a také např. nativní podporou komplexních čísel. PHP se na výpočty nehodí, i když jednu neuronovou síť jsem v něm už napsal.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
2. 8. 2014   #17
-
0
-

#15 ČeV
Ta absence složených závorek v Pythonu mě inspirovala natolik, že dvojtečku na konci řádku píši i v ostatních programovacích jazycích. Pokud za ní následuje enter, editor to u těchto jazyků opraví na pár složených závorek. U Pythonu a Yamlu ponechá dvojtečku. Je to velmi praktické.

Nahlásit jako SPAM
IP: 88.103.124.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
2. 8. 2014   #18
-
-1
-
Mimo téma

nevim, me prijde python odpornej syntaxi.. ani vic vlaken to nedokaze zpracovat najednou kvuli global locku

zacatecnik se na tom muze naucit jedine to odsazovani (protoze musi, ne protoze uz zjistil, ze to je nejlepsi pro citelnost!!)... proste se bude prechazet furt stejne blbe jako by se naucil treba pascal a chtel prejit k C/c++/php/js/perlu/jave...

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
sputnikone+1
Věrný člen
2. 8. 2014   #19
-
0
-

#18 KIIV
GIL? Not for long, bro. Not for long...

Nahlásit jako SPAM
IP: 2a00:1028:83a4:27c6:226a:...–
hanpari0
Stálý člen
2. 8. 2014   #20
-
0
-

#18 KIIV

Vy jste zřejmě ukázkový případ člověka, o kterém Guido mluví zde:

Guido o trolech

Přiznám se, že jsem mu to měl za zlé, ale teď už ho docela chápu :)

Kromě toho, že váš příspěvek toto vlákno nijak neobohatil, si pletete pojmy s dojmy:

Modul threading je určený pro současné vykonávání částí programu.

zatímco modul multiprocessing je určený pro využití  vícenásobných procesorů, což je to, oč vám asi jde.

CPython implementation detail: In CPython, due to the Global Interpreter Lock, only one thread can execute Python code at once (even though certain performance-oriented libraries might overcome this limitation). If you want your application to make better use of the computational resources of multi-core machines, you are advised to use multiprocessing or concurrent.futures.ProcessPoolExecutor. However, threading is still an appropriate model if you want to run multiple I/O-bound tasks simultaneously.

Nahlásit jako SPAM
IP: 178.72.234.–
ČeV
~ Anonymní uživatel
12 příspěvků
7. 8. 2014   #21
-
0
-

#14 hanpari
zkusil jsem můj nahoře uvedený příklad napsat dle rady takhle:

a = 255
ucty_x = (123, 255, 785)
#ucty_x = [(123, 255, 785), range(400,651)]
ucty_y = range(100,400)
print(a)
if a in ucty_x:
   print ("vypocet-x")
if a in ucty_y:
   print ("vypocet-y")

ale "range" v definici množiny "ucty-x" dle komentařového řádku způsobí, že se množina "ucty-x" vůbec nevyhodnocuje - něco mám špatně a nevím co - - - :o(

Nahlásit jako SPAM
IP: 213.192.19.–
Kit+15
Guru
8. 8. 2014   #22
-
0
-

#21 ČeV
V komentáři máš dvouprvkový seznam, který se skládá z výčtu a intervalu. Musel bys udělat sjednocení.

Nahlásit jako SPAM
IP: 46.174.37.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ČeV
~ Anonymní uživatel
12 příspěvků
8. 8. 2014   #23
-
0
-

#22 Kit

to mně ale hlásí chybu

    ucty_x = [(123, 255, 785) + range(400,651)]
TypeError: can only concatenate tuple (not "range") to tuple

Nahlásit jako SPAM
IP: 213.192.19.–
Kit+15
Guru
8. 8. 2014   #24
-
0
-

#23 ČeV
Píše, že bys měl nejprve konvertovat range na tuple a pak to půjde spojit.

Nahlásit jako SPAM
IP: 46.174.37.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
8. 8. 2014   #25
-
0
-

#23 ČeV
nebo zkus:  ucty_x = [123, 255, 785] + range(400,651)

EDIT: ale jak tak koukam, tak python3 to posere .. funguje to v 2.7

ve 3.3 zda se facha:

ucty_x = [123, 255, 785] + list(range(400,651))

500 in ucty_x   => true

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kit+15
Guru
8. 8. 2014   #26
-
0
-

#25 KIIV
Také funguje 

ucty_x = (123, 255, 785) + tuple(range(400, 651))

Zkoušel jsem to pro 10M range.

Nahlásit jako SPAM
IP: 46.174.37.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
ČeV
~ Anonymní uživatel
12 příspěvků
8. 8. 2014   #27
-
0
-

#26 Kit
perfektní - funguje to a rozumím tomu - dík za pomoc !!!

Nahlásit jako SPAM
IP: 213.192.19.–
Kit+15
Guru
8. 8. 2014   #28
-
0
-

#27 ČeV
Není zač. Vždy preferuji immutable (resp. final) proměnné všude, kde to jde.

Nahlásit jako SPAM
IP: 46.174.37.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
9. 8. 2014   #29
-
0
-

#27 ČeV
Ještě bych k tomu dodal, že v Pythonu existuje i datový typ množina, tedy set. I takové asociativní pole má své použití.

Nahlásit jako SPAM
IP: 46.174.37.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 17 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý