Ders 7
1.17 - Python Programlarına Veri Girişi
1.17.1 - Python Programlarına Veri Giriş Yöntemleri
Bunlardan, literal girişlerini biliyoruz. Dosya girişlerini ise burada incelemeyeceğiz. Bunun nedeni, dosyalama işlerinin çok detaylı olması, işletim sistemleri arasında farklılıklar olması, gibi sorunlar olduğu için, dosyalama işlerinin özel ihtisas isteyen bir işlem olmasıdır. Bu konuda sürekli dosyalarla çalışan Python programcıları emek sarfetmektedirler. Bizler, çalışmalarımızda, dosyalama sistemlerini kullanmayacağız. Bu konuda daha fazla bilgi almak isteyenler standart Python dokümantasyonundan yararlanabilirler. Öntanımlı input fonksiyonundan yararlanmak ise son derece kolaydır. Bu fonksiyonun kullanımı,
input(Açıklama : str = ''); → str;
şeklindedir.
Yukarıdaki tanım, öntanımlı input() fonksiyonun öntanımı boş bir string veri tipinde bir mesaj yayınlayacağını, kullanıcı bu mesaja karşılık konsoldan bir değer girdiğinde bu değeri sözel bir veri olarak geri döndüreceğini açıklamaktadır. Tanımdaki açıklama mesajının ön tanımı boş bir sözel değerdir. Bu mesaj değerini klavyeden girerek istediğimiz gibi düzenleyebiliriz.
Bir tanıtıcı değeri olarak input() fonksiyonu verilirse, girilen değer tanıtıcıya sözel değer olarak atanır. Standart giriş/çıkış, sys modülü import edilip değiştirilmedikçe, konsol giriş/çıkışıdır. Böylece, input() fonksiyonu, programdaki bir tanıtıcıya konsoldan bir sözel değer atanması olanağını sağlar. Aşağıdaki programla, konsol girişininin denenmesi yapılabilir:
a = input('Lütfen Bir Değer Giriniz : '); print(a);
Bu program çalıştığında, konsoldan girilen değer, konsola yazdırılacaktır.
Programa input () fonksiyonun döndürdüğü değerin veri tipi, sözel (string) veri tipidir. Bu nedenle, eğer input() fonksiyonundan bir değer girişi yaparsak, bu değerle bir matematik işlem yapmak için bu değerin veri tipini, sözelden sayısala dönüştürmek zorundayız.
Sözel bir değerin, sayısal bir ver tipine dönüştürülmesi için iki olasılık bulunmaktadır. Bu değer ya bir tamsayı(int) ya da bir ondalıklı sayı (float)veri tipine dönüştürülecektir. Bu konuda aşağıdaki seksiyonda bilgi verilmiştir.
1.17.2 - Değerlerin Başka Veri Tiplerine Dönüştürülmesi
Sayısal veri tiplerinin sözele dönüştürülmesi için, str(SayısalDeğer) yazılması yeterlidir.
Sözel bir değerin, bir tamsayı veri tipine dönüştürülebilmesi için, öntanımlı int() fonksiyonundan yararlanılır. Bu fonksiyonun çağrılması aşağıda görülmektedir:
int(değer: str, sayıtemeli: tamsayı=10) → int
Bu tanım, int() fonksiyonun biri zorunlu, diğeri isteğe bağlı, iki tane argümanı olduğunu, ilk argümanın bir sözel değer olduğunu, ikinci argümanın ise sayı temeli olduğunu ve bunun öntanımlı olarak 10 temeline ayarlanmış olduğunu, dolayısı ile eğer sayı temeli değiştirilmeyecekse bu argümanın kullanımının gereksiz olacağını ve fonksiyonun, çağıran program öğesine bir tamsayı (int) tipinde veri döndüreceğini belirtmektedir. Bu fonksiyona girilecek argümanın sözel (str) veri tipinde fakat değerinin bir tamsayı olması gerekmektedir. Aksi durumda, tamsayı olmayan bir değer, tamsayıya çevrilemeyeceğinden bir kuraldışılık (exception) oluşacaktır. Bu fonksiyonun bir uygulama örneği,
a = int('325');
şeklindedir ve işlem sonunda, a tanımlayıcısının işaret ettiği bellek alanına tamsayı veri tipinde 325 değeri yerleştirilmiş olur.
Eğer, int() fonksiyonu değeri bir ondalıklı sayı olan '2.4' gibi ondalıklı sayı değeri olan bir sözel veri ile çağrılırsa veya 'qw' gibi tamsayı karşılığı olmayan bir sözel değer ile çağrılırsa, ValueError hatası oluşacaktır.
Eğer, int() fonksiyonu bir ondalıklı sayı (float) veri tipinde değer ile çağrılırsa, bu verinin bir üst basamak tamsayıya dönüştürülmüş değerini (ceil) (tavan) geri döndürür.
a = int("34.56");
gibi, geriye girilen değerin bir üst tamsayı değerine yükseltilmiş bir tamsayı sonucu döndürür. Bu örnekte, a tanımlayıcısının işaret ettiği bellek alanına tamsayı veri tipinde 35 değeri yerleştirilmiş olur.
Konsoldan input() girişi ile sözel tipte ondaklıklı sayı değeri girildiğinde, bu sözel veriyi, ondalıklı sayısal veri (float) tipine dönüştürmek için yine öntanımlı bir fonksiyon olan float() fonksiyonu kullanılabilir. Bu fonksiyonun kullanımı,
float(Değer : str); → float
veya
float(Değer : int) → float
şeklindedir. Bu fonksiyon tek argümanlıdır, çünkü, sadece on tabanlı sayıların ondalık değerleri hesaplanabilmektedir. İkili (binary), sekizli (oktal) ve onaltılı (hex) sayıların ondalık değerleri hesaplanamamaktadır.
Eğer float() fonksiyonu, bir tamsayı veri tipindeki değer ile kullanılırsa bu değeri ondalıklı sayı tipine dönüştürür.
Dikkat: Konsol girişi sağlayan input() fonksiyonu, mesajsız kullanılmamalıdır. Çünkü, derleyici bir konsol girdisi bekleyerek programı durdurur. Programın neye durduğu hakkında, hiçbir uyarı mesajı olmadığı için, bir değer girilip programı devam ettirmek akla gelmez. Bir konsol girdisi olmadığı için program sonsuza kadar durur ve kullanıcı ne olup bittiğini arayarak vakit kaybeder.
Bir konsol girdisini, anında sayısal değere dönüştürerek, bit anıtıcının işaret ettiğ bir bellek alanına yerleştirmek olanağı bulunabilir. Aşağıdaki program adımı buna bir örnektir.
a = float(input("Lütfen bir ondalıklı sayı giriniz : "));
Bu işlem sonucunda, a tanıtıcısının işaret ettiği bellek alanına, konsoldan girilen ondalıklı sayı değeri, ondalıklı sayı (float) veri tipinde olarak yerleştirilecektir.
1.17.3 - Python Program Sonuçlarının Çıkışı
Standart Python program çıktı ortamı, interaktif Python konsoludur. Program sonuçları standart çıkış ortamına öntanımlı print() fonksiyonu kullanılarak yazdırılır.
Öntanımlı print() fonksiyonunun kullanımı çok kolaydır. Bu fonksiyonun kullanımı, fonksiyonun docstringi içinde belirtilmiş olabilir. Kullanıcı tanımlı fonksiyonlarda bu pek uygulanmıyorsa da, modüler yapı içindeki fonksiyonlarda mutlaka bir docstring yerleştirilmektedir. Öntanımlı print() fonksiyonunun docstring bilgilerine Python komut satırında help(print) yazılarak ulaşılır. Bu işlem sonucunda,
>>>help (print)![]()
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
bilgileri konsola yazılıyor.
Bu bilgileri değerlendirelim.
Herşeyden önce, file=sys.stdout, flush=False kısmı sadece bir dosyaya bilgi yazılır veya bir dosyadan bilgi okunurken kullanılacak argümanlardır. Dosyalama ile ilgili şu anda bir çalışma yapmadığımızdan, print() fonksiyonunun kullanım şekli,
print(değer,...,sep = ' ', end ='\n');
şeklindedir.Dosyaya yazım akımı düşünülmezse, varsayılan yazma akımı, sys.stdout da belirlenmiş olduğu şekliyle, konsol çıktısı olarak gerçekleşecektir. Buna konsol görüntüsü de denilebilir.
print() fonksiyonun görüntülediği değerler arasına varsayılan olarak virgül (comma) konulur. Bu ayraç varsayılan olarak sep = ' 'olarak tarif edildiği şekli ile görüntülenen veriler arasına tek bir boşluk karakteri yerleştirir. Bu ayraç, kullanıcılar tarafından, sep = ' | ' veya sep = '@' gibi tanımlanabilir. Eğer ayraç olarak varsayılan boşluk karakterini kanudersek, sep değişleninin kullanılamsına gerek olmayacaktır.
Her print akımı tamamlandığında, kürsör bir alt satıra geçer. Eğer varsayılan olarak bu çalışma şekli kabul edilirse, print() fonksiyonunda end değerinin yeniden tanımlanmasına gerek olmaz. Aksi halde end = '' print() akımının sonunda, kürsörün haraketinin yeniden tanımlanması gerekir.
Varsayılanlar kabul edilirse, print() fonksiyonu,
print(değer , ...);
şeklinde uygulanır. Burada değer, tanımlanmış bir veridir ve bir print akımında istenildiği kadar değer bastırılabilir.
Bastırırılacak tanımlanmış değerler, bir literal olabilecekleri gibi, program adımları içinde tanımlı, tanıtıcılar da olabilir. Genellikle tanımlı tanıcılar ile çağrılacak değerlerin açıklanması için bir mesaj sözel verisi, literal olarak print () fonksiyonunun argümanı olarak kullanılır. Bu şekilde,
print(['Bilgi',] değer {[,'Bilgi',] değer}*);
şeklinde, varsayılan olarak değerler arasında boşluk olan ve print akımının tamamlanması ile kürsörün bir alt satıra geçtiği uygulamalar yapılır. Gerek ayraç, gerekse yazma akımı sonunda kürörün haraketi varsayılandan farklı olması istenirse, bu iki argümanın da her ikisi veya sadece birisi ayrıca tanımlanır.
Buradan,
print(a);
print(a , b);
print('a = ' , a);
print(" a = ' , a , '\nb = 'b);
şeklinde kullanım olanakları bulunmaktadır. Docstring açıklamalarından, öntanımlı print() fonksiyonu ile bir dosyaya yazmak olanağı olduğu da görülmektedir.
Yukarıda görünen kullanım örnekleri her türlü kullanım için yeterli sayılabilir. Mesajlarda kontrol karakterleri kullanılarak çok rahat okunacak şekilde biçimlendirilmiş çıktılar görüntülenebilir. Ama esas sürpriz, bu basit görünüşlü öntanımlı print() fonksiyonunun kendisinden beklenmedik şekilde, inanılmayacak kadar yetenekli, hem klasik C printf() fonksiyonu gibi hem de daha modern ve sadece kendine özgü bir çıktı biçimlendirme yeteneği olmasıdır. Bunların hepsini birazan göreceğiz.
Bu nokatada en büyük olay, artık Python programlama dilinde program yapacak kadar bilgiyi sağlayabilmiş olmamız ve bu yeteneğimizle konsol savaşlarından kurtulup gerçek Python programları yapabileceğimizdir. İlk olarak, bir konsol girdisini, bir tanıtıcının işaret ettiği bellek alanına bir tamsayı verisi şeklinde yerleştirelim ve bu veriyi çağırarak hem değer, hem de veri tipi olarak isteğimize ulaşıp ulaşamadığımızı sınayalım. Örnek program aşağıda görülmektedir.
veri = int(input('Lütfen bir tamsayı giriniz :')); print('Veri = ' , veri , '\t Veri Tipi : , type(veri));
Bu programın sonucu :
Lütfen bir tamsayı giriniz : 17
veri = 17 Veri Tipi : <class 'int'>
Program sonucundan görüldüğü gibi, konsaoldan girilmiş olan bir sözel değer, anında ondalıklı sayıya dönüştürğlerek, veri tanıtıcısının erişim sağladığı bir bellek alanına yüklenmiş. Bu bellek alanındaki değere, veri tanıtıcısı ile erişildiğinde, değerininin girilen değer ve veri tipinin amaçlanan veri tipi olduğu görülüyor.
Bu şekilde, ilk tam donanımlı Python programımızı gerçekleştirmiş durumdayız. Arkası hızla gelecek, çabalarımızın karşılığı almaya başlıyoruz. Bu son derece sevindirici ...