4. Character Types

4.1. str

4.1.1. Creating empty string

  • " and ' works the same
  • Unicode characters (UTF-16 or UTF-32, depending on how Python was compiled)
name = ''
name = ""

name: str = ''
name: str = ""

4.1.2. Creating string

name = 'José'       # 'José'
name = "José"       # 'José'

name: str = 'José'  # 'José'
name: str = "José"  # 'José'

4.1.3. Multiline str

names = """
    We choose to go to the Moon!
We choose to go to the Moon in this decade and do the other things, not because they are easy, but because they are hard.
"""

print(names)
# '\n    We choose to go to the Moon!\nWe choose to go to the Moon in this decade and do the other things, not because they are easy, but because they are hard.'

4.1.4. Type casting to str

str(1969)           # '1969'
str(13.37)          # '13.37'

4.2. Single or double quote?

  • " and ' works the same
  • Choose one and keep consistency in code
  • Python console uses '
  • I use ' in this book to be consistent with Python
  • doctest uses single quotes and throws error on double quotes

4.2.1. When use double quotes?

my_str = 'it\'s José\'s book'
my_str = "it's José's book"

4.2.2. When use single quotes?

  • HTML and XML uses double quotes
my_str = '<a href="http://python.astrotech.io">Python and Machine Learning</a>'

4.3. Escape characters

4.3.1. New lines

\n
\r\n
../_images/type-machine.jpg

Fig. 4.1. Why we have ‘\r\n’ on Windows?

4.3.2. Other escape characters

\x1F680     # after \x goes hexadecimal number
\U0001F680  # after \u goes four hexadecimal numbers
🚀

4.4. Characters before strings

  • Format string: since Python 3.6
  • str is a unicode
  • In Python3 u'..' = '...'
  • bytes is a sequence of octets (integers between 0 and 255)
Tab. 4.2. String modifiers
Modifier Name Description
f'...' Format string String interpolation (variable substitution), since Python 3.6
u'...' Unicode literals Used in Python 2, now only for compatibility
b'...' Bytes literals Instance of the bytes type instead of the str. Use b'...'.decode('utf-8') for conversion to unicode
r'...' Raw string Escapes does not matters
name = 'José Jiménez'

f'My name... {name}'
u'zażółć gęślą jaźń'
b'this is bytes literals'
r'(?P<foo>)\n'
r'C:\Users\Admin\file.txt'
print('C:\Users\Admin\file.txt')
# SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

# Problem: ``\Users``
#          ``s`` is invalid hexadecimal character
#          after ``\U...`` python expects unicode codepoint

4.5. print()

  • print() adds '\n' at the end

  • Prints on the screen

    print('My name... José Jiménez')
    # My name... José Jiménez
    
  • Variable substitution

    name = 'José Jiménez'
    
    print(f'My name... {name}')
    # My name... José Jiménez
    
  • Special characters

    print(f'My name...\n\t{name}')
    # My name...
    #     José Jiménez
    

Note

More in Print Formatting

4.6. String methods

4.6.1. String immutability

  • str is immutable
  • str methods create a new modified str
a = 'Python'
a.replace('P', 'J')

print(a)            # Python
a = 'Python'
b = a.replace('P', 'J')

print(a)            # Python
print(b)            # Jython
a = 'Python'
b = a.upper().replace('P', 'C').title()

print(a)            # Python
print(b)            # Cython

4.6.2. Multiplication

'José' * 3          # JoséJoséJosé
'-' * 10            # ----------

4.6.3. str.title(), str.lower(), str.upper()

  • Unify data format before analysis

    name = 'joSé jiMénEz III'
    
    name.title()    # 'José Jiménez Iii'
    name.upper()    # 'JOSÉ JIMÉNEZ III'
    name.lower()    # 'josé jiménez iii'
    

4.6.4. str.replace()

name = 'José Jiménez Iii'
name.replace('Iii', 'III')  # 'José Jiménez III'

4.6.5. strip(), lstrip(), rstrip()

name = '\tMark Watney    \n'

name.rstrip()       # '\tMark Watney'
name.lstrip()       # 'Mark Watney    \n'
name.strip()        # 'Mark Watney'

4.6.6. str.startswith() and str.endswith()

  • Understand this as “starts with” and “ends with”
name = 'José Jiménez'

name.startswith('José')
# True

name.endswith(';')
# False

4.6.7. str.split()

text = 'José Jiménez'
text.split()        # ['José', 'Jiménez']

text = 'jimenez:x:0:0:José Jiménez:/home/jimenez:/bin/bash'
text.split(':')     # ['jimenez', 'x', '0', '0', 'José Jiménez', '/home/jimenez', '/bin/bash']

4.6.8. str.join()

names = ['jimenez', 'x', '0', '0', 'José Jiménez', '/home/jimenez', '/bin/bash']

':'.join(names)
# 'jimenez:x:0:0:José Jiménez:/home/jimenez:/bin/bash'

4.6.9. str.isspace()

''.isspace()    # False
' '.isspace()   # True
'\t'.isspace()  # True
'\n'.isspace()  # True

4.6.10. str.isnumeric(), str.isdigit(), str.isdecimal()

'10'.isnumeric()    # True
'10.5'.isnumeric()  # False

'10'.isdigit()      # True
'10.5'.isdigit()    # False

'10'.isdecimal()    # True
'10.5'.isdecimal()  # False

4.6.11. str.isalpha()

'hello'.isalpha()   # True
'hello1'.isalpha()  # False

4.6.12. str in str

'th' in 'Python'     # True
'hello' in 'Python'    # False

4.6.13. len()

len('Python')   # 6
len('')         # 0
len()           # TypeError: len() takes exactly one argument (0 given)

4.7. Handling user input

  • input() returns str
  • Space at the end of prompt
name = input('Type your name: ')
  • This is a dump of distinct records of a single address

  • Is this the same address?:

    'ul. Jana III Sobieskiego'
    'ul Jana III Sobieskiego'
    'ul.Jana III Sobieskiego'
    'ulicaJana III Sobieskiego'
    'Ul. Jana III Sobieskiego'
    'UL. Jana III Sobieskiego'
    'ulica Jana III Sobieskiego'
    'Ulica. Jana III Sobieskiego'
    
    'os. Jana III Sobieskiego'
    
    'Jana 3 Sobieskiego'
    'Jana 3ego Sobieskiego'
    'Jana III Sobieskiego'
    'Jana Iii Sobieskiego'
    'Jana IIi Sobieskiego'
    'Jana lll Sobieskiego'  # three small letters 'L'
    
    'ul '
    'ul. '
    'ul.'
    'ulica'
    'Ul. '
    'UL. '
    'ulica '
    'Ulica. '
    'os. '
    'ośedle'
    'osiedle'
    'os'
    'plac '
    'pl '
    'al '
    'al. '
    'aleja '
    'alei '
    
    '1/2'
    '1 / 2'
    '1 m. 2'
    '1 apt 2'
    '1 apt. 2'
    
  • Which one is a true address?

4.8. Assignments

4.8.1. String cleaning

  1. Dane poniżej przeczyść, tak aby zmienne miały wartość 'Jana III Sobieskiego'
  2. Jak zrobić to rozwiązaniem generycznym pasującym do wszystkich? (dyskusja)
a = 'Jana III Sobieskiego 1 apt 2'
b = 'ul Jana III SobIESkiego 1/2'
c = 'ul. Jana trzeciego Sobieskiego 1/2'
d = 'ul.Jana III Sobieskiego 1/2'
e = 'ulicaJana III Sobieskiego 1/2'
F = 'UL. JANA 3 SOBIESKIEGO 1/2'
G = 'UL. III SOBiesKIEGO 1/2'
H = 'ULICA JANA III SOBIESKIEGO 1/2'
I = 'ULICA. JANA III SOBI'
j = ' Jana 3 Sobieskiego 1/2 '
k = 'Jana III Sobieskiego 1 m. 2'
l = ' 1/2'

4.8.2. Variables and types

  1. Wczytaj od użytkownika imię

  2. Za pomocą f-string formatting wyświetl na ekranie:

    '''My name... "José Jiménez".
            I'm an """astronaut!"""'''
    
  3. Uwaga! Druga linijka zaczyna się od tabulacji

  4. Gdzie wartość w podwójnym cudzysłowiu to ciąg od użytkownika (w przykładzie użytkownik wpisał José Jiménez)

  5. Zwróć uwagę na znaki apostrofów, cudzysłowów, tabulacji i nowych linii

  6. W ciągu do wyświetlenia nie używaj spacji ani enterów - użyj \n i \t

  7. Tekst wyświetlony na ekranie ma mieć zamienione wszystkie spacje na _

  8. Tekst wyświetlony na ekranie ma być w UPPERCASE

  9. Nie korzystaj z dodawania stringów (str + str)

  10. Następnie znów wyświetl na ekranie wynik, tym razem z podmienionymi spacjami:

    '''MY_NAME_"JOSÉ_JIMÉNEZ".
    _I'M_AN_"""ASTRONAUT!"""'''
    
About:
  • Filename: types_input.py
  • Lines of code to write: 4 lines
  • Estimated time of completion: 10 min
The whys and wherefores:
 
  • Definiowanie zmiennych
  • Korzystanie z print formatting
  • Wczytywanie tekstu od użytkownika