Thứ Hai, 20 tháng 8, 2012

Chuyển file .py sang .exe

Tên bài viết: chuyển file py thành exe
Tác giả: Nguyễn Minh Thế
Phiên bản Python sử dụng: 2.6
Tóm tắt: không phải ai dùng python cũng muốn soft mik viết ra phơi phơi cái mã nguồn, muốn run thì phải có cài python và kèm với cái icon có sẵn đâu nhỉ :))
_____________________________________________________________


Như đã nói ở trên, các soft khi các bạn viết hoàn tất, khi lưu lại chỉ là file đuổi mở rộng .py thế giờ muốn thành exe thì sao nhể ? :)) không phải ai dùng python cũng muốn soft mik viết ra phơi phơi cái mã nguồn, muốn run thì phải có cài python và kèm với cái icon có sẵn đâu nhỉ :)) vì thế viết một soft và xuất ra exe hay còn gọi là file chường trình, hay file thực thi mới là điều thú vị cần làm của đông đảo đa số dân viết soft cây nhà lá vườn nói riêng hay...các công ti nói chung ;))

Thôi ko lải nhải nữa, tốn time của các pythoner :)) giờ ta bắt đầu nhé :). Ở đây mik xin hướng dẫn các bạn sử dụng py2exe ;) . Ai chưa có py2exe thì vào đây download cho đúng phiên bản python cài trong máy nhé

http://sourceforge.net/projects/py2exe/files/py2exe/0.6.9/ 


Tạm thời phiên bản hỗ trợ chỉ đến python 2.7, vẫn đang chờ hỗ trợ python 3x ;))

Giờ bắt tay vào làm nào :)

hãy thử làm 1 ứng dụng nhỏ nhé, file hello.py của chúng ta giả sử có nội dung như sau:

print "Hello World!"


bồ nào chưa hiểu đoạn code trên thì học lại python cơ bản nhé =.=!

Tiếp theo là tạo 1 file setup.py có nội dung như sau:

from distutils.core import setup

import py2exe

setup(console=['hello.py'])


giờ thì để 2 file này ngoài Desktop chẳng hạn nhé ;)

vào Start -> Run -> CMD -> Enter

cưa sổ DOS xuất hiện, gõ vào CD Desktop. Sau đó gõ setup.py py2exe

Chờ một chút, và ngoài Desktop của bạn sẽ có 1 thư mục tên là Dist, trong đó sẽ có file hello.exe (Vậy là bạn đã thành công rồi đó)

LƯU Ý: đối vơi các pro muốn làm ứng dụng có chế độ đồ họa người dùng GUI cũng làm tương tự nhưng sẽ có 1 cửa sổ DOS phía sau (nhìn khá bực bội) muốn không có cửa sổ DOS này chỉ cần sửa

from distutils.core import setup

import py2exe

setup(console=['hello.py'])


thành

from distutils.core import setup

import py2exe

setup(windows=['hello.py'])


Muốn file exe có icon riêng thì sửa file setup.py như sau:

from distutils.core import setup

import py2exe

setup (windows = [{"script":'file py của bạn', "icon_resources":[(1,"file icon của bạn")]}])


Hy vọng bai viết sẽ hữu ích cho các bạn ;)

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

Các bài tập cơ bản viết bằng C và Python

Một số bài tập viết bằng C và Python của một bạn mình sưu tầm được. Code này chưa được tối ưu cho lắm nhưng mang tính chất tham khảo cho các bạn mới học rất good

Bài 1
Biết lãi suất tiết kiệm là t%/tháng (nhập t từ bàn phím). Nhập số vốn ban đầu n và số tháng gửi k. Tính số tiền nhận được sau k tháng.

Viết bằng C
#include<stdio.h>

#include<conio.h>

#include<math.h>

void main()

{

 float t,n;

 int k;

 printf("Nhap lai suat: ");

 scanf("%f",&t);

 printf("Nhap so tien gui ban dau: ");

 scanf("%f",&n);

 printf("Nhap so thang gui: ");

 scanf("%d",&k);

 for(int i=1;i<=k;i++)

  {

 n=n+n*(t/100);

  }

 printf("Tong so tien nhan duoc la %f",n);

 getch();

}


Viết bằng python

def bai1(t,n,k):

 for i in range(k):

  n=n+n*t/100

        print "Tong so tien nhan duoc la:"

        print n



if __name__=="__main__":

 t=float(raw_input("Nhap lai suat: "))

 n=float(raw_input("Nhap so tien gui ban dau: "))

 k=int(raw_input("Nhap so thang gui: "))

 bai1(t,n,k) 
 
Bài 2: Tiền điện hàng tháng được tính như sau:
- 100 số đầu tính m1 đồng/số
- từ số 101 trở lên tính m2 đồng/số
Nhập m1,m2, số điện năng tiêu thụ s. Hãy tính tiền điện phải trả.

Code C
#include<stdio.h>

#include<conio.h>

#include<math.h>

void main()

{

float m1,m2,t;

int s;

printf("Nhap don gia cho 100 so dau : ");

scanf("%f",&m1);

printf("Nhap don gia tu so 101 tro len: ");

scanf("%f",&m2);

printf("Nhap so dien dung trong thang:");

scanf("%d",&s);



if((s<100)&&(s>0))

 {

  t=s*100;

  printf("So tien phai tra la: %f",t );

 }

else

 {

  t=m1*100+(s-100)*m2;

  printf("So tien phai tra la: %f",t);

 }

getch();

}


Code Python

def bai2(m1,m2,s):

 if(s<100):

  t=100*m1

  print "so tien phai tra la:",t

 else:

  t=100*m1+(s-100)*m2

  print "so tien phai tra la:",t



if __name__=="__main__":

 m1=float(raw_input("Nhap don gia cho 100 so dau: "))

 m2=float(raw_input("Nhap don gia so 101 tro len: "))

 s=int(raw_input("Nhap so dien da dung trong thang: "))

 bai2(m1,m2,s)
 
Bài 3: In ra m số nguyên tố đầu tiên

Input: Nhập vào số nguyên m
Process
- Viết hàm kiểm tra tính nguyên tố của số k
+ nếu k<2: k không phải là số nguyên tố
+ lặp biến i từ 2 đến sqrt(k)
nếu k%i==0 thì k ko phải là số nguyên tố
- in ra các số nguyên tố:
+ gán biến dem=0, k=0
+ lặp: trong khi dem<m thì:
nếu k là nguyên tố: in k, tăng dem++
tăng k++
Output in ra m số nguyên tố đầu tiên

code C
#include<stdio.h>

#include<conio.h>

#include<math.h>

int check_prime(int x)

 {

  if(x<2) return 0;

  for(int i=2;i<=sqrt(x);i++)

  if(x%i==0) return 0;

  return 1;

 }

void main()

{

 int m;

 int k=1,dem=0;

 printf("Nhap m: ");

 scanf("%d",&m);

 printf("%d so nguyen to dau tien la: ",m);

 while(dem<m)

   {

 if(check_prime(k)==1)

    {

       printf("%4d",k);

       dem++;

    }

 k++;

   }

 getch();

}

Code python (chưa giải quyết trong hàm check_prime xét 2 đến sqrt(x))
def check_prime(x):

 if(x<2): return 0

 elif(x==2): return 1

 t=range(x)

 for i in t[2:]:

  if(x%i==0): return 0

 return 1

if __name__=="__main__":

 m=int(raw_input("Nhap m: "))

 print m, "so nguyen to dau tien la: "

 dem=k=0

 while(dem<m):

  if(check_prime(k)==1):

   print k,

   dem=dem+1

  k=k+1 
 
Bài 4: Tìm phân số tối giản của một phân số.

Ý tưởng: Ta tìm UCLN của tử số và mẫu số bằng giải thuật Euclid, sau đó chia cả tử và mẫu cho UCLN.

Code C
#include<stdio.h>

#include<conio.h>

int UCLN(int a, int b)

{

 if (a < 0) a = -a;

 if (b < 0) b = -b;

 while (a&&b)

  {

   if(a >= b) a %= b;

   else b %= a;

  }

 return (a + b);

}

void main()

{

 int tu,mau;

 printf("Nhap tu so: ");

 scanf("%d",&tu);

 printf("Nhap mau so: ");

 scanf("%d",&mau);

 printf("Phan so ban vua nhap la: %d/%d \n",tu, mau);

 printf("Phan so toi gian la: %d/%d",tu/UCLN(tu,mau),mau/UCLN(tu,mau));

 getch();

}

Code Python
def ucln(a,b):

 if(a<0): a=-a

 if(b<0): b=-b

 while(a&b):

  if(a>=b): a=a%b

  else: b=b%a

 return(a+b)

if __name__=="__main__":

 tu=int(raw_input("Nhap tu so: "))

 mau=int(raw_input("Nhap mau so: "))

 print "Phan so ban vua nhap la: ",tu,"/",mau

 print "Phan so toi gian la: ", tu/ucln(tu,mau),"/",mau/ucln(tu,mau) 
 
Bài 5: Nhập một số nguyên, đếm xem số đó có bao nhiêu chữ số và tính tổng các chữ số.

Code C
#include<stdio.h>

#include<conio.h>

void main()

{

 int n,sodu,dem=0,s=0;

 printf("Nhap vao n: ");

 scanf("%d",&n);

 while(n>0)

  {

 sodu=n%10;

 s=s+sodu;

 dem++;

 n=n/10;

  }

 printf("So da nhap co %d chu so",dem);

 printf("\nTong cac chu so la %d",s);

 getch();

}

Code Python
def bai5(n):

 s,dem=0,0

 while(n>0):

  sodu=n%10

  s=s+sodu

  dem=dem+1

  n=n/10

 print "So da nhap co",dem,"chu so"

 print "Tong cac chu so la: ",s

if __name__=="__main__":

 n=int(raw_input("Nhap vao n: "))

 bai5(n) 
 
Bài 6: Tìm các số có 3 chữ số sao cho tổng lập phương của các chữ số bằng chính số đó (gọi là các số Amstrong)

Code C
#include<stdio.h>

#include<conio.h>

void main()

{

 int a,b,c;

 for(a=1;a<10;a++)

  for(b=0;b<10;b++)

 for(c=0;c<10;c++)

  if(a*a*a+b*b*b+c*c*c==100*a+10*b+c) printf("%d \n",100*a+10*b+c);

 getch();

}

Code Python
if __name__=="__main__":

        t=range(10)

 for a in t[1:]:

  for b in t:

   for c in t:

    if(a*a*a+b*b*b+c*c*c==100*a+10*b+c): print 100*a+10*b+c
 
 
 
 

Game đoán chữ Hangman bằng Python

Bạn lạc vào một xứ sở Thần Tiên xa xôi nơi mà văn minh hiện đại không biết tới. Ở đó luật pháp rất nghiêm, trong đó có luật là nếu ăn trộm thì sẽ bị treo cổ. Bạn lạc vào nơi không quen biết, và không có gì để ăn. Bạn lòng vòng 1 khu chợ và trong lúc cơ cực, bạn đành phải “nhón” 1 quả cam. Lính gác phát hiện ra bạn, trói bạn lại và mang ra chợ hành hình trước bàn dân thiên hạ. Nhưng vua của đất nước Thần Tiên đó lại rất coi trọng những người có chữ, và sẽ tha cho bọn nếu bạn đoán được đúng chữ ẩn số.
Trong game này, bạn sẽ học các khái niệm về:
  • Methods – Phương thức
  • The append() list method – Thêm thành phần của list (danh sách)
  • The lower() and upper() string methods – phương thức chữ thường và chữ hoa cho chuỗi
  • The reverse() list method – phương thức đảo danh sách
  • The split() string method – phương thức chia chuỗi
  • The range() function – hàm range()
  • The list() function – hàm list()
  • for loops – vòng lặp loop
  • elif statements – Kiểm tra điều kiện
  • The startswith() and endswith() string methods. – Phương thức startswith() và endswith()
  • The dictionary data type. – Kiểu dữ liệu tử điển
  • key-value pairs – Cặp khóa – giá trị
  • The keys() and values() dictionary methods – phương thức keys() và values()
  • Multiple variable assignment, such as a, b, c = [1, 2, 3] – Đa gán
Muốn lập trình được game này bạn phải sơ đồ hóa trước, như cái sơ đồ ở dưới:


Còn code của game thì đây:

import random
HANGMANPICS = ['''
 
  +---+
  |   |
      |
      |
      |
      |
=========''', '''
 
  +---+
  |   |
  O   |
      |
      |
      |
=========''', '''
 
  +---+
  |   |
  O   |
  |   |
      |
      |
=========''', '''
 
  +---+
  |   |
  O   |
 /|   |
      |
      |
=========''', '''
 
  +---+
  |   |
  O   |
 /|\  |
      |
      |
=========''', '''
 
  +---+
  |   |
  O   |
 /|\  |
 /    |
      |
=========''', '''
 
  +---+
  |   |
  O   |
 /|\  |
 / \  |
      |
=========''']
 
words = 'hocbaomat linux hacker backtrack python wordpress javascript'.split()
 
def getRandomWord(wordList):
    # This function returns a random string from the passes list of strings.
    wordIndex = random.randint(0, len(wordList)-1)
    return wordList[wordIndex]
 
def displayBoard(HANGMANPICS, missedLetters, correctLetters, secretWord):
    print(HANGMANPICS[len(missedLetters)])
    print()
 
    print('Nhung chu cai doan truot:', end=' ')
    for letter in missedLetters:
           print(letter, end=' ')
    print()
 
    blanks = '_' * len(secretWord)
 
    for i in range(len(secretWord)):
           if secretWord[i] in correctLetters:
               blanks = blanks[:i] + secretWord[i] + blanks[i+1:]
 
    for letter in blanks:
           print(letter, end=' ')
    print()
 
def getGuess(alreadyGuessed):
    # Returns the letter the player entered. This
    # function makes sure the player entered a single letter, and not
    # something else
 
    while True:
        print('Doan 1 chu cai')
        guess = input()
        guess = guess.lower()
        if len(guess) != 1:
           print('Chi dien vao 1 chu cai.')
        elif guess in alreadyGuessed:
           print('Chu cai do da doan roi. Doan lai.')
        elif guess not in 'abcdefghijklmnopqrstuvwxyz':
           print('Nhap 1 CHU CAI.')
        else:
           return guess
 
def playAgain():
    # This function returns True if the player wants to play again, otherwise
    # it returns False.
    print('Ban co muon choi lai khong? (yes or no)')
    return input().lower().startswith('y')
 
# main code
print('T R E O   C O')
missedLetters = ''
correctLetters = ''
secretWord = getRandomWord(words)
gameIsDone = False
 
 
while True:
    displayBoard(HANGMANPICS, missedLetters, correctLetters, secretWord)
 
    # Let the player type in a letter
 
    guess = getGuess(missedLetters + correctLetters)
 
    if guess in secretWord:
           correctLetters += guess
 
           #Check if the player has won
           foundAllLetters = True
           for i in range(len(secretWord)):
               if secretWord[i] not in correctLetters:
                   foundAllLetters = False
                   break
           if foundAllLetters:
               print('Xong! Tu bi mat do la "' + secretWord + '"! Ban da thang!')
               gameIsDone = True
 
    else:
           missedLetters = missedLetters + guess
 
           #Check if player has guesses too many times and lost
           if len(missedLetters) == len(HANGMANPICS) - 1:
               displayBoard(HANGMANPICS, missedLetters, correctLetters, secretWord)
               print('Da qua so lan doan!\nSau ' + str(len(missedLetters)) + ' lan doan truot va ' +
                     str(len(correctLetters)) + ' lan doan dung, tu can doan la "' + secretWord + '"')
               gameIsDone = True
 
    # Ask the player if they want to play again (but only if the game is done).
    if gameIsDone:
        if playAgain():
            missedLetters = ''
            correctLetters = ''
            gameIsDone = False
            secretWord = getRandomWord(words)
        else:
            break
 
Nhớ là các bạn hãy gõ code nhé, đừng copy & paste, gõ thì mới lên trình lập trình được. Để tiện hình dung, các bạn hãy save nội dung code vào 1 file rồi chạy thử xem game này chơi như thế nào.
Chúc các bạn vui!

Class trong Python

Rất dễ! Nó được thực hiện bằng cách gõ “python”, như sau:
Trans-MacBook-Pro:~ Son$ python
Python 2.7.1 (r271:86832, Aug  5 2011, 03:30:24) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
Như vậy mình vừa gọi Python shell, giờ việc mình cần làm là thực hiện phép tính cộng:
>> 1 + 1 # (Nhấn Enter)
2
>>>
Quá dễ phải không các bạn. Giờ mình thực hiện phép cộng theo cách khác. Mình sẽ định nghĩa ra 1 cái hàm để làm việc này, nó như sau:
>>> def cong2so(x, y):
...     return x + y
... 
>>>
Như vậy là mình vừa tạo ra xong 1 cái hàm cộng 2 số. Để dùng hàm này, mình làm như sau:
>> cong2so(1,1)
2
>>>
Đó là mình hồi nhỏ học toán, chỉ làm được có thế. Còn thần đồng toán thì làm được giỏi hơn thế nhiều, đó là phép trừ, nhân và chia, như sau:
>> class thandongtoan():
...     def cong2so(self, x, y):
...             return x + y
...     def tru2so(self, x, y):
...             return x - y    
...     def nhan2so(self, x, y):
...             return x * y
...     def chia2so(self, x, y):
...             return x  / y
... 
>>>
Như vậy mình vừa tạo ra 1 class thần đồng toán, có nghĩa là thần đồng toán thì sẽ giỏi 4 phép toán cộng trừ nhân chia. Củ Hành là thần đồng toán, nghĩa là Củ Hành thuộc vào class thandongtoan(), như sau:
>> cu_hanh = thandongtoan()
>>>
Để xem Củ Hành làm được gì nào:
>>> dir(cu_hanh)
['__doc__', '__module__', 'chia2so', 'cong2so', 'nhan2so', 'tru2so']
>>>
Bạn có thấy Củ Hành thực hiện được 4 phép toán không. Thử thêm chút nữa xem bạn Củ Hành có thực được phép nhân 2 số không:
>>> cu_hanh.nhan2so(2,3)
6
>>>

Phân giải DNS bằng Python

Hôm nay chúng ta viết 1 chương trình nhỏ bằng Python để làm 1 việc đơn giản là phân giải domain name thành địa chỉ IP. Ở trên Linux hay Windows thì chúng ta làm việc này bằng cách gõ lệnh:











#nslookup ten_domain
thì ra được địa chỉ IP của domain đó. Với Python chúng ta viết 1 chương trình như sau:

#!/usr/bin/python
import socket
# Module chuyên xử lý về socket
 
hostname = 'hocbaomat.com'
# tạo ra 1 biến kiểu xâu (string) với giá trị là 'hocbaomat.com'
 
addr = socket.gethostbyname(hostname)
#hàm gethostbyname của module socket sẽ phân giải tên
#chứa trong biến hostname thành địa chị IP
#và IP sẽ được lưu vào biến addr
 
print 'Dia chi cua ', hostname, ' la:', addr
#In địa chỉ IP của biến addr ra màn hình

Lưu nội dung trên vào một file có tên là nslookup_hoc_bao_mat.py, thêm thuộc tính ‘execute’ cho nslookup_hoc_bao_mat.py rồi chạy. Kết quả có được là:
 184.154.160.13
Viết 1 chương trình bằng Python quả là đơn giản, phải không các bạn. Ngoài ra nếu chúng ta muốn phân giải tên domain khác thì chúng ta chỉ việc thay biến hostname với giá trị là tên domain mà chúng ta cần phân giải, ví dụ:
hostname = 'wordpress.org'
Như vậy bài này dừng ở đây, cám ơn các bạn đã quan tâm!
Ảnh nguồn tham khảo: http://www.smashingtips.com

Python game: Học mà chơi, chơi mà học

Trong suốt quá trình tìm hiểm về các ngôn ngữ lập trình, mình thấy rằng hầu hết các cuốn sách nhập môn đều có chung một “format”: giới thiệu kiểu dữ liệu, biến, làm quen với các câu lệnh điều khiển, xử lý mảng, chương trình con, hướng đối tượng … cách viết này mang lại cho người học một mớ công cụ và rồi bỏ mặc họ tự áp dụng vào thực tế. Quả thực, đối với người “a ma tơ”, mới bước chân vào lĩnh vực lập trình, nhất là đối với những người tự học, việc bị bỏ rơi như vậy sẽ khiến họ chỉ còn biết ngồi ngắm đống kiến thức đó mà ko biết vận dụng như thế nào, khả quan hơn thì là họ tự tìm và ngồi đọc mã nguồn để bắt chước. Thật may, gần đây mình tìm được 2 cuốn python viết theo cấu trúc hoàn toàn khác.
Cuốn đầu tiên: “Invent Your Own Computer Game with Python” đúng như tựa đề, hướng dẫn các bạn viết những game nhỏ nhỏ, tương tác dòng lệnh như các game trên nền DOS ngày xưa, nhưng cũng khá thú vị, qua đó, giúp bạn có thể làm quen nhanh hơn với Python, biết cách áp dụng Python để viết một chương trình. Cuốn sách được viết chi tiết, giải thích cặn kẽ, đảm bảo kể cả những học sinh 10-12 tuổi cũng có thể làm được.


Cuốn thứ 2: “Making games with Python & Pygame” là phần tiếp theo của cuốn trên. Lúc này, bạn đã có kha khá kiến thức về Python rồi, cuốn sách sẽ hướng dẫn các bạn lập trình 11 game lớn hơn với đồ họa 2D không thua gì các game trên thị trường. Để từ đó, bạn có thể tự viết game của mình, hay phát triển các ứng dụng hữu ích khác.


Các bạn có thể download miễn phí 2 cuốn sách này cùng mã nguồn các game trong 2 cuốn sách tại đây.
Hy vọng 2 cuốn sách này sẽ mang lại cho các bạn cảm hứng đến với thế giới lập trình cũng như Python.

Game Rồng đất bằng Python

Chào các bạn. Hôm nay mình viết 1 cái game tên là game Rồng đất, game này rất đơn giản như sau:
- Bạn lạc vào 1 xử sở của rồng đất. Trước mắt bạn là 2 cái hang, 1 cái hang có con rồng thân thiện sẽ cho bạn kho báu. 1 cái hang có con rồng háu ăn và đang bị đói, nó sẽ ăn thịt bạn. Bạn chọn 1 trong 2 cái hang
- Bạn có thể chơi lại game này.
Trong game này, bạn sẽ học cách sử dụng function, các phép toán logic, cách dùng vòng lặp while trong ngôn ngữ Python. Tức nhiên ngoài ra là các module random (sinh số ngẫu nhiên), và module time. Việc viết đi viết lại code của game này sẽ cho chúng ta sự nhuần nhuyễn code, sẽ thấy viết code tự nhiên như viết tiếng Việt vậy. Nào bắt đầu, và dưới đây là code của game:




#!/usr/bin/python
import random, time
 
def displayIntro():
 print('Ban lac vao xu so cua rong. Truoc mat ban,')
 print('la 2 cai hang. Mot hang co con rong rat than thien,')
 print('no se dua cho ban kho bau. Hang con lai, la 1 con rong ')
 print('rat hau an va dang bi doi, no se an thit ban.')
 print('')
 
def chooseCave():
 cave = ''
 while cave != '1' and cave !='2':
  print('Ban chon hang nao? (1 hay la 2)')
  cave = raw_input()
 return cave
 
def checkCave(chosenCave):
 print('Ban tien gan toi cai hang...')
 time.sleep(2)
 print('Toi den nhu muc va ma quai...')
 time.sleep(2)
 print('Mot con rong to lon nhay ra va ha cai mieng rong lon...')
 time.sleep(2)
 
 friendlyCave = random.randint(1,2)
 if chosenCave == str(friendlyCave):
  print('Dua cho ban kho bau!')
 else:
  print('Nuot song ban!')
 
playAgain = 'yes'
while playAgain == 'yes' or playAgain == 'y':
 displayIntro()
 caveNumber = chooseCave()
 checkCave(caveNumber)
 print('Ban co muon choi lai khong? (yes or no)')
 playAgain = raw_input()

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)

Bài tập căn bản Python (1) - Nhập,xuất,tính toán

Bài 1.1

""" Viết chương trình nhập vào năm sinh, in ra tuổi, ví dụ nhập 1984 in ra: Ban sinh năm 1984, vay ban 19 tuoi. """
#Chuong trinh : Nhap nam sinh Xuat tuoi
import time
x=time.localtime()
print x[0]
def Xuat_tuoi(Namsinh):
  x=time.localtime()
  a=x[0]-Namsinh
  if a==0:
      print "Tuoi cua ban la :",a+1
  elif (a<0):
       print "Tuoi nay chua ton tai"
  else:
       print "Tuoi cua ban la :",a
NS=int(raw_input("Nhap nam sinh : "))
Xuat_tuoi(NS)

Bài 1.2

import math
def Tinh(R):
   if R<0:
       print "Ban kinh khong nho hon 0"
       print "Ban nhap khong hop le"
   else:
       CV=2*R*math.pi
       DT=R*R*math.pi
       print "Chu vi la :",CV
       print "Dien tich la :",DT
 
print "-------Tinh Chu Vi, Dien Tich Hinh Tron---------"  
r=float(raw_input("Nhap ban kinh hinh tron: "))
Tinh(r)

Bài 1.3

Bài 1.4

import math
def Bai_1_4(R,h):
   S_DAY=R**2*math.pi
   S_XQ=2*R*h*math.pi
   V=S_DAY*h
   if (R<0)or(h<0):
       print "Ban nhap khong hop le"
   else:
       print "Dien tich day la :",S_DAY
       print "Dien tich xung quang la :",S_XQ
       print "The tich la :",V
print"-----Tinh Dien Tich,The Tich Hinh Tru Tron-------"
if __name__=="__main__":
   r=float(raw_input("Nhap ban kinh :"))
   h=float(raw_input("Nhap chieu cao :"))
   Bai_1_4(r,h)

Bài 1.5

import math
def Bai_1_5(x):
   y1=4*(x*x+10*math.pow(x, 1.5)+3*x+1)
   y2=(math.sin(math.pi*x*x)+math.sqrt(x*x+1))/(math.exp(2*x)+math.cos((math.pi/4)*x))
   print "Y1 = ",y1
   print "Y2 = ",y2
print "------Tinh gia tri bieu thuc-------------  "
x=float(raw_input("Nhap so thuc X : "))     
Bai_1_5(x)

Bài 1.6

import math
def Bai_1_6(n):
   a=[10,5,2,1]
   for i in a[:]:
       so_to=n/i
       print "Tien",i,"d co" , so_to,"to"
       n=n%i
if __name__=="jfkjfk__main__":
   N=int(raw_input("Nhap so tien : ")) 
   Bai_1_6(N)

Bài 1.7

#Chuong trinh tinh tong cac chu so cua mot so nguyen
import math
def Bai_1_7(n):
   s=0
   while (n/10):
       s+=n%10
       n=n/10
   return s+n;
if __name__=="__main__":
   N=int(raw_input("Nhap 1 so nguyen :")) 
   print Bai_1_7(N)