Chủ Nhật, 19 tháng 8, 2012

Gửi email dùng tài khoản Gmail bằng Python

Chả là có 1 ông em hỏi mình câu hỏi như trên nhưng hơi khác 1 tí là gửi email bằng tài khoản Gmail nhưng với code PHP. PHP thì mình ít làm, nên chỉ đưa cho ông em tài liệu hướng dẫn. Nhưng bỗng dưng trong đầu lóe lên câu hỏi, nếu bài toán đó giải bằng Python thì sao nhỉ? Chưa đầy 10 phút, mình đã tìm được câu trả lời cho câu hỏi đó. Thật thú vị! Mới thấy Python hỗ trợ lập trình viên rất tốt, code đơn giản và dễ hiểu.





import smtplib #Sử dụng module smtp của Python
 
#Khai báo username và pass
username = 'hocbaomat'
password = '123456'
 
#Soạn email
msg = 'This is a test'
 
#Tạo đối tượng làm việc với smtp của gmail
 
server = smtplib.SMTP('smtp.gmail.com:587') # Tạo một kết nối đến SMTP của gmail
server.starttls() #Khởi tạo kết nối TLS SMTP
server.login(username, password) # Đăng nhập user, pass
 
fromaddr = 'hocbaomat@gmail.com' # Địa chỉ người gửi
toaddr = 'maivanthang@gmail.com' # Địa chỉ người nhận
 
server.sendmail(fromaddr, toaddr, msg) # Gửi email từ hocbaomat@gmail.com đến maivanthang@gmail.com
 
server.close() # Kết thúc
 
# Củ Hành 

Game đoán số bằng Python

Chào các bạn!
Mình muốn viết 1 game đoán số đơn giản như sau:
- Cho 1 số nguyên ngẫu nhiên nằm trong đoạn từ 1 – 20
- Người chơi sẽ có 6 lần để đoán trúng. Nếu đoán không trúng, người chơi sẽ được gợi ý số vừa đoán nhỏ hơn hay lớn hơn kết quả. Đoán 6 lần mà không trúng thì coi như thua.









Như vậy là luật chơi rất đơn giản, đơn giản để chúng ta có thể bắt đầu dễ dàng được. Code chương trình của mình được viết như ở dưới sau:

#!/usr/bin/python
# Game doan so version 1.0
import random
 
guessesTaken = 0
 
print('Xin chao! Ban ten la gi?')
myName = raw_input()
 
number = random.randint(1,20)
print('Hey, ' + myName + ', to dang nghi 1 con so tu 1 cho den 20')
 
while guessesTaken < 6:
 print('Moi ban doan.')
 guess = input()
 
 guess = int(guess)
 guessesTaken += 1
 
 if guess < number:
  print('Ban doan nho hon roi.')
 elif guess > number:
  print('Ban doan lon hon roi.')
 else: break
 
if guess == number:
 print('Ban doan dung roi! Ban doan mat ' + str(guessesTaken) + " de doan.")
else:
 print('Ban doan sai roi. Con so to dang nghi trong dau la ' + str(number) + " co.")
Các bạn nên type lại đoạn code trên vào 1 file có tên bất kỳ, đừng copy paste vì như vậy không học được cách viết code, ví dụ là guess.py, rồi chạy thử. Mình chạy thử thì nó trông như sau:
MacBooks-MacBook-Pro:Documents MacBookPro$ ./guess.py 
Xin chao! Ban ten la gi?
Cu Hanh
Hey, Cu Hanh, to dang nghi 1 con so tu 1 cho den 20
Moi ban doan.
10
Ban doan lon hon roi.
Moi ban doan.
5
Ban doan nho hon roi.
Moi ban doan.
8
Ban doan lon hon roi.
Moi ban doan.
6
Ban doan nho hon roi.
Moi ban doan.
7
Ban doan dung roi! Ban doan mat 5 de doan.
MacBooks-MacBook-Pro:Documents MacBookPro$
Game này dễ viết và dễ chơi, phải không các bạn!

Tạo 1 function đơn giản trong Python

Function, dịch sang tiếng Việt là hàm, nói 1 cách đơn giản là 1 thủ tục cho phép thực hiện 1 hoặc nhiều tác vụ nào đó, có thể sử dụng lại nhiều lần. Hôm nay chúng ta cùng tìm hiểu cách tạo hàm trong Python. Chúng ta sẽ làm mấy việc như sau:
Thứ nhất là định nghĩa hàm,
Và thứ hai là sử dụng hàm (gọi hàm)
Chúng ta sẽ minh họa bằng cách tạo ra 1 hàm rất đơn giản là thực hiện việc in ra lời chào “Hello Everyone!”. Cấu trúc để tạo hàm là như sau

def ten_ham():
 
   lenh_1
 
   lenh_2
 
   ...
 
   lenh_n

trong đó def là keyword (từ khóa) dùng để định nghĩa hàm, tiếp theo sau là tên hàm, ten_ham(), và tiếp sau là dấu hai chấm,: , sau đó xuống dòng và lùi vào trong bao nhiêu dấu cách tùy ý, miễn là cách dấu cách này là giống nhau từ lệnh lenh_1, lenh_2, cho đến lệnh n, lenh_n tạo nên phần thụt vào trong so với tên hàm, phần thụt này chính là thân hàm. Như vậy định nghĩa 1 hàm trong python rất đơn giản đúng không các bạn! Giờ chúng ta áp dụng vào để viết ví dụ minh họa nói đến ở trên:
 
def xin_chao():
 
   print("Hello Everyone!")

Xong. Quá đơn giản đúng không! Giờ ta chỉ cần việc gọi hàm nữa là xong, ta làm như sau:
xin_chao()
Như vậy để sử dụng được hàm thì đầu tiên chúng ta cần tạo ra hàm, rồi sau đó gọi hàm. Lưu ý là nếu chúng ta gọi hàm trước khi chúng ta định nghĩa hàm, thì chúng ta sẽ gặp lỗi, vì hàm đã tồn tại đâu mà gọi.
Tóm lại chương trình của chúng ta viết bằng Python là như sau:
 
def xin_chao():
 
   print("Hello Everyone!")
 
xin_chao()

Lưu ý là xin_chao() phải dóng hàng với def xin_chao():
Lưu code vào trong 1 file bất ký, ví dụ: xinchao.py, và chạy, kết quả như sau:
Hello Everyone!
Như vậy là chúng ta thấy để tạo ra hàm trong Python rất đơn giản, nó chỉ phức tạp khi hàm chúng ta tạo ra làm được cái gì, còn về mặt định nghĩa và sử dụng hàm thì rất dễ. Chúng ta kết thúc bài này ở đây!

Làm việc với lập trình hướng đối tượng trong Python

Lập trình hướng đối tượng là cách thức lập trình không còn xa lạ gì nữa với những người làm về lập trình. Mục đích của lập trình hướng đối tượng là để làm cho việc lập trình dễ dàng hơn bằng cách mô tả các thành phần của đoạn mã như là những đối tượng trong thế giới thực.
Nói thực là mình học lập trình hướng đối tượng cách đây 10 năm, nhưng hồi đó mình chẳng hiểu quái gì cả,và chẳng viết được tẹo chương trình nào bằng lập trình hướng đối tượng cả. Thật là quê! :D . Tại cách tiếp cận của các thầy giáo dạy mình hồi đó thấy trừu tượng quá, cộng thêm việc mình lười nên thành ra học mà chẳng thu được cái gì cả. Giờ mình thấy 1 cách học rất hiệu quả là tự mình dạy mình, cách này mình thấy rất hay!


Muốn lập trình được đối tượng, thì phải hiểu về class (lớp). Vậy class là gì? Class là class chứ còn là gì :) ). Class nói nôm na là thứ mô tả chung chung nhất về đối tượng, nhưng lại không phải là đối tượng cụ thể nào. Lấy ví dụ, chúng ta có lớp là Con người. Mình là Củ Hành, tức là hiện thân cho một con người. Haha, nghe to tát quá! Mà thế quái nào Củ Hành lại là người nhỉ :) ).

Thôi đi vào cụ thể cho dễ hình dung lập trình hướng đối tượng trong Python là như thế nào nào. Mình lấy ví dụ viết 1 lớp tên như sau:
 
class className: # dùng từ khóa class để định nghĩa ra lớp có tên là className
   def createName(self,name): #Lớp className có phương thức tạo ra tên 
      self.name = name
   def displayName(self):
      return self.name
   def saying(self):
      print "Hello %s" % self.name

Thế là định nghĩa xong lớp className. Giờ muốn sử dụng thì làm như sau:
first = className() #Khởi tạo 1 đối tượng thuộc lớp className, đối tượng này đặt tên là first
first.createName('Củ Hành') # sử dụng hành động của đối tượng first
Phù, thế là viết xong ví dụ minh họa về lớp. Xong!

Viết chương trình xem tên máy bằng Python

Hi các bạn, hôm nay chúng ta sẽ viết 1 chương trình nhỏ xem tên máy (hostname) bằng chương trình Python. Trên hệ thống linux, để làm được việc này thì chỉ đơn giản chúng ta gõ lệnh hostname là xong. Tuy vậy, mục đích của bài này là để chúng ta làm quen hơn với Python bằng cách viết những chương trình. Một bí quyết để lập trình được giỏi là viết bất kể chương trình gì, dù đơn giản đến đâu. Và lưu ý là chúng ta phải viết ra nhé, tự gõ ra chương trình, còn nếu chúng ta viết bằng cách copy & paste khi lập trình thì coi như là chúng ta không học lập trình rồi.
Nào chúng ta bắt đầu, trên hệ thống linux dùng nano tạo ra 1 file có tên là hostname.py với nội dung như sau:

#!/usr/bin/python
import sys, socket
hostname = socket.gethostname()
print "Ten may cua ban la:", hostname
 
Dòng đầu tiên như chúng ta đã biết là chỉ ra đường dẫn của trình thông dịch Python, nhằm nhiệm vụ sẽ dịch các lệnh kế tiếp ở trong file.

Dòng
 import sys, socket
có tác dùng là nạp thêm module xử lý về hệ thống (sys) và về socket.

Dòng thứ 3
hostname = socket.gethostname()
tạo ra 1 tên biến có tên là hostname, và một hàm xử lý có tên là socket.gethostname(), mục đích là lấy tên máy, hàm này chạy xong sẽ được chứa dữ liệu vào biến hostname.

Dòng thứ 4
print "Ten may cua ban la:", hostname
sẽ in ra màn hình kết quả “Tên máy của bạn là:” và giá trị của biến hostname, cụ thể với máy tính của tôi sẽ là localhost.localdomain. Tóm lại là dòng 4 sẽ in ra màn hình kết quả như sau:
Ten may cua ban la:localhost.localdomain

Như vậy các bạn thấy việc tạo ra 1 chương trình bằng Python đơn giản và khá tiện dụng nhỉ.

Viết chương trình chuyển đổi số nguyên sang dạng nhị phân

Mục đích:
- Nhận 1 số nguyên dương bất kỳ từ bàn phím
- Chuyển đổi số đó sang dạng nhị phân, và in trở lại màn hình kết quả

Để làm được việc này, đầu tiên chúng ta phải mô tả lại cách chuyển số thập phân sang dạng nhị phân, như sau:
Chúng ta lấy số thập phân chia cho số 2, kết quả chúng ta được phần nguyên và phần dư khi chia hết cho 2. Lấy phần nguyên và chia tiếp cho . Làm như vậy cho đến khi phần nguyên bé hơn 2, thực hiện nốt phép chia hết cho 2 và dừng lại. Ghi lại kết quả các phần dư, rồi viết ngược lại, vậy là ta đổi được ra số nhị phân.
Lấy ví dụ: đổi số 11 ra số nhị phân
11 / 2 được phần nguyên là 5, phần dư là 1. Tiếp tục lấy phần nguyên là 5 chia tiếp cho 2, được 2 dư 1. Lấy 2 chia tiếp cho 2, được 1 dư 0. Lấy 1 chia tiếp cho 2 được 0 dư 1. Ta không chia nữa vì số phần nguyên 1 bé hơn 2. Các kết quả số dư là như sau 1101, sau đó viết đảo lại thành 1011, đó chính là số nhị phân của số thập phân 11.
Code của chương trình:
def dec2bin(n):  # n là số nguyên dương cho trước
 
   s = '' # Đây chính là phần dư, ban đầu là chưa có gì, rỗng
 
   while n:   #Thực hiện liên tục phép chia hết cho 2
 
      s = str(n % 2) + s # % 2 là phép chia cho 2 lấy phần dư, s chính là xâu lưu trữ kết quả các phần dư
 
      n = n / 2 # Gán lại n bằng phần nguyên của n chia cho 2
 
   return s # trả kết quả thành chuỗi nhị phân


Dưới đây là chương trình hoàn chỉnh, theo cách viết của mình. Mỗi bài toàn phần mềm có rất nhiều cách viết, cách của mình chỉ là 1 trong số đó. Như vậy có thể có những cách khác hay hơn, chứ không bao giờ có duy nhất 1 cách viết, đó là cái hay của phần mềm cũng như sự linh hoạt cực kỳ của nó.

#!/usr/bin/python
#Chuong trinh chuyen doi so thap phan nguyen duong nhap tu ban phim sang so nhi phan
#Author: Cu Hanh
#Version: 1.0
#Date: Jul 07 2012
 
### Nhap so nguyen duong tu ban phim ###
 
start = 1
while start:
 s = raw_input('Nhap so nguyen duong tu ban phim: ')
 try:
  num = int(s)
  if num <= 0:
   print("So ban nhap khong phai la so nguyen duong, moi ban nhap lai.\n")
  else: start = 0
 except:
  print('So ban nhap khong dung, moi nhap lai.\n')
 
### Chuyen doi so thap phan sang so nhi phan ###
 
bin = ''
while num:
 bin = str(num % 2) + bin
 num /= 2
 
### In so nhi phan sang man hinh ###
print('So nhi phan tuong ung la: ' + bin)
 
### Het. ###
 
 
Chạy thử nghiệm chương trình:
  

Bài tập căn bản Python (2) - Cấu trúc rẽ nhánh

Bài 2.1

#Chuong trinh sap tang 3 so nguyen
def Bai_2_1(a,b,c):
   if (a>=b):
       if(b>=c):
           print "ket qua :",c,b,a
       else:
           if(a>=c):
               print "ket qua :",b,c,a
           print "ket qua :",b,a,c
               
       
   else:    #a<b
       if(b<=c):   
           print "ket qua :",a,b,c
       else:#a<b,c<b
           if(c<=a):
               print "ket qua :",c,a,b
           else:
               print "ket qua :",a,c,b
if __name__=="__main__":  
   a=int(raw_input("Nhap a :"))
   b=int(raw_input("Nhap b :"))
   c=int(raw_input("Nhap c :"))
   Bai_2_1(a,b,c)             

Bài 2.2

def Max(a,b,c,d):
   max=a
   if b>max :
       max=b
   if c>max :
       max=c
   if d>max:
       max=c
   return max
def Min(a,b,c,d):
   min=a
   if b<min:
       min=b
   if c<min :
       min=c
   if d<min:
       min=c
   return min
def Trung_gian(a,b,c,d):
   max=Max(a,b,c,d)
   min=Min(a,b,c,d)
   if (max!=a)and(min!=a):
       print "So trung gian :",a
   if (max!=b)and(min!=b):
       print "So trung gian :",b
   if (max!=c)and(min!=c):
       print "So trung gian :",c
   if (max!=d)and(min!=d):
       print "So trung gian :",d
   
if __name__=="__main__":  
   a=int(raw_input("Nhap a :"))
   b=int(raw_input("Nhap b :"))
   c=int(raw_input("Nhap c :"))
   d=int(raw_input("Nhap d :"))
   print "So Lon Nhat :", Max(a,b,c,d)
   print "So Nho Nhat :", Min(a,b,c,d)             
   Trung_gian(a,b,c,d)
           

Bài 2.3

def Bai3(a,b,c):
   if (a+b)>c and (a+c)>b and (b+c)>a and (a>0) and (b>0) and (c>0):
       if(a==b)and (b==c):
           return 0
       elif((a*b+b*b==c*c)and(a==b))or((a*a+c*c==b*b)and(a==c))or((c*c+b*b==a*a)and(c==b)):
           return 1
       elif(a==b)or(b==c)or(a==c):
           return 2
       elif((a*a==b*b+c*c)or(b*b==a*a+c*c)or(c*c==a*a+b*b)):
           return 3
       else:
           return 4
   else:
       return 5
       
       
if __name__=="__main__":
   a=int(raw_input("Nhap a :"))
   b=int(raw_input("Nhap b :"))
   c=int(raw_input("Nhap c :"))         
   r=['Tam giac deu','tam giac vuong can','tam giac can','tam giac vuong ','tam giac thuong','khong hop le']
   i=Bai3(a,b,c)
   print r[i]

Bài 2.4

def Bai_2_4(km):
   if km==1:
       print "So tien phai tra la : 5000d"
   else:
       if km<=5:
           print "So tien phai tra la :",((km-1)*4500+5000)
       else:
           if(km<120):
                print "So tien phai tra la :",((km-5)*3500+4500*4+5000)
           else:     
               print "So tien phai tra la :",((((km-5)*3500+4500*4+5000)*1/10))
if __name__=="__main__":  
   km=int(raw_input("Nhap so km da di :"))
   Bai_2_4(km)             
           

Bài 2.5

def Bai5(BD,KT):
   h=KT-BD # So gio truy cap
   T=1 #Thanh tien
   if((BD>=0)and(BD<=7)):
       if h>=7:
           T=(T*h*300*60)/0.15
       else:
           T=T*h*300
   if((BD>7)and (BD<=17)):
      if h>=6:
           T=(T*h*400*60)/0.1
      else:
           T=T*h*400
   if((BD>17)and (BD<=24)):
      if h>=4:
           T=(T*h*350*60)*0.12
      else:
           T=T*h*350                
   return T       
               
if __name__=="__main__":
   BD=int(raw_input("Nhap thoi gian bat dau :"))    
   KT=int(raw_input("Nhap thoi gian ket thuc :"))
   print "Thanh tien",Bai5(BD,KT)
         

Bài 2.6

def formatStringInput(str):
  return str[:len(str)-1]
def Bai_6(Ngay_thue,Loai_phong):
   if(Ngay_thue<=12):
       if Loai_phong=='A':
           return Ngay_thue*250000
       if Loai_phong=='B':
           return Ngay_thue*200000
       if Loai_phong=='C':
           return Ngay_thue*150000
   else:
       if Loai_phong=='A':
           return Ngay_thue*250000*0.1
       if Loai_phong=='B':
           return Ngay_thue*200000*0.08
       if Loai_phong=='C':
           return Ngay_thue*150000*0.08
if __name__=="__main__":
   So_ngay=int(raw_input("Nhap so ngay thue :"))   
   Loai=(raw_input("Nhap loai phong:"))
   strLP = formatStringInput (Loai) 
   print "Thanh tien",Bai_6(So_ngay,strLP)   
   
   

Bài 2.7

#chuong trinh nhap vao 1 thang xuat ra mua tuong ung
def Bai_2_7(m):
   if(m<1)or(m>12):
       print "Nhap thang khong hop le"
   if(m>=1)and(m<=3):
       print "Mua xuan"
   if(m>=4)and(m<=6):    
       print "Mua ha"
   if(m>=6)and(m<=9):
       print "Mua thu"
   if(m>=10)and(m<=12):
       print "Mua dong"        
       
if __name__=="__main__":  
   M=int(raw_input("Nhap 1 thang trong nam :"))
   Bai_2_7(M)