<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ZetBlog&#187; hints</title>
	<atom:link href="http://zetblog.ru/tag/hints/feed/" rel="self" type="application/rss+xml" />
	<link>http://zetblog.ru</link>
	<description>Зеты говорят. Блог о программировании, администрировании и безопасности.</description>
	<lastBuildDate>Sat, 29 Oct 2011 18:59:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Python: Маленькая хитрость. if-else vs and-or.</title>
		<link>http://zetblog.ru/programming/201003/python-if-else-vs-and-or/</link>
		<comments>http://zetblog.ru/programming/201003/python-if-else-vs-and-or/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 19:30:57 +0000</pubDate>
		<dc:creator>lizz</dc:creator>
				<category><![CDATA[общие вопросы]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[hints]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://zetblog.ru/?p=980</guid>
		<description><![CDATA[На этот раз будет мини-заметка, уж слишком мне понравился трюк, о котором пойдёт речь дальше :). Наверное любому программисту приходится часто писать конструкции такого вида: if a == b: c = d else: c = e Как-то разбирая исходники какого-то проекта наткнулся на весьма компактную замену. Вот для сравнения два аналогичных блока кода с использованием [...]]]></description>
			<content:encoded><![CDATA[<p>На этот раз будет мини-заметка, уж слишком мне понравился трюк, о котором пойдёт речь дальше :). </p>
<p>Наверное любому программисту приходится часто писать конструкции такого вида:</p>
<pre class=".brush: python">if a == b:
    c = d
else:
    c = e</pre>
<p>Как-то разбирая исходники какого-то проекта наткнулся на весьма компактную замену. Вот для сравнения два аналогичных блока кода с использованием логических операций python&#8217;а и с использованием конструкции if-else:</p>
<pre class=".brush: python"># if-else:
if random.random() > 0.5:
    a = 1
else:
    a = 0

# and-or style:
a = random.random() > 0.5 and 1 or 0</pre>
<p>На мой взгляд выглядит гораздо лучше и компактнее (да-да, if-else можно записать в 2 строчки вместо 4, но мне так не нравится ^__^) . Другое дело, что некоторым это может показаться противоречиво с некоторыми пунктами дзена python&#8217;а (import this), но это спорно :). В общем использую там, где считаю нужным.</p>
<p>Кстати, если кого-то интересует производительность, то она примерно одинакова, далее выложу тесты и объяснение логики для тех, кому интересно.<br />
<span id="more-980"></span></p>
<pre class=".brush: python">>>> import timeit
>>> t1 = timeit.Timer('if random.random()>0.5:a=1\nelse:a =0', 'from __main__ import a\nimport random')
>>> t2 = timeit.Timer('a=random.random()>0.5 and 1 or 0', 'from __main__ import a\nimport random')
>>> t1.repeat()
[0.21074632467116317, 0.2097615509806019, 0.20978293771349854]
>>> t2.repeat()
[0.21944338095772764, 0.21785226684687586, 0.21940797240040411]
</pre>
<p>Тесты привёл, теперь объяснение.</p>
<p>Дело в том, что логические операции <strong>and</strong> и <strong>or</strong> в python&#8217;е возвращают один из операндов. Операция and возвращает первый операнд, если он приводится к логическому типу False, иначе &#8212; второй. Операция or наоборот, возвращает 1й операнд, если он приводится к типу True, иначе &#8212; второй. Всё это связано с &#171;ленивостью&#187; (lazy) операций, вычисляется столько аргументов, сколько надо для того, чтобы однозначно определить результат (например, 1 or x всегда даёт True, поэтому x не вычисляется).</p>
]]></content:encoded>
			<wfw:commentRss>http://zetblog.ru/programming/201003/python-if-else-vs-and-or/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

