Acaba nedir, nedir?
Çarşamba, 01 Ara 2010
Geçen gün bir arkadaşım, belirli bir ay içindeki Pazar günlerini Python yardımıyla nasıl bulabileceğimizi sordu e.posta aracılığıyla. Ben de şu betiği yazıp gönderdim ona:
# -*- coding: utf-8 -*- import datetime, calendar #0 = Pazartesi #1 = Salı #2 = Çarşamba #3 = Perşembe #4 = Cuma #5 = Cumartesi #6 = Pazar def gun_bul(yil, ay, gun): for i in range(1, calendar.monthrange(yil, ay)[1]): if datetime.date(yil, ay, i).weekday() == gun: print datetime.date(yil, ay, i) #2010 yılı Aralık ayı içindeki Pazar günleri gun_bul(2010, 12, 6)
Ancak daha sonra tekrar bakınca bu betikte bir hata yaptığımı farkettim. Bulun bakalım buradaki hata nedir…
Kodlar Python 2.x’te gayet güzel çalışıyor. Python 3.x’te 16. satırda “print” kodundan sonra gelen karakter dizilerini parantez içerisine almak gerekiyor. Başka hata(?) göremiyorum fakat incelemeye devam ediyorum…
Dediğim gibi, çok basit bir hata var kodlarda. İncelemeye devam…
calendar.monthrange()’in döndürdüğü değer ayın gün sayısı. range() işlevi ayın son gününü döndürmüyor, bu yüzden de for döngüsü ayın son gününü dikkate almıyor, mu?
İşte bu kadar basit bir hata.
range() fonksiyonu içinde, monthrange()’in verdiği değerin bir fazlasını kullanmamız gerekiyor. Bu haliyle, bir ayın son gününe denk gelen Pazar günleri liste dışı kalır.
yani tam bulmuştum ,cevabı görünce birazcık genişleteyim dedim ,
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import datetime, calendar
sozluk={“Pazartesi”:0,
“Salı”:1,
“Çarşamba”:2,
“Perşembe”:3,
“Cuma”:4,
“Cumartesi”:5 ,
“Pazar”:6}
def gun_bul(yil, ay, gun):
for i in range(1, calendar.monthrange(yil, ay)[1]):
if datetime.date(yil, ay, i).weekday() == gun:
print datetime.date(yil, ay, i+1),
for x in sozluk:
if sozluk[x] == gun:
print x +”\n”,
def sor():
y= raw_input(“Yıl\t:”)
a= raw_input(“Ay\t:”)
g= raw_input(“Gün\t:”)
try: isinstance(int(y), int) , isinstance(int(a), int)
except ValueError:
print “Ay ve yıl rakamsal olarak belirtilmeli \n’%s’ veya ‘%s’ kullanımı uygun değil” %(a,y)
return
try:isinstance( int(g), int)
except ValueError:pass
else:
print “Gün belirteçi için ‘%s’ kullanımı uygun değil” %(g)
return
try:g = sozluk[g]
except KeyError:
print “Gün belirteçi için \n’”,
for x in sozluk :print x,
print “‘\nöğelerden hiçbiri eşleşmedi..”
return
gun_bul( int(y),int(a),g )
sor()
Düzgün oldu galiba olmamışta olabilir ama olsun paylaşayım
Güzel beyin jimnastiği olmuş, ben de şöyle düşündüm:
import calendar
c = calendar.Calendar()
def gun_bul(yil, ay, gun_no):
for i in c.itermonthdates(yil, ay):
if i.weekday() == gun_no and i.month == ay:
print i
gun_bul(2010, 12, calendar.SUNDAY)