<?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>deadlime.project &#187; Python</title>
	<atom:link href="http://deadlime.hu/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://deadlime.hu</link>
	<description>squeezed out</description>
	<lastBuildDate>Tue, 24 Jan 2012 21:54:45 +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>A zöldcitromok ereje</title>
		<link>http://deadlime.hu/2011/06/19/a-zoldcitromok-ereje/</link>
		<comments>http://deadlime.hu/2011/06/19/a-zoldcitromok-ereje/#comments</comments>
		<pubDate>Sat, 18 Jun 2011 22:57:31 +0000</pubDate>
		<dc:creator>kriz</dc:creator>
				<category><![CDATA[nincs kategória]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Sublime]]></category>

		<guid isPermaLink="false">http://deadlime.hu/?p=233</guid>
		<description><![CDATA[Érdekes módon a deadlime kedvenc kódszerkesztő alkalmazása a Sublime. Egyrészt azért, mert a többszörös kijelölés az bizony hihetetlenül fantasztikus egy találmány. Másrészt pedig Python-ban lehet hozzá plugin-eket írni.]]></description>
			<content:encoded><![CDATA[<p style="text-indent: 0;"><img src="http://deadlime.hu/wp-content/uploads/2011/06/lime.jpg" alt="" width="450" height="190" /></p>

<p>Érdekes módon a deadlime kedvenc kódszerkesztő alkalmazása a <a href="http://www.sublimetext.com/">Sublime</a>. Egyrészt azért, mert a <a href="http://sublime.akalias.net/gettingstarted/concepts-multiple-selections.html">többszörös kijelölés</a> az bizony hihetetlenül fantasztikus egy találmány. Másrészt pedig Python-ban lehet hozzá plugin-eket írni.</p>

<p>Kedves kollégám említette a minap, hogy egyik régebben használt szerkesztőjében volt valamiféle funkció, amivel a vágólap korábbi tartalmait lehetett újra felhasználni. Aztán elkezdtem gondolkodni rajta, hogy vajon lehetne-e egy ilyen plugin-t írni Sublime-hoz. Aztán megírtam. :)</p>

<p>Ha már így alakult, ragadjuk meg az alkalmat és nézzük meg kicsit, hogyan is néz ki egy Sublime plugin. A funkció meglepően kevés kódból megoldható: először is felül kell csapnunk a beépített copy és cut utasításokat sajáttal úgy, hogy megmaradjon az eredeti funkcionalitás is, de közbe mentsük egy tömbbe az adatokat.</p>

<pre class="code prettyprint lang-python">class ClipboardHistoryCopyCommand(sublimeplugin.TextCommand):
    def run(self, view, args):
        saveSelections(view)
        view.runCommand('copy');</pre>

<p>Egy kis XML-lel meg is mondjuk a proginak, hogy a mi parancsunkat használja a <kbd>Ctrl+C</kbd> nyomkodása esetén:</p>

<pre class="code prettyprint lang-xml">&lt;bindings&gt;
    &lt;binding key=&quot;ctrl+c&quot; command=&quot;clipboardHistoryCopy&quot; /&gt;
&lt;/bindings&gt;</pre>

<p>A cut nem túl meglepő módon elég hasonlóan néz ki (csak a beépített cut parancsot hívjuk meg a végén). A <code>saveSelections</code> végzi a munka javát. Végigmegy az összes kijelölésen és amelyik nem üres, azt elpakolja egy tömbbe, aminél még arra is figyelünk, hogy ne lehessen túl nagy:</p>

<pre class="code prettyprint lang-python">clipboardMaxSize = 100
clipboardData = []

def saveSelections(view):
    for region in view.sel():
        if region.begin() != region.end():
            clipboardData.insert(0, view.substr(region))
            if len(clipboardData) &gt; clipboardMaxSize:
                clipboardData.pop()</pre>

<p>Annyi maradt már csak, hogy valami kellően kézreálló billentyűkombinációra meg is jelenítse az előzményeket és tudjunk belőle kedvünkre válogatni. Legnagyobb szerencsénkre tudjuk használni a beépített lista ablakot, amiben még kereső is van (ugyanaz, ami a <kbd>Ctrl+P</kbd> vagy a <kbd>Ctrl+R</kbd> kombinációkra is bejön):</p>

<pre class="code prettyprint lang-python">class ClipboardHistoryPasteCommand(sublimeplugin.TextCommand):
    def pasteSelected(self, view, index):
        for region in view.sel():
            view.insert(region.begin(), clipboardData[index])
    
    def run(self, view, args):
        view.window().showSelectPanel(
            clipboardData,
            functools.partial(self.pasteSelected, view),
            None,
            sublime.SELECT_PANEL_MONOSPACE_FONT
        );</pre>

<p>És természetesen a hozzá tartozó kis XML részlet:</p>

<pre class="code prettyprint lang-xml">&lt;binding key=&quot;alt+shift+q&quot; command=&quot;clipboardHistoryPaste&quot; /&gt;</pre>

<p>Nem a legtökéletesebb megoldás, például plugin újratöltéseknél elveszik a clipboardData tömb tartalma (lehetne például fájlba menteni menet közben), de kezdetnek megteszi. A teljes csomagot <a href="http://knagy.hu/sublime/TheClipboardHistory.sublime-package">innen</a> le lehet rántani (érdekes módon ClipboardHistory.sublime-package fájlnévvel nem mentek volna a billentyűparancs felüldefiniálások, mivel az Sublime ABC sorrendben tölti be a plugineket és a Default később van... :)).</p>

<p style="text-indent: 0; font-size: 10px; color: #808080;">[a képet köszönjük <a href="http://www.flickr.com/photos/snakphotography/5483168387/">ShutterBugChef</a>-nek]</p>]]></content:encoded>
			<wfw:commentRss>http://deadlime.hu/2011/06/19/a-zoldcitromok-ereje/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Valósághű (?) sorbanállás szimulátor</title>
		<link>http://deadlime.hu/2011/02/03/valosaghu-sorbanallas-szimulator/</link>
		<comments>http://deadlime.hu/2011/02/03/valosaghu-sorbanallas-szimulator/#comments</comments>
		<pubDate>Thu, 03 Feb 2011 21:03:17 +0000</pubDate>
		<dc:creator>kriz</dc:creator>
				<category><![CDATA[nincs kategória]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://deadlime.hu/?p=186</guid>
		<description><![CDATA[Az úgy volt, hogy elgondolkoztam azon, hogy vajon miért jó az, ha a kiszolgálás folyamatát több részre bontják. Ha egyáltalán jó az. Offline, bolti kiszolgálásról van szó, mielőtt bárki - a blog témáját figyelembe véve - jogosan másra gondolna.]]></description>
			<content:encoded><![CDATA[<p>Az úgy volt, hogy elgondolkoztam azon, hogy vajon miért jó az, ha a kiszolgálás folyamatát több részre bontják. Ha egyáltalán jó az. Offline, bolti kiszolgálásról van szó, mielőtt bárki - a blog témáját figyelembe véve - jogosan másra gondolna.</p>

<p>Ha vesszük az értékesítő-pénztáros-árukiadó modellt, érzésre úgy tűnik, hogy a több sor végigjárása miatt többet is várunk. De a sorbanállás pszichológiája fura egy dolog. Jó példa erre a hipermarket, ahol N pénztárnak van N sora azért, mert az N pénztár 1 sor felállás zavaró lehet az embereknek a hosszú sor miatt, holott a várakozási idő úgy kevesebb lenne.</p><span id="more-186"></span>

<iframe title="YouTube video player" width="450" height="275" src="http://www.youtube.com/embed/F5Ri_HhziI0" frameborder="0" allowfullscreen></iframe>

<p>Itt az ideje szimulálni. Két eset lesz (meg talán egy bónusz :)). Az egyikben van 4 ember, aki értékesít, 1 kezeli a pénzt és 1 kiadja a vásárolt árut. A másikban 6 ember, aki a teljes vásárlási folyamatért felelős. Mindkét esetben ahány ember van, annyi sor is, valamint hirtelen nagyobb mennyiségű vásárló esik be a boltba, akik mindig a legrövidebb sort célozzák meg. A helyek közötti közlekedésre szánt időt figyelmen kívül hagyjuk. Nincsenek kezelve az olyan vásárlók, akik az értékesítés után "feladják" és hazamennek (csak érdeklődni jöttek be a boltba). Az egyes helyeken töltött időt random generáltam a következő intervallumokat használva:</p>

<dl>
	<dt>Értékesítés:</dt>
	<dd>30 és 300 másodperc között</dd>
	<dt>Pénztár:</dt>
	<dd>15 és 30 másodperc között</dd>
	<dt>Árukiadás:</dt>
	<dd>30 és 120 másodperc között</dd>
</dl>

<p>Az első változat eredményei 4 különböző adathalmazra, 25 egyszerre érkező vásárlóval (az eredmények percben vannak):</p>

<table width="100%" style="background-color: #FFF; border: 1px solid #ABC9AB;">
	<tr>
		<th>&nbsp;</th>
		<th>A1</th>
		<th>A2</th>
		<th>A3</th>
		<th>A4</th>
	</tr>
	<tr>
		<td>Átlagos sorbanállással töltött idő</td>
		<td align="right">14.37</td>
		<td align="right">14.58</td>
		<td align="right">12.57</td>
		<td align="right">12.36</td>
	</tr>
	<tr>
		<td>Az összes ember kiszolgálása</td>
		<td align="right">33.79</td>
		<td align="right">34.44</td>
		<td align="right">32.15</td>
		<td align="right">30.46</td>
	</tr>
</table>

<p>A kettes számú verzió a 6 eladóval, aki nem specializálódott:</p>

<table width="100%" style="background-color: #FFF; border: 1px solid #ABC9AB;">
	<tr>
		<th>&nbsp;</th>
		<th>A1</th>
		<th>A2</th>
		<th>A3</th>
		<th>A4</th>
	</tr>
	<tr>
		<td>Átlagos sorbanállással töltött idő</td>
		<td align="right">7.28</td>
		<td align="right">6.90</td>
		<td align="right">6.91</td>
		<td align="right">7.61</td>
	</tr>
	<tr>
		<td>Az összes ember kiszolgálása</td>
		<td align="right">24.28</td>
		<td align="right">22.12</td>
		<td align="right">27.27</td>
		<td align="right">23.65</td>
	</tr>
</table>

<p>Ezzel úgy tűnik el is dőlt, hogy a többszörös sorbanállás nem csak lassabbnak érződik, de lassabb is. Már amennyire meg lehet bízni az általam írt szimulációkban. :)</p>

<p>A bónusz eset megegyezik a kettes verzióval annyi különbséggel, hogy nem eladónként van egy sor, hanem egy sor van összesen:</p>

<table width="100%" style="background-color: #FFF; border: 1px solid #ABC9AB;">
	<tr>
		<th>&nbsp;</th>
		<th>A1</th>
		<th>A2</th>
		<th>A3</th>
		<th>A4</th>
	</tr>
	<tr>
		<td>Átlagos sorbanállással töltött idő</td>
		<td align="right">7.05</td>
		<td align="right">6.80</td>
		<td align="right">6.43</td>
		<td align="right">7.45</td>
	</tr>
	<tr>
		<td>Az összes ember kiszolgálása</td>
		<td align="right">21.61</td>
		<td align="right">23.75</td>
		<td align="right">18.89</td>
		<td align="right">21.80</td>
	</tr>
</table>

<p>A különbség nem annyira látványos, de azért még sikerült lefaragni valamennyit az időkből (az A2 idejét leszámítva, az valamilyen rejtélyes oknál fogva több lett).</p>

<p>A kód egyébként Python-ban készült és <a href="http://kriz.deadlime.hu/shop_simulator.zip">a használt adathalmazokkal együtt letölthető itt</a>. Kellemes szimulálást. :)</p>]]></content:encoded>
			<wfw:commentRss>http://deadlime.hu/2011/02/03/valosaghu-sorbanallas-szimulator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A kígyó esete a parancssorral I.</title>
		<link>http://deadlime.hu/2008/09/21/a-kigyo-esete-a-parancssorral-1/</link>
		<comments>http://deadlime.hu/2008/09/21/a-kigyo-esete-a-parancssorral-1/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 13:05:01 +0000</pubDate>
		<dc:creator>kriz</dc:creator>
				<category><![CDATA[nincs kategória]]></category>
		<category><![CDATA[parancssor]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://deadlime.hu/?p=127</guid>
		<description><![CDATA[Mostanság parancssori scripteket írogatok Python-ban, ha éppen nincs jobb dolgom (ritka). Gondoltam hát, hogy ezzel kapcsolatos tapasztalataimat és a nyelvvel való ismerkedésemet megosztom egy - egyelőre még nem tudni hány részes - bejegyzéssorozatban. Az első rész témája az alkalmazásnak átadott paraméterek feldolgozása a getopt és az optparse modulok segítségével. A programunk egy egyszerű "Hello World!" [...]]]></description>
			<content:encoded><![CDATA[<p>Mostanság parancssori scripteket írogatok Python-ban, ha éppen nincs jobb dolgom (ritka). Gondoltam hát, hogy ezzel kapcsolatos tapasztalataimat és a nyelvvel való ismerkedésemet megosztom egy - egyelőre még nem tudni hány részes - bejegyzéssorozatban. Az első rész témája az alkalmazásnak átadott paraméterek feldolgozása a <code>getopt</code> és az <code>optparse</code> modulok segítségével.</p>

<p>A programunk egy egyszerű "Hello World!" alkalmazás lesz parancssori stílusban. Két fajta bemenő paramétert fogad el. Az egyik a név, akinek köszönni fog, a másikra pedig megjeleníti a súgót, hogy hogyan is kell paraméterezni ezt a rettentő bonyolult programot.</p><span id="more-127"></span>

<h3>A getopt</h3>

<p>A legkézenfekvőbb módszer a paraméterek feldolgozására a <a href="http://docs.python.org/lib/module-getopt.html"><code>getopt</code> modul</a> <code>getopt()</code> függvénye. Szükségünk lesz ezen kívül még a <a href="http://docs.python.org/lib/module-sys.html"><code>sys</code> modulra</a>, hogy a feldolgozandó lista is a birtokunkba kerüljön (mellesleg a <a href="http://hu2.php.net/getopt"><code>getopt()</code> függvény</a> PHP-ban is létezik):</p>

<pre class="code prettyprint lang-python">from getopt import getopt, GetoptError
import sys</pre>

<p>A feldolgozás során a <code>getopt()</code> egy <code>GetoptError</code> kivételt dob, ha nem talál rendben valamit. A függvény első paramétere a bemenő adatok tömbje (az első indextől, mivel a nulladik index az a meghívott fájl neve), a második paraméter a rövid kapcsolók listája (kettőspont van a betűk mögött, amik paramétert várnak), a harmadik paraméter pedig a hosszú kapcsolók listája (egyenlőségjellel a név mögött, ha paramétert várnak). A visszatérési értéke két tömb, az első paraméternév-érték párokat tartalmaz, a második pedig a fel nem dolgozott parancssori argumentumokat.</p>

<pre class="code prettyprint lang-python">try:
    opts, args = getopt(sys.argv[1:], 'hn:', ['help', 'name='])
except GetoptError:
    print 'Parameterezesi hiba'
    sys.exit(1)</pre>

<p>Ha nem szállt el a program hibával, akkor megadjuk a változóinknak (jelen esetben csak a name-nek) az alapértelmezett értékeket és végigmegyünk az <code>opts</code> tömbön, hogy feltölthessük őket valós adatokkal.</p>

<pre class="code prettyprint lang-python">name = False

for opt, arg in opts:
    if opt in ('-h', '--help'):
        print 'usage: %s --name=NAME' % sys.argv[0]
        sys.exit(0)
    elif opt in ('-n', '--name'):
        name = arg</pre>

<p>Nem maradt más hátra, mint a <code>name</code> változó ellenőrzése és siker esetén a köszöntés kiiratása:</p>

<pre class="code prettyprint lang-python">if not name:
    print 'Add meg a nevet!'
    sys.exit(2)

print 'Hello, ' + name + '!'</pre>

<p>Ha a <code>name</code> változó kezdőértéke például <code>'World'</code> lenne, akkor a feldolgozás utáni ellenőrzést el is hagyhatnánk és a programunk működése úgy módosulna, hogy a világot köszöntené, ha nem kap más paramétert.</p>

<h3>Az optparse</h3>

<p>A Python 2.3-as verziója óta rendelkezésre áll az <a href="http://docs.python.org/lib/module-optparse.html"><code>optparse</code> modul</a> is, ami még egy pár gondot levesz a vállunkról méghozzá objektum-orientált módon. Ez esetben a <code>sys</code> modulra nem lesz szükségünk, a parancssori paraméterek begyűjtését az <code>optparse</code> végzi.</p>

<pre class="code prettyprint lang-python">from optparse import OptionParser</pre>

<p>Beállítjuk, hogy milyen paramétereket várunk és azt is, hogy mik lesznek ezeknek az alapértelmezett értékei. Ezek után feldolgozzuk a bejövő adatokat.</p>

<pre class="code prettyprint lang-python">parser = OptionParser()
parser.add_option(
    '-n', '--name',
    dest = 'name',
    help = 'a koszontendo neve',
    metavar = 'NAME'
)
parser.set_defaults(name = False)
opts, args = parser.parse_args()</pre>

<p>Ami azonnal feltűnhet, hogy a <code>-h</code> és <code>--help</code> kapcsolókat nem adtuk meg. Ezt az <code>optparser</code> automatikusan megteszi és még a segítség szövegét is legenerálja nekünk (az <code>add_option()</code> <code>help</code> és  <code>metavar</code> paramétere alapján). A feldolgozás után kapott értékeket az <code>opts</code> tömbben érjük el az <code>add_option()</code>-nak megadott <code>dest</code> paraméter nevű kulcsként.</p>

<pre class="code prettyprint lang-python">if not opts.name:
    parser.error('Add meg a nevet!')

print 'Hello ' + opts.name + '!'</pre>

<p>Ezzel meg is lennénk. Nem tűnik sokkal rövidebbnek a kód, de több paraméter esetén szembetűnőbb lenne a <code>getopt</code> esetén a kód közepén az a hatalmas <code>if-elif</code> erdő. Ezen kívül ugye egy elég szép súgó kimenetet generál nekünk és bizonyos fokig kezeli a hibákat is (üres paraméter, nem numerikus paraméter - ha az van beállítva) egy kulturált hibakimenetet mutatva.</p>

<h3>Példafájlok</h3>

<ul>
    <li><a href="http://kriz.deadlime.hu/python/hello_world_getopt.py"><code>getopt</code> példafájl</a></li>
    <li><a href="http://kriz.deadlime.hu/python/hello_world_optparse.py"><code>optparse</code> példafájl</a></li>
</ul>

<p>A következő részben előreláthatólag különböző konfigurációs fájlok feldolgozásának módjáról lesz szó. Addig is kellemes paraméterezést.</p>]]></content:encoded>
			<wfw:commentRss>http://deadlime.hu/2008/09/21/a-kigyo-esete-a-parancssorral-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kígyóbűvölés alapfokon</title>
		<link>http://deadlime.hu/2008/07/27/kigyobuvoles-alapfokon/</link>
		<comments>http://deadlime.hu/2008/07/27/kigyobuvoles-alapfokon/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 23:46:39 +0000</pubDate>
		<dc:creator>kriz</dc:creator>
				<category><![CDATA[nincs kategória]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://deadlime.hu/?p=114</guid>
		<description><![CDATA[Néha a lustaságomon felül kerekedik az a vágy, hogy új programozási nyelveket ismerjek meg. Ennek lett a legfrissebb áldozata a Python. Bár már volt vele dolgom régebben is, de körülbelül csak egy Fibonacci-számokat számoló rekurzív függvény megvalósításáig jutottam (az is nagy valószínűséggel valami példakód volt valamelyik segédletből). Magáról a nyelvről azt lehet elmondani, hogy feltűnően [...]]]></description>
			<content:encoded><![CDATA[<p>Néha a lustaságomon felül kerekedik az a vágy, hogy új programozási nyelveket ismerjek meg. Ennek lett a legfrissebb áldozata a <a href="http://www.python.org/">Python</a>. Bár már volt vele dolgom régebben is, de körülbelül csak egy Fibonacci-számokat számoló rekurzív függvény megvalósításáig jutottam (az is nagy valószínűséggel valami példakód volt valamelyik segédletből).</p>

<p>Magáról a nyelvről azt lehet elmondani, hogy feltűnően szépnek mondható ahhoz képest, hogy a Pascal-stílusú nyelvek közé tartozik. És nem csak egyszerűen szép, hanem törekszik arra, hogy a benne írt kód is szép legyen (ahogy az a <a href="http://wiki.python.org/moin/PythonPhilosophy">Python filozófiáinak listájában</a> is szerepel: <em>"Beautiful is better than ugly."</em>). Persze ehhez az is kell, hogy ne csak Python nyelven, de Python stílusban is programozunk.<br/>
A kinézetet tekintve legszembetűnőbb különbség más nyelvekhez képest a kód kötelező indentálása. Nincsenek sorvégi pontok, pontosvesszők, if-eket és egyéb blokkszerkezeteket lezáró hullámos zárójelek vagy kulcsszavak. Minden az új sor karakterek és az indentálás alapján dől el. De mivel kódolás közben a nagy többség amúgy is szokott új sorokat és tabokat használni (és mivel a kötelező indentálás az esetek közel 100%-ában megegyezik azzal, amúgy is használnánk), ezért elég gyorsan hozzá lehet szokni ahhoz, hogy tulajdonképpen kevesebbet kell gépelni. Persze ez még kevés ahhoz, hogy használható is legyen valamire. Mivel napjaim nagy részét a webprogramozás teszi ki, ezért a szintaktikai ismerkedés után első dolgom az volt, hogy utánanézzek, mire is képes a kígyó a weben...</p><span id="more-114"></span>

<p>Itt már kezdődtek a gondok. Mutatkoztak annak a jelei, hogy a Python egy általános scriptnyelv, nem webre teremtették, mint a PHP-t. Ha mindenféle keretrendszer nélkül szeretnénk benne webprogramozni, csupán a megfelelő Apache beállítások elvégzésével és egy mod_python betöltésével... hát... nem lesz egy könnyű dolgunk (arról nem is beszélve, hogy a mod_python mellett van számos más alternatíva is és akkor még el sem jutottunk odáig, hogy keretrendszert válasszunk). Persze egy nagyon minimális keretrendszert össze lehet dobni pár tíz perc és 50-60 sor kód alatt (amit meg is tettem, just for fun), de végső soron arra jutottam, hogy ha webprogramozás, akkor egyelőre maradok a PHP-nél.</p>

<p>A gond ez után már csak az volt, hogy ha nem webprogramozásra, akkor mégis mi a fenére használjak egy scriptnyelvet? Mivel egy általános nyelvről van szó, elég sok dologra lehetne használni. Ennek okán úgy döntöttem, hogy ha valami nem webprogramozással kapcsolatos, de programozást igénylő problémába ütközöm, akkor azt Python-ban próbálom majd megoldani, ahelyett, hogy a jól bevált PHP-t használnám. Így ha épp egy random, 8 betűből álló stringre van szükségem, akkor nem azt írom, hogy:</p>

<pre class="code prettyprint lang-php">$str = '';
for ($i = 0; $i &lt; 8; ++$i) {
	$str .= chr(mt_rand(97, 122));
}
print $str;</pre>

<p>Hanem inkább ezt:</p>

<pre class="code prettyprint lang-python">from random import randint
print ''.join([chr(randint(97, 122)) for x in range(8)])</pre>

<p>Valószínűleg így egyes problémákat tovább tart megoldani, mivel kénytelen vagyok utánanézni olyan dolgoknak, amiknek PHP-ban nem kellene, viszont ha sosem használom a nyelvet valós problémák megoldására, akkor egyrészt nem lesz benne gyakorlatom, másrészt pedig elfelejtem. Végeredményben tehát a Python egy szép nyelv (és nem csak külalakra, hanem működését és megoldásait tekintve is), amivel érdemes foglalkozni. Már csak azért is, hogy új szemléletmódokat szedjen magára az ember. Ezt pedig jól segíti <a href="http://www.diveintopython.org/">ez az online is olvasható könyv</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://deadlime.hu/2008/07/27/kigyobuvoles-alapfokon/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

