Как определить полярность, не имея приборов
Как определить полярность неизвестного вам источника питания? Давайте предположим, что вам в руки попался какой-нибудь блок питания постоянного напряжения, батарейка или аккумулятор. Но… на нем не обозначено, где плюс, а где минус. Да, дело быстро решается мультиметром, но что делать, если у вас его нет под рукой? Спокойно. Есть три проверенных рабочих способа.
Определяем полярность с помощью воды
Думаю, это самый простой способ определения полярности. Первым делом наливаем водичку в какую-нибудь емкость. Желательно не металлическую. От источника питания с неизвестными клеммами отводим два провода, отпускаем их в нашу водичку и смотрим внимательно на контакты. На минусовом выводе начнут выделяться пузырьки водорода. Начинается электролиз воды.
Как определить полярность с помощью сырого картофеля
Берем сырую картофелину и разрезаем ее пополам.
Втыкаем в нее два наших провода от неизвестного источника постоянного тока и ждем 5-10 мин.
Около плюсового вывода на картошке образуется светло-зеленый цвет.
[quads id=1]
Как определить полярность с помощью компьютерного вентилятора
Берем вентилятор от компьютера. Он имеет два вывода, а иногда даже три. Третий может быть желтый провод – датчик оборотов. Но его мы все равно использовать не будем. Нас волнуют только два провода – это красный и черный. Если на красном проводе будет плюс, а на черном – минус, то вентилятор у нас будет вращаться
Если же не угадали, то лопасти будут стоять на месте.
Вентилятор используем, если известно, что напряжение источника питания от 3 и до 20 Вольт. Подавать на вентилятор напряжение более 20 Вольт чревато для него летальным исходом.
Проще конечно купить мультиметр, можно на алиэкспрессе.
Если не понятно по картинкам, смотрите видео про полярность:
youtube.com/embed/CZ7NorA4ulk?feature=oembed» frameborder=»0″ allow=»accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture» allowfullscreen=»»/>Как определить и проверить полярность с помощью мультиметра
Точное знание полярности электроприбора крайне важно. Ведь если подключить электрическую аппаратуру с нарушением полярности, она может либо не работать, либо полностью выйти из строя. В большинстве случаев «плюс» и «минус» проводов и контактов в подобных устройствах обозначаются буквенным, символьным или цветовым способом (на корпусе возле контактов есть маркер «+» и «-», а провода имеют черный цвет для минуса и красный для плюса).
Но иногда случается, что визуально определить полюса нет возможности. Для этого можно воспользоваться как обыкновенным тестером полярности, так и подручными средствами.
Определение полярности мультиметром
Иногда случается, что в новом электрическом аппарате, который необходимо подключить, отсутствует маркировка полярности или необходимо перепаять проводку поврежденного устройства, а все провода одного цвета. В такой ситуации важно правильно определить полюса проводов или контактов.
Но при наличии необходимых приборов возникает закономерный вопрос: как мультиметром определить плюс и минус электроприбора?
Для определения полярности мультиметр необходимо включить в режим замера постоянного напряжения до 20 В. Провод черного щупа подключается в гнездо с маркировкой СОМ (он соответствует отрицательному полюсу), а красный подключается в гнездо с маркером VΩmA (он, соответственно, является плюсом).
После этого щупы подсоединяются к проводам или контактам и прибор, полярность которого необходимо узнать, включается.
Если на дисплее мультиметра отображается значение без дополнительных знаков, то полюса определены правильно, контакт к которому подключен красный щуп – это плюс, а к которому подключен черный щуп будет соответствовать минусу.
В том случае если мультиметр показал значение напряжения со знаком минус – это будет означать, что щупы подключены к устройству неверно и красный щуп будет минусом, а черный – плюсом.
Если мультиметр, которым производится замер, аналоговый (со стрелкой и табло с градациями значений), при правильном подключении полюсов стрелка покажет действительное значение напряжения, а сели полюса перепутаны то стрелка будет отклоняться в противоположную сторону относительно нуля, то есть показывает отрицательное значение напряжения тока.
Определение полярности альтернативными методами
Если случилось так, что мультиметра под рукой нет, а полярность необходимо найти, можно использовать альтернативные и «народные» средства.
К примеру, заряды проводки динамиков проверяются при помощи батарейки на 3 вольта. Для этого необходимо на короткий промежуток времени прикоснуться проводами, присоединенными к батарейке, к выводам динамика.
Если диффузор в динамике начинает двигаться наружу, это будет значить, что положительная клемма динамика присоединена к плюсу батарейки, а отрицательная к минусу. Если же диффузор движется внутрь – полярность перепутана: положительная клемма замкнута на минусе, а отрицательная на плюсе.
Если необходимо подключить блок питания постоянного напряжения или аккумулятор, но на них нет маркировки полярности, а под рукой нет мультиметра, плюс и минус можно определить «народными» методами при помощи подручных материалов.
Самый простой способ определения полярности, которым можно воспользоваться дома – это использовать картофель. Для этого необходимо взять один клубень сырого картофеля и разрезать пополам. После этого два провода (желательно разного цвета или с любым другим отличительным знаком) оголенными концами втыкаются в срез картофеля на расстоянии 1-2 сантиметра друг от друга.
Другие концы проводов подключаются к проверяемому источнику постоянно тока, и прибор включается в сеть (если это аккумулятор, то после подсоединения проводов больше ничего делать не нужно) на 15-20 минут. По истечении этого времени на срезе картофеля, вокруг одного из проводов образуется светло-зеленое пятно, которое будет признаком плюсового заряда провода.
Второй способ также не требует, каких либо, особых устройств или инструментов. Для определения полярности проводов источника постоянного тока понадобится емкость с теплой водой, в которую опускаются два подключенных к источнику питания провода.
После включения прибора в сеть вокруг одного из проводов начнут появляться пузыри газа (водород) – это процесс электролиза воды. Эти пузырьки образуются вокруг источника отрицательного заряда.
Следующий способ подойдет в том случае, если есть не используемый, рабочий компьютерный кулер. Способ определения полярности данным методом заключается в том, что кулер необходимо запитать от проверяемого источника бесперебойного питания. Но зачастую в кулерах присутствует три провода:
- черный, отвечает за отрицательный заряд;
- красный, отвечает за положительный заряд;
- желтый, является датчиком оборотов.
В данном случае желтый провод игнорируется и никуда не подключается. Если после подключения кулера к источнику постоянного напряжения, кулер начал работать, то полярность определена правильно, плюс подключен к красному проводу, а минус – к черному. А если кулер не срабатывает – это будет означать что полярность неправильная.
Также, если мультиметр отсутствует, положительный и отрицательный контакты аккумулятора можно определить при помощи индикаторной отвертки.
Для этого необходимо дотронутся индикатором до одного из выводов аккумулятора, прижать палец к обратной стороне индикатора (к контакту на рукоятке), а ко второму выводу аккумулятора дотронуться рукой.
Если индикатор начал светиться, то заряд проверенного вывода, с которым он контактирует, имеет положительное значение, а если индикатор не засветился – вывод отрицательный. Но у этого способа определения полярности есть один недостаток.
Если аккумулятор разрядился или поврежден (пробит), индикатор будет загораться при контакте с обеими клеммами, из-за чего определить значения полюсов аккумуляторной батареи будет невозможно.
полярность проводов, на зарядном устройстве
Полярность — это термин, используемый в электрике. Полярность определяется как состояние тела или системы, в которой она имеет противоположные физические свойства в различных точках, особенно магнитных полюсов или электрического заряда. Чтобы определить плюс и минус на проводах, существуют разные способы.
Описание полюсов
В случае электрического тока, проходящего между двумя точками, или полюсами, один из полюсов будет иметь больше электронов, чем другой. Говорят, что полюс с большим количеством электронов имеет отрицательный заряд. Полюс с меньшим количеством электронов имеет положительный заряд. Когда два полюса соединены проводом, электроны движутся от отрицательного полюса к положительному. Этот поток называется электрическим током.
Полярность может быть разных видовК сведению!
В цепи постоянного тока один полюс всегда отрицательный, а другой положительный с электронами, идущими только в одном направлении. В цепи переменного тока (AC) два полюса чередуются между отрицательным и положительным полюсами с направлением электронов, идущих в обратном направлении.Проверка полярности
Переменный ток может быть проверен с помощью мультиметра или вольтметра Ом. Тестирование с помощью мультиметра обычно включает в себя прикосновение положительного и отрицательного проводов от счетчика к проверяемой проводке.
ВольтметрОбратите внимание! Мигающий отрицательный знак («-») перед цифровым считыванием на счетчике указывает на неправильную полярность.
Обратная полярность
Если обнаружено, что одна из розеток в доме имеет обратную полярность, исправить проблему несложно, однако нужно быть осторожным, чтобы не поразило электрическим током. Перед осмотром проводки необходимо отключить бытовое электроснабжение. Положительные провода, которые обычно красные или черные, должны быть подключены к латунной клемме. Нейтральные провода, которые обычно являются белыми или серыми, должны быть подключены к хромированной клемме светлого цвета.
Важно! Если провода подключены неправильно, то получится обратная полярность, в результате чего ток будет идти в обратном направлении. Это может привести к поражению электрическим током любого, кто прикоснется к устройству или розетке, и даже к повреждению самого устройства.
Как найти плюс и минус
Когда мастер имеет дело с электрической проводкой, определение отрицательных и положительных жил играет важную роль. Некоторые провода будут иметь четкую маркировку со знаком плюс («+„) или минус (“-»). У немаркированных проводов можно сначала попытаться проверить полярность, взглянув на физические характеристики, такие как цвет или текстура. Если этот метод смущает, можно проверить провода с цифровым мультиметром.
Некоторые провода имеют плюс и минусВажные нюансы:
- вилки прибора на самом деле не имеют положительных и отрицательных сторон. Вместо этого у них один зубец горячий, а другой нейтральный;
- у положительных и отрицательных проводов есть отличия по форме и материалу. Ребристый обычно является отрицательным проводом на удлинителе. Если есть провод, в котором обе стороны имеют одинаковый цвет, обычно медный с рифленой текстурой является отрицательным. Нужно провести пальцами по проволоке, чтобы определить, с какой стороны есть ребра. Если она гладкая, значит у нее положительный показатель.
- на динамиках и усилителях серебряный провод обычно отрицательный, а медный — положительный. Их часто скрепляют между собой прозрачным корпусом, поэтому легко определить полярность каждой стороны. Часто черный провод является отрицательным, а красный — положительным. Если оба кабеля черные, а у одного белая полоса, то он отрицательный, а простой черный положительный.
- можно посмотреть в руководстве по эксплуатации, чтобы определить, какие провода являются отрицательными в автомобиле. Любое авто следует своей собственной системе цветовой кодировки для проводов. Не существует стандартной или международной системы, поэтому стоит найти схему подключения, соответствующую марке и модели в руководстве пользователя.
Какого цвета полюса в проводах
Защитно-нейтральный кабель соединяет защитный заземляющий и N-нейтральный кабеля. Эти типы требуют двойного заземления, натянутого вдоль линии. Маркировка электрических проводов такая же, как и для защитного проводника, желто-зеленая. Синий цвет использовался и в старых инсталляциях, но в настоящее время такая маркировка встречается редко. Гораздо чаще можно увидеть установки, отмеченные альтернативными желтыми и зелеными полосами.
Обратите внимание! Сам кончик защитно-нейтрального кабеля, как правило, отмечен синим цветом.
Нулевой кабель встречается в очень старых электроустановках. Он использовался в тех случаях, когда схемы еще не имели нейтральных и защитных кабелей. В установке были только фазовый и заземленный нейтральный провода, которые можно было распознать по синему цвету. Сегодня нейтральный проводник больше не используется в электроустановках.
Зеленый цвет кабеля с положительным потенциаломЗелёный цвет предназначен для электрических кабелей с положительным потенциалом.
В электронных устройствах положительный заряд протекает в красных проводах, отрицательный — в чёрных.
Как найти короткое замыкание в машине с мультиметром
Мультиметровые приборы помогут точно определить, какой именно провод не работает, так как будет заметно отсутствие напряжения на неисправном кабеле. Поиск короткого замыкания является довольно утомительным процессом и потребует от измерения непрерывности, чтобы определить.
Обратите внимание! В зависимости от того, какое устройство будет протестировано, потребуется установить диапазон и параметры для мультиметра. Если это ток, важно убедиться, что всегда используется порт с предохранителем для контактов. В противном случае придется тестировать неиспользуемые порты.
Как правильно определять полярность на проводах в авто
Если проверяется напряжение на автомобиле, курс держится на поиск постоянного. 20 Вт — это правильная настройка, если проверяется батарейка. Поэтому нужно отрегулировать циферблат до нужного диапазона/установки и подключить зонды к любому компоненту, для которого необходимо получить показания.
Как проверить фару с помощью мультиметра
МультиметрЧтобы проверить проводку фары, нужно найти заземляющий провод. От разъема, который подключается к лампочке, идут 2-4 проводка. Где два или три провода, только один из них является заземляющим, в то время как четырехпроводные разъемы будут иметь два заземления.
Чтобы протестировать провода на фаре, необходимо настроить мультиметр на сопротивление. Можно разместить один из зондов на заземляющий, а другой на отрицательный полюс аккумулятора автомобиля.
Обратите внимание! Если не читается непрерывность, то есть проблема с проводом заземления, то есть он нуждается в замене.
Как проверить провод заземления автомобиля с помощью мультиметра
Для тестирования проводов заземления стоит начать с измерения сопротивления. Тест вдоль проводки, чтобы проверить показания, составляет 5 Ом или меньше. Если оно превышает, нужно будет проверить провод дальше. Необходимо переключить мультиметр на постоянное напряжение и включить любую электрическую деталь, с которой возникли проблемы. Стоит проверить провод дважды, чтобы убедиться, что показания не превышают 0,05 В. Если это так, нужно будет использовать другое место для заземления или использовать связующий ремешок.
Как проверить, не перегорел ли предохранитель с помощью мультиметра
Поиск и устранение неисправностей предохранителя с помощью мультиметра чрезвычайно прост. Необходимо установить мультиметр в настройках с наименьшим значением Ом и поместить зонды по обеим сторонам крышек предохранителей. Предохранители не имеют полярности, поэтому используемые контакты не покажут значений.
ПредохранителиОбратите внимание! Если очень низкое значение сопротивления, то предохранитель работает отлично. Если значение сопротивления не изменилось после подключения контактов, предохранитель перегорел.
Также можно протестировать предохранитель с помощью контрольной лампочки. Нужно включить ключ и коснутся обеих сторон предохранителя наконечником контрольной лампочки. Если он загорится, предохранитель в порядке. Если он не загорится, предохранитель нужно заменить.
Как использовать мультиметр от автомобильной аккумуляторной батареи
Если возникают трудности с запуском автомобиля, одной из наиболее распространенных причин является слабая батарея. Это то, что можно легко проверить с помощью мультиметра, который также даст точное представление о том, сколько заряда батареи на самом деле осталось. Тестирование автомобильной батареи в первую очередь является отличным способом исключить вероятный культ для многих электрических проблем.
При тестировании автомобильной аккумуляторной батареи нужно проверить напряжение, установив мультиметр на 20 V DC. Необходимо подключить контакты к обеим клеммам батареи, подходящие по цвету. Лучше еще включить фары, чтобы получить точные сведения, касающиеся заряда.
Важно! Фары нужно включать на заглохшем двигателе.
В большинстве случаев будут указаны показания где-то между 11.8 V и 12.6 V. Чем выше показания напряжения, тем больше заряда в батарее. Показание 12,5 В означают, что батарея почти полностью заряжена, в то время как показание 11,9 В, что батарея должна быть заменена в ближайшее время.
Проверка зарядного устройства
Электронные устройства используют адаптеры для преобразования переменного тока, подаваемого от настенных розеток, в постоянный ток. После преобразования в постоянный ток течет в одном направлении, отсюда и термин «постоянный ток».
Какого цвета плюсовой провод на зарядном устройствеОбратите внимание! Один провод положительный, который проводит ток к прибору, а другой отрицательный, который завершает цепь. Направление потока называется полярностью и наносится на зарядные устройства с помощью диаграммы. Если диаграммы нет на зарядном устройстве, стоит проверить полярность.
Полярность проводов зарядного устройства по цвету не имеет значения.
Чтобы определить, является ли зарядное устройство пригодным для эксплуатации, необходимо сделать следующее:
- Подключить зарядное устройство к розетке.
- Включить мультиметр и установить настройки на напряжение постоянного тока. Большинство мультиметров указывает эту настройку как VDC.
- Вставить красный положительный контакт в отверстие в наконечнике зарядного устройства.
- Дотронуться до черного отрицательного контакта и до внешней металлической части наконечника зарядного устройства.
- Проследить за показаниями мультиметра. Можно увидеть положительное или отрицательное число, указывающее на выходное напряжение постоянного тока зарядного устройства. Если число положительное, то полярность на внутренней стороне наконечника зарядного устройства положительная. Если число отрицательное, то полярность внутри отрицательная.
Как узнать полярность с помощью мультиметра
Иногда бывает так, что в новом электроприборе нет отметки полярности или нужно заново включить проводку испорченного устройства, а все провода имеют один цвет. В подобной ситуации необходимо правильно выделить полюса контактов.
Чтобы определить полярность, к прибору должен быть подключен мультиметр для измерения напряжения постоянного тока до 20 Вт. К разъёму с маркировкой COM (минус) присоединяют черный провод, а в разъём с отметкой VmA — красный провод (следовательно, это знак плюса). После этого зонды подключаются к проводам или контактам и активируется устройство, полярность которого необходимо узнать.
Обратите внимание! Если на дисплее отображается значение мультиметра без дополнительных сигналов, полюса будут правильно определены. Контакт, к которому подключен красный электрод, является плюсовым сигналом. У чёрного контакта будет отрицательный заряд.
Если мультиметр отображает отрицательное значение напряжения, это означает, что зонды неверно соединены с устройством, и красный контакт будет отрицательным, а черный — со знаком плюс.
Если измерительный прибор является аналоговым, то при верном подключении полюсов указатель отобразит фактическое значение напряжения, а полюса будут перевернуты, стрелка начнет отклоняться в обратном направлении от нуля, т. е. представлять минусовое напряжение.
Таким образом, для определения плюса и минуса проводов есть несколько способов — на глаз и с помощью специального оборудования. Все они обладают своими плюсами, минусами и нюансами, которыми стоит руководствоваться в проведении тестирования.
плюс или минус, цветовое обозначение заземления и нуля на проводах
На чтение 9 мин Просмотров 23.6к. Опубликовано Обновлено
Полярность электроприбора является важнейшей составляющей при подключении. При нарушении полярности устройство может выйти из строя и привести к негативным последствиям. Обычно положительный и отрицательный провода помечаются буквами, символами или цветом. Но иногда не получается определить принадлежность жилы, тогда пользуются тестерами и другими способами.
Параметры классификации проводов
Провода классифицируются по разным показателям, например, по сечению кабеля и числу жилПроводники имеют два вида маркировки – цветовую и буквенно-цифровую. По этим обозначениям можно понять, из чего выполнено изделие, какое назначение у жилы, какой материал и другие важные параметры.
Провода можно классифицировать по следующим показателям:
- Число жил. В зависимости от количества жил проводник может использоваться для обеспечения электродвигателя питанием, разводки электропроводки, передачи электрического тока в силовых сетях. Также от числа жил зависит гибкость изделия.
- Материал. Преимущественно используется медь для создания токоведущих жил, так как она более стойкая и имеет хорошие характеристики. Раньше применялся алюминий – он быстро разрушается, имеет непродолжительный срок службы и уступает по свойствам медному прибору.
- Изоляционный слой. На проводнике может присутствовать или отсутствовать изоляция. Она делается из диэлектрического материала и оберегает изделие от механических повреждений, внешнего воздействия, а также человека от поражения электрическим током.
- Сечение. От этого показателя зависит нагрузка, которую кабель способен пропустить через себя.
- Иные показатели. Мощность, напряжение, рабочие температуры, условия эксплуатации также важны для выбора проводника.
Благодаря перечисленным свойствам можно правильно подобрать провод для разных целей.
Для чего нужно окрашивание жил
Цветовая маркировка проводов позволяет быстро сориентироваться, за что отвечает каждая жилаНачинающие мастера, которые только осваивают азы электротехники, не могут сразу определить, белый провод это плюс или минус. Расцветка важна при идентификации жил и называется маркировкой.
Цветовая маркировка проводников – это необходимость, позволяющая мастеру быстро сориентироваться, за что отвечает каждая жила. С ее помощью можно понять, какого цвета нулевой провод и где находится фаза. Она также позволяет упростить чтение электронных схем.
Особенно важно соблюдение цветовой маркировки при подключении к счетчикам, автоматам, приборам. Без окраски сложно разобраться, какое устройство могло выйти из строя и в какую цепь оно подключено.
Производители окрашивают кабели в определенные цвета, установленные правилами электротехнических установок ПУЭ. Они строго регламентируют, какая маркировка должна использоваться для той или иной жилы.
Кроме того важно понимать, что свой окрас имеют положительный и отрицательный контакты в цепи постоянного тока. Какого цвета плюсовой провод, также устанавливается правилами.
В случае немаркированного кабеля одного цвета метка с информацией может ставиться на концах изделия (например, на термоусадочной трубке).
Окрас фазы
При монтаже электропроводки особую опасность представляют именно фазные жилы. При касании фазы человек может получить удар электрическим током, который может навредить здоровью или привести к летальному исходу. Окрас в яркие цвета позволяет мастеру определить, что перед ним именно фазный проводник.
Обычно фазу окрашивают в красный и черный цвета, но может встречаться и другой окрас (оранжевый, коричневый, розовый, фиолетовый, белый, бирюзовый и другие).
Если электрик точно не знает, какого цвета фаза, можно идти методом исключения. Нулевой и заземляющий провода имеют строго определенную расцветку, и тогда оставшаяся жила является фазой.
На схемах фаза обозначается латинской буквой L. Если их несколько, добавляется цифра – L1, L2, L3 для трехфазных сетей 380 В. Также встречается обозначение А, В и С в электросетях с тремя фазами.
Окрас заземляющего провода
Современные стандарты регламентируют желто-зеленый окрас земли. Окраска может выполняться в виде поперечных желто-зеленых полос или как желтая изоляция с одной или двумя продольными полосками зеленого цвета.
Некоторые производители выпускают заземляющий провод ярко-зеленого или желтого цвета. Опознать землю в таком случае несложно, так как подобная расцветка запрещена для обозначения фазы. Аналогичная маркировка используется и на электрических схемах. Буквенное обозначение – РЕ.
Часть специалистов неправильно называют землю «нулевым и защитным» проводом. Это может запутать других, нужно понимать, что под таким названием скрывается именно земляной провод. Он по определению защитный, так как помогает обезопасить человека от удара электрическим током в случае аварийной ситуации.
Окрас нуля
Нулевой или нейтральный провод традиционно красят в синий или голубой цвет, но встречается окраска синего цвета с белой полоской. Другие оттенки не применяются для нуля. Также нулевой проводник специалисты называют рабочим нулем. Такое выражение корректно, так как он участвует в электропроводке с питанием.
В некоторых схемах ноль может называться минусом, а фаза – плюсом.
Окрас проводов и шин при переменном трехфазном токе
Шины и вводы на трансформаторы в трехфазных сетях окрашиваются определенным образом. Желтый – это фаза А, зеленый – фаза В, красный – фаза С.
Такие сети нашли свое применение в следующих областях:
- Промышленность, строительство, складирование. Позволяют подключать мощные промышленные установки, разгрузочные машины и другое электрооборудование.
- Электрификация общественного транспорта. Трамваи и троллейбусы работают именно на трехфазной сети 380 В.
- Электрические подстанции.
Сети постоянного тока используют только два провода – плюс (положительная шина) и минус (отрицательная шина). Какой провод плюс, а какой минус также можно понять по цветам.
По нормативным документам положительная шина должна быть окрашена в красный цвет, а минусовый провод – в серый или черный. Средний проводник обозначается голубым цветом. Увидеть такое обозначение плюса и минуса на проводах можно на различной аудио- и видеоаппаратуре, а также другой электронике.
В случае ответвления двухпроводной электрической сети положительный проводник должен окрашиваться так же, как и плюс на трехпроводной сети, к которой он подсоединен.
Особенности работы с электропроводами разного цвета
Есть случаи, когда знание фазы и нуля необязательно. Например, при подключении новой розетки или замене старой. При подсоединении в нее вилки полярность не важна и не влияет на работоспособность устройства.
В ситуациях, когда нужно присоединить выключатель к люстре, требуется узнать фазу и ноль. На переключатель подключается фазовый проводник напрямую, а на лампочки – только нулевой. В ином случае выключатель работать не будет.
Использование проводников разных оттенков намного облегчило работу мастерам и ускорило процесс монтажа. Также цветовое обозначение позволило повысить безопасность при работе с жилами, находящимися под напряжением.
Как проверить правильность маркировки и расключения
Все работы с электрикой нужно проводить в обесточенном помещенииЦветовая маркировка и является простой и удобной, но полностью полагаться на ее правильность не следует. К тому же со временем она может стереться, что затрудняет идентификацию провода. Сложность заключается и в старых проводах, которые были монотонными – белые или черные. Поэтому перед проведением работ следует проверить, за что отвечает каждая жила.
Важно перед электромонтажом обесточить помещение. Проводки на концах следует немного зачистить, и лишь потом проверять тестером. В ином случае можно получить удар электрическим током.
Проверка с помощью индикаторной отвертки
Определение фазового провода при помощи индикаторной отверткиДля работы потребуется тестер. Это может быть мультиметр или индикаторная отвертка. Она внешне выглядит как обычная отвертка, но на конце имеется светодиодный индикатор. Ее рукоятки обязательно заизолированы. С отверткой работать проще – достаточно прикоснуться к каждой жиле, и если щуп попал на фазу, должен загореться светодиодный индикатор. Такой способ подходит для двухжильных проводов. Главный недостаток определения фазы индикаторной отверткой – риск ложного срабатывания. Она может отреагировать на наводки и показать наличие напряжения там, где его нет.
Купить устройство можно в любом строительном магазине. Оно стоит недорого и доступно каждому в отличие от профессиональных тестеров.
Стоимость индикаторной отвертки
Проверка с помощью мультиметра
Проверка проводов при помощи мультиметраДля трехжильного провода нужен мультиметр. Тогда можно идти путем исключения – найти точную фазу с помощью отвертки, а затем тестером определять землю и ноль.
Мультиметры бывают двух видов – цифровые и аналоговые. Разница заключается лишь в выведении информации, точности проверки и внутреннему механизму. Способ проверки от вида тестера не поменяется. Для домашнего мастера можно купить недорогой мультиметр с ограниченным функционалом.
Круговой переключатель нужно поставить в положение более 220 В. Затем нужно взять два щупа за изолированные рукоятки и аккуратно прикоснуться одним щупом к найденному фазовому проводу, а вторым – к оставшемуся проводнику. Если на экране загорелось 220 В или чуть больше, то найденный провод является нулем. С землей значение будет ниже. Алгоритм проверки аналогичный.
Стоимость мультиметра
Определение заземления, нуля и фазы с помощью контрольной лампы
Использование контрольной лампы для поиска нулевой фазыПодобный способ использовать не рекомендуется, так как тестер и индикаторная отвертка являются более точным и безопасным методом. Но в случае отсутствия инструментов можно провести следующие действия, выполняя все предельно аккуратно:
- Вкрутить в патрон лампочку.
- К клеммам патрона зацепить провода с зачищенной изоляцией.
- Поочередно присоединить к проводам лампы проверяемые жилы.
Этот способ позволяет найти фазовый проводник. Если лампочка засветилась, то одна подключенная жила является фазой. В ином случае жилы нулевая и заземляющая.
Остальные народные способы проверки применять запрещено. Они небезопасны и могут привести к поражению электрическим током.
Самостоятельное нанесение маркировки
Бывают случаи, когда маркировка стирается или она отсутствует/перепутана. Тогда после прозвонки каждого проводника следует самостоятельно обозначить, какая жила за что отвечает.
Если участки провода полностью заменяются, можно приобрести кабели необходимого цвета. В случае невозможности приобрести подходящий оттенок можно сделать на концах метку с помощью цветной изоленты или термоусадочной трубки. Правила позволяют маркировать проводник не по всей длине, а только на местах присоединения к шинам.
где плюс, где минус по внешнему виду
Многие виды электрических конденсаторов полярности не имеют и поэтому их включение в схему не представляет трудностей. Электролитические накопители заряда составляют особый класс, т.к. имеют положительные и отрицательные выводы, поэтому при их подключении часто возникает задача — как определить полярность конденсатора.
Как определить полярность электролитического конденсатора?
Существует ряд способов, как проверить расположение плюса и минуса на корпусе устройства. Полярность конденсатора определяется следующим образом:
- по маркировке, т.е. по нанесенным на его корпус надписям и рисункам;
- по внешнему виду;
- с помощью универсального измерительного прибора — мультиметра.
Важно правильно определить положительные и отрицательные контакты, чтобы после монтажа при подаче напряжения схема не вышла из строя.
По маркировке
Маркировка накопителей заряда, в том числе электролитических, зависит от страны, компании-производителя и стандартов, которые со временем меняются. Поэтому вопрос о том, как определить полярность на конденсаторе, не всегда имеет простой ответ.
Обозначение плюса конденсатора
На отечественных советских изделиях обозначался только положительный контакт — знаком «+». Этот знак наносился на корпус рядом с положительным выводом. Иногда в литературе плюсовой вывод электролитических конденсаторов называют анодом, поскольку они не только пассивно накапливают заряд, но и применяются для фильтрации переменного тока, т.е. обладают свойствами активного полупроводникового прибора. В ряде случаев знак «+» ставят и на печатной плате, вблизи от положительного вывода размещенного на ней накопителя.
На изделиях серии К50-16 маркировку полярности наносят на дно, выполненное из пластмассы. У других моделей серии К50, например К50-6, знак «плюс» нанесен краской на нижнюю часть алюминиевого корпуса, рядом с положительным выводом. Иногда по низу также маркируются изделия импортные, произведенные в странах бывшего социалистического лагеря. Современная отечественная продукция отвечает общемировым стандартам.
Маркировка конденсаторов типа SMD (Surface Mounted Device), предназначенных для поверхностного монтажа (SMT — Surface Mount Technology), отличается от обыкновенной. Плоские модели имеют черный или коричневый корпус в виде маленькой прямоугольной пластины, часть которой у положительного вывода закрашена серебристой полосой с нанесенным на нее знаком «плюс».
Обозначение минуса
Принцип маркировки полярности импортных изделий отличается от традиционных стандартов отечественной промышленности и состоит в алгоритме: «чтобы узнать, где плюс, сначала нужно найти, где минус». Местоположение отрицательного контакта показывают как специальные знаки, так и цвет окраски корпуса.
Например, на черном цилиндрическом корпусе на стороне отрицательного вывода, иногда называемого катодом, нанесена светло-серая полоса по всей высоте цилиндра. На полосе напечатана прерывистая линия, или вытянутые эллипсы, или знак «минус», а также 1 или 2 угловые скобки, острым углом направленные на катод. Модельный ряд с другими номиналами отличается синим корпусом и бледно-голубой полосой на стороне отрицательного контакта.
Применяют для маркировки и другие цвета, следуя общему принципу: темный корпус и светлая полоса. Такая маркировка никогда полностью не стирается и поэтому всегда можно уверенно определить полярность «электролита», как для краткости на радиотехническом жаргоне называют электролитические конденсаторы.
Корпус емкостей SMD, изготовленных в виде металлического алюминиевого цилиндра, остается неокрашенным и имеет естественный серебристый цвет, а сегмент круглого верхнего торца закрашивается интенсивным черным, красным или синим цветом и соответствует позиции отрицательного вывода. После монтажа элемента на поверхность печатной платы частично закрашенный торец корпуса, указывающий полярность, хорошо просматривается на схеме, поскольку по сравнению с плоскими элементами имеет большую высоту.
На поверхность платы наносится соответствующее маркировке обозначение полярности цилиндрического SMD-прибора: это окружность с заштрихованным белыми линиями сегментом, где располагается отрицательный контакт. Однако следует учесть, что некоторые фирмы-производители предпочитают белым цветом отмечать положительный контакт прибора.
По внешнему виду
Если маркировка стерлась или неясна, то определение полярности конденсатора иногда возможно путем анализа внешнего вида корпуса. У многих емкостей с расположением выводов на одной стороне и не подвергавшихся монтажу плюсовая ножка длиннее, чем отрицательная. Изделия марки ЭТО, ныне устаревшие, имеют вид 2 цилиндров, поставленных друг на друга: большего диаметра и небольшой высоты, и меньшего диаметра, но существенно более высокий. Контакты расположены по центру торцов цилиндров. Положительный вывод смонтирован в торце цилиндра большего диаметра.
У некоторых мощных электролитов катод выведен на корпус, который соединен пайкой с шасси электрической схемы. Соответственно, положительный вывод изолирован от корпуса и расположен на его верхней части.
Полярность широкого класса зарубежных, а теперь и отечественных электролитических конденсаторов, определяется по светлой полосе, ассоциированной с отрицательным полюсом прибора. Если же ни по маркировке, ни по внешнему виду полярность электролита определить нельзя, то и тогда задача «как узнать полярность конденсатора» решается путем применения универсального тестера — мультиметра.
С помощью мультиметра
Перед проведением экспериментов важно собрать схему так, чтобы испытательное напряжение источника постоянного тока (ИП) не превышало 70-75% от номинала, указанного на корпусе накопителя или в справочнике. Например, если электролит рассчитан на 16 В, то ИП должен выдавать не более 12 В. Если номинал электролита неизвестен, начинать эксперимент следует с малых значений в диапазоне 5-6 В, и затем постепенно повышать напряжение на выходе ИП.
Конденсатор должен быть полностью разряжен — для этого нужно соединить его ножки или выводы накоротко на несколько секунд металлической отверткой или пинцетом. Можно подключить к ним лампу накаливания от карманного фонарика, пока она не потухнет или резистор. Затем следует внимательно осмотреть изделие — на нем не должно быть повреждений и вздутий корпуса, особенно защитного клапана.
Потребуются следующие устройства и компоненты:
- ИП — батарея, аккумулятор, блок питания компьютера или специализированное устройство с регулируемым выходным напряжением;
- мультиметр;
- резистор;
- монтажные принадлежности: паяльник с припоем и канифолью, бокорезы, пинцет, отвертка;
- маркер для нанесения знаков полярности на корпус проверяемого электролита.
Затем следует собрать электрическую схему:
- параллельно резистору с помощью «крокодилов» (т.е. щупов с зажимами) присоединить мультиметр, настроенный на измерение постоянного тока;
- плюсовую клемму ИП соединить с выводом резистора;
- другой вывод резистора соединить с контактом емкости, а ее 2 контакт присоединить к минусовой клемме ИП.
Если полярность подключения электролита правильная, мультиметр ток не зафиксирует. Т.о., контакт, соединенный с резистором, будет плюсовым. В противном случае мультиметр покажет наличие тока. В этом случае с минусовой клеммой ИП был соединен плюсовой контакт электролита.
Другой способ проверки отличается тем, что мультиметр, параллельно подключенный к сопротивлению, переводится в режим измерения постоянного напряжения. В этом случае при правильном подключении емкости прибор покажет напряжение, величина которого затем будет стремиться к нулю. При неправильном подключении напряжение сначала будет падать, но потом зафиксируется на ненулевой величине.
Согласно 3 способу прибор, измеряющий постоянное напряжение, присоединяется параллельно не сопротивлению, а проверяемой емкости. При правильном подключении полюсов емкости напряжение на ней достигнет величины, выставленной на ИП. Если же минус ИП будет соединен с плюсом емкости, т.е. неправильно, напряжение на конденсаторе поднимется до значения, равного половине величины, выдаваемой ИП. Например, если на клеммах ИП 12 В, то на емкости будет 6 В.
После окончания проверок емкость следует разрядить так же, как и в начале эксперимента.
как определить где плюс, а где минус?
Известно, что светодиод в рабочем состоянии пропускает ток только в одном направлении. Если его подключить инверсионно, то постоянный ток через цепь не пройдет, и прибор не засветится. Происходит это потому, что по своей сущности прибор является диодом, просто не каждый диод способен светиться. Получается, что существует полярность светодиода, то есть он чувствует направление движения тока и работает только при определенном его направлении.
Определить полярность прибора по схеме не составит труда. Светодиод обозначают треугольником в кружке. Треугольник упирается всегда в катод (знак «−», поперечная черточка, минус), положительный анод находится с противоположной стороны.
Но как определить полярность, если вы держите в руках сам прибор? Вот перед вами маленькая лампочка с двумя выводами-проводками. К какому проводку подключать плюс источника, а к какому минус, чтобы схема заработала? Как правильно установить сопротивление где плюс?
Определяем зрительно
Первый способ – визуальный. Предположим, вам необходимо определить полярность абсолютно нового светодиода с двумя выводами. Посмотрите на его ножки, то есть выводы. Один из них будет короче другого. Это и есть катод. Запомнить, что это катод можно по слову «короткий», поскольку оба слова начинаются на буквы «к». Плюс будет соответствовать тому выводу, который длиннее. Иногда, правда, на глаз определить полярность сложновато, особенно когда ножки согнуты или поменяли свои размеры в результате предыдущего монтажа.
Глядя в прозрачный корпус, можно увидеть сам кристаллик. Он расположен как будто в маленькой чашечке на подставке. Вывод этой подставки и будет катодом. Со стороны катода также можно увидеть небольшую засечку, как бы срез.
Но не всегда эти особенности заметны у светодиода, поскольку некоторые производители отходят от стандартов. К тому же есть много моделей, изготовленных по другому принципу. На сложных конструкциях сегодня производитель ставит значки «+» и «−», делают отметку катода точкой или зеленой линией, чтобы все было предельно понятно. Но если таких отметок нет по каким-то причинам, то на помощь приходит электрическое тестирование.
Применяем источник питания
Более эффективный способ определить полярность – подключить светодиод к источнику питания. Внимание! Выбирать надо источник, напряжение которого не превышает допустимое напряжение светодиода. Можно соорудить самодельный тестер, используя обычную батарейку и резистор. Это требование связано с тем, что при обратном подключении светодиод может перегореть или ухудшить свои световые характеристики.
Некоторые говорят, что подключали светодиод и так и сяк, и он от этого не портился. Но все дело в предельном значении обратного напряжения. К тому же, лампочка может сразу и не погаснуть, но срок ее работы уменьшится, и тогда ваш светодиод проработает не 30-50 тысяч часов, как указано в его характеристиках, а в несколько раз меньше.
Если мощности элемента питания для светодиода не хватает, и прибор не светится, как вы его не подключаете, то можно соединить несколько элементов в батарею. Напоминаем, сто элементы соединяются последовательно плюс к минусу, а минус к плюсу.
Применение мультиметра
Существуют прибор, который называется мультиметром. Его с успехом можно использовать, чтобы узнать, куда подключать плюс, а куда минус. На это уходит ровным счетом одна минута. В мультиметре выбирают режим измерения сопротивления и прикасаются щупами к контактам светодиода. Красный провод указывает на подключение к плюсу, а черный – к минусу. Желательно, чтобы касание было кратковременным. При обратном включении прибор ничего не покажет, а при прямом включении (плюс к плюсу, а минус к минусу) прибор покажет значение в районе 1,7 кОм.
Можно также включать мультиметр на режим проверки диода. В этом случае при прямом включении светодиодная лампочка будет светиться.
Данный способ самый эффективный для лампочек, излучающих красный и зеленый свет. Светодиод, дающий синий или белый свет рассчитан на напряжение, большее 3 вольт, поэтому не всегда при подключении к мультиметру он будет светиться даже при правильной полярности. Из этой ситуации можно легко выйти, если использовать режим определения характеристик транзисторов. На современных моделях, таких как DT830 или 831, он присутствует.
Диод вставляют в пазы специальной колодки для транзисторов, которая обычно расположена в нижней части прибора. Используется часть PNP (как для транзисторов соответствующей структуры). Одну ножку светодиода засовывают в разъем С, который соответствует коллектору, вторую ножку – в разъем Е, соответствующий эмиттеру. Лампочка засветится, если катод (минус), будет подключен к коллектору. Таким образом, полярность определена.
Как определить и что это такое
В источниках питания полярность является важнейшей характеристикой. В старых батарейках или у изделий подвергшихся механическому воздействию обозначения могут быть не читаемыми, поэтому и определить где «плюс», а где «минус» бывает очень проблематично.
Что такое полярность у батарейки
Полярность батарейки определяет движение электронов от одного полюсного вывода к другому. Для работоспособности большого количества электрических приборов этот параметр является определяющим.
Для точной установки полярности потребуется воспользоваться специальными приборами, но в некоторых случаях можно обойтись и без них, если обладать информацией, как именно узнать этот параметр по определённым признакам на корпусе элемента.
Как определить полярность
При наличии обозначений “+” и “-” определение полярности не вызовет каких-либо затруднений, совершенно иная ситуации может возникнуть, когда на корпусе батарейки отсутствуют подобные указания.
У таблетки
У плоских таблеток плюс всегда находится на поверхности большей площади. После обнаружения положительного вывода отрицательным будет являться противоположный контакт.
С помощью цифрового вольтметра можно установить правильную полярность, если красный щуп будут подключён к минусу батарейки, а отрицательный к плюсу, то на дисплее перед цифрой, которая обозначает напряжение, появится минус. Это говорит о неправильном подключение, то есть красный щуп должен быть всегда соединён с плюсом батареи.
С помощью стрелочного вольтметра определить правильность подключения ещё проще. При ошибочном соединении стрелка прибора отклонится влево, что для такого измерительного устройства является недопустимым.
Обратите внимание! Если перепутать щупы при определении полярности, то ничего страшного с батарейкой или устройством не произойдет.
Цилиндрических
У круглых батареек плюс имеет несколько выпуклую плоскость, поэтому перепутать положительный и отрицательный выводы будет крайне сложно, даже если на корпусе изделия отсутствуют обозначения.
При наличии плоских контактов с обеих сторон этот параметр можно проверить с помощью измерительных приборов, а также применить для этой цели практически любой стрелочный индикатор.
В таких элементах имеется электронная катушка, которая при подаче напряжения отклоняет стрелку в определённом направлении. Для точности эксперимента следует вначале к стрелке подключить элемент питания с заведомо известным расположением контактов, после чего произвести диагностику испытуемого образца.
Кроны
У кроны положительный вывод выпуклой формы и меньше отрицательного, более того, подключается такой элемент питания посредством специального клеммника, в котором контакты также имеют различный диаметр. Проверить полярность можно также с помощью любого токоизмерительного устройства.
Может ли поменяться полярность
Чтобы в батарейке поменялась полярность, она должна быть наполовину разряжена, при этом установлена последовательно между элементами с нормальным показателем вольтажа. При работе устройства слабый элемент полностью потеряет заряд и со временем переполюсуется.
Когда батарейки меняют полярность, может произойти взрыв элемента, а литиевые батареи могут загореться, поэтому следует последовательно подключать только равные по вольтажу батареи.
Что будет если перепутать при установке
Современные электронные устройства, как правило, хорошо защищены от переполюсовки. При неправильной установке батареек сработает защита, которая предотвратит поступление электрического тока.
Если защиты нет, то многие электрические приборы таким образом могут быть выведены из строя. Для некоторых устройств значение полярности не имеют принципиального значения, например, в фонариках с лампами накаливания.
Остались вопросы или есть что добавить? Тогда напишите нам об этом в комментариях, это позволит сделает материал более полным и точным.
Определение вашей собственной функции Python — Настоящий Python
Смотреть сейчас В этом руководстве есть связанный видеокурс, созданный командой Real Python. Просмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Определение и вызов функций Python
На протяжении предыдущих руководств этой серии вы видели множество примеров, демонстрирующих использование встроенных функций Python. В этом руководстве вы узнаете, как определить вашу собственную функцию Python .Вы узнаете, когда разделить вашу программу на отдельные пользовательские функции и какие инструменты вам понадобятся для этого.
Из этого руководства вы узнаете:
- Как функции работают в Python и почему они полезны
- Как определить и вызвать вашу собственную функцию Python
- Механизмы для передачи аргументов вашей функции
- Как вернуть данные из вашей функции обратно в вызывающую среду
Функции в Python
Возможно, вы знакомы с математической концепцией функции .Функция — это связь или отображение между одним или несколькими входами и набором выходов. В математике функция обычно представлена так:
Здесь f
— это функция, которая работает на входах x
и y
. Выход функции: z
. Однако функции программирования гораздо более обобщены и универсальны, чем это математическое определение. Фактически, правильное определение и использование функций настолько критично для правильной разработки программного обеспечения, что практически все современные языки программирования поддерживают как встроенные, так и определяемые пользователем функции.
В программировании функция — это автономный блок кода, который инкапсулирует конкретную задачу или связанную группу задач. В предыдущих руководствах этой серии вы познакомились с некоторыми встроенными функциями, предоставляемыми Python. id ()
, например, принимает один аргумент и возвращает уникальный целочисленный идентификатор этого объекта:
>>> s = 'foobar'
>>> id (s)
56313440
len ()
возвращает длину переданного ему аргумента:
>>> a = ['foo', 'bar', 'baz', 'qux']
>>> len (а)
4
any ()
принимает в качестве аргумента итерацию и возвращает Истина
, если какой-либо из элементов в итерации является истинным, и Ложь
в противном случае:
>>> любое ([Ложь, Ложь, Ложь])
Ложь
>>> любой ([False, True, False])
Правда
>>> any (['bar' == 'baz', len ('foo') == 4, 'qux' в {'foo', 'bar', 'baz'}])
Ложь
>>> any (['bar' == 'baz', len ('foo') == 3, 'qux' в {'foo', 'bar', 'baz'}])
Правда
Каждая из этих встроенных функций выполняет определенную задачу.Код, выполняющий задачу, где-то определен, но вам не нужно знать, где и даже как он работает. Все, о чем вам нужно знать, это интерфейс функции:
- Какие аргументов (если есть) нужно
- Какие значения (если есть) возвращает
Затем вы вызываете функцию и передаете ей соответствующие аргументы. Выполнение программы переходит к обозначенному фрагменту кода и делает свое полезное дело. Когда функция завершена, выполнение возвращается к вашему коду с того места, где оно было остановлено.Функция может возвращать или не возвращать данные для использования вашим кодом, как в приведенных выше примерах.
Когда вы определяете свою собственную функцию Python, она работает точно так же. Где-то в коде вы вызываете функцию Python, и выполнение программы передается в тело кода, составляющего функцию.
Примечание: В этом случае вы будете знать, где находится код и как именно он работает, потому что вы его написали!
Когда функция завершена, выполнение возвращается в то место, где функция была вызвана.В зависимости от того, как вы спроектировали интерфейс функции, данные могут передаваться при вызове функции, а возвращаемые значения могут передаваться обратно после ее завершения.
Важность функций Python
Практически все языки программирования, используемые сегодня, поддерживают определенные пользователем функции, хотя их не всегда называют функциями. На других языках вы можете встретить их как одно из следующих:
- Подпрограммы
- Процедуры
- Методы
- Подпрограммы
Итак, зачем вообще определять функции? Есть несколько очень веских причин.Давайте пройдемся по нескольким.
Абстракция и возможность повторного использования
Предположим, вы пишете код, который делает что-то полезное. По мере продолжения разработки вы обнаружите, что задача, выполняемая этим кодом, вам часто требуется во многих различных местах вашего приложения. Что вы должны сделать? Что ж, вы можете просто копировать код снова и снова, используя возможность копирования и вставки вашего редактора.
Позже вы, вероятно, решите, что рассматриваемый код нужно изменить.Вы либо обнаружите, что с ним что-то не так, что нужно исправить, либо захотите как-то улучшить его. Если копии кода разбросаны по всему приложению, вам нужно будет внести необходимые изменения в каждом месте.
Примечание: На первый взгляд это может показаться разумным решением, но в долгосрочной перспективе это может стать кошмаром для обслуживания! Хотя ваш редактор кода может помочь, предоставляя функцию поиска и замены, этот метод подвержен ошибкам, и вы можете легко внести в свой код ошибки, которые будет трудно найти.
Лучшее решение — определить функцию Python, которая выполняет задачу . В любом месте вашего приложения, где вам нужно выполнить задачу, вы просто вызываете функцию. В дальнейшем, если вы решите изменить способ работы, вам нужно будет изменить код только в одном месте, то есть в том месте, где определена функция. Изменения будут автоматически приняты везде, где вызывается функция.
Абстракция функциональности в определение функции является примером принципа «не повторяйся» (DRY) при разработке программного обеспечения.Это, пожалуй, самая сильная мотивация для использования функций.
Модульность
Функциипозволяют разбить сложных процессов на более мелкие этапы. Представьте, например, что у вас есть программа, которая читает файл, обрабатывает его содержимое, а затем записывает выходной файл. Ваш код может выглядеть так:
# Основная программа
# Код для чтения файла в
<заявление>
<заявление>
<заявление>
<заявление>
# Код для обработки файла
<заявление>
<заявление>
<заявление>
<заявление>
# Код для записи файла
<заявление>
<заявление>
<заявление>
<заявление>
В этом примере основная программа — это связка кода, связанного в длинную последовательность, с пробелами и комментариями, которые помогают упорядочить ее.Однако, если бы код стал намного длиннее и сложнее, вам было бы все труднее осмыслить его.
В качестве альтернативы вы можете структурировать код примерно так:
def read_file ():
# Код для чтения файла в
<заявление>
<заявление>
<заявление>
<заявление>
def process_file ():
# Код для обработки файла
<заявление>
<заявление>
<заявление>
<заявление>
def write_file ():
# Код для записи файла
<заявление>
<заявление>
<заявление>
<заявление>
# Основная программа
read_file ()
process_file ()
write_file ()
Этот пример — модульный .Вместо того, чтобы связывать весь код вместе, он разбит на отдельные функции, каждая из которых ориентирована на конкретную задачу. Эти задачи: чтение , процесс и запись . Теперь основной программе просто нужно вызвать каждый из них по очереди.
Примечание: Ключевое слово def
вводит новое определение функции Python. Вы все об этом узнаете очень скоро.
В жизни вы делаете такие вещи все время, даже если не думаете об этом явно.Если бы вы захотели переместить несколько полок, заполненных вещами, из одной стороны гаража в другую, то, надеюсь, вы не станете просто стоять и бесцельно думать: «Ой, блин. Мне нужно перевезти все это туда! Как это сделать???» Вы бы разделили задание на управляемые шаги:
- Уберите все с полок.
- Разобрать полки.
- Перенести частей полки через гараж на новое место.
- Снова соберите полок.
- Перенести вещей через гараж.
- Положите вещей обратно на полки.
Разделение большой задачи на более мелкие и небольшие подзадачи помогает упростить рассмотрение большой задачи и управление ею. По мере того, как программы становятся более сложными, становится все более выгодным модулировать их таким образом.
Разделение пространства имен
Пространство имен — это область программы, в которой идентификаторов имеют значение.Как вы увидите ниже, когда вызывается функция Python, для этой функции создается новое пространство имен, которое отличается от всех других уже существующих пространств имен.
Практический результат этого состоит в том, что переменные можно определять и использовать в функции Python, даже если они имеют то же имя, что и переменные, определенные в других функциях или в основной программе. В этих случаях не будет путаницы или вмешательства, потому что они хранятся в отдельных пространствах имен.
Это означает, что, когда вы пишете код внутри функции, вы можете использовать имена и идентификаторы переменных, не беспокоясь о том, использовались ли они где-то еще вне функции.Это помогает значительно минимизировать ошибки в коде.
Надеюсь, вы достаточно убедились в достоинствах функций и хотите их создать! Посмотрим как.
Вызов функций и определение
Обычный синтаксис для определения функции Python следующий:
def <имя_функции> ([<параметры>]):
<заявление (я)>
Компоненты определения поясняются в таблице ниже:
Компонент | Значение |
---|---|
по умолчанию | Ключевое слово, информирующее Python о том, что функция определяется |
<имя_функции> | Действительный идентификатор Python, который называет функцию |
<параметры> | Необязательный список параметров, разделенных запятыми, которые могут быть переданы функции |
: | Пунктуация, обозначающая конец заголовка функции Python (имя и список параметров) |
<выписки> | Блок действительных операторов Python |
Последний элемент,
, называется телом функции.Тело — это блок операторов, который будет выполняться при вызове функции. Тело функции Python определяется отступом в соответствии с правилом off-side. Это то же самое, что и блоки кода, связанные со структурой управления, например, if
или while
statement.
Синтаксис для вызова функции Python следующий:
<имя_функции> ([<аргументы>])
<аргументы>
— значения, переданные в функцию.Они соответствуют <параметры>
в определении функции Python. Вы можете определить функцию, которая не принимает никаких аргументов, но круглые скобки по-прежнему необходимы. И определение функции, и вызов функции всегда должны включать круглые скобки, даже если они пусты.
Как обычно, вы начнете с небольшого примера, а затем добавите сложности. Помня об освященной веками математической традиции, вы вызовете свою первую функцию Python f ()
. Вот файл сценария foo.py
, который определяет и вызывает f ()
:
1def f ():
2 s = '- Внутри f ()'
3 отпечатка (ов)
4
5print ('Перед вызовом f ()')
6f ()
7print ('После вызова f ()')
Вот как работает этот код:
Строка 1 использует ключевое слово
def
, чтобы указать, что функция определяется. Выполнение оператораdef
просто создает определениеf ()
. Все следующие строки с отступом (строки 2–3) становятся частью телаf ()
и сохраняются как его определение, но еще не выполняются.Строка 4 — это небольшой пробел между определением функции и первой строкой основной программы. Хотя это и не является синтаксически необходимым, но иметь. Чтобы узнать больше о пробелах вокруг определений функций Python верхнего уровня, прочтите статью Написание красивого кода Python с помощью PEP 8.
Строка 5 — это первый оператор без отступа, потому что он не является частью определения
f ()
. Это начало основной программы.Когда выполняется основная программа, этот оператор выполняется первым.Линия 6 — это звонок на номер
f ()
. Обратите внимание, что пустые круглые скобки всегда требуются как в определении функции, так и при ее вызове, даже если нет параметров или аргументов. Выполнение переходит кf ()
, и выполняются операторы в телеf ()
.Строка 7 — это следующая строка, выполняемая после завершения тела
f ()
.Выполнение возвращается к этому операторуprint ()
.
Последовательность выполнения (или потока управления ) для foo.py
показана на следующей диаграмме:
Когда foo.py
запускается из командной строки Windows, результат будет следующим:
C: \ Users \ john \ Documents \ Python \ doc> python foo.py
Перед вызовом f ()
- Внутри f ()
После вызова f ()
Иногда вам может понадобиться определить пустую функцию, которая ничего не делает.Это называется заглушкой , которая обычно является временным заполнителем для функции Python, которая будет полностью реализована позже. Как блок в управляющей структуре не может быть пустым, так и тело функции не может быть пустым. Чтобы определить функцию-заглушку, используйте оператор pass
:
>>> def f ():
... проходить
...
>>> f ()
Как видно выше, вызов функции-заглушки синтаксически допустим, но ничего не делает.
Передача аргумента
До сих пор в этом руководстве функции, которые вы определили, не принимали никаких аргументов. Иногда это может быть полезно, и иногда вы будете писать такие функции. Однако чаще вам нужно передавать данные в функцию , чтобы ее поведение могло изменяться от одного вызова к другому. Посмотрим, как это сделать.
Позиционные аргументы
Самый простой способ передать аргументы функции Python — использовать позиционных аргумента (также называемых обязательных аргумента ).В определении функции вы указываете в скобках список параметров, разделенных запятыми:
>>> >>> def f (кол-во, шт., Цена):
... print (f '{qty} {item} cost $ {price: .2f}')
...
При вызове функции указывается соответствующий список аргументов:
>>> >>> f (6, 'бананы', 1.74)
6 бананов стоят 1,74 доллара
Параметры ( кол-во
, предмет
и цена
) ведут себя как переменных , которые определены локально для функции.Когда функция вызывается, переданные аргументы ( 6
, 'бананов'
и 1.74
) привязывают к параметрам по порядку, как если бы путем присвоения переменной:
Параметр | Аргумент | |
---|---|---|
шт. | ← | 6 |
товар | ← | бананов |
цена | ← | 1.74 |
В некоторых текстах по программированию параметры, указанные в определении функции, называются формальными параметрами , а аргументы в вызове функции называются фактическими параметрами:
Хотя позиционные аргументы являются наиболее простым способом передачи данных в функцию, они также обеспечивают наименьшую гибкость. Во-первых, порядок аргументов в вызове должен соответствовать порядку параметров в определении.Конечно, ничто не мешает вам указывать позиционные аргументы не по порядку:
>>> >>> f ('бананы', 1.74, 6)
бананы 1.74 стоят $ 6.00
Функция может даже работать, как в приведенном выше примере, но маловероятно, что она даст правильные результаты. Программист, определяющий функцию, должен задокументировать, какими должны быть соответствующие аргументы , а пользователь функции обязан знать эту информацию и соблюдать ее.
С позиционными аргументами аргументы в вызове и параметры в определении должны согласовываться не только по порядку, но и по номеру . По этой причине позиционные аргументы также называются обязательными аргументами. Вы не можете ничего пропустить при вызове функции:
>>> >>> # Слишком мало аргументов
>>> f (6, 'бананы')
Отслеживание (последний вызов последний):
Файл "", строка 1, в
f (6, 'бананы')
TypeError: f () отсутствует 1 обязательный позиционный аргумент: 'цена'
Вы также не можете указать лишние:
>>> >>> # Слишком много аргументов
>>> f (6, 'бананы', 1.74, кумкваты)
Отслеживание (последний вызов последний):
Файл "", строка 1, в
f (6, «бананы», 1,74, «кумкват»)
TypeError: f () принимает 3 позиционных аргумента, но было дано 4
Позиционные аргументы концептуально просты в использовании, но они не очень снисходительны. Вы должны указать такое же количество аргументов в вызове функции, как и параметры в определении, и в точно таком же порядке. В следующих разделах вы увидите некоторые приемы передачи аргументов, которые снимают эти ограничения.
Аргументы ключевого слова
При вызове функции можно указать аргументы в форме <ключевое слово> = <значение>
. В этом случае каждое <ключевое слово>
должно соответствовать параметру в определении функции Python. Например, ранее определенная функция f ()
может быть вызвана с аргументами ключевого слова следующим образом:
>>> f (qty = 6, item = 'bananas', price = 1,74)
6 бананов стоят 1,74 доллара
Ссылка на ключевое слово, которое не соответствует ни одному из заявленных параметров, генерирует исключение:
>>> >>> f (qty = 6, item = 'bananas', cost = 1.74)
Отслеживание (последний вызов последний):
Файл "", строка 1, в
TypeError: f () получил неожиданный аргумент ключевого слова 'стоимость'
Использование аргументов ключевого слова снимает ограничение на порядок аргументов. Каждый аргумент ключевого слова явно обозначает конкретный параметр по имени, поэтому вы можете указать их в любом порядке, и Python все равно будет знать, какой аргумент соответствует какому параметру:
>>> >>> f (item = 'bananas', price = 1.74, qty = 6)
6 бананов стоят 1 доллар.74
Однако, как и в случае с позиционными аргументами, количество аргументов и параметров должно совпадать:
>>> >>> # Еще слишком мало аргументов
>>> f (кол-во = 6, элемент = 'бананы')
Отслеживание (последний вызов последний):
Файл "", строка 1, в
f (кол-во = 6, элемент = 'бананы')
TypeError: f () отсутствует 1 обязательный позиционный аргумент: 'цена'
Итак, аргументы ключевого слова допускают гибкость в порядке указания аргументов функции, но количество аргументов остается жестким.
Вы можете вызвать функцию, используя как позиционные, так и ключевые аргументы:
>>> >>> f (6, цена = 1.74, item = 'bananas')
6 бананов стоят 1,74 доллара
>>> f (6, 'бананы', цена = 1,74)
6 бананов стоят 1,74 доллара
Когда присутствуют как позиционные аргументы, так и аргументы ключевого слова, все позиционные аргументы должны идти первыми:
>>> >>> f (6, item = 'bananas', 1.74)
SyntaxError: позиционный аргумент следует за аргументом ключевого слова
После того, как вы указали аргумент ключевого слова, справа от него не может быть никаких позиционных аргументов.
Параметры по умолчанию
Если параметр, указанный в определении функции Python, имеет форму <имя> = <значение>
, тогда <значение>
становится значением по умолчанию для этого параметра. Параметры, определенные таким образом, называются параметрами по умолчанию или дополнительными параметрами . Пример определения функции с параметрами по умолчанию показан ниже:
>>> def f (qty = 6, item = 'bananas', price = 1.74):
... print (f '{qty} {item} cost $ {price :.2f} ')
...
Когда вызывается эта версия f ()
, любой аргумент, который не указан, принимает значение по умолчанию:
>>> f (4, 'яблоки', 2.24)
4 яблока стоят 2,24 доллара.
>>> f (4, 'яблоки')
4 яблока стоят 1,74 доллара
>>> f (4)
4 банана стоят 1,74 доллара
>>> f ()
6 бананов стоят 1,74 доллара
>>> f (item = 'кумкват', кол-во = 9)
9 кумкватов стоят 1,74 доллара
>>> f (цена = 2,29)
6 бананов стоят 2,29 доллара
Итого:
- Позиционные аргументы должны соответствовать по порядку и номеру параметрам, объявленным в определении функции.
- Аргументы ключевого слова должны совпадать с объявленными параметрами по количеству, но они могут быть указаны в произвольном порядке.
- Параметры по умолчанию позволяют опускать некоторые аргументы при вызове функции.
Изменяемые значения параметров по умолчанию
Все может стать странным, если вы укажете значение параметра по умолчанию, которое является изменяемым объектом . Рассмотрим это определение функции Python:
>>> >>> def f (my_list = []):
... my_list.append ('###')
... вернуть my_list
...
f ()
принимает единственный параметр списка, добавляет строку '###'
в конец списка и возвращает результат:
>>> f (['foo', 'bar', 'baz'])
['foo', 'bar', 'baz', '###']
>>> f ([1, 2, 3, 4, 5])
[1, 2, 3, 4, 5, '###']
Значение по умолчанию для параметра my_list
— пустой список, поэтому, если f ()
вызывается без каких-либо аргументов, возвращаемое значение — это список с одним элементом '###'
:
Пока все имеет смысл.Что вы ожидаете, если вызовите f ()
без каких-либо параметров второй и третий раз? Посмотрим:
>>> f ()
['###', '###']
>>> f ()
['###', '###', '###']
Ой! Вы могли ожидать, что каждый последующий вызов также будет возвращать одноэлементный список ['###']
, как и первый. Вместо этого возвращаемое значение продолжает расти. Что случилось?
В Python значения параметров по умолчанию определяются только один раз , когда функция определена (то есть, когда выполняется инструкция def
).Значение по умолчанию не переопределяется каждый раз при вызове функции. Таким образом, каждый раз, когда вы вызываете f ()
без параметра, вы выполняете .append ()
в том же списке.
Вы можете продемонстрировать это с помощью id ()
:
>>> def f (my_list = []):
... печать (id (my_list))
... my_list.append ('###')
... вернуть my_list
...
>>> f ()
140095566958408
['###']
>>> f ()
140095566958408
['###', '###']
>>> f ()
140095566958408
['###', '###', '###']
Отображаемый идентификатор объекта подтверждает, что, когда для my_list
разрешено значение по умолчанию, значение будет одним и тем же объектом при каждом вызове.Поскольку списки изменяемы, каждый последующий вызов .append ()
заставляет список удлиняться. Это распространенная и довольно хорошо задокументированная ошибка, когда вы используете изменяемый объект в качестве значения параметра по умолчанию. Это потенциально приводит к путанице в поведении кода, и, вероятно, лучше этого избегать.
В качестве обходного пути рассмотрите возможность использования значения аргумента по умолчанию, которое сигнализирует , что аргумент не указан . Практически любое значение будет работать, но Нет.
— это обычный выбор. Когда значение дозорного показывает, что аргумент не задан, создайте новый пустой список внутри функции:
>>> def f (my_list = None):
... если my_list - None:
... my_list = []
... my_list.append ('###')
... вернуть my_list
...
>>> f ()
['###']
>>> f ()
['###']
>>> f ()
['###']
>>> f (['фу', 'бар', 'баз'])
['foo', 'bar', 'baz', '###']
>>> f ([1, 2, 3, 4, 5])
[1, 2, 3, 4, 5, '###']
Обратите внимание, как это гарантирует, что my_list
теперь действительно будет по умолчанию использовать пустой список всякий раз, когда f ()
вызывается без аргументов.
Передача по значению и передача по ссылке в Pascal
В разработке языков программирования есть две общие парадигмы для передачи аргумента функции:
- Передаваемое значение: Копия аргумента передается функции.
- Передается по ссылке: В функцию передается ссылка на аргумент.
Существуют и другие механизмы, но они, по сути, являются вариациями этих двух. В этом разделе вы сделаете небольшой отход от Python и кратко рассмотрите Pascal, язык программирования, который делает особенно четкое различие между этими двумя.
Примечание: Не волнуйтесь, если вы не знакомы с Паскалем! Концепции аналогичны концепциям Python, а показанные примеры сопровождаются достаточно подробным объяснением, чтобы вы могли составить общее представление.Как только вы увидели, как передача аргументов работает в Паскале, мы вернемся к Python, и вы увидите, как он сравнивается.
Вот что вам нужно знать о синтаксисе Паскаля:
- Процедуры: Процедура в Паскале похожа на функцию Python.
- Двоеточие равно: Этот оператор (
: =
) используется для присваивания в Паскале. Это аналог знака равенства (=
) в Python. -
Writeln ()
: Эта функция отображает данные на консоли, аналогично функции print () в Python.
Имея такую основу, вот первый пример Pascal:
1 // Пример # 1 для Паскаля
2
3процедура f (fx: целое число);
4начать
5 Writeln ('Начать f (): fx =', fx);
6 FX: = 10;
7 Writeln ('Конец f (): fx =', fx);
8end;
9
10 // Основная программа
11вар
12 x: целое число;
13
14начало
15 х: = 5;
16 Writeln ('Перед f (): x =', x);
17 f (x);
18 Writeln ('После f (): x =', x);
19 конец.
Вот что происходит:
- Строка 12: Основная программа определяет целочисленную переменную
x
. - Строка 15: Первоначально
x
присваивается значение5
. - Строка 17: Затем он вызывает процедуру
f ()
, передаваяx
в качестве аргумента. - Строка 5: Внутри
f ()
инструкцияwriteln ()
показывает, что соответствующий параметрfx
изначально равен5
, переданному значению. - Строке 6:
fx
затем присваивается значение10
. - Строка 7: Это значение проверяется этим оператором
writeln ()
, выполняемым непосредственно перед выходом изf ()
. - Строка 18: Вернувшись в вызывающую среду основной программы, этот оператор
writeln ()
показывает, что после возвратаf ()
x
все еще остается5
, как это было до вызова процедуры. .
Запуск этого кода дает следующий результат:
Перед f (): x = 5
Начать f (): fx = 5
Конец f (): fx = 10
После f (): x = 5
В этом примере x
— это , переданное значением , поэтому f ()
получает только копию.Когда соответствующий параметр fx
изменяется, x
не изменяется.
Примечание: Если вы хотите увидеть это в действии, вы можете запустить код самостоятельно, используя онлайн-компилятор Pascal.
Просто выполните следующие действия:
- Скопируйте код из поля кода выше.
- Посетите онлайн-компилятор Паскаля.
- В поле кода слева замените любое существующее содержимое кодом, который вы скопировали на шаге 1.
- Щелкните Выполнить .
Вы должны увидеть тот же результат, что и выше.
Теперь сравните это со следующим примером:
1 // Пример # 2 на Паскале
2
3процедура f (var fx: integer);
4начать
5 Writeln ('Начать f (): fx =', fx);
6 FX: = 10;
7 Writeln ('Конец f (): fx =', fx);
8end;
9
10 // Основная программа
11вар
12 x: целое число;
13
14начало
15 х: = 5;
16 Writeln ('Перед f (): x =', x);
17 f (x);
18 Writeln ('После f (): x =', x);
19 конец.
Этот код идентичен первому примеру с одним изменением.Это наличие слова var
перед fx
в определении процедуры f ()
в строке 3. Это означает, что аргумент f ()
— это , переданный по ссылке . Изменения, внесенные в соответствующий параметр fx
, также изменят аргумент в вызывающей среде.
Вывод этого кода такой же, как и раньше, за исключением последней строки:
Перед f (): x = 5
Начать f (): fx = 5
Конец f (): fx = 10
После f (): x = 10
Опять же, fx
присваивается значение 10
внутри f ()
, как и раньше.Но на этот раз, когда возвращается f ()
, x
в основной программе также было изменено.
Во многих языках программирования это, по сути, различие между передачей по значению и передачей по ссылке:
- Если переменная передается по значению, , тогда у функции есть копия для работы, но она не может изменить исходное значение в вызывающей среде.
- Если переменная передается по ссылке, , то любые изменения, которые функция вносит в соответствующий параметр, повлияют на значение в вызывающей среде.
Причина почему исходит из того, что означает ссылка на этих языках. Значения переменных хранятся в памяти. В Паскале и подобных языках ссылка — это, по сути, адрес этой ячейки памяти, как показано ниже:
На диаграмме слева x
соответствует памяти, выделенной в пространстве имен основной программы. Когда вызывается f ()
, x
— это , переданное значением , поэтому память для соответствующего параметра fx
выделяется в пространстве имен f ()
, а значение x
копируется туда. .Когда f ()
изменяет fx
, изменяется именно эта локальная копия. Значение x
в среде вызова остается неизменным.
На диаграмме справа x
— это , переданное по ссылке . Соответствующий параметр fx
указывает на фактический адрес в пространстве имен основной программы, где хранится значение x
. Когда f ()
изменяет fx
, он изменяет значение в этом месте, точно так же, как если бы основная программа сама изменяла x
.
Передача по значению и передача по ссылке в Python
Параметры в Python передаются по значению или по ссылке? Ответ таков: ни то, ни другое. Это потому, что ссылка в Python означает не совсем то же самое, что в Паскале.
Напомним, что в Python каждая часть данных представляет собой объект . Ссылка указывает на объект, а не на конкретную ячейку памяти. Это означает, что присваивание не интерпретируется в Python так же, как в Паскале. Рассмотрим следующую пару операторов в Паскале:
Они интерпретируются следующим образом:
- Переменная
x
ссылается на конкретную ячейку памяти. - Первый оператор помещает в это место значение
5
. - Следующий оператор перезаписывает
5
и помещает вместо него10
.
Напротив, в Python аналогичные операторы присваивания выглядят следующим образом:
Эти операторы присваивания имеют следующее значение:
- Первый оператор указывает
x
на объект, значение которого составляет5
. - Следующий оператор переназначает
x
как новую ссылку на другой объект, значение которого составляет10
. Другими словами, второе присвоение повторно привязываетx
к другому объекту со значением10
.
В Python, когда вы передаете аргумент функции, происходит аналогичное повторное связывание . Рассмотрим этот пример:
>>> 1 >>> def f (fx):
2 ... fx = 10
3 ...
4 >>> х = 5
5 >>> f (x)
6 >>> х
75
В основной программе оператор x = 5
в строке 5 создает ссылку с именем x
, привязанную к объекту, значение которого равно 5
.Затем в строке 7 вызывается f ()
с x
в качестве аргумента. При первом запуске f ()
создается новая ссылка с именем fx
, которая изначально указывает на тот же объект 5
, что и x
:
Однако, когда выполняется инструкция fx = 10
в строке 2, f ()
выполняет повторную привязку fx
к новому объекту, значение которого составляет 10
. Две ссылки, x
и fx
, не связаны друг с другом на .Ничто другое из того, что делает f ()
, не повлияет на x
, и когда f ()
завершится, x
все равно будет указывать на объект 5
, как это было до вызова функции:
Подтвердить все это можно с помощью id ()
. Вот слегка расширенная версия приведенного выше примера, которая отображает числовые идентификаторы задействованных объектов:
1 >>> def f (fx):
2 ... печать ('fx =', fx, '/ id (fx) =', id (fx))
3... fx = 10
4 ... печать ('fx =', fx, '/ id (fx) =', id (fx))
5 ...
6
7 >>> х = 5
8 >>> print ('x =', x, '/ id (x) =', id (x))
9x = 5 / id (x) = 13578
10
11 >>> f (x)
12fx = 5 / id (FX) = 1357
8
13fx = 10 / id (fx) = 13578
14
15 >>> печать ('x =', x, '/ id (x) =', id (x))
16x = 5 / id (x) = 1357
8
При первом запуске 8 f ()
fx
и x
оба указывают на один и тот же объект, чей id ()
равен 1357
.После того, как 8
f ()
выполнит оператор fx = 10
в строке 3, fx
указывает на другой объект, чей id ()
равен 1357
. Связь с исходным объектом в вызывающей среде теряется.
Передача аргументов в Python — это своего рода гибрид между передачей по значению и передачей по ссылке. В функцию передается ссылка на объект, но ссылка передается по значению.
Примечание. Механизм передачи аргументов Python получил название с передачей по назначению .Это связано с тем, что имена параметров привязаны к объектам при вводе функции в Python, а присвоение также является процессом привязки имени к объекту. Вы также можете увидеть термины «передача по объекту», «передача по ссылке на объект» или «передача по совместному использованию».
Ключевой вывод здесь заключается в том, что функция Python не может изменить значение аргумента, переназначив соответствующий параметр чему-то другому. Следующий пример демонстрирует это:
>>> >>> def f (x):
... x = 'foo'
...
>>> для i в (
... 40,
... dict (foo = 1, bar = 2),
... {1, 2, 3},
... 'бар',
... ['foo', 'bar', 'baz']):
... f (я)
... печать (я)
...
40
{'foo': 1, 'bar': 2}
{1, 2, 3}
бар
['фу', 'бар', 'баз']
Здесь объекты типа int
, dict
, set
, str
и list
передаются в f ()
в качестве аргументов. f ()
пытается назначить каждый объект строковому 'foo'
, но, как вы можете видеть, вернувшись в вызывающую среду, все они не изменились.Как только f ()
выполнит присвоение x = 'foo'
, ссылка будет rebound , и соединение с исходным объектом будет потеряно.
Означает ли это, что функция Python вообще никогда не может изменять свои аргументы? На самом деле нет, это не так! Посмотрите, что здесь происходит:
>>> >>> def f (x):
... x [0] = '---'
...
>>> my_list = ['foo', 'bar', 'baz', 'qux']
>>> f (мой_лист)
>>> мой_лист
['---', 'bar', 'baz', 'qux']
В этом случае аргумент f ()
— это список.Когда вызывается f ()
, передается ссылка на my_list
. Вы уже видели, что f ()
не может переназначить my_list
оптом. Если бы x
было назначено чему-то другому, то оно было бы привязано к другому объекту, и соединение с my_list
было бы потеряно.
Однако f ()
может использовать ссылку для внесения изменений в my_list
. Здесь f ()
модифицировал первый элемент.Вы можете видеть, что после возврата из функции my_list
фактически был изменен в вызывающей среде. То же самое относится и к словарю:
>>> def f (x):
... x ['bar'] = 22
...
>>> my_dict = {'foo': 1, 'bar': 2, 'baz': 3}
>>> f (my_dict)
>>> my_dict
{'foo': 1, 'bar': 22, 'baz': 3}
Здесь f ()
использует x
в качестве ссылки для внесения изменений в my_dict
.Это изменение отражается в вызывающей среде после возврата f ()
.
Сводка по передаче аргументов
Передачу аргумента в Python можно резюмировать следующим образом. Передача неизменяемого объекта , такого как int
, str
, tuple
или frozenset
, в функцию Python действует как передача по значению. Функция не может изменять объект в вызывающей среде.
Передача изменяемого объекта , такого как список
, dict
или set
, действует отчасти — но не совсем — как передача по ссылке.Функция не может переназначить объект оптом, но она может изменять элементы на месте внутри объекта, и эти изменения будут отражены в вызывающей среде.
Побочные эффекты
Итак, в Python вы можете изменить аргумент из функции, чтобы изменение отражалось в вызывающей среде. Но стоит ли вам это делать? Это пример того, что на жаргоне программирования называется побочным эффектом .
В более общем смысле говорят, что функция Python вызывает побочный эффект, если она каким-либо образом изменяет среду своего вызова.Изменение значения аргумента функции — лишь одна из возможностей.
Примечание: Вы, вероятно, знакомы с побочными эффектами из области здоровья человека, где этот термин обычно относится к непреднамеренным последствиям лекарств. Часто последствия нежелательны, например, рвота или седативный эффект. С другой стороны, побочные эффекты могут быть использованы намеренно. Например, некоторые лекарства вызывают стимуляцию аппетита, что может быть полезно, даже если это не является основным назначением лекарства.
Концепция аналогична в программировании. Если побочный эффект является хорошо задокументированной частью спецификации функции, и пользователь функции четко знает, когда и как вызывающая среда может быть изменена, тогда все в порядке. Но программист не всегда может должным образом документировать побочные эффекты или даже не подозревать о возникновении побочных эффектов.
Когда они скрыты или неожиданны, побочные эффекты могут привести к программным ошибкам, которые очень трудно отследить.Как правило, их лучше избегать.
Возврат
ЗаявлениеЧто тогда делать функции Python? В конце концов, во многих случаях, если функция не вызывает каких-либо изменений в вызывающей среде, тогда нет никакого смысла в ее вызове. Как функция должна влиять на вызывающего?
Ну, одна из возможностей — использовать возвращаемых значений функции . Оператор return
в функции Python служит двум целям:
- Он немедленно завершает функцию и передает управление выполнением обратно вызывающей стороне.
- Он предоставляет механизм, с помощью которого функция может передавать данные обратно вызывающей стороне.
Выход из функции
Внутри функции оператор return
вызывает немедленный выход из функции Python и передачу выполнения обратно вызывающей стороне:
>>> def f ():
... печать ('фу')
... печать ('полоса')
... возвращение
...
>>> f ()
фу
бар
В этом примере оператор return
фактически лишний.Функция вернется к вызывающей стороне, когда упадет с конца , то есть после выполнения последнего оператора тела функции. Таким образом, эта функция будет вести себя идентично без оператора return
.
Однако возвращает
оператор не обязательно в конце функции. Они могут появляться в любом месте тела функции и даже несколько раз. Рассмотрим этот пример:
1 >>> def f (x):
2 ... если x <0:
3... возвращение
4 ... если x> 100:
5 ... вернуться
6 ... печать (x)
7 ...
8
9 >>> f (-3)
10 >>> f (105)
11 >>> f (64)
1264
Первые два вызова f ()
не вызывают никакого вывода, потому что выполняется оператор return
и функция завершается преждевременно, до того, как будет достигнут оператор print ()
в строке 6.
Такая парадигма может быть полезна для проверки ошибок в функции. Вы можете проверить несколько условий ошибки в начале функции: вернет
операторов, которые выйдут из строя, если возникнет проблема:
def f ():
если error_cond1:
возвращение
если error_cond2:
возвращение
если error_cond3:
возвращение
<нормальная обработка>
Если ни одно из условий ошибки не обнаружено, функция может продолжить свою обычную обработку.
Возврат данных вызывающему абоненту
Помимо выхода из функции, оператор return
также используется для передачи данных обратно вызывающему . Если за оператором return
внутри функции Python следует выражение, то в вызывающей среде вызов функции оценивается как значение этого выражения:
1 >>> def f ():
2 ... вернуть 'foo'
3 ...
4
5 >>> s = f ()
6 >>> с
7'фу '
Здесь значение выражения f ()
в строке 5 равно 'foo'
, которое впоследствии присваивается переменной s
.
Функция может возвращать любой тип объекта . В Python это означает что угодно. В вызывающей среде вызов функции может использоваться синтаксически любым способом, который имеет смысл для типа объекта, который возвращает функция.
Например, в этом коде f ()
возвращает словарь. Тогда в вызывающей среде выражение f ()
представляет словарь, а f () ['baz']
является действительной ключевой ссылкой в этот словарь:
>>> def f ():
... return dict (foo = 1, bar = 2, baz = 3)
...
>>> f ()
{'foo': 1, 'bar': 2, 'baz': 3}
>>> f () ['баз']
3
В следующем примере f ()
возвращает строку, которую можно разрезать, как любую другую строку:
>>> def f ():
... вернуть 'foobar'
...
>>> f () [2: 4]
'ob'
Здесь f ()
возвращает список, который можно индексировать или разрезать:
>>> def f ():
... return ['foo', 'bar', 'baz', 'qux']
...
>>> f ()
['foo', 'bar', 'baz', 'qux']
>>> f () [2]
'баз'
>>> f () [:: - 1]
['qux', 'baz', 'bar', 'foo']
Если в инструкции return
указано несколько выражений, разделенных запятыми, они упаковываются и возвращаются как кортеж:
>>> def f ():
... вернуть 'foo', 'bar', 'baz', 'qux'
...
>>> тип (f ())
<класс 'кортеж'>
>>> t = f ()
>>> т
('foo', 'bar', 'baz', 'qux')
>>> a, b, c, d = f ()
>>> print (f'a = {a}, b = {b}, c = {c}, d = {d} ')
a = foo, b = bar, c = baz, d = qux
Если возвращаемое значение не указано, функция Python возвращает специальное значение Python Нет
:
>>> def f ():
... возвращение
...
>>> print (f ())
Никто
То же самое происходит, если тело функции вообще не содержит оператора return
и функция отваливается от конца:
>>> def g ():
... проходить
...
>>> print (g ())
Никто
Напомним, что Нет
является ложным при оценке в логическом контексте.
Поскольку функции, которые выходят с помощью простого оператора , возвращают
или падают в конце, возвращают Нет
, вызов такой функции может использоваться в логическом контексте:
>>> def f ():
... возвращение
...
>>> def g ():
... проходить
...
>>> если f () или g ():
... печать ('да')
... еще:
... печать ('нет')
...
нет
Здесь вызовы как f ()
, так и g ()
являются ложными, поэтому f () или g ()
также являются ложными, и выполняется предложение else
.
Возвращаясь к побочным эффектам
Предположим, вы хотите написать функцию, которая принимает целочисленный аргумент и удваивает его. То есть вы хотите передать целочисленную переменную в функцию, и когда функция вернется, значение переменной в вызывающей среде должно быть вдвое больше, чем было.В Паскале это можно сделать с помощью передачи по ссылке:
1процедура double (var x: integer);
2начало
3 х: = х * 2;
4end;
5
6вар
7 x: целое число;
8
9начало
10 х: = 5;
11 Writeln ('Перед вызовом процедуры:', x);
12 двойных (х);
13 Writeln ('После вызова процедуры:', x);
14 конец.
Выполнение этого кода дает следующий результат, который подтверждает, что double ()
действительно изменяет x
в вызывающей среде:
Перед процедурой вызова: 5
После вызова процедуры: 10
В Python это не сработает.Как вы теперь знаете, целые числа Python неизменяемы, поэтому функция Python не может изменить целочисленный аргумент с помощью побочного эффекта:
>>> >>> def double (x):
... х * = 2
...
>>> х = 5
>>> двойной (х)
>>> х
5
Однако вы можете использовать возвращаемое значение для получения аналогичного эффекта. Просто напишите double ()
, чтобы он принимал целочисленный аргумент, удваивал его и возвращал удвоенное значение. Затем вызывающий абонент отвечает за присвоение, изменяющее исходное значение:
>>> def double (x):
... вернуть x * 2
...
>>> х = 5
>>> х = двойной (х)
>>> х
10
Возможно, это предпочтительнее модификации по побочным эффектам. Совершенно очевидно, что x
изменяется в вызывающей среде, потому что вызывающий абонент делает это сам. В любом случае, это единственный вариант, потому что модификация с помощью побочного эффекта в этом случае не работает.
Тем не менее, даже в тех случаях, когда можно изменить аргумент с помощью побочного эффекта, использование возвращаемого значения может быть более ясным.Предположим, вы хотите удвоить каждый элемент в списке. Поскольку списки изменяемы, вы можете определить функцию Python, которая изменяет список на месте:
>>> >>> def double_list (x):
... я = 0
... пока я >> a = [1, 2, 3, 4, 5]
>>> double_list (а)
>>> а
[2, 4, 6, 8, 10]
В отличие от double ()
в предыдущем примере, double_list ()
фактически работает так, как задумано.Если в документации для функции четко указано, что содержимое аргумента списка изменено, это может быть разумной реализацией.
Тем не менее, вы также можете написать double_list ()
, чтобы передать желаемый список обратно по возвращаемому значению и позволить вызывающей стороне выполнить назначение, аналогично тому, как double ()
было переписано в предыдущем примере:
>>> def double_list (x):
... r = []
... для i в x:
... р.добавить (я * 2)
... вернуть г
...
>>> a = [1, 2, 3, 4, 5]
>>> а = двойной_лист (а)
>>> а
[2, 4, 6, 8, 10]
Оба подхода работают одинаково хорошо. Как это часто бывает, это вопрос стиля и личных предпочтений. Побочные эффекты не обязательно являются абсолютным злом, и они имеют свое место, но поскольку практически все может быть возвращено из функции, то же самое обычно можно достичь и с помощью возвращаемых значений.
Списки аргументов переменной длины
В некоторых случаях, когда вы определяете функцию, вы можете не знать заранее, сколько аргументов вы хотите, чтобы она принимала.Предположим, например, что вы хотите написать функцию Python, которая вычисляет среднее нескольких значений. Начать можно примерно так:
>>> >>> def avg (a, b, c):
... return (a + b + c) / 3
...
Все хорошо, если вы хотите усреднить три значения:
Однако, как вы уже видели, когда используются позиционные аргументы, количество переданных аргументов должно соответствовать количеству объявленных параметров. Тогда ясно, что с этой реализацией avg ()
для любого количества значений, кроме трех, не все в порядке:
>>> ср (1, 2, 3, 4)
Отслеживание (последний вызов последний):
Файл "", строка 1, в
средн. (1, 2, 3, 4)
TypeError: avg () принимает 3 позиционных аргумента, но было дано 4
Вы можете попробовать определить avg ()
с дополнительными параметрами:
>>> def avg (a, b = 0, c = 0, d = 0, e = 0):
....
....
....
...
Это позволяет указывать переменное количество аргументов. Следующие вызовы, по крайней мере, синтаксически верны:
в среднем (1)
ср (1, 2)
ср (1, 2, 3)
средн. (1, 2, 3, 4)
средн. (1, 2, 3, 4, 5)
Но при таком подходе все еще есть несколько проблем. Во-первых, он по-прежнему позволяет использовать до пяти аргументов, а не произвольное число. Что еще хуже, нет способа отличить указанные аргументы от аргументов, которым разрешено использовать по умолчанию.У функции нет способа узнать, сколько аргументов было фактически передано, поэтому она не знает, на что делить:
>>> >>> def avg (a, b = 0, c = 0, d = 0, e = 0):
... return (a + b + c + d + e) / # На что делить ???
...
Очевидно, и этого не пойдет.
Вы можете написать avg ()
, чтобы получить единственный аргумент списка:
>>> def avg (a):
... всего = 0
... для v в:
... всего + = v
... return total / len (a)
...
>>> avg ([1, 2, 3])
2.0
>>> avg ([1, 2, 3, 4, 5])
3.0
По крайней мере, это работает. Он допускает произвольное количество значений и дает правильный результат. В качестве дополнительного бонуса это работает, когда аргумент также является кортежем:
>>> >>> t = (1, 2, 3, 4, 5)
>>> avg (t)
3.0
Недостатком является то, что дополнительный этап группировки значений в список или кортеж, вероятно, не является тем, чего ожидает пользователь функции, и это не очень элегантно.Всякий раз, когда вы находите код Python, который выглядит неэлегантно, вероятно, есть лучший вариант.
В данном случае действительно есть! Python предоставляет способ передать функции переменное количество аргументов с упаковкой и распаковкой кортежа аргументов с помощью оператора звездочки ( *
).
Упаковка кортежей аргументов
Если перед именем параметра в определении функции Python стоит звездочка ( *
), это указывает на упаковку кортежа аргументов . Все соответствующие аргументы в вызове функции упаковываются в кортеж, на который функция может ссылаться по заданному имени параметра.Вот пример:
>>> def f (* args):
... печать (аргументы)
... print (тип (аргументы), len (аргументы))
... для x в аргументах:
... печать (x)
...
>>> f (1, 2, 3)
(1, 2, 3)
<класс 'кортеж'> 3
1
2
3
>>> f ('foo', 'bar', 'baz', 'qux', 'quux')
('foo', 'bar', 'baz', 'qux', 'quux')
<класс 'кортеж'> 5
фу
бар
баз
qux
quux
В определении f ()
спецификация параметра * args
указывает на упаковку кортежа.При каждом вызове f ()
аргументы упаковываются в кортеж, на который функция может ссылаться по имени args
. Можно использовать любое имя, но аргументов
выбирают настолько часто, что это практически стандарт.
Используя упаковку кортежей, вы можете очистить avg ()
следующим образом:
>>> def avg (* args):
... всего = 0
... для i в аргументах:
... всего + = я
... вернуть total / len (args)
...
>>> avg (1, 2, 3)
2.0
>>> avg (1, 2, 3, 4, 5)
3.0
Более того, вы можете привести его в порядок, заменив цикл на
на встроенную функцию Python sum ()
, которая суммирует числовые значения в любой итерации:
>>> def avg (* args):
... вернуть сумму (аргументы) / len (аргументы)
...
>>> avg (1, 2, 3)
2.0
>>> avg (1, 2, 3, 4, 5)
3.0
Теперь avg ()
написан лаконично и работает по назначению.
Тем не менее, в зависимости от того, как этот код будет использоваться, может быть, еще есть над чем поработать. Как написано, avg ()
выдаст исключение TypeError
, если какие-либо аргументы не являются числовыми:
>>> avg (1, 'foo', 3)
Отслеживание (последний вызов последний):
Файл "", строка 1, в
Файл "", строка 2, в среднем
TypeError: неподдерживаемые типы операндов для +: 'int' и 'str'
Для максимальной надежности следует добавить код, проверяющий, что аргументы имеют правильный тип.Позже в этой серии руководств вы узнаете, как перехватывать исключения, такие как TypeError
, и обрабатывать их соответствующим образом. Вы также можете проверить исключения Python: Введение.
Распаковка кортежа аргументов
Аналогичная операция доступна на другой стороне уравнения в вызове функции Python. Когда аргументу в вызове функции предшествует звездочка ( *
), это указывает на то, что аргумент представляет собой кортеж, который должен быть распакованным и переданным в функцию как отдельные значения:
>>> def f (x, y, z):
... print (f'x = {x} ')
... print (f'y = {y} ')
... печать (f'z = {z} ')
...
>>> f (1, 2, 3)
х = 1
у = 2
г = 3
>>> t = ('фу', 'бар', 'баз')
>>> f (* t)
x = foo
y = бар
z = baz
В этом примере * t
в вызове функции указывает, что t
— это кортеж, который следует распаковать. Распакованные значения 'foo'
, 'bar'
и 'baz'
назначаются параметрам x
, y
и z
соответственно.
Хотя этот тип распаковки называется распаковкой кортежей , он работает не только с кортежами. Оператор звездочка ( *
) может применяться к любой итерации в вызове функции Python. Например, список или набор тоже можно распаковать:
>>> a = ['foo', 'bar', 'baz']
>>> тип (а)
<список классов>
>>> f (* а)
x = foo
y = бар
z = baz
>>> s = {1, 2, 3}
>>> тип (ы)
<класс 'набор'>
>>> f (* s)
х = 1
у = 2
г = 3
Вы даже можете использовать упаковку и распаковку кортежей одновременно:
>>> >>> def f (* args):
... print (тип (аргументы), аргументы)
...
>>> a = ['foo', 'bar', 'baz', 'qux']
>>> f (* а)
<класс 'кортеж'> ('foo', 'bar', 'baz', 'qux')
Здесь f (* a)
указывает, что список a
должен быть распакован, а элементы переданы в f ()
как отдельные значения. Спецификация параметра * args
заставляет значения упаковываться обратно в кортеж args
.
Упаковка словаря аргументов
Python имеет аналогичный оператор, двойную звездочку ( **
), который можно использовать с параметрами и аргументами функции Python для указания упаковки и распаковки словаря .Двойная звездочка ( **
) перед параметром в определении функции Python указывает на то, что соответствующие аргументы, которые, как ожидается, будут парами ключ = значение
, должны быть упакованы в словарь:
>>> def f (** kwargs):
... печать (kwargs)
... print (введите (kwargs))
... для ключа val в kwargs.items ():
... print (ключ, '->', val)
...
>>> f (foo = 1, bar = 2, baz = 3)
{'foo': 1, 'bar': 2, 'baz': 3}
<класс 'dict'>
foo -> 1
бар -> 2
баз -> 3
В этом случае аргументы foo = 1
, bar = 2
и baz = 3
упаковываются в словарь, на который функция может ссылаться по имени kwargs
.Опять же, можно использовать любое имя, но своеобразное kwargs
(которое является сокращением от ключевого слова args ) почти стандартно. Вам не обязательно его придерживаться, но если вы это сделаете, то любой, кто знаком с соглашениями о кодировании Python, сразу поймет, что вы имеете в виду.
Распаковка словаря аргументов
Распаковка словаря аргументов аналогична распаковке кортежа аргументов. Когда двойная звездочка ( **
) предшествует аргументу в вызове функции Python, она указывает, что аргумент является словарем, который должен быть распакован, с полученными элементами, переданными в функцию как аргументы ключевого слова:
>>> def f (a, b, c):
... print (F'a = {a} ')
... печать (F'b = {b} ')
... печать (F'c = {c} ')
...
>>> d = {'a': 'foo', 'b': 25, 'c': 'qux'}
>>> е (** д)
a = foo
б = 25
c = qux
Элементы в словаре d
распаковываются и передаются в f ()
как аргументы ключевого слова. Итак, f (** d)
эквивалентно f (a = 'foo', b = 25, c = 'qux')
:
>>> f (a = 'foo', b = 25, c = 'qux')
a = foo
б = 25
c = qux
На самом деле, проверьте это:
>>> >>> f (** dict (a = 'foo', b = 25, c = 'qux'))
a = foo
б = 25
c = qux
Здесь dict (a = 'foo', b = 25, c = 'qux')
создает словарь из указанных пар ключ / значение.Затем оператор двойной звездочки ( **
) распаковывает его и передает ключевые слова в f ()
.
Собираем все вместе
Думайте о * args
как о списке позиционных аргументов переменной длины, а о ** kwargs
как о списке аргументов ключевого слова переменной длины.
Все три — стандартные позиционные параметры, * args
и ** kwargs
— могут использоваться в одном определении функции Python. Если да, то их следует указывать в таком порядке:
>>> def f (a, b, * args, ** kwargs):
... print (F'a = {a} ')
... печать (F'b = {b} ')
... print (F'args = {args} ')
... печать (F'kwargs = {kwargs} ')
...
>>> f (1, 2, 'foo', 'bar', 'baz', 'qux', x = 100, y = 200, z = 300)
а = 1
b = 2
args = ('foo', 'bar', 'baz', 'qux')
kwargs = {'x': 100, 'y': 200, 'z': 300}
Это обеспечивает столько гибкости, сколько вам может понадобиться в функциональном интерфейсе!
Множественные распаковки в вызове функции Python
Python версии 3.5 представил поддержку дополнительных обобщений распаковки, как указано в PEP 448.Одна вещь, которую позволяют эти улучшения, — это нескольких распаковок за один вызов функции Python:
>>> >>> def f (* args):
... для i в аргументах:
... печать (я)
...
>>> a = [1, 2, 3]
>>> t = (4, 5, 6)
>>> s = {7, 8, 9}
>>> f (* a, * t, * s)
1
2
3
4
5
6
8
9
7
Вы также можете указать несколько распаковок словарей в вызове функции Python:
>>> >>> def f (** kwargs):
... для k, v в kwargs.items ():
... print (k, '->', v)
...
>>> d1 = {'a': 1, 'b': 2}
>>> d2 = {'x': 3, 'y': 4}
>>> f (** d1, ** d2)
а -> 1
б -> 2
х -> 3
у -> 4
Примечание. Это расширение доступно только в Python версии 3.5 или новее. Если вы попробуете это в более ранней версии, то получите исключение SyntaxError
.
Кстати, операторы распаковки *
и **
применяются не только к переменным, как в примерах выше.Вы также можете использовать их с литералами, которые повторяются:
>>> def f (* args):
... для i в аргументах:
... печать (я)
...
>>> f (* [1, 2, 3], * [4, 5, 6])
1
2
3
4
5
6
>>> def f (** kwargs):
... для k, v в kwargs.items ():
... print (k, '->', v)
...
>>> f (** {'a': 1, 'b': 2}, ** {'x': 3, 'y': 4})
а -> 1
б -> 2
х -> 3
у -> 4
Здесь литеральные списки [1, 2, 3]
и [4, 5, 6]
указаны для распаковки кортежей, а буквальные словари {'a': 1, 'b': 2}
и {'x': 3, 'y': 4}
указаны для распаковки словаря.
Аргументы только для ключевых слов
Функцию Python в версии 3.x можно определить так, чтобы она принимала аргумента, состоящего только из ключевых слов. . Это аргументы функции, которые должны быть указаны с помощью ключевого слова. Давайте рассмотрим ситуацию, в которой это может быть полезно.
Предположим, вы хотите написать функцию Python, которая принимает переменное количество строковых аргументов, объединяет их вместе, разделенные точкой ( "."
), и выводит их на консоль. Для начала подойдет что-то вроде этого:
>>> def concat (* args):
... print (f '-> {".". join (args)}')
...
>>> concat ('a', 'b', 'c')
-> a.b.c
>>> concat ('foo', 'bar', 'baz', 'qux').
-> foo.bar.baz.qux
В существующем виде выходной префикс жестко запрограммирован на строку '->'
. Что, если вы хотите изменить функцию, чтобы она также принимала это как аргумент, чтобы пользователь мог указать что-то еще? Это одна из возможностей:
>>> def concat (префикс, * args):
... print (f '{prefix} {".".join (аргументы)} ')
...
>>> concat ('//', 'a', 'b', 'c')
//a.b.c
>>> concat ('...', 'foo', 'bar', 'baz', 'qux')
... foo.bar.baz.qux
Работает так, как рекламируется, но в этом решении есть несколько нежелательных моментов:
Префикс
Строка
объединяется вместе со строками, которые необходимо объединить. Просто взглянув на вызов функции, неясно, обрабатывается ли первый аргумент иначе, чем остальные. Чтобы узнать это, вам нужно вернуться назад и посмотреть на определение функции.префикс
не является обязательным. Его всегда нужно включать, и нет возможности принять значение по умолчанию.
Вы могли подумать, что можете решить вторую проблему, указав параметр со значением по умолчанию, например, например:
>>> >>> def concat (prefix = '->', * args):
... print (f '{префикс} {".". join (args)}')
...
К сожалению, это работает не совсем правильно. Префикс
— это позиционный параметр , поэтому интерпретатор предполагает, что первый аргумент, указанный в вызове функции, является предполагаемым выходным префиксом.Это означает, что его нельзя пропустить и получить значение по умолчанию:
>>> concat ('a', 'b', 'c')
ab.c
Что если вы попытаетесь указать префикс
в качестве аргумента ключевого слова? Ну, вы не можете указать его сначала:
>>> concat (prefix = '//', 'a', 'b', 'c')
Файл "", строка 1
SyntaxError: позиционный аргумент следует за аргументом ключевого слова
Как вы видели ранее, когда даны оба типа аргументов, все позиционные аргументы должны предшествовать любым аргументам ключевого слова.
Однако вы также не можете указать его последним:
>>> >>> concat ('a', 'b', 'c', prefix = '...')
Отслеживание (последний вызов последний):
Файл "", строка 1, в
TypeError: concat () получил несколько значений для аргумента prefix
Опять же, префикс
является позиционным параметром, поэтому ему назначается первый аргумент, указанный в вызове (в данном случае это 'a'
). Затем, когда он снова указывается в качестве аргумента ключевого слова в конце, Python думает, что он был назначен дважды.
Параметры только для ключевых слов помогают решить эту дилемму. В определении функции укажите * args
, чтобы указать переменное количество позиционных аргументов, а затем укажите префикс после этого
:
>>> def concat (* args, prefix = '->'):
... print (f '{префикс} {".". join (args)}')
...
В этом случае префикс
становится параметром только с ключевым словом. Его значение никогда не будет заполнено позиционным аргументом.Его можно указать только с помощью именованного аргумента ключевого слова:
>>> concat ('a', 'b', 'c', prefix = '...')
... a.b.c
Обратите внимание, что это возможно только в Python 3. В версии 2.x Python указание дополнительных параметров после параметра аргументов переменной * args
вызывает ошибку.
Аргументы, содержащие только ключевое слово, позволяют функции Python принимать переменное количество аргументов, за которыми следует один или несколько дополнительных параметров в качестве аргументов ключевого слова.Если вы хотите изменить concat ()
так, чтобы можно было указать символ-разделитель, вы можете добавить дополнительный аргумент, состоящий только из ключевых слов:
>>> def concat (* args, prefix = '->', sep = '.'):
... print (f '{префикс} {sep.join (args)}')
...
>>> concat ('a', 'b', 'c')
-> a.b.c
>>> concat ('a', 'b', 'c', prefix = '//')
//a.b.c
>>> concat ('a', 'b', 'c', prefix = '//', sep = '-')
// а-б-в
Если параметру, содержащему только ключевое слово, присвоено значение по умолчанию в определении функции (как в приведенном выше примере), а ключевое слово опущено при вызове функции, то предоставляется значение по умолчанию:
>>> >>> concat ('a', 'b', 'c')
-> а.до н.э
Если, с другой стороны, параметру не присвоено значение по умолчанию, то он становится обязательным, и если его не указать, возникает ошибка:
>>> >>> def concat (* args, префикс):
... print (f '{префикс} {".". join (args)}')
...
>>> concat ('a', 'b', 'c', prefix = '...')
... a.b.c
>>> concat ('a', 'b', 'c')
Отслеживание (последний вызов последний):
Файл "", строка 1, в
TypeError: в concat () отсутствует 1 обязательный аргумент, содержащий только ключевое слово: 'prefix'
Что делать, если вы хотите определить функцию Python, которая принимает аргумент, состоящий только из ключевых слов, но не принимает переменное количество позиционных аргументов? Например, следующая функция выполняет указанную операцию с двумя числовыми аргументами:
>>> >>> def oper (x, y, op = '+'):
... если op == '+':
... вернуть x + y
... elif op == '-':
... вернуть x - y
... elif op == '/':
... вернуть x / y
... еще:
... return None
...
>>> опер (3, 4)
7
>>> опер (3, 4, '+')
7
>>> опер (3, 4, '/')
0,75
Если вы хотите сделать op
параметром, содержащим только ключевое слово, вы можете добавить посторонний параметр аргумента фиктивной переменной и просто игнорировать его:
>>> def oper (x, y, * ignore, op = '+'):
... если op == '+':
... вернуть x + y
... elif op == '-':
... вернуть x - y
... elif op == '/':
... вернуть x / y
... еще:
... return None
...
>>> oper (3, 4, op = '+')
7
>>> oper (3, 4, op = '/')
0,75
Проблема с этим решением заключается в том, что * ignore
поглощает любые посторонние позиционные аргументы, которые могут быть включены:
>>> oper (3, 4, «Мне здесь не место»)
7
>>> oper (3, 4, «Мне здесь не место», op = '/')
0.75
В этом примере дополнительного аргумента не должно быть (как объявляет сам аргумент). Вместо того, чтобы тихо добиться успеха, это действительно должно привести к ошибке. То, что это не так, в лучшем случае неопрятно. В худшем случае это может привести к вводящему в заблуждение результату:
Чтобы исправить это, версия 3 позволяет параметру аргумента переменной в определении функции Python быть просто звездочкой ( *
) с опущенным именем:
>>> def oper (x, y, *, op = '+'):
... если op == '+':
... вернуть x + y
... elif op == '-':
... вернуть x - y
... elif op == '/':
... вернуть x / y
... еще:
... return None
...
>>> oper (3, 4, op = '+')
7
>>> oper (3, 4, op = '/')
0,75
>>> oper (3, 4, «Мне здесь не место»)
Отслеживание (последний вызов последний):
Файл "", строка 1, в
TypeError: oper () принимает 2 позиционных аргумента, но было дано 3
>>> опер (3, 4, '+')
Отслеживание (последний вызов последний):
Файл "", строка 1, в
TypeError: oper () принимает 2 позиционных аргумента, но было дано 3
Пустой параметр аргумента переменной *
указывает, что больше нет позиционных параметров.Это поведение генерирует соответствующие сообщения об ошибках, если указаны дополнительные. Он позволяет следовать параметрам, содержащим только ключевые слова.
Только позиционные аргументы
Начиная с Python 3.8, параметры функции также могут быть объявлены только позиционными , что означает, что соответствующие аргументы должны быть предоставлены позиционно и не могут быть указаны с помощью ключевого слова.
Чтобы обозначить некоторые параметры как позиционные, вы указываете косую черту (/
) в списке параметров определения функции.Все параметры слева от косой черты (/
) должны быть указаны позиционно. Например, в следующем определении функции x
и y
являются позиционными параметрами, но z
можно указать с помощью ключевого слова:
>>> # Это Python 3.8
>>> def f (x, y, /, z):
... print (f'x: {x} ')
... print (f'y: {y} ')
... print (f'z: {z} ')
...
Это означает, что действительны следующие вызовы:
>>> >>> f (1, 2, 3)
х: 1
г: 2
z: 3
>>> f (1, 2, z = 3)
х: 1
г: 2
z: 3
Однако следующий звонок на f ()
недействителен:
>>> f (x = 1, y = 2, z = 3)
Отслеживание (последний вызов последний):
Файл "", строка 1, в
TypeError: f () получила некоторые позиционные аргументы, переданные как аргументы ключевого слова:
'х, у'
Позиционные указатели и указатели только для ключевых слов могут использоваться в одном и том же определении функции:
>>> >>> # Это Python 3.8
>>> def f (x, y, /, z, w, *, a, b):
... print (x, y, z, w, a, b)
...
>>> f (1, 2, z = 3, w = 4, a = 5, b = 6)
1 2 3 4 5 6
>>> f (1, 2, 3, w = 4, a = 5, b = 6)
1 2 3 4 5 6
В этом примере:
-
x
иy
являются только позиционными. -
a
иb
— только ключевые слова. -
z
иw
можно указать позиционно или по ключевому слову.
Для получения дополнительной информации о позиционных параметрах см. Основные моменты выпуска Python 3.8.
Строки документации
Когда первая инструкция в теле функции Python является строковым литералом, она называется строкой документации функции . Строка документации используется для предоставления документации для функции. Он может содержать назначение функции, аргументы, которые она принимает, информацию о возвращаемых значениях или любую другую информацию, которая, по вашему мнению, будет полезной.
Ниже приведен пример определения функции со строкой документации:
>>> >>> def avg (* args):
... "" "Возвращает среднее значение списка числовых значений." ""
... вернуть сумму (аргументы) / len (аргументы)
...
Технически, строки документации могут использовать любой из механизмов цитирования Python, но рекомендуется использовать тройных кавычек с использованием символов двойных кавычек ( "" "
), как показано выше. Если строка документации умещается в одной строке, то котировки закрытия должны находиться на той же строке, что и котировки открытия.
Многострочные строки документации используются для более объемной документации.Многострочная строка документации должна состоять из итоговой строки, за которой следует пустая строка, за которой следует более подробное описание. Котировки закрытия должны быть на отдельной строке:
>>> >>> def foo (bar = 0, baz = 1):
... "" "Выполните преобразование foo.
...
... Аргументы ключевого слова:
... bar - величина по оси бара (по умолчанию = 0)
... baz - величина по оси baz (по умолчанию = 1)
... "" "
...
...
Форматирование строки документации и семантические соглашения подробно описаны в PEP 257.
Когда определена строка документации, интерпретатор Python назначает ее специальному атрибуту функции с именем __doc__
. Этот атрибут является одним из набора специализированных идентификаторов в Python, которые иногда называют магических атрибутов или магических методов , потому что они предоставляют специальные языковые функции.
Примечание: Эти атрибуты также упоминаются с помощью атрибутов dunder с красочным псевдонимом и методов dunder. Слово dunder объединяет d из double и под из символа подчеркивания ( _
).В будущих уроках этой серии вы встретите еще много неприятных атрибутов и методов.
Вы можете получить доступ к строке документации функции с помощью выражения
. Строки документации для приведенных выше примеров могут отображаться следующим образом:
>>> print (ср .__ doc__)
Возвращает среднее значение списка числовых значений.
>>> печать (foo .__ doc__)
Выполните преобразование foo.
Аргументы ключевого слова:
bar - величина по оси бара (по умолчанию = 0)
baz - величина по оси baz (по умолчанию = 1)
В интерактивном интерпретаторе Python вы можете ввести help (
, чтобы отобразить строку документации для
:
>>> справка (в среднем)
Справка по функции avg в модуле __main__:
avg (* аргументы)
Возвращает среднее значение списка числовых значений.>>> help (foo)
Справка по функции foo в модуле __main__:
foo (bar = 0, baz = 1)
Выполните преобразование foo.
Аргументы ключевого слова:
bar - величина по оси бара (по умолчанию = 0)
baz - величина по оси baz (по умолчанию = 1)
Считается хорошей практикой кодирования указывать строку документации для каждой определяемой вами функции Python. Дополнительные сведения о строках документации см. В документе «Документирование кода Python: полное руководство».
Аннотации функций Python
Начиная с версии 3.0, Python предоставляет дополнительную возможность для документирования функции, которая называется аннотацией функции . Аннотации позволяют прикреплять метаданные к параметрам функции и возвращаемому значению.
Чтобы добавить аннотацию к параметру функции Python, вставьте двоеточие (:
), за которым следует любое выражение после имени параметра в определении функции. Чтобы добавить аннотацию к возвращаемому значению, добавьте символы ->
и любое выражение между закрывающей круглой скобкой списка параметров и двоеточием, завершающим заголовок функции.Вот пример:
>>> def f (a: '', b: '') -> '':
... проходить
...
Аннотация для параметра a
— это строка ''
, для b
строка ''
, а для значения, возвращаемого функцией, строка '
.
Интерпретатор Python создает словарь из аннотаций и присваивает их другому специальному атрибуту dunder функции с именем __annotations__
.Аннотации для функции Python f ()
, показанные выше, могут отображаться следующим образом:
>>> f .__ annotations__
{'a': '', 'b': '', 'return': ''}
Ключи для параметров — это имена параметров. Ключом для возвращаемого значения является строка 'return'
:
>>> f .__ annotations __ ['a']
""
>>> f .__ аннотации __ ['b']
''
>>> е.__annotations __ ['return']
''
Обратите внимание, что аннотации не ограничиваются строковыми значениями. Это может быть любое выражение или объект. Например, вы можете аннотировать объекты типа:
>>> >>> def f (a: int, b: str) -> float:
... print (a, b)
... вернуть (3.5)
...
>>> f (1, 'фу')
1 фу
3.5
>>> f .__ annotations__
{'a': , 'b': , 'return': }
Аннотация может быть даже составным объектом, например списком или словарем, поэтому к параметрам и возвращаемому значению можно прикрепить несколько элементов метаданных:
>>> >>> def area (
... р: {
... 'desc': 'радиус круга',
... 'тип': поплавок
...}) -> \
... {
... 'desc': 'площадь круга',
... 'тип': поплавок
...}:
... return 3.14159 * (r ** 2)
...
>>> площадь (2,5)
19,6349375
>>> area .__ annotations__
{'r': {'desc': 'радиус круга', 'type': },
'return': {'desc': 'область круга', 'type': }}
>>> area .__ annotations __ ['r'] ['desc']
'радиус круга'
>>> Площадь.__annotations __ ['return'] ['type']
<класс 'float'>
В приведенном выше примере аннотация прикреплена к параметру r
и к возвращаемому значению. Каждая аннотация представляет собой словарь, содержащий описание строки и объект типа.
Если вы хотите назначить значение по умолчанию для параметра, имеющего аннотацию, то значение по умолчанию идет после аннотации:
>>> >>> def f (a: int = 12, b: str = 'baz') -> float:
... print (a, b)
... вернуть (3.5)
...
>>> f .__ annotations__
{'a': , 'b': , 'return': }
>>> f ()
12 баз
3.5
Что делают аннотации? Откровенно говоря, они почти ничего не делают. Они просто вроде как там. Давайте снова посмотрим на один из примеров сверху, но с небольшими изменениями:
>>> >>> def f (a: int, b: str) -> float:
... print (a, b)
... вернуть 1, 2, 3
...
>>> f ('фу', 2.5)
foo 2.5
(1, 2, 3)
Что здесь происходит? Аннотации для f ()
указывают, что первый аргумент — int
, второй аргумент — str
, а возвращаемое значение — float
. Но последующий вызов f ()
нарушает все правила! Аргументы: str
и float
соответственно, а возвращаемое значение — кортеж. И все же переводчик позволяет всему этому скользить без каких-либо жалоб.
Аннотации не накладывают никаких семантических ограничений на код вообще. Это просто биты метаданных, прикрепленные к параметрам функции Python и возвращаемому значению. Python послушно прячет их в словаре, присваивает словарю атрибут dunder функции __annotations__
, и все. Аннотации не являются обязательными и вообще не влияют на выполнение функций Python.
Процитирую Амала из Амаль и ночные посетители : «Какая тогда польза от этого?»
Во-первых, аннотации делают документацией .Вы, конечно, можете указать ту же информацию в строке документации, но размещение ее непосредственно в определении функции добавляет ясности. Типы аргументов и возвращаемое значение очевидны с первого взгляда для такого заголовка функции:
def f (a: int, b: str) -> float:
Конечно, интерпретатор не обеспечивает соблюдение указанных типов, но, по крайней мере, они понятны для тех, кто читает определение функции.
Deep Dive: принудительная проверка типов
Если бы вы были склонны, вы могли бы добавить код для принудительного применения типов, указанных в аннотациях к функциям.Вот функция, которая проверяет фактический тип каждого аргумента на соответствие тому, что указано в аннотации для соответствующего параметра. Он отображает
>>>Истинно
, если они соответствуютЛожь
, если нет:>>> def f (a: int, b: str, c: float): ... импорт осмотреть ... args = inspect.getfullargspec (f) .args ... аннотации = inspect.getfullargspec (f) .annotations ... для x в аргументах: ... print (x, '->', ... 'arg is', type (locals () [x]), ',', ... 'annotation is', annotations [x], ... '/', (type (locals () [x])) is annotations [x]) ... >>> f (1, 'foo', 3.3) a -> arg - это
, аннотация - это / True b -> arg - , аннотация - / True c -> arg - , аннотация - / True >>> f ('фу', 4.3, 9) a -> arg - это , аннотация - / False b -> arg - , аннотация - / False c -> arg - , аннотация - / False >>> f (1, 'фу', 'бар') a -> arg - это , аннотация - это / True b -> arg - , аннотация - / True c -> arg - , аннотация - / False (Модуль
inspect
содержит функции, которые получают полезную информацию о живых объектах — в данном случае функцияf ()
.)Функция, определенная как указанная выше, при желании может предпринять какие-то корректирующие действия, когда обнаружит, что переданные аргументы не соответствуют типам, указанным в аннотациях.
Фактически, схема использования аннотаций для выполнения проверки статического типа в Python описана в PEP 484. Доступна бесплатная программа проверки статического типа для Python под названием mypy, основанная на спецификации PEP 484.
Есть еще одно преимущество использования аннотаций.Стандартизованный формат, в котором аннотационная информация хранится в атрибуте __annotations__
, позволяет анализировать сигнатуры функций автоматическими инструментами.
В аннотациях нет ничего особенного. Вы даже можете определить свой собственный без специального синтаксиса, предоставляемого Python. Вот определение функции Python с аннотациями объекта типа, прикрепленными к параметрам и возвращаемому значению:
>>> >>> def f (a: int, b: str) -> float:
... возвращение
...
>>> f .__ annotations__
{'a': , 'b': , 'return': }
По сути, это та же функция со словарем __annotations__
, созданным вручную:
>>> def f (a, b):
... возвращение
...
>>> f .__ annotations__ = {'a': int, 'b': str, 'return': float}
>>> f .__ annotations__
{'a': , 'b': , 'return': }
Эффект идентичен в обоих случаях, но первый на первый взгляд визуально более привлекателен и удобочитаем.
Фактически, атрибут __annotations__
существенно не отличается от большинства других атрибутов функции. Например, его можно динамически изменять. Вы можете использовать атрибут возвращаемого значения, чтобы подсчитать, сколько раз функция выполняется:
>>> def f () -> 0:
... f .__ аннотации __ ['return'] + = 1
... print (f "f () был выполнен {f .__ annotations __ ['return']} время (с)")
...
>>> f ()
f () выполнено 1 раз (а)
>>> f ()
f () было выполнено 2 раза (а)
>>> f ()
f () было выполнено 3 раза (а)
Аннотации функций Python — это не что иное, как словари метаданных.Просто так получилось, что вы можете создать их с помощью удобного синтаксиса, поддерживаемого интерпретатором. Это все, что вы хотите из них сделать.
Заключение
По мере роста приложений становится все более важным модулировать код, разбивая его на более мелкие функции управляемого размера. Надеюсь, теперь у вас есть все необходимые инструменты для этого.
Вы узнали:
- Как создать определяемую пользователем функцию в Python
- Несколько разных способов передать аргумента функции
- Как можно вернуть данные из функции ее вызывающему
- Как добавить документацию к функциям с строками документации и аннотациями
Следующими в этой серии являются два руководства, которые охватывают поиск и сопоставление с образцом .Вы получите подробный обзор модуля Python под названием re , который содержит функции для поиска и сопоставления с использованием универсального синтаксиса шаблонов, называемого регулярным выражением .
Смотреть сейчас В этом руководстве есть связанный видеокурс, созданный командой Real Python. Просмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Определение и вызов функций Python
Как определять и вызывать функции в Go
Введение
Функция — это часть кода, которую после определения можно использовать повторно.Функции используются для облегчения понимания вашего кода, разбивая его на небольшие, понятные задачи, которые можно использовать более одного раза в вашей программе.
Go поставляется с мощной стандартной библиотекой, которая имеет множество предопределенных функций. Из пакета fmt вы, вероятно, уже знакомы:
-
fmt.Println ()
, который будет печатать объекты в стандартном формате (скорее всего, ваш терминал). -
fmt.Printf ()
, который позволит вам форматировать печатный вывод.
Имена функций включают круглые скобки и могут включать параметры.
В этом руководстве мы рассмотрим, как определять свои собственные функции для использования в проектах кодирования.
Определение функции
Начнем с классического «Hello, World!» программу в функцию.
Мы создадим новый текстовый файл в выбранном текстовом редакторе и вызовем программу hello.go
. Затем мы определим функцию.
Функция определяется с помощью ключевого слова func
.Затем следует имя по вашему выбору и набор круглых скобок, в которых содержатся любые параметры, которые примет функция (они могут быть пустыми). Строки кода функции заключены в фигурные скобки {}
.
В этом случае мы определим функцию с именем hello ()
:
hello.go
func hello () {}
Устанавливает начальную инструкцию для создания функции.
Отсюда мы добавим вторую строку с инструкциями по выполнению функции.В этом случае мы напечатаем Hello, World!
к консоли:
hello.go
func hello () {
fmt.Println ("Привет, мир!")
}
Наша функция теперь полностью определена, но если мы запустим программу на этом этапе, ничего не произойдет, поскольку мы не вызывали функцию.
Итак, внутри нашего функционального блока main ()
давайте вызовем функцию с помощью hello ()
:
hello.go
пакет основной
импорт "FMT"
func main () {
Привет()
}
func hello () {
fmt.Println ("Привет, мир!")
}
Теперь запустим программу:
Вы получите следующий результат:
Выход
Hello, World!
Обратите внимание, что мы также ввели функцию под названием main ()
. Функция main ()
— это специальная функция, которая сообщает компилятору, что именно здесь программа должна запустить . Для любой программы, которая должна быть исполняемым файлом (программой, которую можно запускать из командной строки), вам понадобится функция main ()
.Функция main ()
должна появляться только один раз, быть в main ()
пакете и не принимать и не возвращать аргументов. Это позволяет выполнять программу в любой программе Go. Как в следующем примере:
main.go
пакет основной
импорт "FMT"
func main () {
fmt.Println («это основной раздел программы»)
}
Функции могут быть более сложными, чем определенная нами функция hello ()
. Мы можем использовать для
циклов, условных операторов и т. Д. В нашем функциональном блоке.
Например, следующая функция использует условный оператор, чтобы проверить, содержит ли вход для переменной name
гласную, а затем использует цикл for
для перебора букв в строке name
.
names.go
пакет основной
Импортировать (
"fmt"
"струны"
)
func main () {
имена ()
}
func names () {
fmt.Println ("Введите свое имя:")
строка имени переменной
fmt.Scanln (& имя)
// Проверяем, есть ли в имени гласная
для _, v: = строки диапазона.ToLower (имя) {
если v == 'a' || v == 'e' || v == 'i' || v == 'o' || v == 'u' {
fmt.Println ("Ваше имя содержит гласную.")
возвращение
}
}
fmt.Println ("В вашем имени нет гласной.")
}
Функция names ()
, которую мы определяем здесь, устанавливает переменную name
с вводом, а затем устанавливает условный оператор в цикле for
. Это показывает, как можно организовать код в определении функции. Однако, в зависимости от того, что мы намерены использовать в нашей программе и как мы хотим настроить наш код, мы можем захотеть определить условный оператор и цикл для
как две отдельные функции.
Определение функций в программе делает наш код модульным и многоразовым, так что мы можем вызывать одни и те же функции, не переписывая их.
Работа с параметрами
До сих пор мы рассматривали функции с пустыми скобками, которые не принимают аргументов, но мы можем определять параметры в определениях функций в их скобках.
Параметр — это именованная сущность в определении функции, указывающая аргумент, который функция может принимать.В Go необходимо указать тип данных для каждого параметра.
Давайте создадим программу, которая повторяет слово определенное количество раз. Для того, сколько раз повторить слово, потребуется параметр string
с именем word
и параметр int
с именем reps
.
repeat.go
пакет основной
импорт "FMT"
func main () {
повторить («Сэмми», 5)
}
func repeat (строка слова, reps int) {
для i: = 0; я <повторы; i ++ {
fmt.Печать (слово)
}
}
Мы передали значение Sammy
для параметра word
и 5
для параметра повторений
. Эти значения соответствуют каждому параметру в том порядке, в котором они были даны. Функция repeat
имеет цикл для
, который будет повторять количество раз, указанное параметром reps
. Для каждой итерации печатается значение параметра word
.
Вот результат работы программы:
Вывод
SammySammySammySammySammy
Если у вас есть набор параметров, которые имеют одно и то же значение, вы можете не указывать тип каждый раз.Давайте создадим небольшую программу, которая принимает параметры x
, y
и z
, которые являются значениями int
. Мы создадим функцию, которая складывает параметры вместе в различных конфигурациях. Их суммы будут напечатаны функцией. Затем мы вызовем функцию и передадим ей числа.
add_numbers.go
пакет основной
импорт "FMT"
func main () {
addNumbers (1, 2, 3)
}
func addNumbers (x, y, z int) {
а: = х + у
б: = х + г
c: = y + z
fmt.Println (a, b, c)
}
Когда мы создавали сигнатуру функции для addNumbers
, нам не нужно было указывать тип каждый раз, а только в конце.
Мы передали число 1
in для параметра x
, 2
in для параметра y
и 3
in для параметра z
. Эти значения соответствуют каждому параметру в том порядке, в котором они указаны.
Программа выполняет следующие вычисления на основе значений, которые мы передали в параметры:
а = 1 + 2
б = 1 + 3
с = 2 + 3
Функция также печатает a
, b
и c
, и на основе этих математических расчетов мы ожидаем, что a
будет равно 3
, b
будет равно 4
и c
быть 5
.Запустим программу:
Выход
3 4 5
Когда мы передаем 1
, 2
и 3
в качестве параметров функции addNumbers ()
, мы получаем ожидаемый результат.
Параметры - это аргументы, которые обычно определяются как переменные в определениях функций. Им можно присвоить значения, когда вы запускаете метод, передавая аргументы функции.
Возвращение значения
Вы можете передать значение параметра в функцию, и функция также может создавать значение.
Функция может генерировать значение с помощью оператора return
, который завершает функцию, а , необязательно, передает выражение обратно вызывающей стороне. Также необходимо указать тип возвращаемых данных.
До сих пор мы использовали оператор fmt.Println ()
вместо оператора return
в наших функциях. Давайте создадим программу, которая вместо печати будет возвращать переменную.
В новом текстовом файле с именем double.go
мы создадим программу, которая удваивает параметр x
и возвращает переменную y
.Мы вызываем вызов для печати переменной result
, которая формируется путем выполнения функции double ()
с переданным ей 3
:
double.go
пакет основной
импорт "FMT"
func main () {
результат: = double (3)
fmt.Println (результат)
}
func double (x int) int {
у: = х * 2
вернуть y
}
Мы можем запустить программу и увидеть результат:
Выход
6
Целое число 6
возвращается как результат, чего мы и ожидаем, умножив 3
на 2
.
Если функция определяет возврат, вы должны предоставить возврат как часть кода. В противном случае вы получите сообщение об ошибке компиляции.
Мы можем продемонстрировать это, закомментировав строку с оператором возврата:
double.go
пакет основной
импорт "FMT"
func main () {
результат: = double (3)
fmt.Println (результат)
}
func double (x int) int {
у: = х * 2
// возвращаем y
}
Теперь давайте снова запустим программу:
Выход
./double.go:13:1: отсутствует возврат в конце функции
Без использования здесь оператора return
программа не может скомпилироваться.
Функции немедленно завершаются, когда они попадают в оператор return
, даже если они не находятся в конце функции:
return_loop.go
основной пакет
импорт "FMT"
func main () {
loopFive ()
}
func loopFive () {
для i: = 0; я <25; i ++ {
fmt.Print (i)
if i == 5 {
// Остановить функцию при i == 5
возвращение
}
}
fmt.Println ("Эта строка не будет выполняться.")
}
Здесь мы перебираем цикл для
и говорим циклу выполнить 25
итераций. Однако внутри цикла for
у нас есть условный оператор if
, который проверяет, равно ли значение i
5
. Если это так, мы выдаем заявление return
. Поскольку мы находимся в функции loopFive
, любой , возвращающий
в любой момент функции, выйдет из функции.В результате мы никогда не дойдем до последней строки в этой функции, чтобы напечатать оператор . Эта строка не будет выполняться.
.
Использование оператора return
в цикле for
завершает функцию, поэтому строка, находящаяся за пределами цикла, не запускается. Если бы вместо этого мы использовали оператор break
, в это время завершился бы только цикл, и была бы запущена последняя строка fmt.Println ()
.
Оператор return
завершает функцию и может возвращать значение, если оно указано в сигнатуре функции.
Возврат нескольких значений
Для функции можно указать несколько возвращаемых значений. Давайте рассмотрим программу repeat.go
и заставим ее возвращать два значения. Первое будет повторяющимся значением, а второе будет ошибкой, если параметр повторений
не является значением, превышающим 0
:
repeat.go
пакет основной
импорт "FMT"
func main () {
val, err: = repeat ("Сэмми", -1)
if err! = nil {
fmt.Println (ошибка)
возвращение
}
fmt.Println (val)
}
func repeat (строка слова, reps int) (строка, ошибка) {
if reps <= 0 {
return "", fmt.Errorf ("недопустимое значение% d, указанное для повторений. значение должно быть больше 0", повторения)
}
строка значения var
для i: = 0; я <повторы; i ++ {
значение = значение + слово
}
возвращаемое значение, ноль
}
Первое, что делает функция repeat
- проверяет, является ли аргумент reps
допустимым значением.Любое значение, не превышающее 0
, вызовет ошибку. Поскольку мы передали значение -1
, эта ветвь кода будет выполнена. Обратите внимание, что когда мы возвращаемся из функции, мы должны предоставить как строку
, так и возвращаемые значения ошибки
. Поскольку предоставленные аргументы привели к ошибке, мы вернем пустую строку для первого возвращаемого значения и ошибку для второго возвращаемого значения.
В функции main ()
мы можем получить оба возвращаемых значения, объявив две новые переменные: value
и err
.Поскольку в возврате может быть ошибка, мы хотим проверить, получили ли мы ошибку, прежде чем продолжить работу с нашей программой. В этом примере мы получили ошибку. Мы распечатываем ошибку, и возвращает
из функции main ()
для выхода из программы.
Если ошибки не было, мы бы распечатали возвращаемое значение функции.
Примечание: Лучшей практикой считается возвращение только двух или трех значений. Кроме того, вы всегда должны возвращать все ошибки как последнее возвращаемое значение из функции.
Запуск программы приведет к следующему выводу:
Вывод
недопустимое значение -1, предусмотренное для повторений. значение должно быть больше 0.
В этом разделе мы рассмотрели, как можно использовать оператор return
для возврата нескольких значений из функции.
Заключение
Функции - это блоки кода инструкций, которые выполняют действия в программе, помогая сделать наш код многоразовым и модульным.
Чтобы узнать больше о том, как сделать ваш код более модульным, вы можете прочитать наше руководство по написанию пакетов на Go.
Как определить (а не определять) проблему
Большинство людей согласны с тем, что первым шагом решения проблемы является ее определение. Люди расходятся во мнениях относительно того, как это сделать. Компании часто определяют проблему, составляя формулировку проблемы или обсуждая, в чем «проблема».
Слишком часто изложение проблемы превращается в длительное упражнение в групповом письме и кузнечном деле.Формулировки проблем и резюме обычно пишутся в произвольном порядке, что заставляет читателей бегло просматривать текст в поисках ценной информации. Кроме того, мы часто видим, как люди называют весь инцидент «проблемой» или, наоборот, идентифицируют проблему только как одно следствие или одну причину. Поскольку инцидент состоит из множества взаимосвязанных причинно-следственных связей, поиск одной «причины проблемы» не дает полной картины. Тем не менее, люди ошибочно идентифицируют одно из последствий как «проблему», и часто их мнение не меняется, что приводит к спорам и разногласиям.
Не нужно спорить о проблеме. Люди естественно видят проблемы по-разному, но проблемы внутри организации не должны определяться индивидуальными точками зрения, они должны определяться любым неблагоприятным исходом для общих целей организации. В методе Cause Mapping первым шагом является определение проблемы путем ответа на четыре вопроса в удобной для чтения форме.
Четыре вопроса о проблеме Краткое содержание
Мы определяем каждый инцидент с помощью этих четырех вопросов:
- Что В чем проблема?
- Когда Когда это произошло?
- Где Где это произошло?
- Цели Как повлияла на каждую из целей организации?
1.Какие?
Первый вопрос: «В чем проблема?» Люди по-разному видят проблемы. Цель этого вопроса - уловить, что люди видят в проблеме с их точки зрения. Этот вопрос не предназначен для поиска одной «правильной» проблемы, но может включать несколько ответов и точек зрения.
2. Когда?
Второй вопрос: «Когда произошел инцидент?» Дата и время являются обычными для организаций. Временная шкала может быть полезна, чтобы дополнить этот вопрос.Временная шкала - это простой способ зафиксировать, что и когда произошло в ходе инцидента.
Также важно понимать контекст происшествия, фиксируя все, что было отличным, необычным или уникальным в то время, когда этот инцидент произошел. Эти различия позволяют лучше понять суть проблемы.
3. Где?
Третий вопрос: «Где это произошло?» Вы можете думать о том, где и когда, как о месте происшествия - времени и месте. Но когда вы спрашиваете, где что-то произошло, ответ заключается не только в географическом местоположении.Он может включать название компании, конкретного отдела, подразделения, единицы оборудования, заинтересованных сторон и рабочего процесса.
4. Каково влияние на цели?
Четвертый вопрос: «Каким образом пострадали каждая цель?» Здесь отражается масштаб проблемы и ее последствия. Хотя первый вопрос задается с точки зрения человека, влияние на цели позволяет вам понять, как последствия соотносятся с точкой зрения организации.
Последний пункт в разделе целей - частота.Он спрашивает: «Сколько раз возникала эта проблема?» Он привлекает внимание к мелким проблемам, которые случаются часто и, таким образом, оказывают влияние, которое не может быть полностью реализовано. У вас может быть относительно небольшая проблема в вашем бизнесе, но частота ее настолько высока, что ежегодно это становится гораздо более серьезной проблемой.
На наших семинарах мы учим людей, как эти четыре основных вопроса - что, когда, где и цели - разбиваются на 15 основных частей информации, чтобы дать полное определение проблемы. Люди узнают, как различные точки зрения людей из разных отделов могут быть согласованы с общими целями организации.Даже если люди могут видеть проблему по-другому, метод Cause Mapping предоставляет объективный способ собраться вместе и определить проблему.
Хотите узнать больше о том, как определять проблему? Посмотрите наш предстоящий бесплатный веб-семинар «Как избежать споров и эффективно определять проблемы». Сохраните свое место сегодня или ознакомьтесь с одним из других наших вариантов обучения анализу первопричин.
Учебное пособие: SPSS
Учебное пособие: SPSS
Перейти к содержанию Щиток приборовАвторизоваться
Панель приборов
Календарь
Входящие
История
Помощь
- Мой Dashboard
- Учебное пособие: SPSS
- Главная
- Модули
- Тесты
- Файлы
- Значки
- Увеличение
Скоро
Просмотр календаря- Ничего на следующую неделю
Важность определения терминов (часть первая)
Важность определения терминов (часть первая)
Есть цитата, приписываемая Джорджу Бернарду Шоу, которая следует следующим образом: «Британия и Америка - две нации, разделенные общим языком».Независимо от того, принадлежит ли это авторство или нет, дело в том, что, хотя мы используем одни и те же слова, эти слова могут (и часто имеют) иметь совершенно разные значения из-за наших культурных различий 1 . Есть даже словарь-переводчик между британским и американским английским 2 !
Словарь Великобритании и США
Короче говоря - слов, термины, которые мы используем, не имеют одно правильное значение .
Слова могут означать разные вещи в разное время.Они возникают, чтобы выражать мысли группой людей, которые разделяют их в определенный момент времени, со смыслом, который отражает их происхождение, использование и временные рамки. Возьмем, к примеру, слово ужасно . Первоначально это слово означало «достойный трепета», как «очень вдохновляющий». Однако со временем это слово стало означать «плохой», «неприятный», «оскорбительный» и т. Д. Быстрый поиск в Google выдаст список за списком терминов, которые изменились с течением времени 3 .
В частности, слова и фразы, которые вы найдете в словаре, существуют для выражения этих общих мыслей, которые в этом документе мы будем называть концепциями .Мы не будем вдаваться в философские дебаты о том, определяют ли понятия слова или слова определяют понятия, дебаты, которые в настоящее время беспокоят педагогов 4 , как это было со времен Платона и Сократа 5 . Мы также не будем тратить время на дискуссии о конкретных определениях терминов, о том, как определения трансформируются с течением времени, о природе и требованиях к определениям 6 .
Вместо этого в этом документе основное внимание уделяется тому, как удовлетворить потребность в создании и поддержании определений для конкретных терминов в определенных предметных областях 7 .Этому делу посвящен целый международный стандарт 8 , в котором мы черпали вдохновение.
Проблема, которую мы пытаемся исправить в этом документе, - это тенденция каждой предметной области к созданию собственного подъязыка конкретных терминов и их определений. Эти термины могут использоваться совместно с другими предметными областями, но довольно часто определения этих общих терминов различаются. И так же часто те, кто работает в определенных предметных областях, создают новые, отдельные термины, используемые для описания той же концепции, что и другие термины, встречающиеся в других предметных областях.Итак, мы получаем:
Те же слова - разные определения.
Те же определения - разные слова.
Если вам нужен пример реального слова, выполните этот поиск в Google:
что такое личная информация?
В последний раз, когда мы выполняли этот поиск, Google вернул более 1,7 миллионов записей с более чем 100 определениями (мы перестали считать примерно тогда) 9 .С этим огромным списком возможных определений ключевого термина, такого как информация, позволяющая установить личность, вы имеете , чтобы согласиться с нами, что единственный способ вы, можете поделиться своим значением , - это то, как вы используете этот термин, а еще лучше: если вы можете дать определение ключевым терминам, которые вы используете.
Короче говоря, если вы определите свои ключевые термины, вы проясните концепции, лежащие в основе терминов, которые вы используете в этом аргументе, в том документе, который вы написали , или, если они добавлены в какой-то настраиваемый словарь, в этом конкретном поле словарь охватывает .
Продолжить чтение
Получить книгу определений
классов - JavaScript | MDN
Классы - это шаблон для создания объектов. Они инкапсулируют данные с помощью кода для работы с этими данными. Классы в JS построены на прототипах, но также имеют некоторый синтаксис и семантику, которые не разделяются с семантикой класса ES5.
Объявления классов
Один из способов определить класс - использовать объявление класса . Чтобы объявить класс, вы используете ключевое слово class
с именем класса (здесь «Прямоугольник»).
class Rectangle {
конструктор (высота, ширина) {
this.height = высота;
this.width = width;
}
}
Подъемник
Важное различие между объявлениями функций и объявлениями классов заключается в том, что объявления функций поднимаются, а объявления классов - нет. Сначала вам нужно объявить свой класс, а затем получить к нему доступ, иначе код, подобный следующему, вызовет ReferenceError
:
const p = новый прямоугольник ();
class Rectangle {}
Выражения класса
Выражение класса - это еще один способ определения класса.Выражения класса могут быть именованными или безымянными. Имя, данное выражению именованного класса, является локальным для тела класса. Однако к нему можно получить доступ через свойство name
.
let Rectangle = class {
конструктор (высота, ширина) {
this.height = высота;
this.width = width;
}
};
console.log (Rectangle.name);
let Rectangle = class Rectangle2 {
конструктор (высота, ширина) {
this.height = высота;
this.width = width;
}
};
console.log (Rectangle.name);
Примечание. Выражения класса подчиняются тем же ограничениям подъема, которые описаны в разделе объявлений классов.
Тело класса - это часть, заключенная в фигурные скобки {}
. Здесь вы определяете члены класса, такие как методы или конструктор.
Строгий режим
Тело класса выполняется в строгом режиме, то есть код, написанный здесь, подлежит более строгому синтаксису для повышения производительности, в противном случае будут возникать некоторые скрытые ошибки, а некоторые ключевые слова зарезервированы для будущих версий ECMAScript.
Конструктор
Метод конструктора - это специальный метод для создания и инициализации объекта, созданного с помощью класса
.В классе может быть только один специальный метод с именем «конструктор». SyntaxError
будет выдано, если класс содержит более одного экземпляра метода конструктора .
Конструктор может использовать ключевое слово super
для вызова конструктора суперкласса.
Методы-прототипы
См. Также определения методов.
class Rectangle {
конструктор (высота, ширина) {
this.height = высота;
this.width = width;
}
get area () {
верни это.calcArea ();
}
calcArea () {
вернуть this.height * this.width;
}
}
const square = новый прямоугольник (10, 10);
console.log (квадратная область);
Генераторные методы
См. Также Итераторы и генераторы.
class Polygon {
constructor (... сторон) {
this.sides = стороны;
}
* getSides () {
for (const side of this.sides) {
сторона уступки;
}
}
}
const pentagon = новый многоугольник (1,2,3,4,5);
console.log ([... pentagon.getSides ()]);
Статические методы и свойства
Ключевое слово static определяет статический метод или свойство для класса.Статические члены (свойства и методы) вызываются без создания экземпляра их класса, а не может быть вызван через экземпляр класса. Статические методы часто используются для создания служебных функций для приложения, тогда как статические свойства полезны для кешей, фиксированной конфигурации или любых других данных, которые не нужно реплицировать между экземплярами.
класс Point {
constructor (x, y) {
this.x = x;
this.y = y;
}
static displayName = "Point";
статическое расстояние (a, b) {
const dx = а.х - b.x;
const dy = a.y - b.y;
вернуть Math.hypot (dx, dy);
}
}
const p1 = новая точка (5, 5);
const p2 = новая точка (10, 10);
p1.displayName;
p1.distance;
p2.displayName;
p2.distance;
console.log (Point.displayName);
console.log (Point.distance (p1, p2));
Связывание
этого
с помощью методов прототипа и статических Когда статический метод или метод прототипа вызывается без значения для этого
, например, путем присвоения метода переменной и последующего ее вызова, значение это значение
будет быть undefined
внутри метода.Это поведение будет таким же, даже если директива «use strict»
отсутствует, потому что код в пределах синтаксической границы тела class
всегда выполняется в строгом режиме.
class Animal {
говорить() {
вернуть это;
}
static eat () {
вернуть это;
}
}
let obj = new Animal ();
obj.speak ();
пусть говорят = obj.speak;
говорить();
Animal.eat ()
пусть есть = Animal.eat;
есть();
Если мы перепишем приведенное выше, используя традиционный синтаксис, основанный на функциях, в нестрогом режиме, то , вызовы этого метода
автоматически привязываются к начальному значению , этому значению
, которое по умолчанию является глобальным объектом.В строгом режиме автосвязывания не произойдет; значение , это
остается прежним.
function Animal () {}
Animal.prototype.speak = function () {
вернуть это;
}
Animal.eat = function () {
вернуть это;
}
let obj = new Animal ();
пусть говорят = obj.speak;
говорить();
пусть есть = Animal.eat;
есть();
Свойства экземпляра
Свойства экземпляра должны быть определены внутри методов класса:
class Rectangle {
конструктор (высота, ширина) {
это.высота = высота;
this.width = width;
}
}
Статические (на стороне класса) свойства данных и свойства данных прототипа должны быть определены вне объявления ClassBody:
Rectangle.staticWidth = 20;
Rectangle.prototype.prototypeWidth = 25;
Объявления полей
Объявления общедоступных полей
С синтаксисом объявления поля JavaScript приведенный выше пример можно записать как:
class Rectangle {
высота = 0;
ширина;
конструктор (высота, ширина) {
это.высота = высота;
this.width = width;
}
}
За счет предварительного объявления полей определения классов становятся более самодокументированными, и поля присутствуют всегда.
Как показано выше, поля могут быть объявлены со значением по умолчанию или без него.
Дополнительные сведения см. В полях общедоступных классов.
Объявления частного поля
Используя частные поля, определение можно уточнить, как показано ниже.
class Rectangle {
#height = 0;
#ширина;
конструктор (высота, ширина) {
это.#height = height;
это. # width = width;
}
}
Ссылка на частные поля извне класса - ошибка; они могут быть прочитаны или записаны только в теле класса. Определяя вещи, которые не видны за пределами класса, вы гарантируете, что пользователи ваших классов не могут зависеть от внутренних компонентов, которые могут меняться от версии к версии.
Примечание: Частные поля могут быть объявлены только заранее в объявлении поля.
Частные поля не могут быть созданы позже путем назначения им, как это могут делать обычные свойства.
Для получения дополнительной информации см. Функции частного класса.
Ключевое слово extends
используется в объявлениях классов или выражениях классов для создания класса как потомка другого класса.
class Animal {
конструктор (имя) {
this.name = имя;
}
говорить() {
console.log (`$ {this.name} шумит .`);
}
}
class Dog расширяет Animal {
конструктор (имя) {
супер (имя);
}
говорить() {
console.log (`$ {this.name} лает.`);
}
}
пусть d = новая собака ('Митци');
d.speak ();
Если в подклассе присутствует конструктор, он должен сначала вызвать super () перед использованием this.
Можно также расширить традиционные функциональные "классы":
function Animal (имя) {
this.name = имя;
}
Animal.prototype.speak = function () {
console.log (`$ {this.name} шумит .`);
}
class Dog расширяет Animal {
говорить() {
console.log (`$ {this.name} barks.`);
}
}
пусть d = новая собака ('Митци');
d.говорить();
Обратите внимание, что классы не могут расширять обычные (неконструируемые) объекты. Если вы хотите наследовать от обычного объекта, вы можете вместо этого использовать Object.setPrototypeOf ()
:
const Animal = {
говорить() {
console.log (`$ {this.name} шумит .`);
}
};
class Dog {
конструктор (имя) {
this.name = имя;
}
}
Object.setPrototypeOf (Dog.prototype, Животное);
пусть d = новая собака ('Митци');
d.speak ();
Возможно, вы захотите вернуть объекты Array
в производном классе массива MyArray
.Шаблон разновидностей позволяет вам переопределить конструкторы по умолчанию.
Например, при использовании таких методов, как map ()
, которые возвращают конструктор по умолчанию, вы хотите, чтобы эти методы возвращали родительский объект Array
вместо объекта MyArray
. Это можно сделать с помощью символа Symbol.species
:
class MyArray extends Array {
статический get [Symbol.species] () {return Array; }
}
пусть a = новый MyArray (1,2,3);
пусть mapped = a.map (x => x * x);
консоль.журнал (сопоставленный экземпляр MyArray);
console.log (сопоставленный экземпляр массива);
Ключевое слово super
используется для вызова соответствующих методов суперкласса. Это одно из преимуществ перед наследованием на основе прототипов.
class Cat {
конструктор (имя) {
this.name = имя;
}
говорить() {
console.log (`$ {this.name} шумит .`);
}
}
class Lion extends Cat {
говорить() {
super.speak ();
console.log (`$ {this.name} roars.`);
}
}
пусть l = новый Лев ('Нечеткий');
л.говорить();
Абстрактные подклассы или примеси являются шаблонами для классов. Класс ECMAScript может иметь только один суперкласс, поэтому множественное наследование от классов инструментов, например, невозможно. Функциональность должна предоставляться суперклассом.
Функция с суперклассом в качестве входных данных и подклассом, расширяющим этот суперкласс в качестве выходных данных, может использоваться для реализации микширования в ECMAScript:
let CalculatorMixin = Base => class extends Base {
calc () {}
};
let randomizerMixin = Base => class extends Base {
randomize () {}
};
Класс, который использует эти микшеры, может быть записан следующим образом:
класс Foo {}
class Bar расширяет CalculatorMixin (randomizerMixin (Foo)) {}
Класс не может быть переопределен.Попытка сделать это приводит к ошибке SyntaxError
.
Если вы экспериментируете с кодом в веб-браузере, например, в веб-консоли Firefox ( Tools > Web Developer > Web Console ), и вы дважды выполняете определение класса с тем же именем, вы получите SyntaxError: повторное объявление let ClassName;
. (См. Дальнейшее обсуждение этой проблемы в ошибке 1428672.) Выполнение чего-то подобного в Инструментах разработчика Chrome дает вам сообщение типа Uncaught SyntaxError: идентификатор ClassName уже был объявлен в
.
Таблицы BCD загружаются только в браузере