{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Global ve Yerel değişkenler" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu konuda **global** ve **yerel (local)** değişkenleri öğrenmeye çalışacağız.\n", "\n", "\n", "Pythonda her bir değişkenin, fonksiyonun ve ileride göreceğimiz sınıfların(class) aslında bir **kapsamı(scope)** bulunur ve Python herbir değişkeni bir **isim alanında (namespace)** tanımlar. Değişkenlerin **İsim alanı** ise, bu değişkenlerin nerelerde var olduğunu ve nerelerde kullanılabileceğini gösterir. \n", "\n", "Pythonda fonksiyonlarda tanımlanan değişkenler Python tarafından **Yerel (Local) değişkenler ** olarak tanımlanırlar. Yani bir **fonksiyon bloğunda** oluşturulan değişkenler fonksiyona özgüdür ve **fonksiyon çalışmasını** bitirdikten sonra bu değişkenler bellekten silinir ve yok olur. Böylelikle , fonksiyon içinde tanımlanmış bir değişkene başka bir yerden **erişilemez**.\n", "\n", "Pythonda en genel kapsama sahip değişkenler ise **Global değişkenler** olarak tanımlanırlar ve global değişkenlere **tanımlandığı andan itibaren** programın her yerinden ulaşabiliriz.\n", "\n", "***Yerel değişkenleri*** anlamak için bir tane fonksiyon tanımlayalım.\n", "\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10\n" ] }, { "ename": "NameError", "evalue": "name 'a' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[0mfonksiyon\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 7\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mNameError\u001b[0m: name 'a' is not defined" ] } ], "source": [ "def fonksiyon():\n", " a = 10 # Yerel isim alanında bir değişken\n", " print(a)\n", "\n", " \n", "fonksiyon() \n", "print(a) # a değişkeni yok oldu." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Burada fonksiyon içinde tanımlanan **a** değişkeni **fonksiyon çağrıldığında** bellekte oluşur ve fonksiyon bloğunu çalıştırdıktan sonra **yok olur**. Yani, **a** değişkeni burada bir ***yerel değişkendir***. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Global Değişkenleri** anlamak içinse şöyle bir örnek yapalım.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n" ] } ], "source": [ "a = 5 # Global isim alanında bir değişken .\n", "\n", "def fonksiyon():\n", " print(a) # a değişkeni globalde tanımlandığı için burada tanımlı.\n", " \n", "fonksiyon()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Peki şöyle bir kodda nasıl bir sıkıntı çıkıyor ? " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 's' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mfonksiyon\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# s global değişkeni henüz tanımlanmadığı için Python hata veriyor.\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[0ms\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m\"Python\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m\u001b[0m in \u001b[0;36mfonksiyon\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mfonksiyon\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mfonksiyon\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# s global değişkeni henüz tanımlanmadığı için Python hata veriyor.\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0ms\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m\"Python\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mNameError\u001b[0m: name 's' is not defined" ] } ], "source": [ "def fonksiyon():\n", " print(s)\n", "\n", "fonksiyon() # s global değişkeni henüz tanımlanmadığı için Python hata veriyor.\n", "s = \"Python\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Peki şöyle bir durumda kodumuz nasıl bir çıktı verecek ? \n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", "10\n" ] } ], "source": [ "c = 10 # Globalde tanımlanmış bir değişken \n", "def fonksiyon():\n", " c = 2 # Yerelde tanımlanmış bir değişken\n", " print(c) # Yerel değişken kullanılıyor.\n", "\n", "fonksiyon()\n", "print(c)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Kodumuz çalıştığında ilk olarak **c** isimli global değişken oluşuyor. **fonksiyon çağrıldığında ise** **c** isimli başka bir yerel değişken oluşuyor gibi düşünebilirsiniz. Böyle bir durumda elimizden iki tane **c** değişkeni var. Python bu durumda **global c** değişkeni yerine **kendi yerel c** değişkenini kullanıyor. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Global Deyimi\n", "\n", "Peki bir fonksiyonda globalde tanımlanmış bir değişkeni nasıl kullanacağız ? Bunun için Pythonda **global** ifadesi bulunmaktadır. Şimdi aşağıdaki kodu beraber inceleyelim.\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4\n", "4\n" ] } ], "source": [ "d = 10\n", "\n", "def fonksiyon():\n", " global d\n", " \n", " d = 4\n", " print(d)\n", "fonksiyon()\n", "print(d)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu durumda kodumuz ne yapıyor ? İlk olarak program başladığı zaman, bir tane **global d** değişkeni oluşuyor ve fonksiyonumuz çağrıldığında **global d** ifadesiyle globaldeki **d** değişkenini kullanmak istediğimizi söylüyoruz. Böyle **d = 4** ifadesiyle bir tane daha **d** değişkeni **oluşturmuyoruz**. Böylelikle **d =4** ifadesiyle **globaldeki değişkeninin değerini** değiştirmiş oluyoruz.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "İşte **Global** ve **Yerel** değişkenler bu şekilde düşünülebilir. Burada gördüğümüz gibi, **Yerel değişkenler** bir fonksiyon bloğunda içinde tanımlanır. Peki bir **if veya while** bloğunda **yerel bir değişken** tanımlanır mı hemen bakalım.\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10\n", "10\n" ] } ], "source": [ "if True:\n", " t = 10\n", " print(t)\n", "\n", "print(t)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10\n", "10\n" ] } ], "source": [ "while True:\n", " deger = 10\n", " print(deger)\n", " break\n", "\n", "print(deger)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Burada gördüğümüz gibi, **if ve while** bloklarında tanımlanan değişkenler **yerel bir değişken yerine global bir değişken** olmaktadır." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bir sonraki konuda **lambda ifadelerini** öğrenmeye çalışacağız." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }