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()