Машинно обучение Лабораторно упражнение 3 Работа с функции, файлове и графики 1. Допълнителни сведения за функции 1.1. Стойности на аргументите по подразбиране Пример за функция, която може да бъде извиквана с по-малко аргументи, отколкото е дефинирана: >>> def function(answer, count=5, text='желаете ли затворите приложението? Отговорете с да или не!'): while 1: yesno = input(answer) if yesno in ( Да, да ): return 1 if yesno in ( Не, не ): return 0 count = count - 1 if count < 0: print (text) raise IOError( Довиждане! ) Тази функция може да бъде извиквана например така: >>> function ( Наистина ли желаете да затворите приложението? ) или така: >>> function ( Наистина ли желаете да затворите приложението?, 2) Стойностите по подразбиране се изчисляват по време на дефинирането на функцията в обсега на самата дефиниция, така че например: >>> x = 111 >>> def function2(parameter=x): print(parameter) >>> parameter = 200 >>> function2( ) ще отпечата 111. Важно предупреждение: Стойностите по подразбиране се изчисляват само веднъж. Това поражда разлика, когато стойността по подразбиране е променлив обект като списък или речник (dictionary). Например, следващата функция събира аргументите, които са и подадени в последователни извиквания:
>>> def function(x, y = []): y.append(x) return y >>> print(function(1)) >>> print(function(2)) >>> print(function(3)) Резултат: [1] [1, 2] [1, 2, 3] Ако не желаете стойността по подразбиране да бъде споделяна между последователните извиквания, можете вместо това да напишете функцията така: >>> def function(x, y = None): if y is None: y=[ ] y.append(x) return y Самостоятелна задача 1: Извиквайте функцията function последователно с параметри 1, 2, 3. 1.2. Аргументи с ключови думи Функциите могат да бъдат извиквани и с използването на аргументи с ключови думи във формата ключова_дума = стойност. Например, следващата функция: >>> def sendmessage(sender, recipient='world!', greeting='hello', question='how have you been?', sendoff='best Wishes'): print (greeting, recipient, question, sendoff, sender) може да бъде извиквана по следните начини: >>> sendmessage("skynet") >>> sendmessage(greeting = 'Dear Mr/Ms', sender = 'Random Internet Person') >>> sendmessage( Me, sendoff = Regards ) >>> sendmessage( Your mom, Ron, What did you do with the car ), но следващите извиквания биха били невалидни:
>>> sendmessage() # липсва задължителен аргумент >>> sendmessage( Me, sender= You ) # дублирана стойност за аргумент >>> sendmessage(city= Sofia ) # непозната ключова дума Списъкът с аргументите може да съдържа всякакви позиционни аргументи, следвани от всякакви аргументи с ключови думи, където ключовите думи са избрани от имената на формалните параметри. Не е важно дали даден формален параметър има стойност по подразбиране или не. Не може обаче един аргумент да получи стойност повече от веднъж. Имената на формалните параметри, съответни на позиционните аргументи, не могат да бъдат използвани като ключови думи в едно и също извикване. Ето един пример, който пропада заради това ограничение: >>> def fun(a):... print( Hello World )... >>> fun(0, a=0) Traceback (innermost last): File "<stdin>", line 1, in? TypeError: keyword parameter redefined Когато последният формален параметър има формата **име, той получава речник, съдържащ всички аргументи с ключови думи, които не съответстват на формален параметър. Това може да бъде комбинирано с формален параметър с формата *име, който получава комплект (tuple), съдържащ позиционните аргументи извън списъка на формалните параметри. (*име трябва да се яви преди **име.) Например, ако дефинираме функция, подобна на тази: >>> def showranking (*arguments, **keywords): print (arguments) print (keywords) Тя може да бъде извикана например така: >>> showranking('skiing', 'Bobsled', 'Triathlon', first='bulgaria', second='romania', third='macedonia') Задача: Тествайте последната функция с различни параметри. 2. Работа с файлове 2.1. Отваряне на файл open() - връща файлов обект object и най-често се използва с два аргумента: Формат на функцията: open(файлово_име, режим).
Първи аргумент име на файла Режими: r файлът се отваря само за четене w създава се нов файл и се отваря само за запис (съществуващ файл със същото име ще бъде изтрит) a файлът се отваря за запис, като добавя съдържанието в края на файла, ако той съществува 't' текстов режим (по подразбиране) r + файлът се отваря за четене и запис а + файлът се отваря за четене и запис, като добавя съдържанието в края на файла, ако той съществува Аргументът режим е незадължителен; ако r е пропуснат, той се подразбира. За повече информация: help(open) 2.2. Четене на файл Функция read() - без параметри прочита целия текстов файл (всички символи) Създайте текстов файл с произволно съдържание с име: testfile Метод read(char_numbers) - прочита char_numbers символи от файла >>> file = open("testfile.txt", "r") >>> print(file.read()) Метод readline() - прочита ред от файла При първото извикване прочита първия ред, при второто прочита втория и т.н. >>> file = open("testfile.txt", "r") >>> print(file.readline()) Метод readlines() - прочита всички редове от файла, разделени в подходящ формат Пример за четене на файл ред по ред: >>> file = open("testfile.txt", "r") >>> print(file.readlines()) Или: >>> file = open("testfile.txt", "r") >>> for line in file:
print(line) 2.3. Запис във файл Метод write(string) - запис на символния низ string във файла Пример за създаване на текстов файл и запис на текст в него. >>> file = open("testfile.txt","w") >>> file.write("this is our new text file\n") >>> file.write("and this is another line.") >>> file.write("\nwhy? Because we can.") >>> file.close() 2.4. Затваряне на файл Метод close() 2.5. Достъп до файл с оператор with Операторът with предоставя по-ясен синтаксис за обработване на файл. Негово предимство е, че автоматично затваря всеки отворен файл след приключване на файловите операции. Формат: with open( filename ) as file: >>> with open("testfile.txt") as f: for line in f: print(line) Липсва извикване на метода close(), който се извиква автоматично в края на оператора with. Пример за създаване на файл и запис в него: >>> with open("123.txt","w") as f: f.write("hello\n")
f.write("1234567\n") f.write("abcdefgh\n") Пример за прочитане на съдържанието на файла в променлива: >>> with open("123.txt") as f: data = f.readlines() print(data) 2.6. Разделяне на думи, прочетени от текстов файл Метод split() - разделя думи в символен низ с разделител интервал >>> with open("123.txt", "r") as f: data = f.readlines() >>> for line in data: words = line.split() print(words) Методът split() може да се извика с параметър символ. В този случай думите се разделят с разделител този символ. Например: >>> str="i love chocolate very much." >>> print(str.split(",")) За повече информация: help(str.split) Самостоятелна задача 2: Даден е символен низ "I love chocolate very much". Да се запише всяка дума от низа на отделен ред в текстов файл. 3. Визуализация на данни 3.1. Въведение в matplotlib matplotlib - мултиплатформена библиотека за визуализация на данни matplotlib.pyplot - функции за изчертаване на графики и фигури За повече информация: >>> import matplotlib.pyplot >>> help(matplotlib.pyplot)
или https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html 3.1.1. Функция plot Функцията plot се използва за изчертаване на графики на функции. Примери: plot(x, y) # plot x and y using default line style and color plot(x, y, 'bo') # plot x and y using blue circle markers plot(y) plot(y, 'r+') # plot y using x as index array 0..N-1 # ditto, but with red plusses За повече информация: >>> >>> help(plt.plot) plt.plot([1,2,1,2,3,2,4]) plt.ylabel('some numbers') Параметрите на функцията plot() са стойности за y в графиката. По подразбиране python създава същите данни за x, като започва от 0. plt.plot([1, 2, 3, 4], [1, 4, 1, 16]) За всяка двойка параметри е възможен трети параметър. Това е символен низ, който задава цвят и тип на графиката. Например: b- - непрекъсната синя линия (по подразбиране) r- - непрекъсната червена линия o- - данни с точки 3.1.2. Функция axis() axis() - функция, задаваща [xmin, xmax, ymin, ymax] plt.plot([1,2,3,4], [1,4,1,16], 'ro')
plt.axis([0, 6, 0, 20]) Практически matplotlib се използва често с numpy масиви. Numpy е библиотека за представяне и операции с множества от данни. За повече информация: >>> import numpy >>> help(numpy) Или http://www.numpy.org/ 3.1.3. Функция arange( ) Синтаксис: arange([start,] stop[, step,], dtype=none) За повече информация: >>> import numpy as np >>>help(np.arange) import numpy as np t = np.arange(0., 5., 0.2) # равномерно разпределя на интервали от 200 ms plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^') # червени тирета, сини квадратчета, зелени триъгълници Самостоятелна задача 3: Визуализирайте графиката на функцията y=x 2, за стойности на x=[-2;+2] със стъпка 0.01. 3.2. Работа с множество графики 3.2.1. Функция figure функция създаваща фигура Синтаксис: figure(num=none, figsize=none, dpi=none, facecolor=none, edgecolor=none, frameon=true, FigureClass=<class 'matplotlib.figure.figure'>, **kwargs) За повече информация: >>> import numpy as np >>> help(plt.figure)
Синтаксис: 3.2.2. Функция subplot subplot(nrows, ncols, plot_number) Субдиаграмите позволяват няколко графики да бъдат поставени н една и съща фигура. Аргументите са: брой редове, брой колони и в коя клетка да се постави графиката. Извикване на субдиаграмата трябва да бъде последвано от диаграмна функция, която може да е plot. Ако числата указващи nrows, ncols и plot_number са едноцифрени може да се пропуска разделителя запетая. plt.figure(1) # първа фигура plt.subplot(211) # първа графика в първата фигура, като фигурата е на два реда и 1 колона plt.plot([1, 4, 2]) plt.subplot(212) # втора графика в първата фигура plt.plot([3, 1, 7]) plt.figure(2) plt.plot([4, 2, 8]) # втора фигура # създава subplot(111) по подразбиране plt.figure(1) plt.subplot(211) # задава фигура 1 текуща; subplot(212) също е текуща # задава subplot(211) във фигура 1 текуща plt.title('easy as 1, 2, 3') # заглавие на subplot 211 3.3. Добавяне на текст в графика import numpy as np x = np.random.randn(10000) # връща извадка от нормално разпределение # хистограма plt.hist(x) plt.title("gaussian Histogram") plt.xlabel("value")
plt.ylabel("frequency") plt.grid(true) plt.grid(true) 3.4. Добавяне на анотации в графика import numpy as np ax = plt.subplot(111) t = np.arange(0.0, 5.0, 0.01) s = np.cos(2*np.pi*t) line = plt.plot(t, s) plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),arrowprops=dict(facecolor='black') plt.ylim(-2,2) # задаване на ограничения по у - оста