Connect with us

Обучение

Python #9: Генераторы, and, or, copy, обработка исключений

531

 

Сегодня мы посмотрим, какие еще полезные инструменты можно использовать в питоне

Тернарный оператор

Это такой оператор, где операция возвращает первый или третий операнд в зависимости от выполнения условия. Тернарный оператор можно использовать вместо конструкции if…else, где нет условия elif

«выполняется_это_условие» если выражение истинно, иначе «_это_условие»

Служит он для того, чтобы уменьшить объем кода. Синтаксис очень простой:

Для примера можно использовать следующую задачу:

Результат:

Тернарный оператор можно использовать прямо в конструкции Print, если мы хотим, чтобы на консоль выводилось то или иное значение

Генераторы словарей и списков

[adace-ad id=»3482″]

 

Генератор списков или словарей — это специальная конструкция, которая помогает генерировать их по заданным условиям. В основном их используют как альтернативу циклу for, т.к. генераторы работают быстрее. Синтаксис генератора следующий:

param1 for param1 in dict if param1 ==0

param1 — это то, что мы записываем в список

for param1 in dict — цикл for, который записывает первый параметр в список или словарь

if param1 ==0 — условие, при котором это происходит

Генератор списка можно показать на таком примере:

Результат:

Теперь посмотрим на генератор словарей

Результат:

Примеры использования генераторов

[adace-ad id=»3475″]

 

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

[code]

# генератор случайных чисел

import random

#создаем список, 1ый параметр — функция рандома и указанный диапазон
#второй параметр — цикл с функцией range, мы указываем, что будем записывать в список только 10 чисел
randomlist = [random.randint (1,100) for i in range(10)] print(randomlist)

# список из квадратов числа

list = [1,2,3,4,5,-5]

# в list мы заносим возведенный в квадрат элемент списка, а сами элементы
# мы получим благодаря циклу, который перебирает их из списка list

list = [elements **2 for elements in list] print(list)

# Теперь создадим список имен, начинающихся на букву Д

names = [‘Алексей’,’Давид’,’Дмитрий’,’Андрей’]

names = [name for name in names if name.startswith(‘Д’)] print(names)

[/code]

 

Результат:

Приведение типов данных к bool

Все типы данных в питоне можно привести к логическому типу данных (bool), которое отдает нам либо false, либо true.

Истиной будет считаться любой не пустой список, словарь, кортеж + целые числа (не равные нулю) в т.ч. числа с плавающей точкой (float).

Ложью будет считаться пустые списки, кортежи, строки, число ноль и тип данных None.

Всё это служит для облегчения разработки, для создания лаконичного кода и улучшает его читаемость. Например:

[adace-ad id=»3473″]

 

[code]

viskarik = ‘spiced’

# классический способ проверки
if len(viskarik) !=0:
print(‘Вискарик есть!’)
else:
print(‘Вискарика нет’)

# новый рекомендуемый способ

if viskarik: #здесь условие уже заложено. Т.е. если строка не пустая — это, по умолчанию, true
print(‘Вискарик есть!’)
else:
print(‘Вискарика нет’)

[/code]

 

Результат у нас одинаковый в классическом способе и в более удобном:

Оператор and

Оператор and служит для того, чтобы проверять все условия на true. Если он «споткнется» об элемент false (пусть он будет даже один из тысячи), то условие внутри цикла не выполнится.  Так же он выводит первую попавшуюся ложь в условии. С истиной наоборот — он выведет последнюю истину в условии

[code]

import math

if 1>2 and math.sqrt(-1):
print(‘Это строка не выводится, т.к. уже первое условие — ложь’)

print(‘Вывод будет этот’)

#оператор and выводит первую попавшуюся ему ложь

print({1}, [], 100, 200.2) # при таком раскладе будут выводиться все элементы

print({1} and [] and 100 and 200.2)# при таком раскладе на вывод попадет пустой список, а это у нас false

#оператор and выводит последнюю истину

print({1} and [1] and 100 and 200.2) # так как у нас везде истина, на вывод попадет последняя из них

[/code]

 

Результат:

Оператор or

Оператор or наоборот остановит перебор условий, если текущее будет true, т.е. является обратной «стороной» оператора and. Он будет возвращать первый истинный элемент или последний ложный

[code]

import math

if 2>1 or math.sqrt(-1):
print(‘Вывод сработает, т.к. первое условие сразу true’)

#оператор or выводит последнюю попавшуюся ему ложь

print({1}, [], 100, {}, 200.2) # Опять обычный вывод

print(0 or None or 0 or [] or {}) # Здесь возвращается словарь

#оператор or выводит первую истину

print([1] or [1] or 100 or 200.2) #это будет список [1] [/code]

 

Результат:

Практика использования and и or

Чтобы лучше понять, как эти операторы помогают нам в разработке, рассмотрим две задачи

[code]

import math

numbers = [1,4,-9,-6,3,4,5] # создаем список, в котором имеются отрицательные числа

# наша задача создать список тех чисел, квадратный корень которых будет меньше двух

list =[] # создаем пустой список под результат

for i in numbers:
if i>0 and math.sqrt(i) <2:
list.append(i)
print (list)

# как работает or

def addtolist(list_input=None): # параметр в функции по умолчанию none, т.е. false
list_input = list_input or [] list_input.append(777)
return list_input

# если параметр останется none (т.е. false) — мы вызвали функцию без параметра
# т.е. конструкцию можно прочитать как list_input = none or [] # в свою очередь or возвращает последнюю ложь — а это у нас пустой список
# далее по условию мы добавляем в него 777

result = addtolist() #т.е. в функцию без параметра просто запишется 777
print(result)

result = addtolist([0,1]) #а в функцию с параметром, то or вернет list_input (перезапишет его), т.к. возвращает первую истину
print(result)

[/code]

 

Результат:

Оператор сopy

Представьте, что у нас есть-какой либо список в переменной list. Если мы переприсваиваем этот список в переменную list2 и изменим там какое-то значение, то в списке list  — оно тоже изменится. Кстати, это правило работает только со списком. Например, если мы используем строку (str), то оригинал её не изменится Чтобы полноценную копию списка, которую можно изменять не в ущерб оригинальному списку используется либо срез (list2 = list[:]), либо оператор copy. Перед тем как его использовать, нужно сделать его импорт: import copy

[code]

import copy
list1 = [1,3,4,5,77,888,999] list2 = list1.copy()

# пока у нас оба списка одинаковые

print (list1)
print (list2)

list2[1] = 10000 # изменим второй элемент списка два

# наш оригинальный список остался нетронутым, зато второй изменился
print(list1)
print(list2)

[/code]

 

Результат:

Для того, чтобы полностью скопировать список, который имеет в себе вложения (другие списки внутри списка), обычная функция copy не подойдет. Необходимо использовать функцию глубокого копирования list2 = copy.deepcopy(list1)

Обработка исключений

Во время выполнения программы может возникнуть ситуация, когда возникнет логическая ошибка и интерпритатор прекратит свою работу. Это называется исключительной ситуацией. Самое простой пример — это деление на ноль. Дело в том, что если мы не обработаем исключение, то программа завершит свою работу и последующий код не будет выполнен. Поэтому там, где возможна такая ситуация лучше перестраховаться.

В питоне имеются несколько типов таких «нештатных» ситуаций. Общие ошибки имеют тип Exception, также есть TypeError, ValueError  и т.д. Если вы знаете, что в этом условии может произойти какой-то конкретный тип ошибки — лучше его указывать. В целом конструкция обработки исключений выглядит как:

try — except — else — finaly (но может состоять только из первых двух)

try — это блок кода, где может возникнуть исключение

except — что делаем при возникновении исключения

else — что делать, если исключение не произошло

finaly — этот код выполнится в любом случае

Как это выглядит на практике:

[code]

viskarik = int(input(‘Сколько денег у тебя есть?’))

try: # здесь внутри блок, где может быть (а у нас точно будет) ошибка
money = viskarik > 800
except: # денег не хватает — пишем об этом пользователю
print(‘Чуви, подкопи баблос’)
else:
print(‘Поздравляю с покупкой’)
finally:
print(‘Всего доброго’)

[/code]

 

Результат:

Чтобы вручную вызвать исключительную ситуацию можно воспользоваться оператором raise

Нажмите что бы оставить комментарий

Ответить

Ваш адрес email не будет опубликован.

Лучшие сервисы стриминга музыки в 2019 году

Сервисы

Телевидение Wink Ростелеком: Samsung LG, Sony, Phillips, Android TV

Ростелеком

Ноутбуки Asus не видят жесткий диск. Автоматический вход в BIOS при старте

Гаджеты

LG WEB OS: приложения, обновления, настройка, проблемы со звуком

Гаджеты

Advertisement Яндекс.Метрика

Digital2.ru - Тренды, Профессии IT, WEB- разработка, Вакансии, Автоматизация, Цифровая экономика
Свободное копирование и распространение материалов с сайта Digital2.ru
разрешено только с указанием активной ссылки на Digital2 как на источник.
Copyright 2018 - 2020 © All rights reserved

OPGIO.COM

Connect