koddla

Yazılımcıları bilgi ile güçlendirir.

Python’da ekrana yazdırma – print() fonksiyonu

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(*objectssep=’ ‘end=’\n’file=sys.stdoutflush=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)

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top