Python Blog — Научись программировать на Python https://python-blog.ru Бесплатный курс программирования на Python для начинающих. Справочник Python. Обучение программированию на Python. Уроки Python. Fri, 14 Oct 2016 09:51:47 +0000 ru-RU hourly 1 https://wordpress.org/?v=4.6.1 https://python-blog.ru/wp-content/uploads/2016/10/cropped-python_sh-600x600-32x32.png Python Blog — Научись программировать на Python https://python-blog.ru 32 32 Справочник Python. Функции в Python. https://python-blog.ru/spravochnik-python-funktsii-v-python/ https://python-blog.ru/spravochnik-python-funktsii-v-python/#respond Fri, 14 Oct 2016 08:23:46 +0000 https://python-blog.ru/?p=243 Читать далее Справочник Python. Функции в Python.]]> Функции в Python.
  1. Определение функции
  2. Передача параметров в функцию
  3. Возврат значения функции
  4.  Рекурсивный вызов функции
  5.  Лямбда-функции

Определение функции в Python.

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

Блок подпрограммы начинается с ключевого слова def, после которого следуют имя подпрограммы и круглые скобки (). Скобки должны быть обязательно!
Пример функции в Python:

def function_example(arg):
    print arg*arg

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

print function_example (2)
#выведет 4

Передача параметров в функцию в Python

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

  •  Обязательные аргументы (Required arguments)
  •  Именованные аргументы (Keyword argument)
  •  Аргументы со значением по умолчанию (Default argument)
  •  Список аргументов любой длины (Variable-length argumens)

Обязательные аргументы:

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

def divide(a,b):
    print float(a)/float(b)

Вызовы функции divide c количеством аргументов отличным от двух, приведут к ошибке. Порядок аргументов тоже важен, ведь divide(0,3) – напечатает значение, а divide(3,0) — вернет ошибку деления на ноль.

Именованные аргументы:

Именованные аргументы используются при вызове функции. Благодаря именнованым аргументам, вы можете задавать произвольный (отличный от описанного при определении функции) порядок аргументов.
Например:

def divide(delimoe, delitel):
   print float(delimoe)/float(delitel)
# Хотя в описании функции первым аргументом идет делимое, мы можем вызвать функцию вот так
divide(delitel=43, delimoe=0)
#Выведет 0

Аргументы, заданные по-умолчанию:

Аргумент по умолчанию, это аргумент, значение для которого задается при создании функции.
Например:

def write_to_database(data, user="admin"):
    print data, "has been writren by ", user
# Можно вызвать функцию write_to_database так:
write_to_database ("Very important data")
# В результате получим: Very important data has been writren by admin

# Можно вызвать функцию write_to_database иначе:
write_to_database (“Garbage data”, “Hacker”)
# В результате получим: Garbage data has been writren by Hacker

Аргументы произвольной длины:

Иногда возникает необходимость передать функции произвольное количество аргументов. В этом случае следует использовать указатель на список аргументов произвольной длины. Они задаются произвольным именем, перед которым ставится звездочка (*).
Например:

def print_list(*args):
    for arg in args:
       print arg
print_list("first",”second”) # напечатает оба слова, каждое с новой строки
print_list(1,1,2,3,5) # напечатает переданные числа Фиббоначи, каждое с новой строки
print_list() # ничего не выведет

Ключевое слово return

Выражение return прекращает выполнение функции и результат вычисления выражения, следующего за оператором return. Вызов return без аргументов равносилен вызову return None. Соответственно, теперь становится возможным, например, присваивать результат выполнения функции какой либо переменной.
Например:

def max(a,b):
   if a > b:
      return a
   else:
      return b
max_ab = max(23,42)
print max_ab
#Вернет 42

Рекурсия

Рекурсией в программировании и математике называется такая функция что f(n) = f(f(n-1)). Классическим примером рекурсии может послужить функция вычисления факториала числа.
Факториалом числа, например, 10 является произведение всех натуральных чисел от 1 до 10. То есть, 1 * 2 * 3 * 4 * 5*6*7*8*9*10
Рекурсивная функция вычисления факториала на языке Python будет выглядеть так:

def factorial(number): 
   if number == 0: 
       return 1 # По договоренности факториал нуля равен единице 
   else: 
       return number * factorial(number - 1) # рекурсивно умножаем 10*factorial(9)*factorial(8)…factorial(1)*factorial(0)

Рекурсивные функции являются сильным приемом в программировании. К сожалению, они не всегда эффективны, а также часто использование рекурсии приводит к ошибкам. Наиболее распространенная из таких ошибок – бесконечная рекурсия, когда цепочка вызовов функций не завершается пока не закончится свободная память в компьютере.. Две наиболее распространенные причины для бесконечной рекурсии:

  1.  Неправильное оформление выхода из рекурсии. Например, если мы в программе вычисления факториала забудем поставить проверку if n==0, то factorial(0) вызовет factorial(−1) factorial(−1), тот вызовет factorial(−2) factorial(−2) и т.д.
  2.  Рекурсивный вызов с неправильными параметрами. Например, если функция factorial(n) будет вызывать factorial(n) , то также получиться бесконечная цепочка.

Ограничение на глубину рекурсии

По умолчанию глубина рекурсии в языке Питон ограничена 1000 вызовов. Это ограничение можно поднять при помощи функции setrecursionlimit из модуля system. Например, чтобы увеличить возможную глубину рекурсии до 10000 нужно в начале программы выполнить две инструкции:

import sys
sys.setrecursionlimit(10000)

Следует учитывать, что глубину рекурсии нельзя увеличивать до очень большого значения, помимо ограничения, который устанавливается при помощи setrecursionlimit есть и ограничения операционной системы.

Лямбда-функции:

Python поддерживает возможность определять небольшие однострочные функции на лету. Подсмотренные в функциональных языках программирования, так назыаемые lambda-функции могут быть использованы везде, где требуется функция.
Например:

def f(x):
   return x*2
print f(3)
#6

Эта lambda-функция делает то же самое, что и обычная функция, определенная выше. Обратите внимание на сокращенный синтаксис: список аргументов записывается без скобок и нет ключевого слова return. Кроме того, функция не имеет имени, но может быть вызвана через переменную, которой она присвоена:

g = lambda x: x*2
print g(3)
#6

Вы можете использовать lambda-функцию даже не присваивая ее переменной. Это совершенно искуственный пример, но он показывает, что lambda-функция может быть определена прямо в месте ее использования:

print(lambda x: x*2)(3)
#6

Обобщая, lambda-функция — это функция, которая имеет произвольное число аргументов (включая необязательные аргументы) и возвращает значение одного выражения. lambda-функции не могут содержать инструкций или более одного выражения. Не пытайтесь поместить в lambda-функцию слишком сложное выражение. Если вам необходимо что-либо более сложное — определите обычную функцию.

]]>
https://python-blog.ru/spravochnik-python-funktsii-v-python/feed/ 0
Курс программирования Python. Функции. https://python-blog.ru/kurs-programmirovaniya-python-funktsii/ https://python-blog.ru/kurs-programmirovaniya-python-funktsii/#respond Thu, 13 Oct 2016 13:02:49 +0000 https://python-blog.ru/?p=221 Читать далее Курс программирования Python. Функции.]]> Функции в Python.

python-logo-master-v3-tm
Привет, в нашем Курсе программирования мы продолжим изучать основы синтаксиса Python в ходе работы над игрой «Поле Чудес». В сегодняшнем уроке мы рассмотрим такой вопрос как функции в Python.

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

В ходе нашего курса мы уже сталкивались с понятием функции, правда в специфическом контексте. Да, вы правильно поняли, я говорю об анонимных функциях(они же lambda-функции).
Определить функцию в Python очень просто:

def my_function(arg1,arg2,..argN):
	pass

Существуют некоторые правила для создания функций в Python:

  • Блок функции начинается с ключевого слова def, после которого следуют название функции и круглые скобки ().
  •  аргументы, которые принимает функция должны находиться внутри этих скобок.
  •  После скобок идет двоеточие ( : ) и с новой строки с отступом начинается тело функции

Внимательно изучив программу, созданную в предыдущем уроке, найдем повторяющиеся участки кода. В нашей игре первый кандидат на вынос в подпрограмму – вывод табло на экран. Почему первый – потому что снижает читаемость основной логики программы. Создадим функцию print_tablo(ua), которая будет принимать в качестве аргумента шаблон ответа с отгаданными буквами и выводить на экран наше табло.
Вот она:

def print_tablo(ua):
    tablo = '|'
    mult = 4*len+1
    print '-'*mult
    for letter in ua:
        tablo+=' %s |'%letter.encode('cp866')
    print tablo
    # выводим нижнюю границу игрового поля
    print '-'*mult

В принципе, единственное ограничение по расположению тела функции в файле с исходным кодом — это «вызов функции должен происходить после ее определения». Поэтому я функции определяю в начале файла, сразу после блока импортирования.
Теперь заменим следующий блок кода на вызов функции print_tablo(ua):
Было:

# выводим верхнюю границу игрового поля
print '-'*mult
# выводим само поле
for letter in user_answer:
   tablo+=' %s |'%letter.encode('cp866')
print tablo
# выводим нижнюю границу игрового поля
print '-'*mult
# Возвращаем таблу начальное значениеk
tablo = '|'

Стало:

# выводим табло
print_tablo(user_answer)

Благодаря выносу декоративного вывода в отдельную функцию, логику нашей программы стало гораздо легче читать.

Обратите внимание: все переменные, использованные в подпрограмме print_tablo – ЛОКАЛЬНЫЕ, и доступ к ним из основной программы НЕВОЗМОЖЕН. Любая попытка обратиться к ним по имени вызовет ошибку вида: NameError: name ‘tablo’ is not defined

В нашем определении функции print_tablo(ua) мы указали, что данная функция должна принимать строго один аргумент, т.е. вызовы

print_tablo()
print_tablo(ua,len)

вернут ошибку.
Функции в Python позволяют указать значения параметров по умолчанию:

def print_tablo(ua = ‘answer’):

Теперь при вызове функции print_tablo() без аргументов она будет выводить шаблон табло со словом answer:

-------------------------
| a | n | s | w | e | r |
-------------------------

Осталось только задокументировать нашу функцию. Функции в Python обладают встроенными возможностями документации:

def print_tablo(ua=u'answer'):
"""Эта функция выводит на экран игровое табло
Параметр функции - шаблон ответа с открытыми буквами.
При вызове функции без параметров выводится шаблон ответа со словом answer"""
    length = len(ua)
    tablo = '|'
    mult = 4*length+1
    print '-'*mult
    for letter in ua:
        tablo+=' %s |'%letter.encode('cp866')
    print tablo
    # выводим нижнюю границу игрового поля
    print '-'*mult

Вывод документации осуществляется следующим образом:
если ваш файл с исходным кодом сохранен в кодировке utf-8:

print print_tablo.__doc__.decode('utf-8')

если же это Unicode:

print print_tablo.__doc__

И теперь весь код нашей игры выглядит следующим образом:

# -*- coding: utf-8 -*-
# импортируем модуль для работы со случайными числами
import random

def print_tablo(ua=u'answer'):
    """Эта функция выводит на экран игровое табло
    Параметр функции - шаблон ответа с открытыми буквами.
    При вызове функции без параметров выводится шаблон ответа со словом answer"""
    length = len(ua)
    tablo = '|'
    mult = 4*length+1
    print '-'*mult
    for letter in ua:
        tablo+=' %s |'%letter.encode('cp866')
    print tablo
    # выводим нижнюю границу игрового поля
    print '-'*mult 
# заполняем базу вопросов и ответов. Считываем их из файла q_a.txt
f = open('C:\grigorev_dv\python_blog\examples\pole_chudes\q_a.txt')
qa = f.readlines()
f.close()

#Интересно-интересно что это такое. А это приведение из кодировки Utf-8 в unicode всех строк в списке вопросов-ответов.
a_str = map(lambda x:x.decode('utf-8'), qa)
print print_tablo.__doc__.decode('utf-8')
# выбираем случайным образом вопрос для игрока
question_id = int(random.random()*29)
# разделяем вопрос и ответ по символу двоеточия ":"
question,answer = a_str[question_id].split(':')
print u"Внимание вопрос:" 
print question
ans_len = len(answer)-1
print ans_len,u"букв в этом слове!"

ans_ = answer.encode('cp866')
tuple_ans = tuple(ans_)
user_answer = [' ']*ans_len
user_answer = map(lambda x:x.encode('cp866'),user_answer)
slovo_otgadano = False

while not(slovo_otgadano):
    # выводим табло
    print_tablo(user_answer)
    print u"Введите букву"
    # считываем букву
    letter_try = raw_input()
    # проверяем наличие буквы в ответе
    if letter_try in tuple_ans:
        # если буква есть то
        print u"Есть такая буква в этом слове!"
        # открываем все эти букв в user_answer
        for i in range(0,ans_len):
            if letter_try==ans_[i]:
                user_answer[i] = letter_try.decode('cp866')       
        # проверяем угадано ли слово полностью
        if user_answer == list(answer)[0:ans_len]:
            print u"Вы угадали и это слово - " +ans_.decode('cp866')
            print_tablo(user_answer)
            # если слово отгадано то присваиваем флагу slovo_otgadano значение "Истина"
            # что вызовет завершение нашего цикла while
            slovo_otgadano = True
    else: 
        print u"Нет такой буквы!"

Вот и все! Более подробно о функциях в Python вы можете прочитать в нашем справочнике Python.
В следующем уроке коснемся темы объектно-ориентированного программирования на Python. Добавим к нашей игре персону игрока и легендарные «100 очков на барабане!», вместе с самим барабаном.

Следующий урок
]]>
https://python-blog.ru/kurs-programmirovaniya-python-funktsii/feed/ 0
Курс программирования Python. Цикл for. Поле чудес. https://python-blog.ru/kurs-programmirovaniya-python-tsikl-for-pole-chudes/ https://python-blog.ru/kurs-programmirovaniya-python-tsikl-for-pole-chudes/#comments Wed, 12 Oct 2016 09:03:53 +0000 https://python-blog.ru/?p=199 Читать далее Курс программирования Python. Цикл for. Поле чудес.]]> Цикл for в Python

tablo_chudes
Всем привет, давайте продолжим тему циклов в Python на этом занятии. В нашем курсе программирования на Python будем рассматривать возможности Python на примере известной игры «Поле чудес». И цикл for не станет здесь исключением.

Примечание: Примеры из этой и последующей статей тестировались под Win7. Из обнаруженных проблем — в IDLE пример работать не будет, из-за кодировок(пример заточен под запуск Python из консоли Windows и кодировку cp866 соответственно)

В предыдущем уроке мы реализовали основную логику игры. Выполнив упражнение курса по циклу While, вы вероятно обратили внимание на вот это место:

#открываем все эти букв в user_answer
       user_answer = map(lambda ult,alt,ualt: ult if ult==alt else ualt,
                             template,ans_[0:ans_len],user_answer)

Думаю вы тоже сочли это место весьма неочевидным. Давайте перепишем этот сложный оператор map в более понятном виде, с помощью цикла for:

for i in range(0,ans_len):
            if letter_try==ans_[i]:
                user_answer[i] = letter_try.decode('cp866')

В этом цикле мы пробегаем по кортежу символов ответа, и если введенная пользователем буква совпадает с i-ой буквой кортежа, то в списке user_answer заменяем i-ый символ в user_answer на пользовательскую. Проще говоря «Откройте ‘letter_try’ на табло!». И мы открываем. Более полную информацию по циклу for можно посмотреть в нашем Справочнике Python.
Внимательные читатели уже заметили, что в случае for нам не нужен кортеж template, поэтому все связанное с ним мы можем удалить.
Слегка изменим условие в проверке угаданности слова:

if user_answer == list(answer)[0:ans_len]:

Это также связано с особенностями кодировок в Windows. Вообще кодировки в Python довольно мутная история, но говорят в Python 3 жить стало лучше, жить стало веселее =).
Поработав над основной логикой нашей программы, можно приступить и к эстетической части. Большинство игроков привыкло к тому что игровое поле представляет собой ряд черных клеток, по количеству букв в ответе. Добавим в нашу программу псевдографическое изображения этого поля с помощью текстовых символов.
Для этого мы изменим нашу программу в следующих местах:
Инициализируем user_answer пробельными символами(вместо зведочек):

user_answer = [' ']*ans_len

Инициализируем новую переменную tablo значением:

tablo = '|'

Введем переменную-мультипликатор(пригодится):

mult = 4*ans_len+1

Добавим вывод нашего игрового табло в консоль при каждой итерации цикла while:

while not(slovo_otgadano):
    # выводим верхнюю границу игрового поля
    print '-'*mult
    # выводим само поле
    for letter in user_answer:
       tablo+=' %s |'%letter.encode('cp866')
    print tablo
    # выводим нижнюю границу игрового поля
    print '-'*mult
    # Возвращаем табло в исходное состояние
    tablo = '|'
	...

И добавим полностью открытое табло при открытии всего слова:

if user_answer == list(answer)[0:ans_len]:
            print u"Вы угадали и это слово - " +ans_.decode('cp866')
            # если слово отгадано то присваиваем флагу slovo_otgadano значение "Истина"
            # что вызовет завершение нашего цикла while
            print '-'*mult
            for letter in user_answer:
               tablo+=' %s |'%letter.encode('cp866')
            print tablo
            print '-'*mult
            tablo = '|'
            slovo_otgadano = True

После всех изменений, полный текст программы выглядит вот так:

# -*- coding: utf-8 -*-
# импортируем модуль для работы со случайными числами
import random
# заполняем базу вопросов и ответов. Считываем их из файла q_a.txt
f = open('C:\grigorev_dv\python_blog\examples\pole_chudes\q_a.txt')
qa = f.readlines()
f.close()

#Интересно-интересно что это такое. А это приведение из кодировки Utf-8 в unicode всех строк в списке вопросов-ответов.
a_str = map(lambda x:x.decode('utf-8'), qa)

# выбираем случайным образом вопрос для игрока
question_id = int(random.random()*29)
# разделяем вопрос и ответ по символу двоеточия ":"
question,answer = a_str[question_id].split(':')
print u"Внимание вопрос:" 
print question
ans_len = len(answer)-1
print ans_len,u"букв в этом слове!"
tablo = '|'
user_answer = []
ans_ = answer.encode('cp866')
tuple_ans = tuple(ans_)
user_answer = [' ']*ans_len
user_answer = map(lambda x:x.encode('cp866'),user_answer)
ans_list =  list(ans_[0:ans_len])
slovo_otgadano = False
#количество знаков "-"
mult = 4*ans_len+1
while not(slovo_otgadano):
    # выводим верхнюю границу игрового поля
    print '-'*mult
    # f.write(sys.stdout)
    # print '-'*mult
    # выводим само поле
    for letter in user_answer:
       tablo+=' %s |'%letter.encode('cp866')
    print tablo
    # выводим нижнюю границу игрового поля
    print '-'*mult
    # Возвращаем таблу начальное значение
    tablo = '|'
    print u"Введите букву"
    # считываем букву
    letter_try = raw_input()
    # проверяем наличие буквы в ответе
    if letter_try in tuple_ans:
        # если буква есть то
        print u"Есть такая буква в этом слове!"
        # открываем все эти букв в user_answer
        for i in range(0,ans_len):
            if letter_try==ans_[i]:
                user_answer[i] = letter_try.decode('cp866')       
        # проверяем угадано ли слово полностью
        if user_answer == list(answer)[0:ans_len]:
            print u"Вы угадали и это слово - " +ans_.decode('cp866')
            # если слово отгадано то присваиваем флагу slovo_otgadano значение "Истина"
            # что вызовет завершение нашего цикла while
            print '-'*mult
            for letter in user_answer:
               tablo+=' %s |'%letter.encode('cp866')
            print tablo
            print '-'*mult
            tablo = '|'
            slovo_otgadano = True
    else: 
        print u"Нет такой буквы!"

Пример раунда игры:

Внимание вопрос:
Какое животное дало название распространенному в Древнем Риме способу боевого по
строения?
8 букв в этом слове!
	---------------------------------
	|   |   |   |   |   |   |   |   |
	---------------------------------
	Введите букву
	е
	Есть такая буква в этом слове!
	---------------------------------
	|   | е |   | е |   |   |   |   |
	---------------------------------
	Введите букву
	ч
	Есть такая буква в этом слове!
	---------------------------------
	| ч | е |   | е |   |   |   |   |
	---------------------------------
	Введите букву
	р
	Есть такая буква в этом слове!
	---------------------------------
	| ч | е | р | е |   |   |   |   |
	---------------------------------
	Введите букву
	п
	Есть такая буква в этом слове!
	---------------------------------
	| ч | е | р | е | п |   |   |   |
	---------------------------------
	Введите букву
	а
	Есть такая буква в этом слове!
	---------------------------------
	| ч | е | р | е | п | а |   | а |
	---------------------------------
	Введите букву
	х
	Есть такая буква в этом слове!
	Вы угадали и это слово - черепаха

	---------------------------------
	| ч | е | р | е | п | а | х | а |
	---------------------------------

В следующем уроке нашего курса программирования на Python мы познакомимся с подпрограммами и сделаем код нашей игры чище и понятнее.

]]>
https://python-blog.ru/kurs-programmirovaniya-python-tsikl-for-pole-chudes/feed/ 1
Справочник Python. Циклы в Python. https://python-blog.ru/spravochnik-python-tsiklyi-v-python/ https://python-blog.ru/spravochnik-python-tsiklyi-v-python/#respond Tue, 11 Oct 2016 13:27:51 +0000 https://python-blog.ru/?p=170 Читать далее Справочник Python. Циклы в Python.]]>
  • Цикл while
  • Цикл for
  • Операторы управления циклом (break, continue, else)
  • Цикл While
    Циклы по условию выполняют что-нибудь, пока условие не будет выполнено. While  — простой цикл, и работает по следующей схеме:

    while логическое выражение:
          действие_пока_логическое_выражение_истинно

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

    x='r'
    i=1
    while i < 10:
        print(x)
        i += 1

    В первой строчке мы присваиваем переменной x значение ‘r’, а второй строчкой инициализируем счетчик i=1. Затем идет цикл, то есть: пока i меньше 10, выводить на экран x. Самая интересная последняя строчка. Когда значение счетчика i (которое увеличивается на 1 каждую петлю цикла) станет больше или равно 10, цикл остановится.

    Цикл for.
    В отличие от большинства других языков программирования (как C, Pascal, Perl), цикл for в Python не просто цикл со счетчиком.В Python цикл for перебирает все элементы последовательности, начиная с нулевого. Ближайший аналог цикла for в Python – это цикл foreach в Perl. Разберем состав цикла:

    for item in seq:
        print item

    item – переменная цикла for
    seq – множество значений(диапазон, кортеж, список, множество или словарь), которые будет принимать переменная цикла.
    например следующий код выведет все цвета из кортежа colors:

    colors = red,green,blue
    for color in colors:
        print color
    >>>
    red
    green
    blue

    Привычный цикл по счетчику в Python реализуется с помощью встроенных функций range() и xrange():

    for i in xrange(1,10):
        print i

    Данный цикл выведет числа от 1 до 9.
    Отличия range() от xrange(): Основным отличием функций range и xrange() является тип возвращаемого объекта. Функция range() возвращает список, а xrange() – кортеж. Кортеж занимает меньше памяти, поэтому при больших значения итератора предпочтительно использовать функцию xrange().

    Операторы управления циклом. Break, continue, else.
    Python предоставляет три оператора для управления циклом: break, continue,else

    break
    Оператор break прекращает выполнение цикла в месте своего вызова. Рассмотрим небольшой пример:

    # -*- coding: utf-8 -*-
    # создадим заведомо бесконечный цикл по условию
    while True:
        command = raw_input("Enter command>>")
        if command =='exit':
           print 'Exit from infinite loop'
           break
        else:
           print 'user input: %s command'%command

    continue
    Оператор continue пропускает все последующие операторы, и переводит цикл на следующую итерацию. Например, удвоим все символы в предложении, кроме символа ‘o’, а символ ‘o’ будем просто пропускать:

    # -*- coding: utf-8 -*-
    from __future__ import print_function
    for i in """Numerous passing references to the phrase have occurred in movies, 
             television, books, video games, advertising, websites, and graphic arts.""":
        if i == 'o':
             continue
        print(i*2,end='')

    else
    Если операторы break и continue могли вам встречаться и в других языках программирования, то в наличии блока else у циклов Python весьма оригинален. Блок else цикла выполняется, если выход из цикла произошел без использования оператора break. Приведем в пример цикл, который ограничивает число команд пользователя пятью за сессию:

    i = 1
    while i<5:
        if command =='exit':
            print 'Exit from infinite loop'
            break
        else:
            i +=1
            print 'user input: %s command'%command
    else:
        print "Too much commands in session"

    ]]>
    https://python-blog.ru/spravochnik-python-tsiklyi-v-python/feed/ 0
    Курс программирования Python. Цикл While. Поле чудес. https://python-blog.ru/kurs-programmirovaniya-python-tsikl-while-pole-chu/ https://python-blog.ru/kurs-programmirovaniya-python-tsikl-while-pole-chu/#respond Mon, 10 Oct 2016 08:47:25 +0000 https://python-blog.ru/?p=130 Читать далее Курс программирования Python. Цикл While. Поле чудес.]]> Всем привет, сегодня мы рассмотрим цикл whilе и напишем настоящую игру. Игра «Поле чудес», известная большинству из вас, обладает несложными правилами, основное из которых – игрок открывает по одной букве, пока слово не угадано. В этом уроке мы с вами напишем «Поле чудес», которое реализует это правило.

    Поле чудес. Цикл While


    Примечание: Примеры из этой и последующей статей тестировались под Win7. Из обнаруженных проблем — в IDLE пример работать не будет, из-за кодировок(пример заточен под запуск Python из консоли Windows и кодировку cp866 соответственно)

    В нашей игре пока не будет Леонида Якубовича и «сектор приз на барабане», да и барабана пока не будет(временно), зато будут:

    • цикл While
    • работа с текстовым файлом
    • функция map и анонимные функции
    • работа с кортежами и списками

    Начнем с того, что для игры нам понадобится база вопросов и ответов. Формат у этой базы будет такой:
    вопрос:ответ,
    т.е. вопрос и ответ просто разделены двоеточием. Пример такой базы можно скачать тут.
    Для начала считаем всю базу вопросов и ответов из файла:

    # импортируем модуль для работы со случайными числами
    import random
    # заполняем базу вопросов и ответов. Считываем их из файла q_a.txt, к которому указываем полный путь:
    f = open('C:\grigorev_dv\python_blog\q_a.txt')
    qa = f.readlines()
    f.close()
    #Интересно-интересно что это такое. А это приведение из кодировки Utf-8 в unicode всех строк в списке вопросов-ответов.
    a_str = map(lambda x:x.decode('utf-8'), qa)

    Далее с помощью функции возвращающей случайное число, определим какой вопрос задать игроку:

    # выбираем случайным образом вопрос для игрока
    question_id = int(random.random()*30)
    # разделяем вопрос и ответ по символу двоеточия ":"
    question,answer = a_str[question_id].split(':')
    print u"Внимание вопрос:" 
    print question

    *Нижеследующие приключения с кодировками актуальны для ОС Windows, в *nix все должно быть проще.
    Инициализируем необходимые переменные:

    # узнаем длину ответа и подсказываем игроку
    #(-1 чтобы убрать символ перевода каретки)
    ans_len = len(answer)-1
    print ans_len,u"букв в этом слове!"
    
    # создаем заготовку для ответа пользователя
    user_answer = []
    # создадим строку ответа в кодировке cp866
    ans_ = answer.encode('cp866')
    #  разобьем ее посимвольно, и запишем в кортеж tuple_ans
    tuple_ans = tuple(ans_)
    
    # инициализируем ответ игрока зведочками по количеству букв
    user_answer = ['*']*ans_len
    # приведем в нужную кодировку cp866
    user_answer = map(lambda x:x.encode('cp866'),user_answer)
    print user_answer
    # создадим представление ответа в виде списка
    ans_list =  list(ans_[0:ans_len])
    # инициализируем флаг того что слово отгадано значением "Ложь"
    slovo_otgadano = False

    Запускаем цикл по условию:

    Пока не(слово_отгадано):
    	спросить у игрока букву
    	проверить наличие буквы в слове
    	если буква есть то
    		заменить в переменой user_answer звездочки на эту букву
    	иначе
    		написать что такой буквы нет

    Вот как это выглядит на Python:

    while not(slovo_otgadano):
        # выводим текущие отгаданные буквы и приглашение ввести букву
        print ''.join(user_answer)
        print u"Введите букву"
        # считываем букву
        letter_try = raw_input()
        # проверяем наличие буквы в ответе
        if letter_try in tuple_ans:
            # если буква есть то
             print u"Есть такая буква в этом слове!"
            # создаем шаблон для сравнения c ответом
            template = tuple((letter_try*ans_len))
            # открываем все эти букв в user_answer
            user_answer = map(lambda ult,alt,ualt: ult if ult==alt else ualt,
                                template,ans_[0:ans_len],user_answer)
            # проверяем угадано ли слово полностью
            if user_answer == ans_list:
                print u"Вы угадали и это слово - " +ans_.decode('cp866')
                # если слово отгадано то присваиваем флагу 
                # slovo_otgadano значение "Истина"
                # что вызовет завершение нашего цикла while
                slovo_otgadano = True
        else: 
            print u"Нет такой буквы!"

    В программе на Python мы также проверяем, угадано ли слово целиком, и если угадано то флаг slovo_otgadano принимат значение “Истина”, что и вызывает завершение цикла, по причине того, что его условие приняло значение “Ложь”.

    Остановимся на некоторых моментах поподробнее:
    В нашей программе несколько раз встречается запись вида

    map(lambda x:somefunc(x) ,list)

    Думаю у вас возник вопрос что же это за такая функция map, и что за lambda трется рядом с ней. Так вот функция map(), которая записывается следующим образом:

    map(somefunc(),somelist)

    позволяет применить функцию somefunc() к списку(кортежу, множеству) somelist, и возвращает список результатов применения somefunc() к элементам somelist. Подробнее об этой функции можно прочитать в нашем справочнике по языку Python
    Теперь, когда стало совсем непонятно, попробуем разобраться с lambda:
    Как вы уже заметили, в нашей программе lambda x: стоит на месте somefunc() в записи функции map(). Так и есть lambda – это анонимные функции, т.е. функции без имени. Основным достоинством лямбда-функций является компактность написанного кода.
    Рассмотрим простой пример:
    Дан список чисел list, надо получить квадраты всех его элементов:

    list = [1,2,3,4,5]
    sqr_list = map(lambda x:x*x,list)
    print sqr_list
    &gt;&gt;&gt;
    [1, 4, 9, 16, 25]

    ]]>
    https://python-blog.ru/kurs-programmirovaniya-python-tsikl-while-pole-chu/feed/ 0
    Справочник Python. Функции map, filter, zip, reduce. https://python-blog.ru/spravochnik-python-funktsii-map-filter-zip-reduce/ https://python-blog.ru/spravochnik-python-funktsii-map-filter-zip-reduce/#respond Mon, 10 Oct 2016 08:43:48 +0000 https://python-blog.ru/?p=149 Читать далее Справочник Python. Функции map, filter, zip, reduce.]]> map(функция, последовательность) возвращает список значений, полученных применением функции к элементам одной или нескольких последовательностей. Например, создадим список квадратов натуральных чисел от 1 до 10:

    def sqr(x): return x*x
    print map(sqr, xrange(1, 11))

    Для нескольких списков(вернет произведения 1*2, 2*3, 3*4..10*11):

    def mult(x,y):return x*y
    print map(mult,xrange(1,11),xrange(2,12))

    filter(функция, последовательность) возвращает последовательность, состоящую из тех элементов последовательности sequence, для которых function(item) является истиной. Функция применяется для каждого элемента последовательности. Пример: определим простые числа в диапазоне до 1000:

    import math
    def primes(x):
    border = int(math.sqrt(x))
    for y in range(2, border):
    if x%y==0: return 0
    return 1
    print filter(primes, xrange(2, 1000))

    zip(последовательности) — функция, аналогичная map() в последнем варианте, но может работать с последовательностями разной длины, возвращает список кортежей:

    a = (1, 2, 3, 4)
    b = (1, 4, 9, 16)
    print zip(a, b)
    >>>[(1, 1), (2, 4), (3, 9), (4, 16)]

    reduce(функция, последовательность) возвращает значение, полученное путем последовательного применения бинарной функции function сначала к первым двум элементам последовательности sequence, затем к результату и следующему элементу и т. д. Например, вычислим факториал 10 (он же 10!):

    def mult(x, y): return x*y
    print reduce(mult, xrange(1, 11))
    >>>3628800

    ]]>
    https://python-blog.ru/spravochnik-python-funktsii-map-filter-zip-reduce/feed/ 0
    Курс программирования Python. Решение квадратного уравнения. https://python-blog.ru/kurs-programmirovaniya-python-reshenie-kvad/ https://python-blog.ru/kurs-programmirovaniya-python-reshenie-kvad/#respond Thu, 06 Oct 2016 13:01:36 +0000 https://python-blog.ru/?p=107 Читать далее Курс программирования Python. Решение квадратного уравнения.]]> Всем привет, сегодня мы познакомимся с оператором условия в языке Python. В качестве подопытного мы возьмем задачу нахождения корней квадратного трехчлена вида

    2+bx+c = 0

    (он же квадратное уравнение). Корни этого уравнения, как известно, находятся по формуле:

    roots_square
    Также известно, что при дискриминанте(это то что под знаком квадратного корня) корни этого уравнения комплексные, при дискриминанте равном нулю — уравнение имеет два одинаковых корня,  при дискриминанте больше нуля — два различных корня.

    Закончим на этом с математикой, и приступим к программированию нашего решателя квадратных уравнений.
    Обратите внимание: в Python блоки кода выделяются отступами(вместо паскалевских begin..end, или С-подобных {}). Конвенция PEP8 рекомендует для создания отступа использовать 4 пробела. PEP8 допускает использование табуляции для создания отступов, но не приветствует. Смешение же знаков пробела и табуляции в одном проекте — считается плохим стилем программирования.

    #find ax^2+bx+c = 0 roots
    
    # -*- coding: utf-8 -*-
    # импортируем модуль math, содержащий функцию квадратного корня sqrt().
    import math
    
    #Запрашиваем у пользователя коэффициенты уравнения
    #функция raw_input() возвращает строку, которую мы с 
    # помощью функции int() приводим к целочисленному типу
    print u'Введите коэффициент А'
    a = int(raw_input())
    print u'Введите коэффициент B'
    b = int(raw_input())
    print u'Введите коэффициент C'
    c = int(raw_input())
    
    # рассчитываем дискриминант 
    discriminant = b**2-4*a*c
    
    # в зависимости от величины дискриминанта вычисляем корни
    if discriminant&gt;0:
        # если дискриминант больше нуля
        x1 = (-b+math.sqrt(discriminant))/(2*a*c)
        x2 = (-b-math.sqrt(discriminant))/(2*a*c)
        print u'Корни уравнения:'
        print "X1 = ",x1
        print "X2 = ",x2
    elif discriminant==0:
        # если дискриминант равен нулю
        print u'Корень уравнения:'
        print "X = ",-b/(2*a)
    else:
        # во всех остальных случаях(т.е. когда дискриминант меньше нуля)
        print u"Корни в комплексной плоскости"

    Как видите, оператор условия if..elif..else в Python устроен очень просто и всегда имеет вид:

    if condition:
        operator1
        operator2
        ...
    elif condition2:
        operator3
        operator4
        ...
    ...
    elif conditionN:
        operatorN-2
        operatorN-1
        ...
    else:
        operatorN
        operatorN+1

    где condition1,condition2..conditionN — логические выражения, принимающие значения True или False. Если не выполняется ни одно из них(т.е. все они принимаю значение False), то выполняется блок кода после ключевого слова else.

    Вот мы и написали программу, которая решает квадратные уравнения,  и решив несколько уравнений, мы попадаем на «Поле чудес», правда без Леонида Якубовича.

    Предыдущий урок

     

    ]]>
    https://python-blog.ru/kurs-programmirovaniya-python-reshenie-kvad/feed/ 0
    Курс программирования Python. Первая программа и даже больше. https://python-blog.ru/kurs-programmirovaniya-python-pervaya-progr/ https://python-blog.ru/kurs-programmirovaniya-python-pervaya-progr/#respond Thu, 06 Oct 2016 13:01:08 +0000 https://python-blog.ru/?p=38 Читать далее Курс программирования Python. Первая программа и даже больше.]]> first_program_2Всем привет, с вами снова я — Дмитрий Григорьев и сегодня мы напишем первую программу(и даже не одну) на языке программирования Python. Как я уже говорил в предыдущем посте, Python — интерпретируемый язык программирования, а значит для исполнения программ нам понадобится интерпретатор Python(если у вас его нет то добро пожаловать в Урок 0. Установка Python). Если вы уже установили интерпретатор Python, а то и целый дистрибутив вместе с ним, то добро пожаловать под кат:

    Откройте ваш любимый текстовый редактор (мне нравятся Notepad++ и Sublime Text, но подойдет и notepad.exe или gedit) и напишите в нем:

    pass

    Теперь сохраните ваш файл с расширением *.py (например у меня это C:\python_lessons\1\first.py). Наша первая программа готова, давайте ее запустим. Для этого нам понадобится консоль(или командная строка в Windows). Наберите в командной строке:

    python C:\python_lessons\1\first.py

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

    Инструкция pass ничего не делает и может быть используется там, где в будущем будут другие операторы, но пока руки не дошли.

    Давайте напишем более полезную программу. Создайте файл «second.py» со следующим содержанием:

    #Запросим у пользователя его имя 
    print "Enter your name:"
    #Считаем имя пользователя из командной строки
    name = raw_input()
    #Поприветствуем пользователя
    print "Hello",name

    Запустите эту программу, после ввода имени она скажет вам «Hello, %ваше_имя%». Согласитесь, это уже гораздо более полезная программа, чем та которая ничего не делает =). Давайте разберем ее поподробнее:

    Первая строчка:

    print "Enter your name:"

    выводит в командную строку просьбу ввести ваше имя.

    Команда

    print

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

    print "Hello",name

    Обратимся теперь ко второй строке:

    name = raw_input()

    Здесь мы создаем переменную «name» и сразу присваиваем ей значение, которое вернет функция raw_input().

    Функция raw_input() возвращает значение, введеное с клавиатуры, в формате строки(обрезает символ перевода каретки «\n»).

    Вот мы с вами и создали две абсолютно рабочие программы на Python’e. Если у вас появились вопросы, то задавайте их в комментариях. В следующем уроке рассмотрим оператор условия в языке Python.

    ]]>
    https://python-blog.ru/kurs-programmirovaniya-python-pervaya-progr/feed/ 0
    Справочник Python. Кортежи, списки, словари. https://python-blog.ru/spravochnik-python-kortezhi-spiski-slovari/ https://python-blog.ru/spravochnik-python-kortezhi-spiski-slovari/#respond Thu, 06 Oct 2016 12:44:18 +0000 https://python-blog.ru/?p=87 Читать далее Справочник Python. Кортежи, списки, словари.]]> Всем привет, сегодня мы рассмотрим возможности Python по хранению наборов данных(однотипных и не очень). Python предоставляет программисту три варианта хранения наборов(или коллекций) данных. Два из них предоставляют произвольный доступ к элементу по индексу, а один — произвольный доступ к элементу по ключу. Вот эта замечательная троица:

    1. Кортеж
    2. Список
    3. Словарь

    1. Кортежи

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

    Создать кортеж можно следующим образом:

    tuple_example = (1,2,3,'vnezapno')
    print tuple_example

    Либо с помощь встроенной функции tuple():

    list_example = [1,2,3] 
    tuple_examle = tuple(list_example)
    print tuple_examle

    Функция tuple() преобразует переданный ей список в кортеж. Как вы уже заметили, в кортеже могут храниться данные разных типов, в том числе допустимо и создание кортежа, в котором хранятся кортежи. Например:

    tuple_of_tuples = ((1,2),(2,3))
    print tuple_of_tuples[1]

    Результатом выполнения этого кода будет вывод в консоль «(2,3)», так как индексация в Python начинается с 0.
    При попытке изменить кортеж(как мы помним, это неизменяемый набор данных), интерпретатор Python вернет ошибку:

    tuple_example = (1,2,3,4,5)
    tuple_example[2] = 1
    
    Traceback (most recent call last):
      File "&lt;pyshell#8&gt;", line 1, in 
        tuple_example[2] = 1
    TypeError: 'tuple' object does not support item assignment

    Если же изменить значение очень надо, то тут на помощь приходит следующий тип коллекций:

    2. Списки

    Списки похож на кортеж тем что доступ к элементам списка осуществляется по индексу и в том что элементы списка могут быть разных типов(это основное, но не единственное, отличие списка в Python от классических массивов). В отличие от кортежа значения элементов списка можно изменять. Индексация в списках также начинается с нуля, как и в кортежах.

    Для того чтобы создать список можно воспользоваться одним из следующих способов:

    Статическое создание списка:

    list_example = ['one', 'two', 3, 4]

    Или использовать генератор списков Python:

    #список квадратов всех чисел от 1 до 5
    squares = [ i*i for i in range(1,5)]

    Список создан, теперь рассмотрим основные возможности Python по работе со списками:

     Сечение(или срез) списка

    list_example = ['one', 'two', 3, 4]
    print list_example[0:1]

    Отметим, что в оператор print можно передавать не только переменные, но и более сложные структуры, такие как кортежи, списки и словари, он все выведет на экран.

    Добавление элемента в список.

    list_example = [1,2,3,4]
     print list_example
    [1, 2, 3, 4]
     list_example.append(5)
     print list_example
    [1, 2, 3, 4, 5]

    Сортировка списка

    list_example = [3,1,2,4]
     list_example.sort()
     print list_example
    [1, 2, 3, 4]

    Количество элементов в списке(длина списка):

    list_example = [3,1,2,4]
     print len(list_example)
    4

    Максимальный и минимальный элементы списка:

    list_example = [3,1,2,4]
     print min(list_example)
    1
    print max(list_example)
    4

    Более подробно об остальных функциях списка можно узнать в справочние [ссылка на статью про списки]
    Часто доступ по индексу не очень удобен, и для таких случаев в Python существует такой тип коллекции как словарь.

    3. Словари

    После списков словарь является самым гибким встроенным типом. Если список — это упорядоченная коллекция, то словарь — неупорядоченная. Основные особенности словарей:

    • Доступ осуществляется по ключу, а не по индексу.
    • Значения словаря хранятся в неотсортированном порядке, как и ключи.
    • По аналогии со списками, словарь может хранить вложенные словари. Ключ в словаре — неизменяемый тип(immutable). Чаще всего используется строковой тип ключа.
    • Словари реализованы как хеш-таблицы с быстрым доступом.
    • Словари, так же как и списки, хранят ссылки на свои элементы, а не сами элементы.

    Так что же такое словарь в Python? Словарь — это неупорядоченное множество пар ключ: значение с требованием уникальности ключей.

    Давайте создадим словарь, который будет хранить пары вида домен — ip-адрес :

    dict_example = {}
     dict_example['localhost'] = '127.0.0.1'
     dict_example['google.com'] = '152.165.15.12'
     print dict_example['google.com']
    '152.165.15.12'

    В этом примере мы создали словарь dict_example, записали в него два значения ip-адресов с ключами ‘localhost’ и ‘google.com’ соответственно. А потом легко и просто вычислили Google по ip.

    Долой скучную теорию, даешь программирование на Python!

    ]]>
    https://python-blog.ru/spravochnik-python-kortezhi-spiski-slovari/feed/ 0
    Справочник Python. Встроенные типы данных. https://python-blog.ru/spravochnik-python-vstroennyie-tipyi-dannyih/ https://python-blog.ru/spravochnik-python-vstroennyie-tipyi-dannyih/#respond Thu, 06 Oct 2016 12:44:01 +0000 https://python-blog.ru/?p=70 Читать далее Справочник Python. Встроенные типы данных.]]> Всем привет, сегодня мы рассмотрим основные типы данных, используемые в Python. Типы данных в Python совпадают с основными типами в других языках программирования. Попробуем их перечислить:

    Основные типы данных, используемые в Python:

    1. Целочисленный
    2. Вещественный
    3. Строка
    4. Логический
    5. Комплексный

    Рассмотрим числовые типы данных(int, float, complex):
    Для числовых типов данных в Python определены следующие операции:

    Операция Результат Комм.
    x + y Сумма X и Y
    x — y Разность X и Y
    x * y Произведение X и Y
    x / y Частное X и Y (1)
    x // y Неполное частное X и Y (3)(4)
    x % y Остаток от деления X на Y (3)
    -x минус X
    +x Ничего не изменяет в X
    abs(x) модуль X
    int(x) приводит X к целочисленному типу (2)
    long(x) приводит X к целочисленному типу(большие числа) (2)
    float(x) Приводит X к вещественному типу (5)
    complex(re,im) Возвращает комплексное число с действительной частью re, и мнимой im.
    c.conjugate() Возвращает комплексно-сопряженное число с числом c.
    pow(x, y) X в степени Y (6)
    x ** y X в степени Y (6)

    Комментарии:

    1. Будьте внимательны, если оба операнда в операции деления – целочисленные значения(тип int), то результатом деления будет также целое число. Т.е. результом операции 1/2 будет 0. Помните об этой особенности Python, это поможет вам избежать ошибок.
    2. Приведение типа с использованием функций int() или long() отбрасывает дробную часть(не округляя), для округления воспользуйтесь функциями math.floor() и math.ceil() для округления к нижней и к верхней границе соответственно.
    3. Кроме комплексных чисел. Для работы с комплксными числами – преобразовать их в тип float с помощью функции abs().
    4. Также называется “целочисленным делением”.
    5. float также принимает строки “nan” and “inf” с префиксом “+” or “-” для определения Not a Number (NaN) and плюс или минус бесконечности.
    6. Python определяет pow(0, 0) и 0 ** 0 равными 1, как и большинство языков программирования.

    Теперь разберемся с логическим типом данных bool c двумя вариантами значения – True и False. В старых версиях Python такого типа данных не было, и любой тип данных мог быть приведен к логическому значению True или False. Все числа, отличные от нуля, и непустые строки или коллекции трактовались как True, а пустые и нулевые значения рассматривались как False. Так же себя ведут и новые версии Python.

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

    ]]>
    https://python-blog.ru/spravochnik-python-vstroennyie-tipyi-dannyih/feed/ 0