Урок 3

Функции

Общие сведения

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

Обращение к функции (вызов функции) — это вызов блока кода этой функции для его исполнения. Т.е. без обращения, данный код не будет исполнен. В языке Python для этого надо написать имя функции и пару скобок (между ними указав параметры, если требуется). Пример: test_func()

Встроенные функции языка Python

На самом деле, мы уже познакомились с частью встроеных функций (build-in functions) языка Python.

  • print()
  • input()
  • str()
  • int()
  • и тд

Все это функции языка. Полный перечень можно посмотреть в документации

Пользовательские функции

Кроме встроенных функций, можно так же написать свои, для реализации любых действий. Все что нужно сделать — это объявить функцию и вызвать ее.

Объявление функции — По сути, написание самой функции (при помощи специального слова def и имени функции, а так же, перечисления параметров функции), и блока кода, который к ней относится.

Пример:

def func_test(param_a):
    print ("This is function!")
    print ("This will print value in param_a: "+param_a)

print ("This is main code")
func_test ("Hello!")

Результат:

This is main code
This is function!
This will print value in param_a: Hello!

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

Параметры функции по-умолчанию
Так же можно указать аргументы по-умолчанию. Это значит, что при вызове функции, даже если соответсвующие параметры не были переданы, будут взяты значения по-умолчанию.

Пример:

def func_test(param_a,param_b="default"):
    print ("This is function!")
    print ("This will print value in param_a: "+param_a)
    print ("Param b has value - "+param_b)

print ("This is main code")
func_test ("Hello!")

print("Now im gonna call func with param_b")
func_test ("Second time!","new value")

Результат:

This is main code
This is function!
This will print value in param_a: Hello!
Param b has value — default
Now im gonna call func with param_b
This is function!
This will print value in param_a: Second time!
Param b has value — new value

Область видимости — Тот надоб данных, с которыми конкретный программный код может работать. Выделяют:

  • Глобальные данные — те переменные и методы, к которым есть доступ у всего кода программы
  • Локальные данные — Те переменные и методы к которому есть доступ только у определенного мест

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

Пример:

def test_func(test_arg):
    test_var=3

test_func("a")
print (test_arg)
print (test_var)

Результат:

Traceback (most recent call last):
File “”, line 1, in
NameError: name ‘test_arg’ is not defined

Traceback (most recent call last):
File “”, line 1, in
NameError: name ‘test_var’ is not defined

Так произошло, потому что это переменные в области видимости функции

Для чего вообще использовать функции?

Python придерживается принципе DRY, который подразумивает как можно меньше писать код-дубликат, и как можно чаще повторно использовать ранее написаный код. Функции как раз позволяют это делать.

Так же функции проще поддерживать, чем код, идущий одной стеной.

Так же код с функциями проще для понимания, особенно если использовать комментарии и говорящие названия функций

Возврат значения

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

Пример:

def hello_ret():
    return "hello world!"
string = hello_ret()
print (string)

Результат:

hello world!

Так же можно возвращать несколько значений: return a,b

Пример:

def hello_ret():
    return "hello", "world!"
str1,str2 = hello_ret()
print (str1+str2)

Результат:

helloworld!

Файлы

Базовые понятия

Когда мы используем программу, информация хранится в оперативной памяти. Из за чего, при закрытии программы, вся информация теряется и при перезапуске мы начинаем работу с чистого листа (яркий пример, задание 2 из прошлого урока). Что бы этого не происходило, ее можно записывать в файл, и при повторном запуске просто считывать ее и продолжать работать с ней (в данном случае, файл — это своего рода База Данных)

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

Так же можно программой сгенерировать огромный массив данных и записать в файл для дальнейшей обработки. Ну и так далее.

Открытие файла

Для работы с файлом, в первую очередь его требуется открыть. Для этого используется функция open(), которая возвращает объект файл.
file_object = open(“filename”, “mode”)

  • “filename” — это путь до файла. Может быть относительным или абсолютным.
  • “mode” — режим открытия файла. Есть несколько режимов открытрытия файлов:
    • “r” — Режим чтения файла. Режим по умолчанию (можно не указывать, т.е. функцию вызвать с 1 аргументом filename)
    • “w” — открытие на запись, содержимое файла удаляется (файл перезаписывается), если файла не существует, создается новый
    • “x” — открытие на запись, если файла не существует, возникнет исключение
    • “a” — открытие на дозапись, информация добавляется в конец файла
    • “b” — открытие в двоичном режиме (для бинарных файлов)
    • “t” — открытие в текстовом режиме (значение по-умолчанию, его не обязательно указывать)
    • “+” — открытие на чтение и запись
      Методы можно указывать вместе, к примеру бинарная запись — “wb”; бинарное чтение — “rb”. По-умолчанию, если метод не указан, будет “rt”. Так как “t” — по-умолчанию, то “w” и “wt” будут одно и тоже выполнять
  • Так же есть и другие аргументы: open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True), но их оставим на самостоятельное изучение (так как они не обязательны и используются не так часто)
    Пример:
f = open("file.txt","r")

Результат:
В переменную f будет записан объект файла, с которым в дальнейшем можно будет работать

!!!Важно!!!

В конце работы с файлами его обязательно надо закрывать с помощью метода close()

Чтение данных из файла

!!!Важно!!!

Работая с файлами, необходимо помнить про служебные символы и про кодировку

Самым основным действием с файлом является чтение. Есть два основных метода чтения из файла — это чтение файла целиком и построчное чтение

  1. Метод read(n) — читает n символов из файла. Если вызвать без аргумента — прочтется целиком. Если передавать аргумент n — то чтение начинается с места, до которого было прошлое чтение.
    Пример:
    файл test.txt содержит строку hello!! world!
f = open("test.txt","r")
print (f.read(3))
print (f.read(3))
f.close()

Результат:

hel
lo!

  1. Метод readline() — Чтение только одной строки
  2. Метод readlines() — чтение всех строк, возвращает значение типа список

Это основные методы чтения. Так же можно читать файл построчно, при помощи цикла for
файл test.txt содержит строки:
hello!! world
second line
Пример:

f = open("test.txt", "r")

for line in f:
    print(line)
f.close()

Результат:

hello!! world

second line

Почему одна строка пустая? потому что в конце первой строки присутствует символ конца строки “\n”, а функци print выполняет перенос строки. Это можно проверить, выполнив метод read(). Можно воспользоваться методом из 1 урока strip() для более корректного вывода:

f = open("test.txt", "r")

for line in f:
    print(line.strip())
f.close()

Результат:

hello!! world
second line

Запись в файл

Запись осуществляется при помощи метода write(‘str’)
Пример:

str_list=["Hello world","Second line","3d line"]
f = open("test2.txt", "w")
for line in str_list:
    f.write(line+'\n')
f.close()

Результат:
Файл с 4 строками

Hello world
Second line
3d line

Зачем \n добавлять? Что бы после каждого элемента списка добавлялся символ конца строки, тем самым каждый элемент запишется с новой строки

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