{"id":10803,"date":"2018-02-16T23:18:07","date_gmt":"2018-02-17T04:18:07","guid":{"rendered":"https:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=10803"},"modified":"2018-07-06T23:58:14","modified_gmt":"2018-07-07T03:58:14","slug":"11b-tr-variable-scope","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/11b-tr-variable-scope\/","title":{"rendered":"11B: De\u011fi\u015fken Kapsam\u0131"},"content":{"rendered":"<!-- Please retain this notice and add more notes if you create a new version.<br \/>\nOriginal lesson author: David Pritchard, daveagp@gmail.com, http:\/\/cscircles.ca<br \/>\nLicense: http:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/-->\n<p><em>11. derste bulunan A, B, C b\u00f6l\u00fcmlerini istedi\u011finiz s\u0131rayla tamamlayabilirsiniz.<\/em><\/p>\n<p>Bu derste de\u011fi\u015fken kapsam\u0131 olarak adland\u0131r\u0131lan bir kavram\u0131 ele alaca\u011f\u0131z. Ana fikir, iki farkl\u0131 de\u011fi\u015fkene farkl\u0131 kapsamlarda yer ald\u0131klar\u0131 her durumda ayn\u0131 ismin verilebilmesidir. Bu, \u00f6zellikle de geni\u015f \u00e7apl\u0131 programlar\u0131 yazmay\u0131 ve d\u00fczenlemeyi kolayla\u015ft\u0131r\u0131r. Ayr\u0131ca bu kavrama, daha ileride g\u00f6rece\u011fimiz yineleme konusunda ihtiyac\u0131m\u0131z olacak.<\/p>\n<h2>De\u011fi\u015fken Kapsam\u0131na Bir \u00d6rnek<\/h2>\n<p>Bu \u00f6rnekte kullanaca\u011f\u0131m\u0131z program\u0131n bir b\u00f6l\u00fcm\u00fc \u015f\u00f6yle:<\/p>\n<pre>def kare(x):\r\n   de\u011fer = x * x\r\n   return de\u011fer<\/pre>Bu,\u00a0<code>x<\/code>, say\u0131s\u0131n\u0131n karesini hesaplayan bir fonksiyon, yani\u00a0<code>kare(5)<\/code> return sonucu\u00a0<code>25<\/code>\u00a0olacak. \u015eimdi diyelim,\u00a0\u00a0<code>kare<\/code>\u00a0fonksiyonunu, program\u0131n\u00a0<code>de\u011fer<\/code>\u00a0 adl\u0131 de\u011fi\u015fkeni ba\u015fka bir ama\u00e7la kulland\u0131\u011f\u0131 bir b\u00f6l\u00fcm\u00fcnde tekrar \u00e7a\u011f\u0131rd\u0131k:<\/p>\n<pre># Program\u0131n ana g\u00f6vdesi burada ba\u015fl\u0131yor\r\nde\u011fer = 17\r\nbe\u015finKaresi = kare(5)\r\nprint(be\u015finKaresi, de\u011fer)<\/pre>Soru \u015fu, program \u00e7\u0131kt\u0131 olarak ne yazd\u0131racak? \u0130ki ihtimal var, e\u011fer Python'un nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 bilmiyorsak:<\/p>\n<ol>\n<li>Birinci ihtimal, Python iki\u00a0<code>de\u011fer<\/code>\u00a0de\u011fi\u015fkeninin bir \u015fekilde ayr\u0131 tutulmas\u0131 gerekti\u011fini anlayacak. B\u00f6ylece\u00a0<code>kare<\/code> 25 sonucunu verirken, <code>de\u011fer<\/code>\u00a0de\u011fi\u015fkeni ana g\u00f6vdede 17 oldu\u011fu gibi kalacak, ve program\u00a0<code>25\u00a0<\/code><code>17<\/code>\u00a0sonucunu verecek.<\/li>\n<li>Di\u011fer ihtimal de,\u00a0<code>kare<\/code>\u00a0fonksiyonu i\u015fleme kondu\u011funda\u00a0\u00a0<code>de\u011fer<\/code>\u00a0de\u011fi\u015fkeninin mevcut kar\u015f\u0131l\u0131\u011f\u0131 yerine 25 getirilecek ve sonu\u00e7 olarak da program\u00a0<code>25\u00a0<\/code><code>25<\/code>\u00a0\u00e7\u0131kt\u0131s\u0131n\u0131 verecek.<\/li>\n<\/ol>\n<p>Bakal\u0131m ger\u00e7ekte ne olacak!<\/p>\n<p><iframe width='100%' height='480' frameborder='0' scrolling='no' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/OnlinePythonTutor3-cemc\/iframe-embed.html#code=def+square%28x%29%3A%0A++++value+%3D+x+%2A+x%0A++++return+value%0A%0A%23+main+body+of+the+program+starts+here%0Avalue+%3D+17%0Afivesquared+%3D+square%285%29%0Aprint%28fivesquared%2C+value%29&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=3&curInstr=0&resizeContainer=true&highlightLines&width=450&rightStdout=1'><\/iframe><\/p>\n<p>Python 1. ihtimale g\u00f6re davranacakt\u0131r. \u00c7\u00fcnk\u00fc, <em>bir fonksiyon \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 zaman, fonksiyonun d\u0131\u015f\u0131nda tan\u0131mlanm\u0131\u015f hi\u00e7bir de\u011fi\u015fken etkilenmez<\/em>. De\u011fi\u015fkenlere atanm\u0131\u015f de\u011ferler sadece \"yerel\" i\u015flemleri, yani fonksiyonun \"i\u00e7indeki\" i\u015flemleri etkiler. Python ve di\u011fer \u00e7o\u011fu programlama dillerinde bunu yapabilmemizin sebebi; bu \u015fekilde i\u00e7inde pek \u00e7ok fonksiyon bulunan \u00e7ok uzun programlar\u0131 daha basit olarak yazabiliriz. Yeni bir fonksiyon tan\u0131mlad\u0131\u011f\u0131m\u0131zda, fonksiyonun i\u00e7inde herhangi bir de\u011fi\u015fken ad\u0131n\u0131 (<code>result,<\/code>\u00a0<code>temp<\/code>\u00a0ve<code>i<\/code>\u00a0gibi son derece genel kelimeler de d\u00e2hil) kullanmaya her zaman izin verilir, isterse bu de\u011fi\u015fkenler program\u0131n ba\u015fka yerlerinde, hatta ba\u015fka fonksiyonlar\u0131n i\u00e7inde defalarca kullan\u0131lm\u0131\u015f olsun.<\/p>\n<p>Bunu detayl\u0131 olarak g\u00f6rmek i\u00e7in, g\u00f6r\u00fcnt\u00fcleyicide 8 ad\u0131m\u0131n 6.s\u0131na bakabilirsiniz. Burada\u00a0<code>de\u011fer<\/code>\u00a0ad\u0131yla tan\u0131mlanm\u0131\u015f iki farkl\u0131 de\u011fi\u015fken g\u00f6receksiniz; bir tanesi\u00a0<code>kare<\/code> fonksiyonunun i\u00e7inde di\u011feri de d\u0131\u015far\u0131da (\"global\" k\u0131s\u0131mda).<\/p>\n<div class='pybox modeNeutral' id='pybox0'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Multiple Choice Exercise: <\/span><span class='title'>\u0130\u00e7 ve D\u0131\u015f<\/span><\/div><div>Bu program hangi \u00e7\u0131kt\u0131y\u0131 verir? <\/p>\n<pre>x = \"d\u0131\u015f\"<br\/>def xDe\u011fi\u015f(de\u011fer):<br\/>   x = de\u011fer<br\/>xDe\u011fi\u015f(\"i\u00e7\")<br\/>print(x)<\/pre> <\/div><label>Your choice: <\/label><select id=\"pyselect0\"><option value=\"d\" selected>Select one<\/option><option value=\"w\">Burada bir hata verir.<\/option><option value=\"w\">i\u00e7<\/option><option value=\"r\">d\u0131\u015f<\/option><\/select><div class='pyboxbuttons'><input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" name=\"slug\" value=\"11b.inout\"\/><input type='submit' style='margin:5px;' value='Check answer' onClick='pbMultiCheck(0)'\/><\/div><div class=\"pbresults\" id=\"pyMultiResults0\"><\/div><div class=\"epilogue\">Do\u011fru! <code>x = de\u011fer<\/code> ifadesi sadece <code>x<\/code> de\u011fi\u015fkeninin yerel versiyonudur ve sadece fonksiyonun i\u00e7inde ge\u00e7erlidir. <code>x<\/code> de\u011fi\u015fkeninin global versiyonu de\u011fi\u015fmez. (Yani, <code>xDe\u011fi\u015f<\/code> fonksiyonunun hi\u00e7bir etkisi olmayacakt\u0131r.)<\/div><\/div>\n<p>Kapsama (<em>scope<\/em>) benzeyen ba\u015fka bir kavram da <em>isim alan\u0131<\/em>d\u0131r (<em>namespace<\/em>); isim alan\u0131 paketin kapsam\u0131 gibidir. Diyelim bir yerde\u00a0<code>x<\/code>\u00a0 de\u011fi\u015fkenini kullanan bir paket ithal (<code>import<\/code>) ederseniz (<code>math<\/code> matematik gibi), buradaki <code>x<\/code>\u00a0 hi\u00e7bir \u015fekilde program\u0131n di\u011fer yerlerindeki <code>x<\/code>\u00a0 de\u011fi\u015fkeni ile kar\u0131\u015fmaz, \u00e7\u00fcnk\u00fc farkl\u0131 isim alanlar\u0131nda yer almaktad\u0131rlar.<\/p>\n<h2>Kapsama Kurallar\u0131: D\u0131\u015far\u0131 Yolla<\/h2>\n<p>Baz\u0131 durumlarda lokal ve global kapsamdaki de\u011fi\u015fkenleri birlikte kullanmak isteyebiliriz. Yayg\u0131n bir \u00f6rnek olarak, program\u0131n ilk k\u0131sm\u0131nda olu\u015fturdu\u011funuz genel baz\u0131 de\u011fi\u015fkenlerin fonksiyonunuzun i\u00e7inde de okunmas\u0131n\u0131 istersiniz.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform1\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox1'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Global de\u011fi\u015fkeni fonksiyonun i\u00e7inde okumak<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 110px;'><textarea wrap='off' name='usercode1' id='usercode1'  cols=10 rows=4 readonly='readonly'  style = 'height : 110px;'  class='pyboxCode RO'>\nneliPizza='mantarl\u0131'\ndef pizzaSipari\u015fi(n):\n   print(\"Ben\", str(n), neliPizza, \"rica edeyim.\")\npizzaSipari\u015fi(3)<\/textarea><\/div>\n<div id='pbhistory1' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit1' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(1)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(1,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse1\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"1\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"8d0cca5868da8173757acf5c34b382c3\"\/>\n<div id='pbresults1' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit1\").value = \"Run program\";document.getElementById(\"inputInUse1\").value = \"N\";<\/script>\n<\/p>\n<p>Burada, yerel kapsamda <code>neliPizza<\/code> diye bir de\u011fi\u015fkenimiz yok, <em>ama\u00a0bu bir hataya yol a\u00e7m\u0131yor<\/em>. Python, de\u011fi\u015fkenleri ele al\u0131rken, e\u011fer bir de\u011fi\u015fken, kendisine ihtiya\u00e7 duyulan lokal kapsamda yer alm\u0131yorsa, onu global kapsamda arar. Bizim \u00f6rne\u011fimizde <code>neliPizza<\/code> de\u011fi\u015fkeni global kapsamda var. (Bir fonksiyon g\u00f6vdesinin ba\u015fka bir fonksiyon g\u00f6vdesini \u00e7a\u011f\u0131rd\u0131\u011f\u0131 daha genel bir durumda, bu kez \u00fc\u00e7 kapsam elde ederiz; Python daima \u00f6nce \"en yerel\" olan\u0131 denetler ve de\u011fi\u015fkeni bulana kadar ad\u0131m ad\u0131m kapsamlar\u0131 tarar.)<\/p>\n<p><table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> Yukar\u0131daki \u00f6rneklerin ikisi, <code>pizzaSipari\u015fi<\/code> ve <code>xDe\u011fi\u015f<\/code>, fonksiyonlar\u0131 sentaks olarak ayn\u0131d\u0131r. Pekiyi, Python <code>xDe\u011fi\u015f<\/code> fonksiyonunda yeni bir lokal de\u011fi\u015fken olarak <code>x<\/code> de\u011fi\u015fkenini yarat\u0131rken, yeni bir\u00a0<code>neliPizza<\/code> de\u011fi\u015fkenini <code>pizzaSipari\u015fi<\/code> fonksiyonu i\u00e7in neden olu\u015fturmad\u0131? Python'un bu konudaki kural\u0131 \u015f\u00f6yledir: E\u011fer de\u011fi\u015fkeni sadece okuyorsan\u0131z, yeni lokal de\u011fi\u015fken yarat\u0131lmaz; ama e\u011fer de\u011fi\u015fkeni en az bir kez de olsa yazd\u0131ysan\u0131z, de\u011fi\u015fken t\u00fcm fonksiyon g\u00f6vdesi boyunca lokal kapsamda de\u011ferlendirilir. (Bu durum <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/console\/?consolecode=x%20%3D%201%0Adef%20f%28%29%3A%0A%20%20%20print%28x%29%0A%20%20%20x%20%3D%202%0Af%28%29\" target=\"_blank\"><code>UnboundLocalError<\/code><\/a> hatas\u0131n\u0131n en yayg\u0131n sebebidir:\u00a0Python resmi sayfalar\u0131nda yer alan \u015fu iki soruya g\u00f6z at\u0131n [<a href=\"http:\/\/docs.python.org\/py3k\/faq\/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value\" target=\"_blank\" rel=\"noopener\">1<\/a>, <a href=\"http:\/\/docs.python.org\/py3k\/faq\/programming.html#what-are-the-rules-for-local-and-global-variables-in-python\" target=\"_blank\" rel=\"noopener\">2<\/a>].) <\/span><\/td><\/table><\/p>\n<p>Fonksiyon arg\u00fcmanlar\u0131 <em>her zaman<\/em> lokal de\u011fi\u015fken olarak kabul edilir. Buradaki k\u0131r\u0131k program par\u00e7as\u0131ndan g\u00f6rebilirsiniz (<code>g<\/code>\u00a0de\u011fi\u015fkenini\u00a0<code>0<\/code> olarak resetlemeye \u00e7al\u0131\u015f\u0131yor ama i\u015fe yaram\u0131yor).<\/p>\n<p><iframe width='100%' height='480' frameborder='0' scrolling='no' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/OnlinePythonTutor3-cemc\/iframe-embed.html#code=def+resetToZero%28var%29%3A%0A+var+%3D+0%0Ag+%3D+15%0AresetToZero%28g%29%0Aprint%28g%29&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=3&curInstr=0&resizeContainer=true&highlightLines&width=400&rightStdout=1'><\/iframe><\/p>\n<h2><code>global<\/code>\u00a0De\u011fi\u015fiklikler<\/h2>\n<p>Di\u011fer pek \u00e7ok \u015fey gibi, yukar\u0131da anlat\u0131lan normal ak\u0131\u015f t\u00fcm durumlar\u0131n %99'u i\u00e7in ge\u00e7erlidir, ama kalan %1'lik durumlar i\u00e7in bir fonksiyon i\u00e7ine yerle\u015ftirdi\u011finiz global bir de\u011fi\u015fkenin yerine ba\u015fka bir isim se\u00e7meniz gerekebilir. Python'da bunu <code>global<\/code> bir ifade kullanarak yapabilirsiniz.<\/p>\n<p>Yukar\u0131da ge\u00e7en\u00a0<code>xDe\u011fi\u015f<\/code>\u00a0\u00f6rne\u011fini burada farkl\u0131 bir \u015fekilde yazd\u0131k; de\u011fi\u015fkeni fonksiyon i\u00e7inde global olarak ilan etmek, de\u011fi\u015fkenin global de\u011ferini fonksiyonun i\u00e7inden de\u011fi\u015ftirmemize izin verir.<\/p>\n<p><iframe width='100%' height='480' frameborder='0' scrolling='no' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/OnlinePythonTutor3-cemc\/iframe-embed.html#code=def+xReplace%28value%29%3A%0A++++global+x%0A++++x+%3D+value%0A%0Ax+%3D+%22outer%22%0AxReplace%28%22inner%22%29+%0Aprint%28x%29+++++++%23+%27inner%27+now%21&cumulative=false&heapPrimitives=false&drawParentPointers=false&textReferences=false&showOnlyOutputs=false&py=3&curInstr=0&resizeContainer=true&highlightLines&width=400&rightStdout=1'><\/iframe><\/p>\n<p>Bir fonksiyonun i\u00e7erisinde global kapsamda tan\u0131mlanm\u0131\u015f bir de\u011fi\u015fkene bir de\u011fer atad\u0131\u011f\u0131m\u0131zda; global de\u011fi\u015fken g\u00fcncellenmi\u015f olmaz, sadece lokal kapsamda ayn\u0131 isimle yeni bir de\u011fi\u015fken yarat\u0131lm\u0131\u015f olur. E\u011fer global kapsaml\u0131 de\u011fi\u015fkenin de\u011ferini fonkisyon i\u00e7inde g\u00fcncellemek isterseniz, fonksiyonun i\u00e7erisinde \"global &lt;de\u011fi\u015fken ad\u0131&gt;\" ifadesini kullanman\u0131z gerekir. B\u00f6ylece Python, de\u011fi\u015fkenin de\u011ferinde yapt\u0131\u011f\u0131m\u0131z de\u011fi\u015fikli\u011fin global kapsamdaki de\u011fi\u015fken i\u00e7in de ge\u00e7erli olaca\u011f\u0131n\u0131 anlar. Dersimizi bu bilgi ile\u00a0bitiriyoruz!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>11. derste bulunan A, B, C b\u00f6l\u00fcmlerini istedi\u011finiz s\u0131rayla tamamlayabilirsiniz. Bu derste de\u011fi\u015fken kapsam\u0131 olarak adland\u0131r\u0131lan bir kavram\u0131 ele alaca\u011f\u0131z. Ana fikir, iki farkl\u0131 de\u011fi\u015fkene farkl\u0131 kapsamlarda yer ald\u0131klar\u0131 her durumda ayn\u0131 ismin verilebilmesidir. Bu, \u00f6zellikle de geni\u015f \u00e7apl\u0131 programlar\u0131 &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/11b-tr-variable-scope\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-10803","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10803","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=10803"}],"version-history":[{"count":14,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10803\/revisions"}],"predecessor-version":[{"id":11006,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/10803\/revisions\/11006"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=10803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}