Všechny standarní sekvenční operace (indexing, slicing, multiplication, membership, length, minimum, maximum) jsou použitelné také u řetězců.
Pamatujte ale, že řetězce jsou immutable, proto následující kód nebude fungovat.
>>> website = 'http://www.python.org'
>>> website[-3:] = 'com'
Traceback (most recent call last):
File "<pyshell#19>", line 1, in ?
website[-3:] = 'com'
TypeError: object doesn't support slice assignment
Jednou ze metod jak vytisknout a formátovat řetězce operátor %, tak jako v jazyce C.
Jako hodnoty, které chceme vytisknout můžeme použít string, integer, tuple nebo dictionary.
>>> format = "Hello, %s. %s are you?"
>>> values = ('world', 'How')
>>> format % values
'Hello, world. How are you?'
%s je tzv. conversion specifiers. Označují místa, kde se má vložit hodnoty z pravé strany přiřazení.
Další možné použití:
%s - string
%i - integer
%f - floating point
Nejnovější a doporučovaný způsob formátování řetězců je pomocí metody format(). Každé položka řetězce, kterou chceme formátovat je reprezentována složenými závorkami {} a může obsahovat jméno a také informace o tom, jak správně řetězec zformátovat.
>>> "{}, {} and {}".format("first", "second", "third")
'first, second and third'
>>> "{0}, {1} and {2}".format("first", "second", "third")
'first, second and third'
Můžeme formátovat i takto:
>>> "{3} {0} {2} {1} {3} {0}".format("be", "not", "or", "to")
'to be or not to be'
Hodnoty můžeme také pojmenovávat:
>>> from math import pi
>>> "{name} is approximately {value:.2f}.".format(value=pi, name="π")
'π is approximately 3.14.'
.2f znamená, že číslo bude vytištěno s přesností na dvě desetinná místa.
Od Pythonu 3.6 můžeme formátovat řetězec i takto:
>>> from math import e
>>> f"Euler's constant is roughly {e}."
"Euler's constant is roughly 2.718281828459045."
Další možnost je například takováto:
>>> name = 'Fred'
>>> age = 42
>>> f'He said his name is {name} and he is {age} years old.'
He said his name is Fred and he is 42 years old.
Můžeme dokonce použít ve složených závorkách i Python výrazy a metody:
>>> name = 'Fred'
>>> seven = 7
>>> f'''He said his name is {name.upper()}
... and he is {6 * seven} years old.'''
'He said his name is FRED\n and he is 42 years old.'
Starší ekvivalent stejného kódu je:
>>> "Euler's constant is roughly {e}.".format(e=e)
"Euler's constant is roughly 2.718281828459045."
Formátování řetězců (funkce format) používá templatovací jazyk. Každá hodnota, která má být nahrazena je uložená ve složených uvozovkách {}, tzv replacement fields. Poud chceme vypsat ve výpisu složené uvozovky, musíme to udělat takto:
>>> "{{ double braces }}".format()
'{ double braces }'
Skládají se z:
Field name - index nebo indentifikátor
Conversion flag - Vykřičník následovaný jedním znakem
Format specifier - dojtečka následovaná výrazem templatovacího jazyka
Příklady použití:
>>> "{foo} {} {bar} {}".format(1, 2, bar=4, foo=3)
'3 1 4 2'
Můžeme přistupovat také jen k části hodnoty (pole), kterou chceme vytisknout:
>>> fullname = ["Alfred", "Hitchcock"]
>>> "Mr {name[1]}".format(name=fullname)
'Mr Hitchcock'
>>> print("{pi!s} {pi!r} {pi!a}".format(pi="π"))
π 'π' '\u03c0'
Floating point format specifier
>>> "The number is {num}".format(num=42)
'The number is 42'
>>> "The number is {num:f}".format(num=42)
'The number is 42.000000'
Binary format specifier
>>> "The number is {num:b}".format(num=42)
'The number is 101010'
Format specifier
Více v dokumentaci.
>>> "{num:10}".format(num=3)
' 3'
>>> "{name:10}".format(name="Bob")
'Bob '
>>> "Pi is {pi:.2f}".format(pi=pi)
'Pi is 3.14'
Formátování se zarovnáním:
>>> "{pi:10.2f}".format(pi=pi)
' 3.14'
Přesnost zarovnání se dá použít také takto:
>>> "{:.5}".format("Guido van Rossum")
'Guido'
Můžeme specifikovat několik typů zarovnání.
Zero-padded:
>>> '{:010.2f}'.format(pi)
'0000003.14'
Levé, pravé a vycentrované:
>>> print('{0:<10.2f}\n{0:^10.2f}\n{0:>10.2f}'.format(pi))
3.14
3.14
3.14
Můžeme specifikovat jakým znakem vyplníme volné místa, jako náhradu za mezeru:
>>> "{:$^15}".format(" I WON ")
'$$$$ I WON $$$$'
Jak formátovat čísla se znaménky?
>>> print('{0:-.2}\n{1:-.2}'.format(pi, -pi)) # Default
3.1
-3.1
>>> print('{0:+.2}\n{1:+.2}'.format(pi, -pi))
+3.1
-3.1
>>> print('{0: .2}\n{1: .2}'.format(pi, -pi))
3.1
-3.1
Praktický příklad:
# Print a formatted price list with a given width
width = int(input('Please enter width: '))
price_width = 10
item_width = width - price_width
header_fmt = '{{:{}}}{{:>{}}}'.format(item_width, price_width)
fmt = '{{:{}}}{{:>{}.2f}}'.format(item_width, price_width)
print('=' * width)
print(header_fmt.format('Item', 'Price'))
print('-' * width)
print(fmt.format('Apples', 0.4))
print(fmt.format('Pears', 0.5))
print(fmt.format('Cantaloupes', 1.92))
print(fmt.format('Dried Apricots (16 oz.)', 8))
print(fmt.format('Prunes (4 lbs.)', 12))
print('=' * width)
Výstup:
Please enter width: 35
===================================
Item Price
-----------------------------------
Apples 0.40
Pears 0.50
Cantaloupes 1.92
Dried Apricots (16 oz.) 8.00
Prunes (4 lbs.) 12.00
===================================
>>> "The Middle by Jimmy Eat World".center(39)
' The Middle by Jimmy Eat World '
>>> "The Middle by Jimmy Eat World".center(39, "*")
'*****The Middle by Jimmy Eat World*****'
Vrací levý index, na kterém našel výskyt řetězce.
>>> 'With a moo-moo here, and a moo-moo there'.find('moo')
7
>>> title = "Monty Python's Flying Circus"
>>> title.find('Monty')
0
>>> title.find('Python')
6
>>> title.find('Flying')
15
>>> title.find('Zirquss')
-1
>>> seq = [1, 2, 3, 4, 5]
>>> sep = '+'
>>> sep.join(seq) # Trying to join a list of numbers
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: sequence item 0: expected string, int found
>>> seq = ['1', '2', '3', '4', '5']
>>> sep.join(seq) # Joining a list of strings
'1+2+3+4+5'
>>> dirs = '', 'usr', 'bin', 'env'
>>> '/'.join(dirs)
'/usr/bin/env'
>>> print('C:' + '\\'.join(dirs))
C:\usr\bin\env
Inverzní funkce je split().
Vrací lowercase verzi řetězce:
>>> 'Dance Floor'.lower()
'dance floor'
Reverzní funkce upper().
Všechny výskyty hledaného řetězce jsou nahrazeny.
>>> 'This is a test'.replace('is', 'eez')
'Theez eez a test'
>>> '1+2+3+4+5'.split('+')
['1', '2', '3', '4', '5']
>>> '/usr/bin/env'.split('/')
['', 'usr', 'bin', 'env']
>>> 'Using the default'.split()
['Using', 'the', 'default']
Vrací řetězec bez prázdných znaků na začátku a na konci.
>>> ' internal whitespace is kept '.strip()
'internal whitespace is kept'
{ "data": { "sessionMaterial": { "id": "session-material:2018/tieto:strings:0", "title": "Řetězce (Strings)", "html": "\n \n \n\n <h2>Řetězce (Strings)</h2>\n<p>Všechny standarní sekvenční operace (indexing, slicing, multiplication, membership, length, minimum, maximum) jsou použitelné také u řetězců.</p>\n<p>Pamatujte ale, že řetězce jsou immutable, proto následující kód nebude fungovat.</p>\n<div class=\"highlight\"><pre><code>>>> website = 'http://www.python.org'\n>>> website[-3:] = 'com'\nTraceback (most recent call last):\n File "<pyshell#19>", line 1, in ?\n website[-3:] = 'com'\nTypeError: object doesn't support slice assignment</code></pre></div><h2>Formátování řetězců</h2>\n<p>Jednou ze metod jak vytisknout a formátovat řetězce operátor %, tak jako v jazyce C.</p>\n<p>Jako hodnoty, které chceme vytisknout můžeme použít string, integer, tuple nebo dictionary.</p>\n<div class=\"highlight\"><pre><code>>>> format = "Hello, %s. %s are you?"\n>>> values = ('world', 'How')\n>>> format % values\n'Hello, world. How are you?'</code></pre></div><p>%s je tzv. <em>conversion specifiers</em>. Označují místa, kde se má vložit hodnoty z pravé strany přiřazení.</p>\n<p>Další možné použití:</p>\n<div class=\"highlight\"><pre><code>%s - string\n%i - integer\n%f - floating point</code></pre></div><p>Nejnovější a doporučovaný způsob formátování řetězců je pomocí metody <em>format()</em>. Každé položka řetězce, kterou chceme formátovat je reprezentována složenými závorkami <em>{}</em> a může obsahovat jméno a také informace o tom, jak správně řetězec zformátovat.</p>\n<div class=\"highlight\"><pre><code>>>> "{}, {} and {}".format("first", "second", "third")\n'first, second and third'\n>>> "{0}, {1} and {2}".format("first", "second", "third")\n'first, second and third'</code></pre></div><p>Můžeme formátovat i takto:</p>\n<div class=\"highlight\"><pre><code>>>> "{3} {0} {2} {1} {3} {0}".format("be", "not", "or", "to")\n'to be or not to be'</code></pre></div><p>Hodnoty můžeme také pojmenovávat:</p>\n<div class=\"highlight\"><pre><code>>>> from math import pi\n>>> "{name} is approximately {value:.2f}.".format(value=pi, name="π")\n'π is approximately 3.14.'</code></pre></div><p><em>.2f</em> znamená, že číslo bude vytištěno s přesností na dvě desetinná místa.</p>\n<p>Od Pythonu 3.6 můžeme formátovat řetězec i takto:</p>\n<div class=\"highlight\"><pre><code>>>> from math import e\n>>> f"Euler's constant is roughly {e}."\n"Euler's constant is roughly 2.718281828459045."</code></pre></div><p>Další možnost je například takováto:</p>\n<div class=\"highlight\"><pre><code>>>> name = 'Fred'\n>>> age = 42\n>>> f'He said his name is {name} and he is {age} years old.'\nHe said his name is Fred and he is 42 years old.</code></pre></div><p>Můžeme dokonce použít ve složených závorkách i Python výrazy a metody:</p>\n<div class=\"highlight\"><pre><code>>>> name = 'Fred'\n>>> seven = 7\n>>> f'''He said his name is {name.upper()}\n... and he is {6 * seven} years old.'''\n'He said his name is FRED\\n and he is 42 years old.'</code></pre></div><p>Starší ekvivalent stejného kódu je:</p>\n<div class=\"highlight\"><pre><code>>>> "Euler's constant is roughly {e}.".format(e=e)\n"Euler's constant is roughly 2.718281828459045."</code></pre></div><p>Formátování řetězců (funkce format) používá templatovací jazyk. Každá hodnota, která má být nahrazena je uložená ve složených uvozovkách <em>{}</em>, tzv <em>replacement fields</em>. Poud chceme vypsat ve výpisu složené uvozovky, musíme to udělat takto:</p>\n<div class=\"highlight\"><pre><code>>>> "{{ double braces }}".format()\n'{ double braces }'</code></pre></div><h3>Replacement Fields</h3>\n<p>Skládají se z:</p>\n<p><strong>Field name</strong> - index nebo indentifikátor</p>\n<p><strong>Conversion flag</strong> - Vykřičník následovaný jedním znakem</p>\n<ul>\n<li>r - repr</li>\n<li>s - string</li>\n<li>a - ascii</li>\n</ul>\n<p><strong>Format specifier</strong> - dojtečka následovaná výrazem templatovacího jazyka</p>\n<p>Příklady použití:</p>\n<div class=\"highlight\"><pre><code>>>> "{foo} {} {bar} {}".format(1, 2, bar=4, foo=3)\n'3 1 4 2'</code></pre></div><p>Můžeme přistupovat také jen k části hodnoty (pole), kterou chceme vytisknout:</p>\n<div class=\"highlight\"><pre><code>>>> fullname = ["Alfred", "Hitchcock"]\n>>> "Mr {name[1]}".format(name=fullname)\n'Mr Hitchcock'</code></pre></div><h3>Základní konverze</h3>\n<div class=\"highlight\"><pre><code>>>> print("{pi!s} {pi!r} {pi!a}".format(pi="π"))\nπ 'π' '\\u03c0'</code></pre></div><p>Floating point <em>format specifier</em></p>\n<div class=\"highlight\"><pre><code>>>> "The number is {num}".format(num=42)\n'The number is 42'\n>>> "The number is {num:f}".format(num=42)\n'The number is 42.000000'</code></pre></div><p>Binary <em>format specifier</em></p>\n<div class=\"highlight\"><pre><code>>>> "The number is {num:b}".format(num=42)\n'The number is 101010'</code></pre></div><p><strong>Format specifier</strong></p>\n<ul>\n<li>b - binary</li>\n<li>c - integer</li>\n<li>d - integer vytiskne jako decimal</li>\n<li>f - decimal s fixním počtem desetinných míst</li>\n<li>o - integer jako osmičkové číslo</li>\n</ul>\n<p>Více v dokumentaci.</p>\n<h3>Šířka zarovnání</h3>\n<div class=\"highlight\"><pre><code>>>> "{num:10}".format(num=3)\n' 3'\n>>> "{name:10}".format(name="Bob")\n'Bob '</code></pre></div><h3>Precison</h3>\n<div class=\"highlight\"><pre><code>>>> "Pi is {pi:.2f}".format(pi=pi)\n'Pi is 3.14'</code></pre></div><p>Formátování se zarovnáním:</p>\n<div class=\"highlight\"><pre><code>>>> "{pi:10.2f}".format(pi=pi)\n' 3.14'</code></pre></div><p>Přesnost zarovnání se dá použít také takto:</p>\n<div class=\"highlight\"><pre><code>>>> "{:.5}".format("Guido van Rossum")\n'Guido'</code></pre></div><p>Můžeme specifikovat několik typů zarovnání.</p>\n<p>Zero-padded:</p>\n<div class=\"highlight\"><pre><code>>>> '{:010.2f}'.format(pi)\n'0000003.14'</code></pre></div><p>Levé, pravé a vycentrované:</p>\n<div class=\"highlight\"><pre><code>>>> print('{0:<10.2f}\\n{0:^10.2f}\\n{0:>10.2f}'.format(pi))\n3.14\n 3.14\n 3.14</code></pre></div><p>Můžeme specifikovat jakým znakem vyplníme volné místa, jako náhradu za mezeru:</p>\n<div class=\"highlight\"><pre><code>>>> "{:$^15}".format(" I WON ")\n'$$$$ I WON $$$$'</code></pre></div><p>Jak formátovat čísla se znaménky?</p>\n<div class=\"highlight\"><pre><code>>>> print('{0:-.2}\\n{1:-.2}'.format(pi, -pi)) # Default\n3.1\n-3.1\n>>> print('{0:+.2}\\n{1:+.2}'.format(pi, -pi))\n+3.1\n-3.1\n>>> print('{0: .2}\\n{1: .2}'.format(pi, -pi))\n 3.1\n-3.1</code></pre></div><p>Praktický příklad:</p>\n<div class=\"highlight\"><pre><code># Print a formatted price list with a given width\n\nwidth = int(input('Please enter width: '))\n\nprice_width = 10\nitem_width = width - price_width\n\nheader_fmt = '{{:{}}}{{:>{}}}'.format(item_width, price_width)\nfmt = '{{:{}}}{{:>{}.2f}}'.format(item_width, price_width)\n\nprint('=' * width)\n\nprint(header_fmt.format('Item', 'Price'))\n\nprint('-' * width)\n\nprint(fmt.format('Apples', 0.4))\nprint(fmt.format('Pears', 0.5))\nprint(fmt.format('Cantaloupes', 1.92))\nprint(fmt.format('Dried Apricots (16 oz.)', 8))\nprint(fmt.format('Prunes (4 lbs.)', 12)) \n\nprint('=' * width)</code></pre></div><p>Výstup:</p>\n<div class=\"highlight\"><pre><code>Please enter width: 35\n===================================\nItem Price\n-----------------------------------\nApples 0.40\nPears 0.50\nCantaloupes 1.92\nDried Apricots (16 oz.) 8.00\nPrunes (4 lbs.) 12.00\n===================================</code></pre></div><h2>Metody řetězců</h2>\n<h3>center()</h3>\n<div class=\"highlight\"><pre><code>>>> "The Middle by Jimmy Eat World".center(39)\n' The Middle by Jimmy Eat World '\n>>> "The Middle by Jimmy Eat World".center(39, "*")\n'*****The Middle by Jimmy Eat World*****'</code></pre></div><h3>find()</h3>\n<p>Vrací levý index, na kterém našel výskyt řetězce.</p>\n<div class=\"highlight\"><pre><code>>>> 'With a moo-moo here, and a moo-moo there'.find('moo')\n7\n>>> title = "Monty Python's Flying Circus"\n>>> title.find('Monty')\n0\n>>> title.find('Python')\n6\n>>> title.find('Flying')\n15\n>>> title.find('Zirquss')\n-1</code></pre></div><h3>join()</h3>\n<div class=\"highlight\"><pre><code>>>> seq = [1, 2, 3, 4, 5]\n>>> sep = '+'\n>>> sep.join(seq) # Trying to join a list of numbers\nTraceback (most recent call last):\n File "<stdin>", line 1, in ?\nTypeError: sequence item 0: expected string, int found\n>>> seq = ['1', '2', '3', '4', '5']\n>>> sep.join(seq) # Joining a list of strings\n'1+2+3+4+5'\n>>> dirs = '', 'usr', 'bin', 'env'\n>>> '/'.join(dirs)\n'/usr/bin/env'\n>>> print('C:' + '\\\\'.join(dirs))\nC:\\usr\\bin\\env</code></pre></div><p>Inverzní funkce je <em>split()</em>.</p>\n<h3>lower()</h3>\n<p>Vrací lowercase verzi řetězce:</p>\n<div class=\"highlight\"><pre><code>>>> 'Dance Floor'.lower()\n'dance floor'</code></pre></div><p>Reverzní funkce <em>upper()</em>.</p>\n<h3>replace()</h3>\n<p>Všechny výskyty hledaného řetězce jsou nahrazeny.</p>\n<div class=\"highlight\"><pre><code>>>> 'This is a test'.replace('is', 'eez')\n'Theez eez a test'</code></pre></div><h3>split()</h3>\n<div class=\"highlight\"><pre><code>>>> '1+2+3+4+5'.split('+')\n['1', '2', '3', '4', '5']\n>>> '/usr/bin/env'.split('/')\n['', 'usr', 'bin', 'env']\n>>> 'Using the default'.split()\n['Using', 'the', 'default']</code></pre></div><h3>strip()</h3>\n<p>Vrací řetězec bez prázdných znaků na začátku a na konci.</p>\n<div class=\"highlight\"><pre><code>>>> ' internal whitespace is kept '.strip()\n'internal whitespace is kept'</code></pre></div>\n\n\n " } } }