22 Nisan 2013 Pazartesi

Kullanıcıdan Girdi Almak

Kayıtlı Python Dosyasını Çalıştırmak
Kullanıcı ile etkileşime geçmeden önce bir "Python dosyası nasıl oluşturulur?" ve "Komut satırında nasıl çalıştırılır?" bundan bahsetmeliyiz.
Python dosyası oluştururken ilk yapmamız gereken ilk satıra
   #!/usr/bin/env python
yazmaktır. Bu komut yazacağımız kodların Python kodları olduğunu ve Python'un sistemdeki konumunu belirtir. Eğer istenilirse Python'nun yolu direkt olarak da belirtilebilir. Fakat her sistemde aynı olmaması ve kullanıcının tam olarak nerede olduğunu bilmemesinden dolayı "env" betiği kullanılmaktadır. Bu betik sayesinde sistemde Python nerede olursa olsun program onu kendisi bulur. Bu satırı yazdıktan sonra kodun devamını istediğimiz gibi şekillendirebiliriz.
Peki Python dosyasını kaydettik ama nasıl çalıştıracağız?
Bu sorunun cevabı oldukça basittir. Yapmanız gereken "uç birimde" oluşturduğunuz Python dosyasının bulunduğu dizine gitmek ve şu kod parçacığını yazmaktır.
   python dosyaAdi.py

Kullanıcıdan Veri Almak

Bugüne kadar yaptığımız bütün örneklerde her zaman tek taraflı işlemler yaptık.Yani kullanıcı programa hiç müdahalede bulunamadı. Bu yazımızda kullanıcının Python ile nasıl etkileşime geçeceğinden bahsedeceğiz.
Python da kullanıcı ile etkileşime geçebilmek için input() ve raw_input() fonksiyonları kullanılır. Şimdi bu fonksiyonları ve aralarındaki temel farkları inceleyelim.

raw_input() Fonksiyonu
raw_input() fonksiyonu klavye aracılığı ile kullanıcıdan veri alınmasını sağlar. Daha iyi anlayabilmeniz için basit bir örnek ile açıklayalım.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

ad = raw_input("Lütfen adınızı giriniz:")
print ad
Yukarıdaki programda ilk satırdaki kodun ne işe yaradığından ve kaydedilen bir Python dosyasının çalıştırılmasından yazının başında bahsetmiştik. Gelelim şuan bizi ilgilendiren kodlara; Gördüğünüz gibi raw_input() fonksiyonu içinde "Lütfen adınızı giriniz:" açıklaması yapılarak programın kullanıcıdan ne beklediği belirtilmiştir. Bu açıklamayı yapmak zorunda değilsiniz. Ama kullanıcının programın kendisinden ne beklediğini anlayabilmesi için yazmanız daha faydalı olacaktır. Burada raw_input() fonksiyonunun anlaşılabilmesi için basit bir örnek yapılmıştır.Şimdi ise kullanıcının girdiği iki sayıyı topladıktan sonra ekrana yazdıran programı yazmaya çalışalım.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print "İki Sayıyı Toplayan Program"
sayi1 = raw_input("Birinci Sayıyı Giriniz:")
sayi2 = raw_input("İkinci Sayıyı Giriniz:");

toplam = sayi1+sayi2
print toplam
Bu programı çalıştırdıktan sonra 10 ve 15 değerlerini girerseniz şu şekilde bir çıktı ile karşılaşacaksınız.
İki Sayıyı Toplayan Program
Birinci Sayıyı Giriniz:10
İkinci Sayıyı Giriniz:15
1015
Gördüğünüz gibi biz programın iki sayıyı toplamasını isterken;program iki sayıyı yan yana ekleyerek ekrana yazdı. Buradan da anlayacağınız gibi raw_input() kullanıcı tarafından girilen bütün değerleri karakter dizisi olarak alır. Yani Python için girilen iki değer sayı değildir.Bu yüzden de iki karakter dizisini uç uca eklemiş oldu. Programın kod yapısını şu şekilde değiştirelim.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

print "İki Sayıyı Toplayan Program"
sayi1 = raw_input("Birinci Sayıyı Giriniz:")
sayi2 = raw_input("İkinci Sayıyı Giriniz:");

toplam = int(sayi1)+int(sayi2)
print toplam
Aynı değerleri bu program için girdiğinizde aşağıdaki gibi bir sonuçla karşılaşacaksınız.
İki Sayıyı Toplayan Program
Birinci Sayıyı Giriniz:10
İkinci Sayıyı Giriniz:15
25
Peki neden bu şekilde oldu? Eğer bu sorunun cevabı hakkında pek bir fikriniz yoksa;Değişkenler başlıklı yazıyı okumalısınız. Burada programın elinde bulunan karakter dizilerini sayıya çevirmesi için int() fonksiyonundan yararlandık. Şimdi bir de input() fonksiyonunu inceleyelim.
input() Fonksiyonu
Tıpkı raw_input() fonksiyonu gibi input() fonksiyonu da kullanıcıdan klavye aracılığıyla veri alınmasını sağlar. Az önce verdiğimiz örneği şimdi de input() ile yapmaya çalışalım.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
print "İki Sayıyı Toplayan Program"
sayi1 = input("Birinci Sayıyı Giriniz:")
sayi2 = input("İkinci Sayıyı Giriniz:");
 
toplam = sayi1+sayi2
print toplam
Bu programı çalıştırdığınız da şu şekilde bir sonuç alacaksınız.
İki Sayıyı Toplayan Program
Birinci Sayıyı Giriniz:10
İkinci Sayıyı Giriniz:15
25
Gördüğünüz gibi herhangi bir dönüştürme işlemi yapmadan input() fonksiyonu ile aldığımız değerleri matematiksel olarak toplayabildik. Buradan da anlaşılacağı gibi input() fonksiyonu aldığı değeri karakter dizisi olarak tutmaz. Gönderdiğimiz değerleri sayı olarak tuttuğu için dönüştürme işlemi yapmadan sayıları toplayabildik. Gelin şimdi de şu örneği inceleyelim.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
kelime = input("Bir kelime giriniz:")
Bu programı çalıştırdığınız da şu şekilde bir hata ile karşılaşacaksınız.
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
NameError: name 'kelime' is not defined
Az önce de söylediğimiz gibi input() fonksiyonu ile gönderilen değerler karakter dizisi olarak saklanmaz. Eğer kod satırına şunu yazarsanız aynı hata ile karşılaştığınızı göreceksiniz.
>>>kelime
Bir de şu şekilde deneyelim;
Bir kelime giriniz:"pythondersleri.com"
pythondersleri.com
Bu şekilde denediğimiz zaman program herhangi bir hata vermeyecektir. Çünkü biz ona tanıdığı bir tür olan karakter dizisini gönderdik. Buradan anlayacağınız gibi raw_input() fonksiyonu kullanıcıdan aldığı değeri karakter dizisi olarak saklarken input() fonksiyonu kullanıcıdan komut bekler. input() fonksiyonun kullanıcıdan komut beklemesi bazı güvenlik sorunlarına sebep olmaktadır.
Güvenlik Sorunları
Yukarı da söylediğimiz gibi input() fonksiyonu kullanıcıdan komut bekler.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

sayi = input("Bir kelime giriniz:")
print sayi
Bir sayı giriniz:3*6
18
Bu örnekte input() komutunun komut beklediğini çok net bir şekilde görebiliyorsunuz. Kullanıcının "3*6" olarak girdiği ifadeyi komut olarak gördü ve "*" operatörünü işleme soktu. input() fonksiyonunun bu özelliği yanında çok ciddi tehlikeler de getirmektedir. Kullanıcı programın istediği "sayi" yerine işletim sistemine ait komutları girerek programa istediği herhangi bir şeyi(dosya silmek,dosya içeriğini görmek vb.) yaptırabilir.
input() fonksiyonun güvenlik sorunlarından dolayı programcılar genellikle raw_input() fonksiyonunu kullanmayı tercih ederler. Zaten bu fonksiyon veri alış verişi ile ilgili her türlü isteğimizi karşılayacak özelliktedir.

Türkçe Karakter Kullanımı
Yukarıda yazdığımız programların hepsinde şu satırı gördünüz.
# -*- coding: utf-8 -*- =>
Python 2.x sürümü Türkçe karakterleri desteklememektedir. Eğer bu kodu yazmadan Türkçe karakter kullanırsanız program hata verecektir. Bu kodu yazarak kullandığımız karakter tipini Python'a tanıtmış oluruz.

25 yorum :

  1. #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    print "İki Sayıyı Toplayan Program"
    sayi1 = raw_input("Birinci Sayıyı Giriniz:")
    sayi2 = raw_input("İkinci Sayıyı Giriniz:");

    toplam = sayi1+sayi2
    print toplam
    Bu programı çalıştırdıktan sonra 10 ve 15 değerlerini girerseniz şu şekilde bir çıktı ile karşılaşacaksınız.
    ?
    1
    2
    3
    4
    İki Sayıyı Toplayan Program
    Birinci Sayıyı Giriniz:10
    İkinci Sayıyı Giriniz:15
    1015


    sunu nasil calistirayim?? ve 10 15 i nereye yazayim?? lutfen yardimci olun

    YanıtlayınSil
    Yanıtlar
    1. sayi1=int
      sayi2=int
      toplam = (sayi1+sayi2)

      Sil
    2. sayı1=int
      sayı2=int
      toplam=int bukadar bide raw input ile alma inputla al

      Sil
    3. Kardeş sen raw_input kullanırsan string dediğimiz cümle oluşturmuş olursun. Yapman gereken input komutunu kullanmak. Şöyle ki ;

      print "Toplama Islemi"
      sayi1 = input("Bir sayi girin; ")
      sayi2 = input("Bir sayi girin; ")

      sonuc = sayi1+sayi2
      print sonuc

      İşlem Tamam :D

      İnstagram @musapbayar

      Sil
    4. #!/usr/bin/env python
      # -*- coding: utf-8 -*-

      print ("İki Sayıyı Toplayan Program")
      sayi1 = raw_input("Birinci Sayıyı Giriniz:")
      sayi2 = raw_input("İkinci Sayıyı Giriniz:");

      sayi1 = int(sayi1)
      sayi2 = int(sayi2)

      toplam = sayi1+sayi2
      print (toplam)

      Sil
    5. cmd de sonuca bakican, cmd calistirmak icin mesela ekrandaysa cd desktop <enter<(deneme.py)enter

      Sil
  2. aldığınız değerleri int() fonksiyonunu kullanarak integer tipine çevirirseniz probleminiz ortadan kalkacaktır.

    YanıtlayınSil
  3. program ne utf8 ne de 1254 ne de 857yi tanıyor. ingilizce mac kullanıyorum. klavyem türkçe. ama türkçe karakterlerde unsupported characters in input hatası alıyorum.

    YanıtlayınSil
    Yanıtlar
    1. Ben de bir türlü tanıtamadım ama ben türkçe windows 8.1 kullanıyorum.
      Kod bu değil mi ?
      # -*- coding: utf-8 -*-
      Anlamadım ki nerede hata yapıyorum :)

      Sil
    2. sadece başına utf-8 yazmakla kalmıyor, metin dosyanızın da utf-8 olması gerekiyor. dosyanızı notepad ile açın, save as seçin, orda ANSI görünüyorsa, onu UTF-8 olarak değiştirin.

      Sil
  4. Dersler çok yaralı ve anlaşılarbilir basit formatta anlatmışsınız emeğiniz için teşekkürler bu arada anlattığınız IDE değilde netbeans kullanıyorum ve 2.7 sürümü ile bayağı rahat çalışmakta bir tek işim kaldı o da elektronik cihazlar ile iletişim kurmak için linux serial haberleşmesi umarım vardır hemen arıyım tekrar teşekkürler ...

    YanıtlayınSil
  5. print "İki Sayıyı Toplayan Program" bu komutu yazıp enter'a bastıgımda komutu dırek uyguluyor ve ben dıger komutları yazamıyorum. C de böyle degıldı run'layana kadar calıstırmazdı komutları.Burda bır alt satıra gecıp baska komutları yazamadan enter'a bastıgım anda ılk yazdıgım komutu uyguluyor. bunun ıcın ne yapmam lazım?

    YanıtlayınSil
  6. Muhtemelen bahsettiğiniz olayı komut satırı üzerinde yazarken yaşıyorsunuzdur. Kodlarınızın tamamını bir dosyaya yazdıktan sonra (örneğin; example.py) komut satırında dosyanızın olduğu dizine gidip python dosya_adi.py komutunu vererek yazdığınız kodun satır satır yorumlanmasını sağlayabilirsiniz. Bahsettiğiniz run olayı ile aynı mantıkta bu işlem.

    YanıtlayınSil
  7. hocam rawinp. ile alacağımız girdi sayısını bilmediğimiz zaman nasıl bir yol izleyebilriz yani girdi sayısı 3 veya 5 de olabilir

    YanıtlayınSil
  8. bu kodları .exe biçiminde çalıstırdıgımda python komut penceresi sonucu vermesı gerekırken komut penceresi direkt olarak kapanıyor.bu problemi nasıl cozebılırım?

    YanıtlayınSil
  9. ben programları çalıştıramıyorum hep f5 e basmak zorundayım nasıl çalıştırabilirim daha kolay

    YanıtlayınSil
  10. Ben şahsen python yüklediğim dizine "projects" adında bir klasör açtım bunun içine dosyalarımı kaydediyorum cmd ile o dize gidiyorum örneğin:
    D:\Pyhton 2.7\Projects\merhaba.py

    bu yolu calistirdiğimda direk script calisiyor. bu scriptleri üst seviyeli dillere entegre edebilir yada direk dosyaAdi.py şeklinde msdos/terminal ekranlarından direk çalıştırabilirsiniz.

    Bende yeni başladım derslere, teşekkürler çok güzel anlatılmış..

    YanıtlayınSil
  11. Bende sayılarda hata oldu, rakamlarda yani cümlelerde olmadı ?

    YanıtlayınSil
  12. türkçe karakterleri çalıştıramadım kodu denedim farklı editorler kullandım internetteki her şeyi de denedim.

    YanıtlayınSil
  13. Dikdörtgenin alanının hesaplanması işlemini gerçekleştirecek fonksiyon hazırlanacaktır. Fonksiyon ismi dortgen_alan_hesapla_v1 olacak ve kullanıcıdan iki adet tamsayı değerini girdi alarak girilen değerlere göre alan hesabını yaparak sonucu kullanıcıya gösterecektir.

    def dortgen_alan_hesapla_v1(Uzunkenar,Kısakenar):
    Uzunkenar= int(input("uzunkenar= "))
    Kısakenar= int(input("kısakenar= "))
    dortgen_alan_hesapla_v1(int(Uzunkenar*Kısakenar))
    print(dortgen_alan_hesapla_v1)
    Hocam sanırım yanlış yapmışım bunun doğru cevabı nedir ?

    YanıtlayınSil
    Yanıtlar
    1. Uzunkenar = int(input("uzunkenar:"))
      Kisakenar = int(input("kısakenar:"))
      dortgen_alan_hesapla = Uzunkenar*Kisakenar
      print(dortgen_alan_hesapla)

      Sil
  14. Pyqt5 de string değer almak için qlineedit i kullanıyoruz int değer almak için ne kullanmalıyız? Yardımcı olorsanız sevinirim.

    YanıtlayınSil
  15. raw_input P3 de input olarak geçtiği için hata veriyor o yazıyı düzeltelim.

    YanıtlayınSil
  16. #!/usr/bin/env python bilgisi sanırım linux için;

    windows için ne yazmalıyız.

    Teşekkürler.

    YanıtlayınSil