MicroPython: Строители навыков — #9 Строки

MicroPython Skill Builders — Строки

Добро пожаловать в девятый выпуск серии «Строители навыков MicroPython» от Тони Гудью, цель которой — улучшить ваши навыки программирования на MicroPython с одновременным знакомством с новыми компонентами и техниками кодирования — с использованием Raspberry Pi Pico!

Сегодня Тони покажет, как создавать и манипулировать строками в MicroPython.

Что вам понадобится

Предполагается, что вы уже установили Thonny на компьютер и настроили Raspberry Pi Pico с последней прошивкой MicroPython (UF2). Если нет — обратитесь к руководству по началу работы с Raspberry Pi Pico, где это подробно описано.

Вам понадобится:

  • Raspberry Pi Pico с контактными штырями

  • Кабель Micro-USB (для питания и программирования Pico)

Что такое строки?

Строки — это последовательность символов, которой присваивается имя переменной, и которой в MicroPython можно манипулировать аналогично спискам.

Вот простой пример строки:

mystring = "I am a string"

Давайте запустим пример программы, чтобы показать, что можно делать со строками. Откройте новую программу в Thonny и вставьте следующий короткий код:

# A string is a sequence of characters
ss = "ThePiHut.com" # A literal string definition

# Here the variable ss contains the sequence of characters between the quotation marks.
print()
print(ss)

# We can convert numbers into strings with function str(n).
fps = str(3.142) # Floating point number
ins = str(27)    # Integer or whole number

# Making longer stings from smaller strings by concatenation – comma separators
ls = ss + "," + fps + "," + ins
print(ls)

# Obtain the number of characters ins a string with len(s)
length = len(ls)
print("\nLength of string:", length,"\n") # "\n" takes a new line

# Create string from ASCII numbers
t = chr(84)+chr(111)+chr(110)+chr(121)
print(t + "\n")

# Obtain ASCII character codes from string
for p in range(len(t)):
    print(t[p], ord(t[p])) # ord() converts a character to its ASCII value = opposite of chr()

Это даёт следующий вывод в окне Shell:

ThePiHut.com
ThePiHut.com,3.142,27

Length of string: 21

Tony

T 84
o 111
n 110
y 121

Процедуры и функции для работы со строками

В приведённом выше коде используются следующие процедуры и функции:

Функция

Описание

string = str(number)

Преобразует число в строку

n = int(string)

Преобразует подходящую строку в целое число

n2 = float(string)

Преобразует подходящую строку в число с плавающей точкой

length = len(string)

Вычисляет длину строки = количество символов

st = chr(ascii no)

Создаёт символ строки из его ASCII-кода

ascii_no = ord(character)

Вычисляет ASCII-код из заданного символа строки

Объединение строк

Мы можем создать длинную строку из других строк, соединяя их вместе — конкатенацией — с помощью оператора +:

long_string = chr(84) + " Goodhew" + "\n"

В примере выше последняя часть \n — это символ новой строки при выводе. ASCII-код 84 — это заглавная буква T.

Запомните! ASCII расшифровывается как American Standard Code for Information Interchange (Американский стандартный код для обмена информацией).

Разбивка строк (подстроки)

Зачастую нам нужно разбить длинную строку на более мелкие части. Существует несколько методов и инструкций для решения этой задачи.

Мы используем синтаксис txt[start : end], где start и end — позиции внутри строки (один из них можно опустить, и тогда будет принято соответствующее крайнее значение строки).

Запустите приведённый ниже код, а затем прочитайте объяснение:

# Working with sub-strings

# Define some strings
txt = "Raspberry Pi Pico @ £3.95: a terrific board"
nos = "0123456789012345678901234567890123456789012 | Left to right" # Character counter
rev = "2109876543210987654321098765432109876543210 | Right to left" # Reverse character counter
nl = "\n"

# Print them out with one line of code
print(nos + nl + txt + nl + rev + nl)

# Find number of characters in a string
length = len(txt)
print("Length:",length)

#Find the position of a specific character in a string
a = txt.find("@")  # Where is the @ character
print("@ is at position:",a)

p = txt.find("£")  # Where is the £ character
print("£ is at position:",p)

c = txt.find(":")  # Where is the : character
print(": is at position:",c)

x = txt.find("%")
print("% is at position:",x,"NOT found")

# Extract the eleventh character from the string
ch = txt[10]
print("Eleventh character is:",ch) # Computers count from ZERO!

# Extract the cost of a Pico = positions: 20 to 24
sub = txt[p:c] # Extract characters from p to c-1
print(sub)

# Extract the first word
sp = txt.find(" ")
print("First word: " + txt[:sp])

# Extract last word, whch starts at position 38
print("Last word: " + txt[38:])
print("Last word: " + txt[-5:],"- Method 2") # Last 5 characters - count backwards 0 to 4!

Приведённый выше код даёт следующий вывод:

0123456789012345678901234567890123456789012 | Left to right
Raspberry Pi Pico @ £3.95: a terrific board
2109876543210987654321098765432109876543210 | Right to left

Length: 43
@ is at position: 18
£ is at position: 20
: is at position: 25
% is at position: -1 NOT found
Eleventh character is: P
£3.95
First word: Raspberry
Last word: board
Last word: board - Method 2

Краткая шпаргалка

Вот небольшая шпаргалка, которая может оказаться полезной при написании собственного кода.

Примечание: будьте очень внимательны с номерами позиций — они на единицу больше, чем можно ожидать. Помните, что первый символ находится на позиции 0.

length = len(txt)  # Length of string
c = txt.find(":")  # Where is the : character?  | -1 if not found
sub = txt[p:c]     # Extract characters from p to c-1
ch = txt[10]       # Extract the eleventh character – counting from zero
last5 = txt[-5:]   # Counting back from the far end with a negative number

Проект — Извлечение отдельных слов из длинной строки

Рассмотрим пример проекта, в котором мы хотим извлечь отдельные слова из длинной строки.

Запустите приведённый ниже код, а затем прочитайте объяснение:

# Extract individual 'words' from a string to a list

txt = "Raspberry Pi Pico @ £3.95: a terrific board"
print(txt+"\n")    # Print the original string and new line
list = []

space =" "
while True:
    sp = txt.find(space)       # Is there a space character?

    if sp >= 0:                # We found a 'space' character
        extract = txt[0:sp]    # Extract the 'word' in front of the space
        print(extract)         # Print the 'word' extracted
        list.append(extract)   # Append the 'word' to the end of the list
        txt = txt[sp+1:]       # Remove the 'word' and the 'space' from txt
        print(txt+"\n")        # Print the shorter txt string
    else:
        list.append(txt)       # Append the remaining 'word'
        break                  # Break out of loop

print("The list\n",list, "\n") # Print the list

print("The individual'words' from the list")
for i in range(len(list)):
    print("   ", list[i])

Приведённый выше код даёт следующий вывод:

Raspberry Pi Pico @ £3.95: a terrific board

Raspberry
Pi Pico @ £3.95: a terrific board

Pi
Pico @ £3.95: a terrific board

Pico
@ £3.95: a terrific board

@
£3.95: a terrific board

£3.95:
a terrific board

a
terrific board

terrific
board

The list
 ['Raspberry', 'Pi', 'Pico', '@', '\xa33.95:', 'a', 'terrific', 'board']

The individual'words' from the list
    Raspberry
    Pi
    Pico
    @
    £3.95:
    a
    terrific
    board

Теперь попробуйте запустить программу с другой текстовой строкой, например, знаменитой «The quick brown fox jumped over the lazy dog».

Код хорошо прокомментирован, так что вы сможете проследить каждый шаг.

Что попробовать

  • s = «1234,23.23,12,0.0045,9999,45,23» — Измените последнюю программу так, чтобы извлечь числа из этой строки и поместить их в список. Выведите список и среднее значение чисел в нём.

  • Выведите элементы списка в обратном порядке.

  • list = [15, 27, 45.76, -34.2, 108.7] — Преобразуйте список чисел в строку, где значения разделены символом «~» (тильда). Выведите строку.

В следующем уроке серии «Строители навыков» мы рассмотрим файлы и запись данных.

Об авторе

Эта статья написана Тони Гудью. Тони — учитель информатики на пенсии, начавший писать код ещё в 1968 году, когда это называлось программированием — он начинал с FORTRAN IV на IBM 1130! Активный участник сообщества Raspberry Pi, его основные интересы сейчас — программирование на MicroPython, путешествия и фотография.