Автор — Грэг Валтерс (Greg Walters)

В прошлом уроке мы рассмотрели простую программу, которая использовала input для получения ответа пользователя, простые типы переменных и простой цикл «for». В этом уроке мы рассмотрим ещё больше типов переменных и напишем ещё больше программ.

Списки

Давайте рассмотрим другой тип переменных, который называется списки. В других языках программирования они называются массивами. Если мы обратимся к аналогии с коробками для обуви, то массив (список) представляет собой несколько склеенных друг с другом коробок с одинаковыми вещами. Например, в одной коробке лежат вилки, в другой — ножи, в третьей — ложки. Посмотрим на простой список— список месяцев. Мы запрограммируем его так:

months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']

Чтобы создать список, мы заключили все значения в квадратные скобки ( '[' и ']' ). Мы назвали наш список 'months'. Чтобы использовать список, мы дадим команду print months[0] или months[1] (которые выведут на экран 'Jan' или 'Feb'). Помните: счет начинается с нуля. Чтобы найти длину списка, можно использовать такую функцию:

print (len(months))

которая вернёт 12.

Ещё один пример списков — категории в поваренной книге. Например…

categories = ['Main dish','Meat','Fish','Soup','Cookies']

Таким образом, в categories[0] хранится 'Main dish', а в categories[4] — 'Cookies'. Всё очень просто. Я уверен, вы сможете придумать много других примеров использования списков.

До сих пор мы создавали списки, хранящие строки. Также можно создать списки, содержащие числа. Опираясь на список месяцев, мы сможем создать список дней в каждом из месяцев.

DaysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]

Если мы захотим напечатать DaysInMonth[1] (для февраля), мы получим 28 — целое число. Обратите внимание, что я назвал список DaysInMonth. Я мог бы называть список 'daysinmonth' или даже 'X'… но такие названия нелегко читать. Правила хорошего программирования (их каждый истолковывает по-своему) гласят, что имена переменных должны быть легко читаемы. Мы обсудим их позже и также чуть позже мы поиграемся со списками.

До того, как мы перейдём к следующему примеру, давайте узнаем ещё кое-что о Python.

Больше о строках

Мы обсудили немного строки в части 1. Теперь давайте познакомимся с ними поближе. Строка — это набор символов и ничего более. В принципе можно рассматривать строки как массив из символов. Например, если мы присвоим переменной strng значение 'The time has come' и захотим посмотреть второй символ строки, то можно набрать:

strng = 'The time has come'
print (strng[1])

Результат будет символ 'h'. Запомните: счёт начинается с 0, поэтому первый символ обозначается [0], второй — [1], третий — [2], и так далее. Если мы хотим отобразить символы начиная с положения 4 и заканчивая положением 8, то набираем:

print (strng[4:8])

результат будет 'time'. Как цикл for из первой части, счет остановится на 8, но не возвращает восьмой символ, которым является пробел после 'time'.

Чтобы найти длину строки используем функцию len():

print (len(strng))

Результатом будет 17. Если мы хотим найти, где в строке находится слово 'time', то набираем

pos = strng.find('time')

Теперь переменная pos равна 4, что означает, что строка 'time' в нашей строке начинается в положении 4. Если мы захотим найти слово или последовательность, которых нет в строке, как например:

pos = strng.find('apples')

значение переменной pos будет равно -1.

При помощи команды split можно получить отдельные слова в строке. Разделим строку по пробелам командой:

print (strng.split(' '))

которая вернёт список, состоящий из ['The', 'time', 'has', 'come']. Это очень мощная команда. Есть и другие операции над строками, которые мы рассмотрим позже.

Подстановка переменных

Есть ещё одна вещь, о которой я хочу рассказать до того, как мы перейдём к следующей программе-примеру. Если мы хотим напечатать строку, включающую текст и переменную, можно использовать подстановку переменных. Это просто. Если мы хотим подставить строку, мы пишем '%s' и затем говорим Python, что надо подставить. Например, чтобы напечатать название месяца из нашего списка, можно использовать:

print ('Month = %s' % months[0])

Эта команда выведет 'Month = Jan'. Если хотите подставить целое число, используйте '%d'. Рассмотрим пример ниже:

Months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
DaysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]
for cntr in range(0,12):
    print ('%s has %d days.' % (Months[cntr],DaysInMonth[cntr]))

Вывод этой программы:

Jan has 31 days.
Feb has 28 days.
Mar has 31 days.
Apr has 30 days.
May has 31 days.
Jun has 30 days.
Jul has 31 days.
Aug has 31 days.
Sep has 30 days.
Oct has 31 days.
Nov has 30 days.
Dec has 31 days.

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

st = 'The time has come'

или так:

st = "The time has come"

разницы никакой нет. Но если надо включить в строку одинарную кавычку, как в примере ниже:

st = 'He said he's on his way'

вы увидите ошибку синтаксиса. Надо делать так:

st = "He said he's on his way"

Думайте о кавычках так. Чтобы определить строку, нужно поместить её между кавычками — одна в начале строки, а другая в конце — и они должны совпадать. Если вам надо вставить кавычки внутрь, используйте другой тип внешних кавычек, как в примере сверху. У вас может появиться вопрос, а если я захочу определить строку подобную “She said “Don't Worry””? В таком случае можно определить её так:

st = 'She said "Don\'t Worry"'

Обратите внимание на обратный слэш перед одинарной кавычкой в 'Don't'. Он называется экранирующим символом и сообщает Python, что в этом случае надо напечатать одинарную кавычку, не считая её разграничителем строк. Существует много последовательностей управляющих символов. Некоторые из них: '\n' — новая строка, '\t' — табуляция. Мы рассмотрим их в одном из следующих примеров.

Назначение и сравнение

Чтобы понять следующий пример, нам надо узнать ещё кое-что. Во-первых, разницу между назначением и сравнением. Мы уже много раз использовали назначение в наших примерах. Если мы хотим присвоить переменной какое-либо значение, то используем оператор назначения — '=' (знак равно):

переменная = значение

Но если мы хотим сравнить переменную и значение, то используем оператор сравнения. Давайте проверим, равна ли переменная определённому значению. Для этого мы используем '==' (два знака равенства):

переменная == значение

Если у нас есть переменная под названием loop и мы хотим проверить, равна ли она 12, то мы используем:

if loop == 12:

Не думайте пока об if и двоеточии в этом примере. Просто запомните: для сравнения мы используем два знака равенства.

Комментарии

Далее, мы должны обсудить комментарии. Комментарии важны по нескольким причинам. Они не только говорят вам или другим людям, что вы пытаетесь делать, но и напомнят вам через полгода, что же вы хотели сделать. Когда вы будете писать много программ, комментарии станут важными. Также при их помощи вы заставите Python игнорировать какие-либо части кода. Чтобы закомментировать строку, поставьте перед ней знак '#'. Например:

#

Это - комментарий.

Комментарии можно вставлять в любое место в строке, но помните, что Python проигнорирует всё, что идёт после '#'.

Операторы If

Теперь мы вернёмся к оператору «if», который мы вкратце обсудили ранее. Когда мы хотим принять решения, основываясь на значениях переменных, мы используем оператор if:

if loop == 12:

Эта команда проверяет переменную 'loop' и если её значение равно 12, мы делаем то, что написано в блоке ниже. В большинстве случаев, этого достаточно, но что если мы захотим сказать, что если переменная равна тому-то делай то-то, в противном случае — то-то. В псевдокоде это будет выглядеть так:

если x == y то
        делай то-то
в противном случае
        делай что-то другое

а на Python — так:

if x == y:
	делай то-то
else:
	делай что-то другое
	другие команды

Самое главное заключается в следующем:

  1. Завершайте операторы if и else двоеточием.
  2. Делайте ОТСТУПЫ в вашем коде.

Если у вас есть несколько проверяемых значений, можно использовать формат if/elif/else. Например:

x = 5
if x == 1:
	print ('X is 1')
elif x < 6:
	print ('X is less than 6')
elif x < 10:
	print ('X is less than 10')
else:
	print ('X is 10 or greater')

Обратите внимание: мы используем оператор '<' для проверки, что x МЕНЬШЕ, ЧЕМ определенное значение — в этом случае 6 и 10. Другие часто используемые операторы сравнения: больше чем '>', меньше, чем или равно '<=', больше чем или равно '>=' и не равно '!='.

Оператор while

В заключении мы рассмотрим простой пример оператора while. Этот оператор позволяет повторять цикл из действий несколько раз до достижения определенного порогового значения. Рассмотрим простой пример: присвоим переменной «loop» значение 1. Затем, пока значение переменной loop меньше или равно 10, выводить значение переменной «loop», прибавлять к нему 1 и продолжать до тех пор, пока переменная «loop» не станет больше 10, и выйти:

loop = 1
while loop <= 10:
	print (loop)
	loop = loop + 1

Запустив программу в консоли, мы увидим следующее:

1
2
3
4
5
6
7
8
9
10

Это то, что мы хотели увидеть.

Следующий пример чуть более сложен, но всё-таки простой.

loop = 1
while loop == 1:
    response = input("Enter something or 'quit' to end => ")
    if response == 'quit':
        print ('quitting')
        loop = 0
    else:
        print ('You typed %s' % response)

В этом примере, мы рассматриваем всё вместе: оператор if, цикл while, команду input, последовательность для новой строки, операторы присваивания и сравнения — всё это в программе из 8 строк.

Если мы запустим этот пример, то увидим:

Enter something or 'quit' to end
=> FROG
You typed FROG
Enter something or 'quit' to end
=> bird
You typed bird
Enter something or 'quit' to end
=> 42
You typed 42
Enter something or 'quit' to end
=> QUIT
You typed QUIT
Enter something or 'quit' to end
=> quit
quitting

Обратите внимание на то, что при вводе 'QUIT' программа не завершила работу. Это потому, что мы сравниваем значение переменной response с 'quit' (response == 'quit'). 'QUIT' НЕ равно 'quit'.

Ещё один пример — и мы закончим урок в этом месяце. Предположим, что вы хотите проверить, может ли пользователь работать с вашей программой. Хотя этот пример не является самым лучшим, он хорошо показывает некоторые вещи, которые мы уже знаем. Короче говоря, мы запросим у пользователя его имя и пароль, сравним их с информацией внутри программы и примем решение на основании результатов сравнения. Мы используем два списка: в одном хранятся имена пользователей, в другом — пароли. Затем мы используем команду input для получения информации от пользователя и, наконец, операторы if/elif/else для проверки, может ли пользователь работать. Запомните: это не самый лучший способ. Мы рассмотрим другие способы в последующих уроках. Наш код показан в рамке справа.

Сохраните его как 'password_test.py', запустите и вводите разнообразные значения.

Мы ещё не обсудили одну команду в процедуре проверки, которая начинается с 'if usrname in users:'. Здесь мы проверяем, есть ли введённое имя пользователя в списке. Если да, мы запрашиваем положение имени пользователя в списке users. Затем мы получаем позицию имени пользователя в списке имён, чтобы получить пароль, который хранится в той же позиции в списке паролей. Например, имя John хранится в позиции 1 списка пользователей. Его пароль, 'dog' хранится в позиции 1 списка паролей. Таким образом, мы сопоставляем имя и пароль. Сейчас вам должен быть понятен смысл программы.

Для одного раза достаточно. В следующем месяце мы изучим функции и модули. А пока развлекайтесь с тем, что уже узнали.

Код к password_test.py

#!/usr/bin/env python3
#-----------------------------------------------
#password_test.py
#	example of if/else, lists, assignments, input,
#	comments and evaluations
#-----------------------------------------------
# Assign the users and passwords
users = ['Fred','John','Steve','Ann','Mary']
passwords = ['access','dog','12345','kids','qwerty']
#-----------------------------------------------
# Get username and password
usrname = input('Enter your username => ')
pwd = input('Enter your password => ')
#-----------------------------------------------
# Check to see if user is in the list
if usrname in users:
	position = users.index(usrname) #Get the position in the list of the users
	if pwd == passwords[position]: #Find the password at position
		print ('Hi there, %s. Access granted.' % usrname)
	else:
		print ('Password incorrect. Access denied.')
else:
	print ("Sorry...I don't recognize you. Access denied.")