Python’da ekrana yazı yazdırmak için print
fonksiyonu kullanılır.
print fonksiyonu nedir?
Peki print fonksiyonu aslında nedir? Python’da her şey bir class olduğuna göre, print fonksiyonu da bir class mıdır? Eğer öyleyse herhangi bir değişkene atanabilir olmalı:
>> b = print
Ancak bu ifade Python versiyonuna göre farklı sonuçlar verir. Python 2.x’de, print bir fonksiyon değil de bir ifadedir. Python 3.x’te ise bir fonksiyondur (2.6+ için bir fonksiyon olarak from __future__ import print_function
ile tanımlanabilir).
print fonksiyonu ne işe yarar?
Öncelikle Python’da print fonksiyonunun ne işe yaradığına bakalım. Her programlama dilinde print fonksiyonu için birden fazla rol verilir. Python 3.0 ve sonrasında tamamen yerleşik bir fonksiyon olan print için C gibi dillere göre daha fazla görevi bulunur.
Python’da, print() yerleşik fonksiyonu için 2 temel işlev sayabiliriz:
1) Esnek bir debug aracı olabilir. Kodumuzun belirli yerlerinde test için kullanılabilir. Böylece belirli yerlerde ekrana yazı yazdırabiliriz:
def myfunc(var):
varsquare = var * var
print("fonksiyon adımları:", var, varsquare)
return varsquare
result = myfunc(5):
print("input=", 5, "output=", result)
###
> fonksiyon adımları: 5 25
> input= 5 output= 25
2) Geliştirme sürecinde nesnelerimizi inceleme aracı olabilir:
import numpy as np
print(np)
# output:
> <module 'numpy' from 'C:\\python\\conda3\\envs\\pyfin\\lib\\site-
> packages\\numpy\\__init__.py'>
var2 = np.arange(10).reshape(2, 5)
print(var2)
# Çıktı:
> [[0 1 2 3 4]
> [5 6 7 8 9]]
Bunda başka görevler de verilebilir.
Print fonksiyonu kullanımı
print fonksiyonunun kullanımı aşağıdaki gibidir:
print
(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)
Burada isimlendirilmemiş argümanlar stringe dönüştürülür ve çıktıya yazılır. Argüman listesinde isimlendirilmemiş argümanların (object) * ile verildiğine dikkat edin. Dolayısıyla birden fazla isimsiz argüman aşağıdaki gibi verilebilir:
print("a", "b", c, ..)
Verilen argümanlar sep ile ayrılır ve çıktı end ile bitirilir. sep ve end‘in string ya da None olması gerekir; None verildiğinde varsayılan değerleri kullanılır. sep ve end parametrelerinin ne işe yaradığına az sonra tekrar bakacağız.
Birden fazla argüman ile print kullanımı
Bunu yapmanın aslında çokca yolu var;
Bir demet ile print kullanımı:
print("%s için toplam skor: %s" % (isim, skor))
sözlük öğelerini yazdırma:
print("%(n)n için toplam skor: %(s)s" % {'n': isim, 's': skor})
Yeni-stil string formatı ile:
print("{} için toplam skor: {}".format(isim, skor))
Yeni-stil string formatı ve sayıları ile
print("{0} için toplam skor: {1}".format(isim, skor))
Yeni-stil string formatı ve isimler ile
print("{n} için toplam skor: {s}".format(n=isim, s=skor))
Birden fazla string’i birleştirerek yazdırma:
print(str(isim) + " için toplam skor :" + str(skor))
Print sep parametresi
Python’da print sep=''
parametresi birden fazla argümanı birleştrimek için verilen karakteri belirtir. Örneğin iki argümanı ekrana yazdırırken iki nokta üst üste ile ayırmak istersek aşağıdakini yapabiliriz:
print("Araba lastiği", "100$", sep=':')
##Çıktı
Araba lastiği:100$
sep’in varsayılan değeri ise bir karakter boşluktur (sep=' '
). Fonksiyon çağrısında sep=''
belirtirsek isimli argüman sep
‘i boş bir string olarak tanımlarız. Bu şekilde yapılan bir çağrı Araba lastiği100$
ifadesinde iki argüman arasında boşluk olmamasını sağlar.
Daha fazla örnek için aşağıdaki kod bloğuna bakalım:
>>> print('foo', 'bar')
foo bar
>>> print('foo', 'bar', sep='')
foobar
>>> print('foo', 'bar', sep=' -> ')
foo -> bar
Tüm bu örneklerde output farklılığı sadece sep
parametrersinin değişmesi ile elde edildi.
Tab karakterini ayırıcı olarak kullanmak isteseydik \t
literal dizesini kullanırdık.
>>> print('eggs', 'ham')
eggs ham
>>> print('eggs', 'ham', sep='\t')
eggs ham
Peki sep parametresini kalıcı olarak değiştirebilir miyiz?
Evet, ama başka bir modül aracılığı ile:
from functools import partial
println = partial(print, sep='\n')
functools
aracılığı ile istediğimiz sep parametresini global olarak tanımlayabiliriz. Yukarıdaki ifadede println
adında bir değişken/fonksiyon tanımlıyoruz. Yeni satır olarak yazdırmak istediğimiz tüm metinleri artık println
ile yazdırabiliriz.
end= parametresi nedir
sep parametresinin ayraç için kullanıldığını öğrendik. Peki end parametresi ne işe yarıyor? Normalde python her print ifadesinin sonuna yeni bir satır ekler. Bunu “\n” karakteri ekleyerek gerçekleştirir. Ancak bu davranışı end parametresi ile değiştirebiliriz:
>>> print('hi')
hi
>>> print('hi', end='')
hi>>> print('hi', end='bye')
hibye>>>
Print ile yan yana yazdırma
print her çağrılışında varsayılan olarak yazdırdığı şeyin sonuna yeni bir satır ekliyordu. Bu davranışı değişitirdiğimizde yukarıdaki örnekte de gördüğünüz gibi yeni satırı kaldırabiliyoruz. Dolayısıyla, print ile yan yana yazdırmak istiyorsak end parametresini değiştirmemiz yeterli:
print('şeyler1', end=' ')
print('şeyler2', end=' ')
#çıktı
şeyler1 şeyler2
Outputta gördüğümüz gibi argümanlarımız artık aynı satıra yazdırıldı. end=”” parametresine boşluk yerine virgül yazmış olsaydık şeyler1, şeyler2,
çıktısını alacaktık.
print() ile yeni bir satır veya boşluk olmadan yazdırma
Aşağıdaki for döngüsü her satıra bir nokta ekleyecek şekilde çalışır:
>>> for i in range(10):
print('.')
.
.
.
.
.
.
.
.
.
.
Aşağıdaki kod parçası ise her öğeden sonra bir boşluk ekler:
>>> print('.', '.', '.', '.', '.', '.', '.', '.', '.', '.')
. . . . . . . . . .
Bundan nasıl kaçınabiliriz?
Python 3
Doğru tahmin – sep ve end parametreleri ile. Python 3’te, print
fonksiyonu ile sep=
ve end=
parametrelerini kullanabiliriz:
Dizenin sonundaki yeni satırı kaldırıp yan yana yazdırmak için:
print('.', end='')
Yazdırmak istediğiniz tüm öğelerin arasına boşluk eklememek için:
print('a', 'b', 'c', sep='')
Her iki parametre için de herhangi bir dize kullanılabilir ve her iki parametre aynı anda da kullanılabilir.
Arabelleğe almada sorun yaşıyorsanız, flush=True
ile çıktıyı temizleyebilirsiniz:
print('.', end='', flush=True)
Python 2.6 ve 2.7
Python 2.6’da __future__
modülunu kullanarak Python 3’teki print fonksiyonunu içe aktarabilirsiniz:
from __future__ import print_function
Böylece yukarıdaki Python 3 çözümünü kullanabilirsiniz.
Ancak, Python 3’ten içe aktarılan print() sürümünde flush=True anahtar kelimesinin kullanılamadığını unutmayın; Önceki sürümlerde yapılan çağrıları el ile temizlemeniz gerekir. ,
stdout.write()
Veya sys.stdout.write()
kullanabiliriz
import sys
sys.stdout.write('.')
print ile sayıları yan yana yazdırma
Az önceki örneğe benzer bir şey yapalım. Yine bir for döngümüz olsun. Ancak bu döngüde her sayıyı ekrana yan yana yazdırmayı deneyelim. Aşağıdaki kod tüm sayıları alt alta yazdıracaktır.
>>> for i in range(10):
print(i)
1
2
3
4
5
.
.
.
.
Yukarıdaki kod tüm çıktıyı yeni bir satırda verecek. Sayıları yan yana yazdırmak için ise Python 3’te, print
fonksiyonu ile sep=
ve end=
parametrelerini kullanabiliriz:
>>> for i in range(10):
print(i, end='')
Yazdırmak istediğimiz sayıların arasındaki boşluğu kaldırmak için
>>> for i in range(10):
print(i, sep='')
sep ve end arasındaki fark
Buraya kadar takip ettiyseniz, artık sep ve end parametreleri arasındaki farkı biliyorsunuz;
Python print fonksiyonu sep
ile argümanları ayırır. end
‘i ise son argümandan sonra ekler. Örneğin:
>>> print('boa', 'cat', 'dog', sep=', ', end='!!!\n')
boa, cat, dog!!!
Tabiki sep
ve end
‘in sadece Python 3’teki print fonksiyonu için geçerli olduğunu unutmayın. Python 2 için, aşağıdaki kullanım eş değerdir:
>>> print ', '.join(['boa', 'cat', 'dog']) + '!!!'
boa, cat, dog!!!
Ya da isterseniz future
ile de istenen sonucu elde edebilirsiniz:
>>> from __future__ import print_function
>>> print('boa', 'cat', 'dog', sep=', ', end='!!!\n')
boa, cat, dog!!!
file parametresi
Python 3 ile gelen file
parametresi dosyaya bir şey yazdırmak istediğimizde kullanılır.
print
‘e bir file
argümanı verirsek, bu argümanın değeri bir dosya akışı olacaktır. Dosya akışını open
fonksiyonu ile oluştururuz:
print("Hello!", file=open("output.txt", "a"))
print("I have a question.", file=open("output.txt", "a"))
Ancak bir dosyayı sürekli açmak performans için olumlu sonuçlar vermeyecektir. Bu yüzden dosyayı bir kere açıp sonrasında print fonksiyonunu kullanıyoruz. Tabi dosyayı en sonda kapatmayı unutmamalıyız.
f = open("output.txt", "a")
print("Hello!", file=f)
print("I have a question.", file=f)
f.close()
Bu ifadenin sentetik eşleniği ise with
‘i kullanır. Böylece dosyanız with
bloğunun sonunda otomatik olarak kapatılır.
with open("output.txt", "a") as f:
print("Hello!", file=f)
print("I have a question.", file=f)
flush parametresi
Şimdi de flush parametresinin ne olduğuna bakalım.
Normalde dosyaya veya terminale bir şey yazdırılma işlemi sürekli olur. Ancak bu işlevi gecikmeli olarak veya istediğimiz zaman için de gerçekleştirebiliriz. flush bu işlem için kullanılır ve çıktının istediğimiz zaman gideceği yere ulaşmasını sağlar. True veya False değerlerini alır.
Örneğin aşağıdaki kod 5 saniye bekledikten ve tüm kod çalıştıktan sonra ekrana yazdırır:
from __future__ import print_function
import sys
from time import sleep
fp = sys.stdout
print('Merhaba')
# fp.flush()
sleep(5)
Eğer fp.flush() ifadesini yorumdan çıkarırsak; program metni yazdırır, ardından 5 saniye bekler ve biter.
Varsayılan olarak bu davranışı değiştirmek istiyorsak iki yöntem kullanabiliriz.
1. Pythonu unbuffered modda kullanabiliriz. Bunun için ya:
python -u
ile çalışırız. Ya da ortam değişkeni tanımlarız:
PYTHONUNBUFFERED=TRUE
2. functools
kullanabiliriz:
import functools
print = functools.partial(print, flush=True)