В прошлой публикации я написал умение Розалии включать музыку. Правда, такая реализация в большей степени бесполезна. Открыть папку и запустить файл музыки я и сам могу, зачем для этого писать программу воспроизведения только одного музыкального файла?
Но если я кое-что подправлю в программе, то могу сделать программу более пригодной для жизни.
- Оформлю программу в виде функции
- Аргументом функции задам файл, который хочу воспроизвести
- Отсортирую список файлов так, чтобы убрать лишние файлы. Я же хочу запустить музыку, зачем мне тогда в списке файлы фотографий?
Чтобы оформить программу в виде функции подправлю одну строчку и весь код помещу в функцию, которую назову play_music::
И снова функции
Словом def я говорю Python, что хочу описать функцию с именем play_music и аргументом функции nomer_file. После знака двоеточия Python понимает, что я начну описывать действия, которые будет выполнять функция play_music. Действия, принадлежащие функции, от основной программы отделены знаком табуляции - так Python понимает, что
- 1 - musik_PLAY_dir = "d:/12"
- 2 - LIST_FILE = os.listdir(musik_PLAY_dir)
- 3 - PLAY=os.path.join(musik_PLAY_dir,LIST_FILE[nomer_file])
- 4- os.startfile(PLAY)
эти четыре действия находятся внутри функции play_music и запустятся, только если я её вызову. А вызову я ее в конце программы с аргументом «0».
Переменная nomer_file задает индекс элемента списка файлов из директории с музыкой. Нулевой элемент моего списка с файлами – 1.mp3.
Теперь запросы растут и мне нужно, чтобы я сам выбрал песню из списка, которую хочу включить. Запросов все больше, а где же золотая рыбка? Зачем она? Ваш интеллект и есть та рыбка, исполняющая желания. Реализую вот что:
Изменю немного код;
file_musik=input("Какую песню включить ")
а затем вынесу эти строки
LIST_FILE = os.listdir(musik_PLAY_dir)
musik_PLAY_dir = "d:/12"
из функции play_music в основную программу.
Такие манипуляции приводят к двум изменениям:
- Переменные LIST_FILE и musik_PLAY становятся глобальными. Т.е. я могу их использовать во всей программе, а не только внутри функции.
- file_musik будет содержать значение, которое я введу с клавиатуры.
Но перед тем, как с клавиатуры вводить значение, нужно вывести список файлов на экран, чтобы я видел из чего выбирать и какую песню включить. Т.е. я должен записать:
print ("1 -"+LIST_FILE[0])
print ("2 -"+LIST_FILE[1])
print ("3 -"+LIST_FILE[2])
print ("4 -"+LIST_FILE[3])
Далее я ввожу номер, и запускается файл. Напомню, что переменная LIST_FILE содержит список файлов из директории d:/12. К каждому элементу списка можно обратиться по его индексу - LIST_FILE[0].
Но если файлов внутри директории 100 или 1000, то 1000 раз писать команду print «не прикольно» . К тому же, если я не знаю количество файлов в директории, то это "в двойне не прикольно". Лучше запишу красивую конструкцию языка Python, которая позволяет неоднократно выполнять одни и те же действия - цикл.
Что такое цикл?
Итак, мне нужно вывести список файлов на экран. Для этого я пишу функцию print_file:
В качестве аргумента функции я буду указывать список LIST_FILE.
print_file(LIST_FILE)
Цикл начинает со слова for, а описание действий, которые хочу повторять - после двоеточия. Вот в этой строке for file_ in list_file: зашифровано количество повторения двух действий:
- print (str(count)+" - "+file_)
- count=count+1
for указывает переменной file_ последовательно принимать все значения из списка list_file и при каждом новом значении выполнять действия
- выводить это значение на экран - print (str(count)+" - "+file_)
- к переменной count прибавлять единицу. Цикл закончится тогда, когда file_ примет последние значение списка.
А вот так, Розалия покажи, как работает цикл:
Из скрина выше видно, что переменная file_ последовательно принимает четыре значения, переменная count увеличивается на единицу. Таким образом, цикл срабатывает четыре раза. Также print (str(count)+" - "+file_) выводит не только файлы с расширением mp3, еще проскальзывают файлы фотографий. А мне нужна только музыка! Исправлю это функцией endswith. Эта функция применяется к строке и сообщает заканчивается ли строка определенным набором символов. К примеру, могу записать так:
file_.endswith(".mp3"). Если строка file_заканчивается ".mp3", endswith() вернет значение "Истина", а если не заканчивается - "Ложь"
Таким образом задача сводится к применению функции endswith(".mp3") и проверки условия:
если endswith(".mp3") в качестве значения вернет Истина", то вывести этот элемент списка, а если Ложь" удалить элемент из списка.
Конструкция условия
Конструкция условия в Python позволяет изменить ход выполнения программы. Условную конструкцию я могу записать так:
Тут комментарии излишние:
А вот полный текст программы:
На этом я прощаюсь, что не понятно расскажу в следующий раз и за одно "волью" это умение "воспроизводить музыку" в сущность Розалии. До встречи на канале.