8000 add string stuff · jackzhang2000/python-tutorial@95810cc · GitHub
[go: up one dir, main page]

Skip to content

Commit 95810cc

Browse files
committed
add string stuff
1 parent 4bd0e2d commit 95810cc

File tree

8 files changed

+355
-0
lines changed
  • 8 files changed

    +355
    -0
    lines changed

    handy-stuff-strings.md

    Lines changed: 355 additions & 0 deletions
    Original file line numberDiff line numberDiff line change
    @@ -0,0 +1,355 @@
    1+
    # Handy stuff: Strings
    2+
    3+
    Python strings are just pieces of text.
    4+
    5+
    ```py
    6+
    >>> our_string = "Hello World!"
    7+
    >>> our_string
    8+
    'Hello World!'
    9+
    >>>
    10+
    ```
    11+
    12+
    So far we know how to add them together.
    13+
    14+
    ```py
    15+
    >>> "I said: " + our_string
    16+
    'I said: Hello World!'
    17+
    >>>
    18+
    ```
    19+
    20+
    We also know how to repeat them multiple times.
    21+
    22+
    ```py
    23+
    >>> our_string * 3
    24+
    'Hello World!Hello World!Hello World!'
    25+
    >>>
    26+
    ```
    27+
    28+
    Also note that everything returns a new string, and the original string
    29+
    is never modified.
    30+
    31+
    ```py
    32+
    >>> our_string = "Hello World!"
    33+
    >>> our_string
    34+
    'Hello World!'
    35+
    >>>
    36+
    ```
    37+
    38+
    Python strings are **immutable**. That's basically a fancy way to say that
    39+
    they cannot be changed in-place, and you need to create a new string to
    40+
    change them. Even `some_string += another_string` creates a new string.
    41+
    Python will treat that as `some_string = some_string + another_string`,
    42+
    so it creates a new string but it puts it back to the same variable.
    43+
    44+
    `+` and `*` are nice, but what else can we do with strings?
    45+
    46+
    ## Slicing
    47+
    48+
    Slicing is really simple. It just means getting a part of the string.
    49+
    For example, to get all characters between the second place between the
    50+
    characters and the fifth place between the characters, we can do this:
    51+
    52+
    ```py
    53+
    >>> our_string[2:5]
    54+
    'llo'
    55+
    >>>
    56+
    ```
    57+
    58+
    So the syntax is like `some_string[start:end]`.
    59+
    60+
    This picture shows you how the slicing works:
    61+
    62+
    ![Slicing with non-negative values](images/slicing1.png)
    63+
    64+
    But what happens if we slice with negative values?
    65+
    66+
    ```py
    67+
    >>> our_string[-5:-2]
    68+
    'orl'
    69+
    >>>
    70+
    ```
    71+
    72+
    It turns out that slicing with negative values simply starts counting
    73+
    from the end of the string.
    74+
    75+
    ![Slicing with negative values](images/slicing2.png)
    76+
    77+
    If we don't specify the beginning it defaults to 0, and if we don't
    78+
    specify the end it defaults to the length of the string. For example, we
    79+
    can get everything except the first or last character like this:
    80+
    81+
    ```py
    82+
    >>> our_string[1:]
    83+
    'ello World!'
    84+
    >>> our_string[:-1]
    85+
    'Hello World'
    86+
    >>>
    87+
    ```
    88+
    89+
    Remember that strings can't be changed in-place.
    90+
    91+
    ```py
    92+
    >>> our_string[:5] = 'Howdy'
    93+
    Traceback (most recent call last):
    94+
    File "<stdin>", line 1, in <module>
    95+
    TypeError: 'str' object does not support item assignment
    96+
    >>>
    97+
    ```
    98+
    99+
    There's also a step argument we can give to our slices, but I'm not
    100+
    going to talk about it in this tutorial.
    101+
    102+
    ## Indexing
    103+
    104+
    So now we know how slicing works. But what happens if we forget the `:`?
    105+
    106+
    ```py
    107+
    >>> our_string[1]
    108+
    'e'
    109+
    >>>
    110+
    ```
    111+
    112+
    That's interesting. We got a string that is only one character long. But
    113+
    the first character of `Hello World!` should be `H`, not `e`, so why did
    114+
    we get an e?
    115+
    116+
    Prograhttps://pyformat.info/mming starts at zero. Indexing strings also starts at zero. The
    117+
    first character is `our_string[0]`, the second character is
    118+
    `our_string[1]`, and so on.
    119+
    120+
    So string indexes work like this:
    121+
    122+
    ![Indexing with non-negative values](images/indexing1.png)
    123+
    124+
    How about negative values?
    125+
    126+
    ```py
    127+
    >>> our_string[-1]
    128+
    '!'
    129+
    >>>
    130+
    ```
    131+
    132+
    But why didn't that start at zero? `our_string[-1]` is the last
    133+
    character, but `our_string[1]` is not the first character!
    134+
    135+
    That's because 0 and -0 are equal, so indexing with -0 would do the same
    136+
    thing as indexing with 0.
    137+
    138+
    So indexing with negative values works like this:
    139+
    140+
    ![Indexing with negative values](images/indexing2.png)
    141+
    142+
    ## The in keyword
    143+
    144+
    We can use `in` and `not in` to check if a string contains another
    145+
    string:
    146+
    147+
    ```py
    148+
    >>> "Hello" in our_string
    149+
    True
    150+
    >>> "Python" in our_string
    151+
    False
    152+
    >>> "Python" not in our_string
    153+
    True
    154+
    >>>
    155+
    ```
    156+
    157+
    ## String methods
    158+
    159+
    Python's strings have many useful methods. [The official documentation]
    160+
    (https://docs.python.org/3/library/stdtypes.html#string-methods) covers
    161+
    them all, but I'm going to just show some of the most commonly used ones
    162+
    briefly. **You don't need to remember all of these string methods, just
    163+
    learn to use the link above so you can find them when you need them.**
    164+
    Python also comes with built-in documentation about the string methods.
    165+
    You can run `help(str)` to read it.
    166+
    167+
    Remember that nothing can modify strings in-place. Most string methods
    168+
    return a new string, but things like `our_string = our_string.upper()`
    169+
    still work because the new string is assigned to the old variable.
    170+
    171+
    Here's some of the most commonly used string methods:
    172+
    173+
    - `upper` and `lower` can be used for converting to uppercase and
    174+
    lowercase.
    175+
    176+
    ```py
    177+
    >>> our_string.upper()
    178+
    'HELLO WORLD!'
    179+
    >>> our_string.lower()
    180+
    'hello world!'
    181+
    >>>
    182+
    ```
    183+
    184+
    - To check if a string starts or ends with another string we could just
    185+
    slice the string and compare with to the slice.
    186+
    187+
    ```py
    188+
    >>> our_string[:5] == 'Hello'
    189+
    True
    190+
    >>> our_string[-2:] == 'hi'
    191+
    False
    192+
    >>>
    193+
    ```
    194+
    195+
    But that gets a bit complicated if we don't know the length of the
    196+
    substring beforehand.
    197+
    198+
    ```py
    199+
    >>> substring = 'Hello'
    200+
    >>> our_string[:len(substring)] == substring
    201+
    True
    202+
    >>> substring = 'hi'
    203+
    >>> our_string[-len(substring):] == substring
    204+
    False
    205+
    >>>
    206+
    ```
    207+
    208+
    That's why it's recommended to use `startswith` and `endswith`:
    209+
    210+
    ```py
    211+
    >>> our_string.startswith('Hello')
    212+
    True
    213+
    >>> our_string.endswith('hi')
    214+
    False
    215+
    >>>
    216+
    ```
    217+
    218+
    - If we need to find out where a substring is located, we can do that
    219+
    with `index`:
    220+
    221+
    ```py
    222+
    >>> our_string.index('World')
    223+
    6
    224+
    >>> our_string[6:]
    225+
    'World!'
    226+
    >>>
    227+
    ```
    228+
    229+
    - The `join` method joins a list of other strings. We'll talk more about
    230+
    lists later.
    231+
    232+
    ```py
    233+
    >>> '-'.join(['Hello', 'World', 'test'])
    234+
    'Hello-World-test'
    235+
    >>>
    236+
    ```
    237+
    238+
    The `split` method is the opposite of joining, it splits a string to
    239+
    a list.
    240+
    241+
    ```py
    242+
    >>> 'Hello-World-test'.split('-')
    243+
    ['Hello', 'World', 'test']
    244+
    >>>
    245+
    246+
    - Last but not least, we can use `strip`, `lstrip` and `rstrip` to
    247+
    remove spaces, newlines and some other whitespace characters from
    248+
    the end of a string. `lstrip` strips from the left side, `lstrip`
    249+
    strips from the right side and `strip` strips from both sides.
    250+
    251+
    ```py
    252+
    >>> ' hello 123 \n '.lstrip()
    253+
    'hello 123 \n '
    254+
    >>> ' hello 123 \n '.rstrip()
    255+
    ' hello 123'
    256+
    >>> ' hello 123 \n '.strip()
    257+
    'hello 123
    258+
    >>>
    259+
    ```
    260+
    261+
    It's also possible to combine string methods with slicing and other
    262+
    string methods:
    263+
    264+
    ```py
    265+
    >>> our_string.upper()[:7].startswith('HELLO')
    266+
    True
    267+
    >>>
    268+
    ```
    269+
    270+
    ## String formatting
    271+
    272+
    To add a string in the middle of another string, you can do something
    273+
    like this:
    274+
    275+
    ```py
    276+
    >>> name = 'Akuli'
    277+
    >>> 'My name is ' + name + '.'
    278+
    'My name is Akuli.'
    279+
    >>>
    280+
    ```
    281+
    282+
    But that gets complicated if you have many things to add.
    283+
    284+
    ```py
    285+
    >>> channel = '##learnpython'
    286+
    >>> network = 'freenode'
    287+
    >>> "My name is " + name + " and I'm on the " + channel + " channel on " + network + "."
    288+
    "My name is Akuli and I'm on the ##learnpython channel on freenode."
    289+
    >>>
    290+
    ```
    291+
    292+
    Instead it's recommended to use string formatting. It means putting
    293+
    other things in the middle of a string.
    294+
    295+
    Python has two ways to format strings. One is not better than the other,
    296+
    they are just different. The two ways are:
    297+
    298+
    - `.format()`-formatting, also known as new-style formatting. This
    299+
    formatting style has a lot of features, but it's a little bit more
    300+
    typing than `%s`-formatting.
    301+
    302+
    ```py
    303+
    >>> "Hello {}.".format(name)
    304+
    'Hello Akuli.'
    305+
    >>> "My name is {} and I'm on the {} channel on {}.".format(name, channel, network)
    306+
    "My name is Akuli and I'm on the ##learnpython channel on freenode."
    307+
    >>>
    308+
    ```
    309+
    310+
    - `%s`-formatting, also known as printf-formatting and old-style
    311+
    formatting. This has less features than `.format()`-formatting, but
    312+
    `'Hello %s.' % name` is shorter and faster to type than
    313+
    `'Hello {}.'.format(name)`.
    314+
    315+
    ```py
    316+
    >>> "Hello %s." % name
    317+
    'Hello Akuli.'
    318+
    >>> "My name is %s and I'm on the %s channel on %s." % (name, channel, network)
    319+
    "My name is Akuli and I'm on the ##learnpython channel on freenode."
    320+
    >>>
    321+
    ```
    322+
    323+
    Both formatting styles have many other features also:
    324+
    325+
    ```py
    326+
    >>> 'Three zeros and number one: {:04d}'.format(1)
    327+
    'Three zeros and number one: 0001'
    328+
    >>> 'Three zeros and number one: %04d' % 1
    329+
    'Three zeros and number one: 0001'
    330+
    >>>
    331+
    ```
    332+
    333+
    If you need to know more about formatting I recommend reading
    334+
    [this](https://pyformat.info/).
    335+
    336+
    ## Summary
    337+
    338+
    - Slicing returns a copy of a string with indexes from one index to
    339+
    another index. The indexes work like this:
    340+
    341+
    ![Slicing](images/slicing3.png)
    342+
    343+
    - Indexing returns one character of a string. Remember that you don't
    344+
    need a `:` with indexing. The indexes work like this:
    345+
    346+
    ![Indexing](images/indexing3.png)
    347+
    348+
    - The `in` keyword can be used for checking if a string contains another
    349+
    string.
    350+
    351+
    - Python has many string methods. Use [the documentation]
    352+
    (https://docs.python.org/3/library/stdtypes.html#string-methods)
    353+
    when you don't rememeber something about them.
    354+
    355+
    - String formatting means adding other things to the middle of a string.

    images/drawings.odg

    15.2 KB
    Binary file not shown.

    images/indexing1.png

    10.7 KB
    Loading

    images/indexing2.png

    10.8 KB
    Loading

    images/indexing3.png

    17 KB
    Loading

    images/slicing1.png

    11 KB
    Loading

    images/slicing2.png

    10.9 KB
    Loading

    images/slicing3.png

    17.4 KB
    Loading

    0 commit comments

    Comments
     (0)
    0