Строки как последовательности символов. Урок 9

Основы программирования на Python

Строки уже упоминались в уроке о типах данных; рассмотрим их более подробно.

Строка — это сложный тип данных, представляющий собой последовательность символов.

Строки в языке программирования Python могут заключаться как в одиночные, так и двойные кавычки. Однако, начало и конец строки должны обрамляться одинаковым типом кавычек.

Существует специальная функция len(), позволяющая измерить длину строки. Результатом выполнения данной функции является число, показывающее количество символов в строке.

Также для строк существуют операции конкатенации (+) и дублирования (*).

>>> len('It is a long string')
19
>>> '!!!' + ' Hello World ' + '!!!'
'!!! Hello World !!!'
>>> '-' * 20
'--------------------'
>>>

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

>>> 'morning, afternoon, night'[1]
'o'
>>> tday = 'morning, afternoon, night'
>>> tday[4]
'i'
>>> 

В примере, выражение 'morning, afternoon, night'[1] привело к извлечению второго символа. Дело в том, что индексация начинается не с единицы, а с нуля. Поэтому, когда требуется извлечь первый символ, то оператор индексирования должен выглядеть так: [0]. Также позволительно извлекать символы, начиная отсчет с конца. В этом случае отсчет начинается с -1 (последний символ).

>>> tday_ru = 'утро, день, ночь'
>>> tday_ru[0]
'у'
>>> tday_ru[-1]
'ь'
>>> tday_ru[-3]
'о'
>>> 

Очевидно, что удобнее работать не с самими строками, а с переменными, которые на них ссылаются. Результат выполнения выражения индексирования можно присвоить другой переменной.

>>> a = "very big string"
>>> a[6]
'i'
>>> b = a[0]
>>> b
'v'
>>> 

Можно извлекать из строки не один символ, а несколько, т.е. получать срез (подстроку). Оператор извлечения среза из строки выглядит так: [X:Y]. X – это индекс начала среза, а Y – его окончания; причем символ с номером Y в срез уже не входит. Если отсутствует первый индекс, то срез берется от начала до второго индекса; при отсутствии второго индекса, срез берется от первого индекса до конца строки.

>>> tday = 'morning, afternoon, night'
>>> tday[0:7]
'morning'
>>> tday[9:-7]
'afternoon'
>>> tday[-5:]
'night'
>>> 

Кроме того, можно извлекать символы не подряд, а через определенное количество символов. В таком случае оператор индексирования выглядит так: [X:Y:Z]; Z – это шаг, через который осуществляется выбор элементов.

>>> str4 = "Full Ball Fill Pack Ring"
>>> str4[::5]
'FBFPR'
>>> str4[0:15:2]
'Fl alFl '
>>> 

Практическая работа

  1. Свяжите переменную с любой строкой, состоящей не менее чем из 8 символов. Извлеките из строки первый символ, затем последний, третий с начала и третий с конца. Измерьте длину вашей строки.
  2. Присвойте произвольную строку длиной 10-15 символов переменной и извлеките из нее следующие срезы:
    - первые восемь символов;
    - четыре символа из центра строки;
    - символы с индексами кратными трем.

Присвойте произвольную строку

Присвойте произвольную строку длиной 10-15 символов переменной и извлеките из нее следующие срезы:
- четыре символа из центра строки;

a = input("Введите текст")
b = int(len(a))
c = int((b - 4) / 2)
d = c + 4
print (a[c:d])

stroka = 'Would you

stroka = 'Would you kindly...'
#vivod pervih vosmi simvolov
print('pervie8: ' + stroka[0:7:])
#vivod seredini
print('seredina: ' + stroka[int(len(stroka)/2)-2:int(len(stroka)/2)+2:])
#vivod kratnih trem (stroka[::3] vivodit nevernie znacheniya)
i = 1
str1 = ''
while i <= len(stroka):
    if i%3 == 0:
        str1 = str1 + stroka[i-1]
    i = i + 1
print('kratnie 3: ' + str1)

по заданию получается сложнее

по заданию получается сложнее задача стоит и без интернетов тут не обойтись...
единственный вопрос возник с нахождением середины... решил так, но чувствую, что есть более красивое решение..

import random
import string
 
def id_generator(size=random.randrange(10,15), chars=string.ascii_uppercase + string.digits + string.ascii_lowercase):
    return ''.join(random.choice(chars) for x in range(size))
 
a=id_generator()
print ("Случайная строка: ",a)
 
a=str(a)
print ("Первые восемь символов: ",a[0:8])
half = round((len(a)-1)/2,0)
half= str(half)
half=half[0]
half=int(half)
h1 = half-2
h2 = half+2
print ("4 символа из середины: ", a[h1:h2])
print ("символы с индексом кратным 3: ", a[::3])

Вот 2 задание -2 пункт вызвал

Вот 2 задание
-2 пункт вызвал сложности, у кого ошибка при деление строки на половину нада использовать два "//" а не "/".

x=input()
print("pervui 8 simvol-",x[:7],)
print(' 4 simvola iz centra-',x[((len(x)//2)-2):((len(x)//2)+2)])
print(" Kratni 3 indexu",x[::3])
input()

А индексы, кратные трем

А индексы, кратные трем должны же начинаться с третьего индекса, а не с нулегого, т. е.

str1 = 'somestring'
slice3 = [3::3]
print(slice3) #Выведет 'erg'

ноль кратен любому числу

ноль кратен любому числу кроме нуля( на ноль вообще делить нельзя)ноль делится на любое число

Вот мои варианты решения

Вот мои варианты решения заданий в python 2.7
1 задание

x1 = raw_input("What is your name? ")
y1 = raw_input("How old are you? ")
z1 = raw_input("Where are you live?" )
print "This is ",x1
print "It is ",y1
print "He live in ",z1

2 задание

print u"Привет"
print u"Сегодня вам нужно решить пример:"
x = input("4*100-54=")
if x = 346:
    print u"Поздравляю, вы решили пример правильно =)"
else:
    print u"Вы решили пример не правильно. =("

3 задание

print u"Привет"
print u"Сегодня вам нужно решить пример:"
x = input("4*100-54=")
while x != 346:
    print u"Вы решили пример не правильно. =("
    print u"Попробуйте ещё раз!"
    x = input("4*100-54=")
print u"Поздравляю, вы решили пример правильно =)"

#!/usr/bin/env python tex =

#!/usr/bin/env python
tex = "123456789abcde"
n = len(tex)/2
s1 = tex[0:8]
s2 = tex[n-4:n]+tex[-n:-n+4]
s3 = tex[::3]
print s1
print s2
print s3

У меня случилось как то так.
С не очень четной длины строкой будет лажа конечно но я не придумал пока как ее разрулить((

а почему не так

а почему не так сделать

n=len(tex)//2

как по мне будет нормально

Прошу прощения чего то я себе

Прошу прощения чего то я себе не верно понял задание и начал выводить 8 символов в средине(

ну, ты был на правильном

ну, ты был на правильном пути.Я сделал так :
 tex[n-2:n+2]
Вроде работает, только нужно, чтобы строка имело парное количество символов :)

a="there are

a="there are difference"
print a,'\n',a[0],'\n',a[-1],'\n',a[2],'\n',a[-3],'\n',len(a)
print ()
b="there is many places in the world"
print b[:8]
c= b[(len(b)/2-2):(len(b)/2+2)]
print b[::3]

2 Ivan! Походу версия твоего

2 Ivan! Походу версия твоего питона не 3.х! В Python 2.7 IDLE print() выдает (). И зачем в своем примере Ты с=b... Если в итоге все равно считываешь с b?

Здесь в c просто сохраняется

Здесь в c просто сохраняется результат операции. Далее его можно будет вывести.

Кстати элегантное решение для вывода символов из центра строки: b[(len(b)/2-2):(len(b)/2+2)]. Формулу можно использовать для любой строки.

Вот мой вариант var =

Вот мой вариант

var = ("123456789abcd")
 
var1 = var[:8]
var2 = var[(len(var)/2 - 2):(len(var)/2 + 2)]
var3 = var[::3]
print(var1,"\n",var2,"\n",var3)

Выдает следущее:
TypeError: slice indices must be integers or None or have an __index__ method

Помогите найти ошибку.

так же. вроде все логично.

так же. вроде все логично. вроде все правильно, а выдает ошибку. питон3,3

решение

1)

a='privet prometey'
b=a[0]
x=a[-1]
z=a[2]
c=a[-3]
v=len(a)
print (a)
print (b,x,z,c,v)

2)
a='0123456789abcd'
b=a[:8]
c=a[5:9]
z=a[::3]
print(a)
print(b,c,z)

Оператор извлечения среза из строки выглядит так: [X:Y]. X – это индекс начала среза, а Y – его окончания; причем символ с номером Y в срез уже не входит.

Не совсем понял,символ Y в срез входит,нюанс возникает только при символе X (не стоит забывать о нумерации символов с "0")

в строке "Оператор извлечения

в строке "Оператор извлечения среза из строки выглядит так: [X:Y)" - последняя скобочка является опечаткой, судя по всему.

исправлено

Это не опечатка. В математике, когда значение не входит в диапазон, то оно "обрамляется" круглой, а не квадратной скобкой.
При этом ситнаксис взятия среза на языке программирования Python всегда в квадратных скобках.
Там просто не грамотно сформулировано, что может ввести в заблуждение.

Ребята, здесь учимся

Ребята, здесь учимся программировать, причем на конкретном языке python. Так что давайте использовать синтаксис этого языка, а не математический.