abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Navštivte Abc obchůdek se samolepkami a přívěsky!
Rozšířené hledání
×
dnes 06:11 | Komerce
Rozrůstající se softwarová společnost v Plzni zabývající se telematikou hledá schopné vývojáře a nadšence se zájmem o OS Linux. Uplatnění zde najdou především vývojáři C++ se znalostí OS Linuxu, dále programátoři v jazyku Java nebo vývojáři se zkušenostmi s Oracle DB a Oracle ADF. Více informací o společnosti. … více »
Reklama | Komentářů: 0
24.5. 22:45 | IT novinky
NASA, která společně s Rackspace stála u zrodu projektu OpenStack, se již nadále nebude podílet na dalším vývoji této "infrastructure-as-a-service" platformy. V NASA totiž došli k závěru, že vzhledem k podpoře OpenStacku ze strany společností jako Red Hat, AT&T a HP lze jejich práci považovat za dokončenou. Posléze se NASA plánuje stáhnout i z vývoje další platformy pro cloud computing jménem Nebula.
Migilenik | Komentářů: 0
24.5. 22:45 | Upozornění
Blíží se svátek IPv6 a s ním i konference IPv6 Day. Na návštěvníky této akce čeká nejen bohatý program, ale také jedna speciální nabídka – v průběhu setkání bude možné získat se slevou 66 procent třetí vydání knihy IPv6 vysokoškolského pedagoga a publicisty Pavla Satrapy, tedy za 105 korun. … více »
Vilem Sladek | Komentářů: 5
24.5. 16:14 | Pozvánky

Přijďte si zasprintovat na Djangu, jiném Python open-source projektu, nebo jen potkat ostatní vývojáře!

… více »
Whit | Komentářů: 0
24.5. 10:20 | Nová verze
Na zrcadlech a torrentech jsou již k dispozici ISO obrazy distribuce Mageia 2. Poznámky k vydání čtěte zde.
Liborek | Komentářů: 14
23.5. 13:47 | Pozvánky

Letos v říjnu se v Praze uskuteční hned několik konferencí. Odehraje se zde nově vzniklá konference LinuxDays. K ní se přidá čtvrtý ročník openSUSE Conference, dvanáctý ročník SUSE Labs conference a aby to nebylo málo, přidá se i první ročník Gentoo miniconf. A to vše ve stejné dny a na stejném místě.

… více »
Miška | Komentářů: 7
23.5. 13:27 | Zajímavý projekt
Printerd je název nového projektu tiskového démona, který bude využívat PolicyKit a D-Bus. Projekt je zatím na úplném začátku, takže nejde o nic vhodného k produkčnímu nasazení. Mimo jiné aktuálně akceptuje jako vstup jen PDF dokumenty.
Luboš Doležel (Doli) | Komentářů: 56
23.5. 13:25 | Zajímavý software
Tři vývojáři ze společnosti Engine Yard přecházejí po dohodě mezi firmami do Red Hatu. Jde o vývojáře zabývající se rozvojem projektu JRuby. To ukazuje, že Red Hat má zájem o podporu alternativních jazyků nad OpenJDK.
Luboš Doležel (Doli) | Komentářů: 1
23.5. 13:20 | Zajímavý software
Fedora přejde na knihovnu libusbx, což je fork původní knihovny libusb. Důvodem pro fork byl zjevný nedostatek času nebo zájmu ze strany správce projektu. libusbx už teď nabízí užitečné funkce navrch.
Luboš Doležel (Doli) | Komentářů: 4
23.5. 10:29 | Nová verze
Vyšlo LLVM 3.1. Vylepšení se dotýkají podpory C++ 11 nebo architektur ARM a MIPS. Dále se můžete těšit z Python bindings nebo nástroje AddressSanitizer pro detekci chyb při práci s pamětí.
Luboš Doležel (Doli) | Komentářů: 0
Pokud by se prohlížeč Opera stal svobodným:
 (9%)
 (32%)
 (1%)
 (58%)
Celkem 252 hlasů
 Komentářů: 31, poslední včera 22:38
    Rozcestník
    Reklama
    Autoškola testy online Levný benzín

    Standardní knihovna pro Python - 5 (řetězce)

    30. 11. 2006 | Jakub Matys | Programování | 6518×

    Po delší odmlce je tu zase pokračování seriálu o knihovně jazyka Python. Dnes začneme další téma - řetězce.

    Po delší odmlce vás vítám u již pátého pokračování seriálu o pythonské knihovně. Dnes se již nebudeme zabývat funkcemi z modulu __builtins__, ale vrhneme se na práci s řetězci. Předpokládám, že většina čtenářů ví, jak se s řetězci pracuje, ale neodpustím si jednoduché opakování.

    V Pythonu je možné pracovat se dvěma typy řetězcových objektů. Prvním typem je obyčejný řetězec, který je 8bitový, a jeho interpretace záleží na nastaveném kódování. Druhým jsou Unicode řetězce. Standardně se skládají z 16bitových znaků, které jsou zakódovány ve formátu UCS-2. Od verze 2.2 je možné používat i 32bitové Unicode řetězce kódované v UCS-4; toto nastavení se však povoluje při překladu interpretru. Mezi oběma typy řetězců je možné provádět konverze. Je možné rovněž konvertovat řetězce z/do jiného kódování než je systémové.

    Nejdříve se začneme zabývat metodami řetězců. Stejné funkce je možné nalézt i v modulu string, ty jsou však už delší dobu označeny jako deprecated (čili nedoporučované).

    Poznámka: Mezi vydáním předchozího a tohoto dílu došlo k uvolnění nové verze Pythonu (v. 2.5). V tomto článku i dalších pokračováních bude na tuto skutečnost brán zřetel a rozdíly mezi jednotlivými verzemi budou komentovány.

    Metody řetězců

    capitalize()

    Metoda vrací novou kopii řetězce, přičemž první písmeno bude velké. Metoda je pro 8bitové řetězce závislá na nastavení locale.

    >>> print "adam".capitalize()
    Adam
    >>> print "říman".capitalize()
    říman
    >>> print u"říman".capitalize()
    Říman
    >>>
    
    center(width[,fillchar])

    Tato metoda vrací také nový řetězec o délce width. Obsah volajícího řetězce je umístěn do jeho středu (vycentrován). Přebývající místo je doplněno znaky fillchar nebo, je-li tento parametr vynechán, mezerami.

    >>> retezec = "Kobyla má malý bok"
    >>> print retezec.center(len(retezec) + 4, '!')
    !!Kobyla má malý bok!!
    >>> print retezec.center(len(retezec) + 3, '!')
    !!Kobyla má malý bok!
    >>> print retezec.center(len(retezec) - 3, '!')
    Kobyla má malý bok
    >>>
    

    Jak je vidět, metoda si poradí i v případě, že vrácený řetězec bude mít lichou délku. V tomto případě se pokusí vycentrovat znaky, jak jen to jde. Předáme-li jako první parametr číslo menší než je délka volajícího řetězce, vrátí se tento řetězec nezměněn.

    Tato metoda byla změněna ve verzi 2.4. Byl přidán argument fillchar.

    count(sub[,start[,end]])

    Spočítá počet výskytů podřetězce sub v řetězci, resp. jeho části definované parametry start a stop.

    decode([encoding[,errors]])

    Metoda dekóduje řetězec do Unicode řetězce. Parametr encoding představuje kodek použitý při dekódování. Je-li vynechán, použije se výchozí kódování (ASCII). Druhý parametr nastavuje způsob, s jakým se bude program vyrovnávat s chybami, které mohou při převádění nastat.

    • 'strict' - nastane-li chyba převodu, vyvolá výjimku UnicodeError (nebo potomka). Tento parametr je výchozí.
    • 'ignore' - přeskočí chybný znak a pokračuje převodem následujícího.
    • 'replace' - nahradí chybný znak znakem REPLACEMENT CHARACTER (U+FFFD).

    Parametry ignore a replace jsou použitelné pouze pro chyby vznikající při převodu. Je-li chyba způsobená neodpovídajícím vstupem, je vyhozena výjimka UnicodeError bezpodmínečně. Například kódování iso-8859-2 a cp1250 nejsou 100% přenositelná. A nechcete-li, aby byla při objevení nekompatibilního znaku vždy vyvolávána výjimka, můžete použít dva výše zmíněné parametry. V prvním případě bude znak ignorován, ve druhém nahrazen.

    Použijete-li však řetězec s diakritikou a nastavíte jej jako ASCII, bude vždy vyvolána výjimka. Při převodu z ASCII kódování se totiž kontroluje, zda je hodnota znaku menší než 128 (rozsah základní ASCII je 0 - 127).

    Metoda byla přidána do Pythonu ve verzi 2.2 a ve verzi 2.3 byl přidán parametr errors.

    >>> unicode = "kobyla má malý bok".decode("utf-8") # utf-8 => unicode
    >>> unicode
    u'kobyla m\xe1 mal\xfd bok'
        # odpovidajici unicode retezec
    
    >>> print unicode
    kobyla má malý bok
        # zde je videt, ze byl retezec zkonvertovan spravne
    
    >>> iso = "kobyla má malý bok".decode("iso8859-2")
        # iso-8859-2 => unicode
    >>> iso
    u'kobyla m\u0102\u0104 mal\u0102\u02dd bok'
    >>> # za kazdy cesky znak se ulozi 2 unicode znaky,
    ... # protoze me nastaveni locale je utf8 (neASCII
    ... # znaky jsou vice bytove), ale pri prevodu bylo
    ... # zadano kodovani iso8859-2 (1 bytove)
    ...
    >>> print iso
    kobyla mĂĄ malĂ˝ bok
    >>> "kobyla má malý bok".decode()
        # neodpovidajici vstup, viz odstavec vyse
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 8:
     ordinal not in range(128)
    >>>
    
    encode([encoding[,errors]])

    Metoda encode pracuje opačně než decode. Unicode nebo obyčejný řetězec je zkonvertován do kódování encoding. Pokud budeme konvertovat standardní řetězec, nesmíme zapomenout, že řetězec bude interpretován ve standardním kódování (ASCII). Pro parametr erorrs platí to samé jako u decode, ale přibývají ještě parametry 'xmlcharrefreplace' a 'backslashreplace'. První zakóduje "neobvyklé" znaky (diakritika atd.) pro použití v XML nebo HTML (&#číslo;), druhý použije lomítkovou interpretaci (\\xe1, kde e1 je hexadecimální kód znaku á).

    Všechna použitelná kódování je možné nalézt v sekci 4.8.3 Python Library Reference.

    Metoda je součástí jazyka od verze 2.0. Parametry xmlcharrefreplace a backslashreplace byly přidány ve verzi 2.3.

    >>> retezec = u"kobyla má malý bok"
    >>> retezec.encode("utf-8") # unicode => utf-8
    'kobyla m\xc3\xa1 mal\xc3\xbd bok'
    >>> retezec.encode("iso-8859-2") # unicode => iso-8859-2
    'kobyla m\xe1 mal\xfd bok'
    
    >>> retezec.encode("ascii") # ta sama chyba jako u decode
    Traceback (most recent call last):
      File "", line 1, in ?
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1'
     in position 8: ordinal not in range(128)
    
    >>> retezec.encode("ascii", "ignore")
        # na rozdil od decode v tomto pripade funguje 'ignore'
    'kobyla m mal bok'
    
    >>> retezec.encode("ascii", "replace") # i 'replace'
    'kobyla m? mal? bok'
    
    >>> retezec.encode("ascii", "xmlcharrefreplace")
        # rozkodovani pro pouziti na webu
    'kobyla má malý bok'
    
    >>> retezec.encode("ascii", "backslashreplace")
        # a s lomitkovou interpretaci
    'kobyla m\\xe1 mal\\xfd bok'
    
    >>> "kobyla ma maly bok".encode() # ASCII => ASCII
    'kobyla ma maly bok'
    >>> "kobyla ma maly bok".encode("utf-8") # ASCII => utf-8
    'kobyla ma maly bok'
    >>> print "kobyla ma maly bok".encode("utf-8")
    kobyla ma maly bok
    >>>
    
    endswith(suffix[,start[,end]])

    Vrací True, pokud řetězec nebo jeho část [start:end] končí na suffix. Ve verzi 2.5 byla přidána možnost zadat suffix jako n-tici řetězců, které se budou kontrolovat.

    expandtabs([tabsize])

    Vrací novou kopii řetězce, ve kterém jsou všechny tabulátory nahrazeny mezerami. Počet těchto mezer je udán parametrem tabsize. Je-li tento vynechán, je počet mezer standardně nastaven na 8.

    A zde dnešní díl končí. Příště budeme pokračovat dalšími metodami.

    Nejčtenější články posledního měsíce

    Komiks xkcd 150: Dospěláci
    Komiks xkcd 1048: Emoce
    Komiks xkcd 131: Větráky

    Nejkomentovanější články posledního měsíce

    GIMP 2.8: V jednom okně a s celou řadou vylepšení
    Komiks xkcd 150: Dospěláci
    Průlomový rozsudek Soudního dvoru Evropské unie ve věci C-406/10, SAS v WPL
      všechny statistiky »

    Seriál Standardní knihovna pro Python (dílů: 8)

    Standardní knihovna pro Python - 1 (builtins) (první díl)
    <—« Standardní knihovna pro Python - 4 (builtins 4)
    »—> Standardní knihovna pro Python - 6 (řetězce 2)
    Standardní knihovna pro Python - 8 (regulární výrazy 1) (poslední díl)

    Související články

    Standardní knihovna pro Python - 1 (builtins)
    Standardní knihovna pro Python - 2 (builtins 2)
    Standardní knihovna pro Python - 3 (builtins 3)
    Standardní knihovna pro Python - 4 (builtins 4)
    Ruby pro začátečníky - 1
    Seriál: BASH
    Python a PyQt - 1 (úvod)
    Python a PyQt - 2 (podmínky, cykly, tlačítka)
    Začínáme programovat v jazyce Python
    Kommander - 1 (Skriptované GUI)
    Kommander - 2 (Starý parser)
    Kommander - 3 (Nový parser)
    Seriál: Začíname KProgramovať
    Programujeme v PERLu - I
    Programujeme v PERLu - II

    Další články z této rubriky

    QML – moderní uživatelská rozhraní v Qt (3)
    QML – moderní uživatelská rozhraní v Qt (2)
    Programování v jazyce D (4): Funkce a delegáty – pokračování, podmínky, cykly, pole, pointery
    Java Native Interface – voláme Javu z nativního kódu a ještě více
    QML – moderní uživatelská rozhraní v Qt (1)
           

    Hodnocení: 100 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    30.11.2006 18:03 Jan Tichavský
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 5 (řetězce)
    Díky za seriál, bude se mi hodit. Může mi někdo poradit, jak poznám, jestli znak jde převést na číslo (tj. je 0-9)? Je nějaká obecná metoda jak to udělat i pro jiné jazyky (kromě zjistění ASCII kódu 0-9 a porovnání)?
    Vojta Drbohlav avatar 30.11.2006 19:28 Vojta Drbohlav | skóre: 27 | blog: Blog | Strahov
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 5 (řetězce)
    >>> i = "5"
    >>> i.isdigit()
    True
    >>>
    30.11.2006 23:07 J.
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 5 (řetězce)
    jo, to je ono, díky
    1.12.2006 09:36 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 5 (řetězce)
    Pro perl třeba $a =~ /^[+-]?\d+(?:\.\d+)?/ a nebo mnohem lépe a radostněji
    use Scalar::Util qw(looks_like_number);
    ...
    if (looks_like_number($a)) {
        ...
    } else {
        ...
    }
    ...
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    Vojta Drbohlav avatar 1.12.2006 16:38 Vojta Drbohlav | skóre: 27 | blog: Blog | Strahov
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 5 (řetězce)
    $a =~ /^[+-]?\d+(?:\.\d+)?/
    No fuj... :-D
    1.12.2006 18:10 amnesiac
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 5 (řetězce)
    print "$a je cislo" if ($a eq ($a + 0))

    Akorát je neošetřeno explicitní uvedení znaménka + .

    4.12.2006 10:48 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 5 (řetězce)
    Akorát je neošetřeno explicitní uvedení znaménka + .
    Ano, taková nepodstatná maličkost, když můžeme použít interní funkci perl api looks_like_number na nímž je Scalar::Util::looks_like_number pouze wrapper. Místo toho necháme perl zavolat tuto funkci hned dvakrát, pokusíme se o sčítání a nakonec ještě budeme porovnávat řetězce s tím výsledkem, že to nefunguje pro všechny případy (hloupé + na začátku). Aneb jak to dělat jednoduše, když to jde složitě, že?
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    7.12.2006 18:18 J.
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 5 (řetězce)
    Jelikož název funkce je dost výstižný, líbí se mi to víc a to v Perlu vůbec nedělám. Samozřejmě všechno lze dělat několika způsoby a v Perlu i zvlášť nepřehledně (neříkám, že každý to tak dělá) :)
    3.12.2006 19:22 mys elf
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 5 (řetězce)
    V C existuje funkce isdigit() (v ctype.h).
    30.11.2006 23:56 Lukoko | skóre: 8 | blog: Lukoko | Praha
    Rozbalit Rozbalit vše Re: Standardní knihovna pro Python - 5 (řetězce)
    osobne mam rad u stringu tudle metodu:
    >>> a=["1","2","3","a","b"]
    >>> ", ".join(a)
    '1, 2, 3, a, b'
    >>> 
    
    Mac OS X je taky unix

    Založit nové vláknoNahoru

    ISSN 1214-1267   Powered by Hosting 90 Server hosting
    © 1999-2012 Argonit s. r. o. Všechna práva vyhrazena.