Stránka 1 z 2

Nefukcni kod, python

Napsal: 11 kvě 2020 13:11
od shockwave
Ahoj, funguje vam prosim tento kod, me ani z prikazove radky.
Omlouvam se , vkladam znovu jelikoz mi v jinem vlakne nesel vlozit prispevek.

kod:
<code>
SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}

def approximate_size(size, a_kilobyte_is_1024_bytes=True):
'''
Convert a file size to human-readable form.
Keyword arguments:
size -- file size in bytes
a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024
if False, use multiples of 1000
Returns: string
'''
if size < 0:
raise ValueError('number must be non-negative')

multiple = 1024 if a_kilobyte_is_1024_bytes else 1000

for suffix in SUFFIXES[multiple]:
size /= multiple
if size < multiple:
return '{0:.1f} {1}'.format(size, suffix)
raise ValueError('number too large')

if __name__ == '__main__':
print(approximate_size(1000000000000, False))
print(approximate_size(1000000000000))
</code>

Re: Nefukcni kod, python

Napsal: 11 kvě 2020 17:32
od faraon
Tak za prvé, programátoři odsazující mezerami jsou lépe placení než ti, kteří odsazují tabulátorem. Zjistila to statistika, příčina je neznámá, prostě to tak je a nikdo neví proč.

A za druhé, nikdy, ale opravdu NIKDY nepoužívej v Pythonu tabulátor, protože se z toho velice rychle zblázníš! Leda že bys dokázal program v jazyce Whitespace napsat na papír a po roce bezchybně opsat do počítače :lol:

Takže po nahrazení tabulátorů mezerami a správném odsazení mi to funguje naprosto bezchybně:

Kód: Vybrat vše

#! /usr/bin/python

SUFFIXES = {1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
            1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}

def approximate_size(size, a_kilobyte_is_1024_bytes=True):
    '''
        Convert a file size to human-readable form.
    Keyword arguments:
    size -- file size in bytes
    a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024
    if False, use multiples of 1000
    Returns: string
        '''

    if size < 0:
       raise ValueError('number must be non-negative')

    multiple = 1024 if a_kilobyte_is_1024_bytes else 1000

    for suffix in SUFFIXES[multiple]:
        size /= multiple
        if size < multiple:
           return '{0:.1f} {1}'.format(size, suffix)
    raise ValueError('number too large')

if __name__ == '__main__':
   print(approximate_size(1000000000000, False))
   print(approximate_size(1000000000000))

Re: Nefukcni kod, python

Napsal: 11 kvě 2020 20:21
od shockwave
Děkuju, fakt že jo, máš pravdu. Tak sem zase o neco chytřejší.

Dodatečně přidáno po 14 minutách 33 vteřinách:
Sem asi LAMA , ale jak ten program ví, že to ma převest na 1 TB a 1 GiB

Re: Nefukcni kod, python

Napsal: 11 kvě 2020 22:01
od CZechBoY
Deli vstupni cislo tisicem dokud je vstupni cislo vyssi nez tisic. Podle toho kolikrat se delilo vybere prislusnou koncovku.

Re: Nefukcni kod, python

Napsal: 11 kvě 2020 23:46
od faraon
Je dobré nevymýšlet nějaká neviditelná kouzla, ale všechno podstatné mít pěkně pohromadě už v hlavičce funkce. Tam se předávají parametry, které řídí její chování. Podstatné části v překladu do lidského jazyka:

def approximate_size(size, binárně=Ano):
...
multiple = 1024 if binárně else 1000
...

Pokud zavoláš tu funkci s jedním parametrem - zadaným číslem, počítá se binárně s násobky 1024 a počítačovými jednotkami *iB z druhého řádku tabulky. Když jí ale druhým parametrem řekneš že je nechceš - False, použijí se lidské metrické násobky 1000 a jednotky *B z prvního řádku. Ale kdybys do druhého parametru dal True, jako že ty binární násobky určitě chceš, bude se také počítat s 1024.

No a potom to zadané číslo v cyklu tím násobkem dělíš tak dlouho, dokud nemáš číslo menší než ten násobek, a pak ho přímo z cyklu vrátíš jako string i s příslušnou příponou z tabulky. Pokud tabulka nestačila, cyklus skončí bez výsledku a z funkce vrátíš chybové hlášení.

Re: Nefukcni kod, python

Napsal: 12 kvě 2020 00:00
od second32
"NIKDY nepoužívej v Pythonu tabulátor", aha :D Tak to jo. A když máš dodržovat PEP8, tak co?

Re: Nefukcni kod, python

Napsal: 12 kvě 2020 00:24
od faraon
No, například "profesionály" opovrhovaný Midnight Editor v Midnight Commanderu má v nastavení položku "Převést tabulátor na mezery" i s hodnotou o kolik mezer se má odsazovat. Do inteligentních editorů, jako je Vim nebo Emacs, si můžeš doplnit libovolnou funkcionalitu sám. Ale pokud musíš z libovolného důvodu místo dávno funkčních řešení používat nějaký neschopný frikulínský crippleware, tak holt usouložíš mezerník :lol:

Mimochodem, automatické odsazování, nahrazení tabulátoru mezerami okamžitě jak ho stisknu i backspace rovnou na předchozí úroveň jsem si vychutnával už v QBasicu z roku 1990 v MS-DOSu, takže mi není jasné proč tyhle věci, naprosto samozřejmé už dávno v minulém tisíciletí, dnes samozřejmé nejsou!

Re: Nefukcni kod, python

Napsal: 12 kvě 2020 08:48
od CZechBoY
Pouzivej si odsazeni jaky chces, ale musis ho dodrzet, coz tazatel asi nedokaze.

Re: Nefukcni kod, python

Napsal: 12 kvě 2020 16:02
od faraon
Však je to první program v té učebnici, až si párkrát otluče klouby, naučí se ;-)

Ono to tak bývá, když jsem kdysi opisoval do osmibitu prográmky z časopisů, také jsem jako první věc musel řešit proč mi nefungují. A je to dobrá škola.

Re: Nefukcni kod, python

Napsal: 13 kvě 2020 12:04
od shockwave
Mě to přeci jen nedá, v učebnicích jsem viděl maximálně tak for i in boxes [2:], ale tady je:


for suffix in SUFFIXES[multiple]: pres tu promennou multiple odkazuje nen slovnik SUFFIXES nebo jak to brat. V modelovych prikladech sem fakt tohle nikde nanasel, diky Děli se tam jak 1000cem tak i 1024kou, je to tak ?

Re: Nefukcni kod, python

Napsal: 13 kvě 2020 14:50
od Zakk
syntaxi v Pythonu moc neznám.. ale v čem ti přijde ten zápis jinej ? suffix=i, SUFFIXES=boxes a za multiple se dosadí buď 1000 nebo 1024

dělí se BUĎ 1000 NEBO 1024, podle toho vstupního parametru

Re: Nefukcni kod, python

Napsal: 13 kvě 2020 14:53
od CZechBoY
jo, vezmeš si ze slovníku příslušnou hodnotu takovou která odpovídá klíči který je uložený v proměnné multiple

tzn když máš
SUFFIXES = {1000: "KB", 1024: "KiB"}
a zavoláš SUFFIXES[1000] tak se ti vrátí "KB"
a když zavoláš SUFFIXES[1024] tak se vrátí "KiB"