4 Temmuz 2011 Pazartesi

Listeler arası işlem

Yoğurt ,su,tuz,yağ,sarmısak ve hıyar denildimi insanın aklına cacık gelir. Ama maalesef her insan iyi cacık yapamaz. Sizde cacık yapan fonksiyon listelerini birleştirip kendi cacık tanımlarınızı yapabilirsiniz. Ne kadar su , nekadar yoğurt vs tek tek tanımlamanıza  gerek yok. Önemli olan husus cacık yapılacak listelerin iterasyonların sonuçları en kısa listenin boyu kadar olacaktır. Hıyar biterse cacıkda olmaz.....

n = [6,7,8,8]
m = [4,3,5,9]
for i in itertools.imap((lambda x, y: x*y), m, n):
    print i

tek satırda dosya çıktısı almak

exec "for i in ((open('dene.txt','r')).readlines()): print i.rstrip()"

EXEC yazılan string gurubu içerisindeki tüm komut ve kuralları uygular(çalıştırır). Daha önceden tanımsız olanlar için geçerli değildir. Tembel adamın işleri gibi gözüksede aslında olması gereken aşağıda yazılı olan şekildir. Bu sizin daha sonra düzeltme yada değişiklik yapmanızı hızlandırır.

a=open('dene.txt','r')
b=a.readlines()
for i in b:
    print i.rstrip()
a.close() ## Açtığınız tüm dosya-bağlantı-işlem leri(-ları) kapatın. Unutmayın ki kainatta hiç bir kaynak sonsuz değildir. Sizin bilgisayarınızın da olmadığı gibi..
Her sistemde açılacak olan işlemler veya dosyaların sayısı bellidir.Her ne kadar bazı python yazarları okumak için açılan dosyaları kapatmasanızda olur deseler bile siz sistem kararlılığı için kapatın.
   

Zaman karşılaştırma

Global olarak tüm takvim formatı YY/AA/GG (yıl/ay/gün) şeklindedir(yazılım için).
fakat çoğu uygulama tarihi ters işler bu da  yazılım geliştiricisi için Order biraz çetrefilleşir. Python da bu işlem gayet basittir. Sadece yapmanız gereken takvimi ham hale getirip terslemektir. Burada  dikkat edilecek husus yıl bölümünün dört ay ve gün bölümünün iki hane olmasıdır. Bu adımlardan sonra tarih karşılaştırmaları gayet basit hale gelir ve istediğiniz karşılaştırmayı yapabilirsiniz.

a='28/10/2011'
b='25/11/2011'
print ((a.split('/'))[::-1]) < ((b.split('/'))[::-1])
Çıktı böyle  olur """>>>True """

27 Kasım 2010 Cumartesi

Python da encoding hataları

Mümkün olduğu kadar uygulamalarda encode ve decode olaylarından
uzak durun desemde en başa encode utf yazılıyor karışık bir durum..
Maksadınız kullanıcı tarafından girilen yada bir fonksiyon veya işlecden sonra
döndürülen bilgiyi kesinlikle ham halinde brakınız.Şayet sabit bir kullanıcı gurubu
var ise klavye girdi desenleri sabittir, bu duruma uygun kodlama kullanmanız
gerekir.

Bir sonuç girdisinin başka bir değişkene atanması demek varsayılan kodlama
süzgecinden geçmiş olur.
 Örnek:
 #-*- coding: utf8 -*-
kelime = "şişğçü"
hop_degis = kelime ##şimdi utf-8 kodlamasından geçmiş oldu

>>> fg=raw_input("yaz bakalım:")
yaz bakalım:şğğüçşğüşçğü
>>> fg
'\xfe\xf0\xf0\xfc\xe7\xfe\xf0\xfc\xfe\xe7\xf0\xfc'
>>> der=fg.encode('cp1254')
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
der=fg.encode('cp1254')
File "C:\Python26\lib\encodings\cp1254.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_table)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfe in position 0: ordinal not in range(128)
>>> print str(fg)
şğğüçşğüşçğü

Print fonksiyonunda bir sorun çıkarmaz fakat değişkenlere aktardığımız
zaman kodlama hatası verir.


>>> c=(str(fg)).decode('cp1254')
>>> print c
şğğüçşğüşçğü

Kodlama yerine dosya isimleri, hesap adları vs verilerinde yazılan betiği
kapsamlı bir try - excep yazılması hata risklerini azalttığı gibi kapsamlı bir hata
sınıflandırması yapmamızıda sağlar.

Liste işlemlerinden bir örnek

a=['5','9','8','6','3','4','2','85'] #tanımlanmış bir liste ve bu listenin
#alfabetik sıralanmış halindeki en son elemanı çağırmak istersek
#ne yapmamız gerekiyor?
#Evvela alfabetik sıraya koyup sonra son elemanını almaktansa

sonuc=(a[::-1])[0] # ibaresini kullanmak sanırım daha kolay olur
#buradaki a[::-1] kodlaması  reverse işlemini yapar.

FTP sunucusu çalıştırma

from pyftpdlib import ftpserver

authorizer = ftpserver.DummyAuthorizer()
authorizer.add_user('user', 'password', 'C:\\', perm='elradfmw')
authorizer.add_anonymous('C:\\')
ftp_handler = ftpserver.FTPHandler
ftp_handler.authorizer = authorizer.host
address = ("127.0.0.1", 21)
ftpd = ftpserver.FTPServer(address, ftp_handler)
ftpd.serve_forever()   ##Eyvallah forever tamam ama siz mutlaka triger için
##pipet ayarlamayı unutmayın.
##Bu ne işimize yarıyacak! tamam, menemen yapmaz ama en azından C: dizinindeki
## tüm dosyaları gösteriyor.Gizli dosyalar vesaire herhalde mesaj ulaşmıştır yerine..

Not defteri Uygulaması

import os ## Gerekli modülün çağrılması
b1="c:\\test.txt" ## ilgili uygulamaya eklenecek argüman burada path verilmiş.
os.system('notepad.exe ' + b1) ## + toplama işaretiyle bağlanması.

#Dikkat edilecek konu yanlızca kullanılan argümanın sürece
#uygun olup olmadığıdır. Argüman uyumsuz ise başka bir
#süreçten geçirilerek uygun hale getirilebilir.