Trang

Friday, May 29, 2015

Bài 10: Hàm trong python

Hôm nay chúng ta sẽ cùng nhau đi tìm hiểu về hàm trong Python nhé. Phần này khá là quan trọng, mình mong muốn các bạn thực hành kĩ càng các ví dụ, cũng như làm bài tập để nắm rõ hơn về sử dụng hàm.

1. Hàm
Hàm là một đoạn chương trình được người viết định nghĩa để thực hiện một công việc nào đó mà có thể sử dụng nhiều lần. Trong các ngôn ngữ khác thì hàm khác với thủ tục ở điểm nó trả lại một kết quả. Hàm trong Python có một điểm đặc biệt là nó có thể không trả về một kết quả, bạn có thể coi nó là một thủ tục. Nhưng mình cũng nhắc nhở một điểm, thủ tục trong các ngôn ngữ khác không phải là không trả về giá trị mà nó trả về giá trị là None ( giá trị trống ) và IDE thường bỏ qua nó nên ta có thể coi là nó không trả về giá trị nào.
Từ khóa def khai báo một định nghĩa hàm . Nó phải được theo sau bởi tên hàm, và một danh sách các thông số chính quy trong ngoặc đơn. Các câu lệnh tạo nên thân hàm bắt đầu từ dòng kế tiếp, và bắt buộc phải được thụt vào. Câu lệnh đầu tiên của thân hàm có thể là một chuỗi; chuỗi này là chuỗi tài liệu, hoặc docstringcủa hàm. Các bạn có thể tìm hiểu về docstring ởđây.
Các bạn tham khảo hàm cơ bản mình viết sau:

Code:
#coding: utf-8
def fib(n):    #In mot day cac so Fibonaci cho den n
    """In mot day cac so Fibonaci cho den n"""
    a, b = 0, 1
    while b < n:
       print b,
       a, b = b, a+b
# Gọi hàm đã được định nghĩa
fib(2000)
Việc thực thi một hàm tạo ra một bảng ký hiệu mới dùng cho các biến cục bộ của hàm. Chính xác hơn, mọi phép gán biến trong một hàm chứa giá trị vào bảng ký hiệu cục bộ; và các tham chiếu biến sẽ trước hết tìm trong bảng ký hiệu cục bộ rồi trong bảng ký hiệu toàn cục, và trong bảng các tên có sẵn. Do đó, các biến toàn cục không thể được gán giá trị trực tiếp trong một hàm (trừ khi được đặt trong câu lệnh global ), mặc dù chúng có thể được tham chiếu tới. Để rõ hơn mình xin đưa ra một ví dụ nhỏ:
Code:
>>> #coding: utf-8
>>> a = 8
>>> def abc():
...    a = 6
...    print a  #a cục bộ
...
>>> abc()
6
>>> print a
8
Thông số thật sự của một lệnh gọi hàm được tạo ra trong bảng ký hiệu cục bộ của hàm được gọi khi nó được gọi; do đó các thông số được truyền theo truyền theo giá trị (call by value) (mà giá trị luôn là một tham chiếu đối tượng, không phải là giá trị của đối tượng).Khi một hàm gọi một hàm khác, một bảng ký hiệu cục bộ được tạo ra cho lệnh gọi đó.

Một định nghĩa hàm tạo tên hàm trong bảng ký hiệu hiện tại. Giá trị của tên hàm có một kiểu được nhận ra bởi trình thông dịch là hàm do người dùng định nghĩa. Giá trị này có thể được gán vào một tên khác và sau đó có thể được sử dụng như một hàm.

Bạn cũng có thể trả lại giá trị cho hàm. Mình sẽ thực hiện đối với hàm fib ở trên nhé:

Code:
#coding: utf-8
def fib(n):    #In mot day cac so Fibonaci cho den n
    """In mot day cac so Fibonaci cho den n"""
    result = []
    a, b = 0, 1
    while b < n:
       result.append(b)
       a, b = b, a+b
    return result
fib100 = fib(100)
print fib100
Để tổng kết lại, chúng ta xem xét ví dụ lớn sau:
Code:
from sys import exit #Cai nay se duoc gioi thieu sau o phan modul
def gold_room():
    print "This room is full of gold. How much do you take?"
    next = raw_input("> ")
    if "0" in next or "1" in next:
        how_much = int(next)
    else:
        dead("Man, learn to type a number.")
    if how_much < 50:
        print "Nice, you're not greedy, you win!"
        exit(0)
    else:
        dead("You greedy bastard!")
def bear_room():
    print "There is a bear here."
    print "The bear has a bunch of honey."
    print "The fat bear is in front of another door."
    print "How are you going to move the bear?"
    bear_moved = False
    while True:
        next = raw_input("> ")
        if next == "take honey":
             dead("The bear looks at you then slaps your face off.")
        elif next == "taunt bear" and not bear_moved:
             print "The bear has moved from the door. You can go through it now."
        bear_moved = True
        elif next == "taunt bear" and bear_moved:
             dead("The bear gets pissed off and chews your leg off.")
        elif next == "open door" and bear_moved:
             gold_room()
        else:
             print "I got no idea what that means."
def cthulhu_room():
    print "Here you see the great evil Cthulhu."
    print "He, it, whatever stares at you and you go insane."
    print "Do you flee for your life or eat your head?"
    next = raw_input("> ")
    if "flee" in next:
        start()
    elif "head" in next:
        dead("Well that was tasty!")
    else:
        cthulhu_room()
def dead(why):
    print why, "Good job!"
    exit(0)
def start():
    print "You are in a dark room."
    print "There is a door to your right and left."
    print "Which one do you take?"
    next = raw_input("> ")
    if next == "left":
        bear_room()
    elif next == "right":
        cthulhu_room()
    else:
        dead("You stumble around the room until you starve.")
start()
Đoạn code ví dụ trên sẽ giúp cho các bạn hiểu cách từ hàm này gọi tới hàm khác. Cũng như kiến thức của các phần trên. Mình mong các bạn cố gắng phân tích kĩ cách thực hiện của ví dụ nhé.

2. Một số cách sử dụng thông số với hàm
Một hàm mặc định khi chúng ta cho nó bao thông số thì khi gọi chúng ta cần bấy nhiêu tham số truyền vào. Điểm đặc biệt trong python là hàm có thể có số thông số nhiều hơn tham số truyền vào, chúng ta cùng đi tham khảo nhé.
2.1 Sử dụng thông số mặc định
Khi chúng ta chỉ định giá trị mặc định cho một hay nhiều thông số, chúng ta có thể gọi hàm với số lượng tham số truyền vào ít hơn số lượng thông số được định nghĩa khi định nghĩa hàm. Ví dụ:

Code:
def ask_ok(prompt, retries=4, complaint='Xin hay nhap \'dung\' hoac \'sai\''):
    while True:
        ok = raw_input(prompt)
        if ok in ('d','dung): return True
        if ok in ('s', 'sa', 'sai'): return False
        retries = retries - 1
        if retries < 0: raise IOError, 'refusenik user'
        print complaint
Như trên bạn thấy muốn gọi đến hàm trên cần truyền vào 3 tham số prompt, retries và complaint. Nhưng do tôi đã sử dụng giá trị mặc định cho thông số nên ta có thể gọi đến hàm với ít tham số hơn như: ask_ok('Ban co thuc su muon quit') hay như sau ask_ok('Ban muon ghi vao file?') .

Hôm nay mình viết đến đây, các bạn cố gắng về đọc và thực hành. Bài sau mình sẽ viết tiếp về 1 số cách xử lý thông số của hàm. Sau đây là bài tập của các bạn:



  • Viết 1 hàm thực hiện việc giải phương trình bậc 2: ax^2 + bx + c = 0
  • Viết 1 hàm thực hiện việc đổi số nhập vào (thập phân) ra hệ cơ số 2, 8 và 16.
2.2 Thông số từ khóa
Giả sử bạn gọi đến hàm và bạn chỉ muốn giá trị cho 1 số thông số của hàm, bạn phải làm thế nào? Hay sử dụng thông số từ khóa nhé. Nó có dạng "từ khóa = giá trị". Ta xem xét ví dụ sau để biết rõ hơn nhé:
Code:
#coding: utf-8
def hs(ten_duong, so_nha = 1, tang = 4):
    print "Bạn đang ở %s số nhà %s tầng %s." % (ten_duong,so_nha,tang)
#ta có thể gọi đến hàm trên như sau:
hs("Hoàng Diệu")
hs("Hoàng Diệu",so_nha = 13)
hs(so_nha = 12,ten_duong = "Hoàng Diệu")
hs(tang = 1, ten_duong = "Hoàng Diệu")
Như trên bạn thấy rằng chúng ta có gọi hàm với các thứ tự tham số truyền vào không đúng với thông số của hàm, chỉ cần truyền theo dạng "từ khóa = giá trị". Ngoài ra bạn có thể truyền giá trị cho thông số mà mình cần.
Đây là một cách sử dụng rất hay của thông số từ khóa. Nhưng 1 số lời gọi sau sẽ bị lỗi:
Code:
hs()                                                          # required argument missing
hs(ten_duong = "Hoàng Diệu", 4)                        # non-keyword argument following keyword
hs("Hoàng Diệu", ten_duong = "Nguyễn Trãi")    # duplicate value for argument
hs(ngo = "68/23")                                                 # unknown keyword
Chú ý: Không thông số nào có thể nhận một giá trị nhiều hơn một lần -- tên thông số chính quy tương ứng với thông số vị trí không thể được dùng làm từ khóa trong cùng một lời gọi.
Khi thông số chính quy cuối có dạng **name , nó nhận một từ điển (dictionary) chứa tất cả các thông số từ khóa trừ những từ khóa tương ứng với thông số chính quy. Điểm này có thể được dùng chung với một thông số chính quy ở dạng *name (bàn đến trong mục con sau) và nhận một bộ (tuple) chứa các thông số vị trí sau danh sách thông số chính quy. (*name bắt buộc phải xuất hiện trước **name.) Ví dụ, nếu ta định nghĩa một hàm như sau:
Code:
#coding: utf-8
def shop(name, *arguments, **keywords):
    print "Are you want to buy %s? \nYes" % name
    print "I'm sorry, I have many kinds, what kind you want to buy?"
    for arg in arguments:
        print arg
    keys = keywords.keys()
    keys.sort()
    for kw in keys: print kw, ': ', keywords[kw]
shop("Storage Drive", "HDD : Hard Disk Drive", "SSD : Solid State Drive",
    USB = 'Universal Serial Bus', FD = 'Flash Disk')
Và đây là kết quả:
Lưu ý rằng phương thức sort() của danh sách các tên thông số từ khóa được gọi trước khi in nội dung của từ điển keywords ; nếu điều này không được thực hiện, thứ tự các thông số được in ra không xác định.

2.3 Danh sách thông số bất kì:
Theo yêu cầu chung, một vài tính năng thường thấy trong các ngôn ngữ lập trình hàm như Lisp đã được thêm vào Python. Với từ khóa lambda , các hàm vô danh (anonymous function) có thể được tạo ra. Đây là một hàm trả vè tổng của hai thông số: "lambda a, b: a+b". Dạng lambda có thể được dùng ở bất kỳ nơi nào cần đối tượng hàm. Cú pháp của chúng giới hạn ở một biểu duy nhất. Về ý nghĩa, chúng chỉ là một cách viết gọn của một định nghĩa hàm bình thường. Giống như các định nghĩa hàm lồng nhau, dạng lambda có thể tham chiếu các biến từ phạm vi chứa nó:
>>> def make_incrementor(n):
... return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43
Hôm nay bài học kết thúc tại đây. Các bạn thực hành 1 vài bài tập nho nhỏ để hiểu rõ thêm nhé.
  • Sử dụng kiến thức trong bài xây dựng một hàm có tác dụng sau: Tính lương cho phóng viên:Nếu nhập tham số truyền vào có số ngày công và số bài viết thì công thức tính lương = 150000 * số ngày công +5% số bài viết(nếu số bài viết lớn hơn 200) * 5000. Nếu tham số truyền vào có phụ cấp công tác thì cộng thêm 10000 vào lương cơ bản (150000).
  • Sử dụng kiến thức trong bài xây dựng hàm đổi từ hệ thập phân ra nhị phân, bát phân, thập lục phân. Nếu chỉ gọi hàm với tham số truyền vào là n thì kết quả trả về là hệ nhị phân. Nếu có thêm hệ cơ số thì trả về hệ cơ số đó.

Bài 9: Cấu trúc dữ liệu trong Python

Hôm nay chúng ta sẽ cùng nhau đi tìm hiểu kĩ hơn 1 số kiểu dữ liệu trong Python, các phương thức của kiểu dữ liệu đó. Bài này, mình sử dụng shell Python để ví dụ nhé. Nào, chúng ta cùng vào bài học ngay bây h nhé.

1. Danh sách

Python có một số kiểu dữ liệu gộp, dùng để nhóm các giá trị với nhau. Kiểu linh hoạt nhất là danh sách (list), có thể được viết như là một danh sách các giá trị phân cách bởi dấu phẩy ở giữa ngoặc vuông.
Code:
a = ['ga', 'vit', 12, 1234]
Để tương tác với các giá trị của danh sách, chúng ta sử dụng các chỉ mục. Chỉ mục trong Python có giá trị bắt đầu là 0. Nó cũng giống với việc chúng ta sử dụng kiểu dữ liệu mảng của các ngôn ngữ lập trình như pascal, C ...

Code:
>>> a[0]
'ga'
>>>a[3]
1234
Với danh sách, chúng ta có thể cắt nhỏ, gộp các danh sách với nhau:

Code:
>>> a[1:-1] #Cat nho
['vit', 12]
>>> a[:2] + ['cho', 2*2] #Gop danh sach
['ga', 'vit', 'cho', 4]
>>> 3*a[:3] + ['Boo!']
['ga', 'vit', 12, 'ga', 'vit', 12, 'ga', 'vit', 12, 'Boo!']
Ngoài ra, chúng ta còn có thể thay đổi giá trị của danh sách:

Code:
>>> a
['ga', 'vit', 12, 1234]
>>> a[2] = a[2] + 111 # 12 + 111
>>> a
['ga', 'vit', 123, 1234]
Tiếp đến là thay đổi các kích thước của danh sách.

Code:
>>> # Thay the 1 vai muc:
... a[0:2] = [1, 12]
>>> a
[1, 12, 123, 1234]
>>> # Xoa bo 1 vai muc:
... a[0:2] = []
>>> a
[123, 1234]
>>> # Chen them vao ds:
... a[1:1] = ['abc', 'abcd']
>>> a
[123, 'abc', 'abcd', 1234]
>>> # Nhan ban phan tu cua danh sach:
>>> a[:0] = a
>>> a
[123, 'abc', 'abcd', 1234, 123, 'abc', 'abcd', 1234]
>>> # Xoa bo cac phan tu cua danh sach (thay the cac phan tu do bang phan tu trong)
>>> a[:] = []
>>> a
[]
Lồng các danh sách vào nhau:
Code:
>>> q = [2, 3]
>>> p = [1, q, 4]
>>> len(p)
3
>>> p[1]
[2, 3]
>>> p[1][0]
2
>>> p[1].append('abc')    #Xem o phan sau
>>> p
[1, [2, 3, 'abc'], 4]
>>> q
[2, 3, 'abc']
Phương thức của danh sách:
append( x)
Thêm một phần tử vào cuối danh sách; tương đương với a[len(a):] = [x].
extend( L)
Nới rộng danh sách bằng cách chèn vào tất cả các phần tử của danh sách chỉ định; tương đương với a[len(a):] = L.
insert( i, x)
Chèn một phần tử vào vị trí chỉ định. Thông số đầu là chỉ mục của phần tử sẽ bị đẩy lùi, cho nên a.insert(0, x) chèn vào đầu danh sách, và a.insert(len(a), x) tương đương với a.append(x).
remove( x)
Bỏ ra khỏi danh sách phần tử đầu tiên có giá trị là x. Sẽ có lỗi nếu không có phần tử như vậy.
pop( [a ])
Bỏ khỏi danh sách phần tử ở vị trí chỉ định, và trả về chính nó. Nếu không chỉ định vị trí, a.pop() bỏ và trả về phần tử cuối trong danh sách. (Ngoặc vuông xung quanh a trong khai báo hàm cho biết thông số đó là không bắt buộc, không có nghĩa là bạn cần gõ dấu ngoặc vuông ở vị trí đó.
index( x)
Trả về chỉ mục của phần tử trong danh sách mà có giá trị là x. Sẽ có lỗi nếu không có phần tử như vậy.
count( x)
Trả về số lần x xuất hiện trong danh sách.
sort( )
Sắp xếp các phần tử trong danh sách, ngay tại chỗ.
reverse( )
Đảo ngược thứ tự các phần tử trong danh sách, ngay tại chỗ.
Ví dụ:
Code:
>>> a = [22.25, 111, 111, 1, 1234.5]
>>> print a.count(111), a.count(22.25), a.count('x')
2 1 0
>>> a.insert(2, -1)
>>> a.append(111) #Chen vao 111 o cuoi danh sach
>>> a
[22.25, 111, -1, 111, 1, 1234.5, 111]
>>> a.index(111) #Xem chi muc cua 111
1
>>> a.remove(111) #Xoa bo phan tu mang gia tri 111 dau tien
>>> a
[22.25, -1, 111, 1, 1234.5, 111]
>>> a.reverse() #Dao nguoc danh sach
>>> a
[111, 1234.5, 1, 111, -1, 22.25]
>>> a.sort() #Sap xep
>>> a
[-1, 1, 22.25, 111, 111, 1234.5]
Từ những phương thức trên, không biết các bạn có thể hình dung được cách sử dụng linh hoạt danh sách như ngăn xếp hay hàng đợi không nhỉ? Nếu không, chúng ta sẽ xem thử ở phần 2 nhé.
2. Sử dụng danh sách như ngăn xếp
Các phương thức của danh sách làm cho nó rất dễ sử dụng như là ngăn xếp (stack), là nơi mà phần tử cuối được thêm vào là phần tử đầu được lấy ra (``vào sau, ra trước'' hay ``last-in, first-out''). Để thêm phần tử vào đỉnh của ngăn xếp, dùng append(). Để lấy một phần tử từ đỉnh của ngăn xếp, dùng pop() mà không chỉ định chỉ mục.
Ví dụ:
Code:
>>> stack = [1,2,3]
>>> stack.append(4)
>>> stack.append(5)
>>> stack
[1,2,3,4,5]
>>> stack.pop()
5
>>> stack
[1,2,3,4]
>>> stack.pop()
4
>>> stack.pop()
3
>>> stack
[1,2]
3. Sử dụng danh sách như hàng đợi.
Bạn cũng có thể thuận tiện dùng danh sách như là hàng đợi (queue), nơi mà phần tử được thêm vào đầu tiên là phần tử được lấy ra đầu tiên ("vào trước, ra trước'' hay "first-in, first-out''). Để thêm một phần tử vào cuối hàng đợi, dùng append(). Để lấy một phần tử từ đầu hàng đợi, dùng pop() với 0 là chỉ mục.
Code:
>>> queue = ["cho", "meo", "ga"]
>>> queue.append("trau")  
>>> queue.append("bo")
>>> queue.pop(0)
'cho'
>>> queue.pop(0)
'meo'
>>> queue
['ga', 'trau', 'bo']

Hôm nay chúng ta sẽ cùng nhau đi tìm hiểu tiếp 1 số kiểu dữ liệu trong Python, các phương thức của kiểu dữ liệu đó.

1. Tập hợp (set)
Một tập hợp là một nhóm các phần tử không trùng lặp. Tập hợp thường được sử dụng để loại bỏ các phần tử trùng lặp trong danh sách, hay là dùng để kiểm tra nhân viên, hội viên....

Cú pháp:
Code:
>>>a = ['a','b','a','d','c','d']
>>>taphop = set(a)
set(['a', 'c', 'b', 'd']) #nó đã bỏ đi các phần tử giống nhau
>>>'a' in taphop #kiểm tra xem a có phải phần tử của tập hợp không
True
Với kiểu dữ liệu tập hợp, chúng ta cũng có 4 toán tử tác động tới tập hợp: hợp, giao, hiệu, và hiệu đối xứng.

Code:
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # những kí tự có trong a
set(['a', 'r', 'b', 'c', 'd'])
>>> a - b                              # kí tự có trong a nhưng không có trong b
set(['r', 'd', 'b'])
>>> a | b                              # kí tự có ở a hoặc b
set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
>>> a & b                              # kí tự có cả ở a và b
set(['a', 'c'])
>>> a ^ b                              # kí tự có ở a hoặc b nhưng không có ở cả hai
set(['r', 'd', 'b', 'm', 'z', 'l'])
2. Từ điển
Các bạn đã sử dụng danh sách (list) không biết có liên tưởng đến việc thao tác với danh sách giống việc chúng ta tra 1 cuốn từ điển không nhỉ? Câu trả lời là việc thao tác với danh sách giống với việc thao tác với từ điển, điểm khác nhau là chỉ mục của danh sách là số, còn chỉ mục của từ điển là chuỗi (string). Python cung cấp cho chúng ta việc đặt các chỉ mục của danh sách bằng các chuỗi, từ đó chúng ta có thể tương tác với các phần tử của danh sách giống như việc sử dụng 1 cuốn từ điển.
Điểm quan trọng nhất các bạn cần nhớ là chỉ mục của từ điển được sử dụng là các khóa không đổi, tức là dữ liệu cố định: số, chuỗi..Nếu các bạn dùng danh sách làm khóa cho từ điển thì sẽ bị lỗi vì danh sách có thể tương tác trực tiếp với các phương thức của nó: append() hay pop()...
Cú pháp để tạo từ điển:
Code:
a = {khoa1:giatri1,khoa2:giatri2,...}
Ví dụ:
Code:
>>> a = {'dog':'cho','chicken':'ga','bird':'chim'}
>>> a
{'chicken': 'ga', 'dog': 'cho', 'bird': 'chim'}
>>> a['chicken'] #cách thao tác với 1 phần tử của từ điển
'ga'
Từ điển có 3 phương thức là keys(), sort(), has_key(): Phương thức keys() của đối tượng từ điển trả về một danh sách các khóa đã được dùng trong từ điển, theo một thứ tự bất kỳ (nếu bạn muốn chúng được sắp xếp, chỉ cần áp dụng phương thức sort() vào danh sách các khóa). Để kiểm tra xem một khóa có trong từ điển hay không, có thể dùng phương thức has_key() hoặc từ khóa in . Ngoài ra, để xóa 1 cặp khóa:giátrị bạn có thể sử dụng câu lệnh del(). Sau đây là 1 ví dụ nhỏ, cơ bản:
Code:
>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> tel.keys()
['guido', 'irv', 'jack']
>>> tel.has_key('guido')
True
>>> 'guido' in tel
True
Cuối cùng, để các bạn thực sự hiểu hết về từ điển, mời các bạn thử chương trình dưới đây. Mình mong muốn các bạn tự gõ code bằng tay, không paste nhé. Hay dùng comment để ghi vào chương trình dự đoán của bạn về các thông tin in ra màn hình:
Code:
states = {
'Oregon': 'OR',
'Florida': 'FL',
'California': 'CA',
'New York': 'NY',
'Michigan': 'MI'
}

cities = {
'CA': 'San Francisco',
'MI': 'Detroit',
'FL': 'Jacksonville'
}

cities['NY'] = 'New York'
cities['OR'] = 'Portland'# print out some cities
print '-' * 10
print "NY State has: ", cities['NY']
print "OR State has: ", cities['OR']

print '-' * 10
print "Michigan's abbreviation is: ", states['Michigan']
print "Florida's abbreviation is: ", states['Florida']

print '-' * 10
print "Michigan has: ", cities[states['Michigan']]
print "Florida has: ", cities[states['Florida']]

print '-' * 10
for state, abbrev in states.items():
    print "%s is abbreviated %s" % (state, abbrev)

print '-' * 10
for abbrev, city in cities.items():
    print "%s has the city %s" % (abbrev, city)

print '-' * 10
for state, abbrev in states.items():
    print "%s state is abbreviated %s and has city %s" % (state, abbrev, cities[abbrev])

print '-' * 10
state = states.get('Texas', None)
if not state:
    print "Sorry, no Texas."

city = cities.get('TX', 'Does Not Exist')
print "The city for the state 'TX' is: %s" % city
Bài học hôm nay kết thúc tại đây. Buổi sau mình sẽ đi giới thiệu về hàm trong Python nhé. Mời các bạn đón đọc.

Bài 2: Cấu trúc lặp và hàm điều khiển trong Python

Hôm nay chúng ta sẽ tìm hiểu về Cấu trúc lặp và hàm điều khiển nhé.

1, For và While
Hàm for là 1 hàm thường thấy trong các ngôn ngữ lập trình. Các bạn chú ý for trong Python có đặc điểm riêng nhé: Thay vì lặp qua một dãy số (như trong Pascal), hoặc cho phép người dùng tự định nghĩa bước lặp và điều kiện dừng (như C), câu lệnh for của Python lặp qua các phần tử của một dãy bất kỳ (một danh sách, hoặc một chuỗi), theo thứ tự mà chúng xuất hiện trong dãy.
Ví dụ:
Code:
a = ['meo', 'cho', 'ga']
for i in a:
    print i, len(i)
Output:


Ở đây có 1 hàm mới là len(i) hàm này sẽ trả lại độ dài của i.
Hàm While cho phép chúng ta lặp với số lần lặp không biết trước, nó sử dụng giá trị logic của điều kiện để cho phép lặp hay không.
Code:
i = 0
while i<8:
    print i
    i = i + 1
Output:
Code:
0
1
2
3
4
5
6
7
Các bạn chú ý điều kiện để kết thúc nhé. Ngoài ra có thể sử dụng True để tạo vòng lặp vô hạn. Lúc đó các bạn cần sử dụng break để kết thúc vòng lặp.
2, Range
Hàm Range() rất tiện dụng để tạo ra 1 danh sách chứa dãy số học theo 1 logic. Có 3 kiểu dùng range():
  • Code:
    range(10)
    [0,1,2,3,4,5,6,7,8,9]
  • Code:
    range(1,5)
    [1,2,3,4]
  • Code:
    range(1,10,3)
    [1,4,7]
    range(-10,-100,-30)
    [-10,-40,-70]
Hàm Range() thường được sử dụng kết hợp với for để lặp. Ngoài ra nếu muốn lặp qua 1 chỉ mục của danh sách, bạn có thể kết hợp giữa for, range() và len():
Code:
a = ['meo','cho','ga','trau']
for i in range(len(a)):
    print i, a[i]
Output:
Code:
0 meo
1 cho
2 ga
3 trau
3, Break và Continue và Else của cấu trúc lặp
  • Break được sử dụng để thoát khỏi vòng lặp nhỏ nhất chứa Break.
  • Continue được sử dụng để bỏ qua 1 lần lặp
  • Trong Python có 1 điều đặc biệt hơn các ngôn ngữ lập trình khác là sau khi lặp xong. Các câu lệnh lặp có thể có vế else ; nó được thực thi khi vòng lặp kết thúc vì danh sách lặp đã cạn (với for) hoặc khi điều kiện là sai (với while), và không được thực thi khi vòng lặp kết thúc bởi câu lệnh break . Ví dụ vòng lặp sau tìm các số nguyên tố:
    Code:
    for n in range(2, 10):
        for x in range(2, n):
            if n % x == 0:
                print n, 'bang', x, '*', n/x
                break
        else:
            print n, 'la so nguyen to'

Bài 3: Cấu trúc rẽ nhánh trong Python

Hôm nay chúng ta sẽ cùng nhau đi học về cấu trúc rẽ nhánh. Có lẽ cấu trúc rẽ nhánh là cấu trúc được sử dụng nhiều nhất khi chúng ta lập trình. Ở Python, lệnh được biết đến nhiều nhất là câu lệnh if . Trước khi đi vào với if, chúng ta sẽ học trước về khối lệnh trong Python.
1, Khối lệnh
Ở các ngôn ngữ lập trình khác, các bạn có lẽ sử dụng đến rất nhiều khối lệnh. Khối lệnh là một tập hợp các câu lệnh, một nhóm các lệnh mà vị thế của nó trong chương trình tương đương với một lệnh khác không nằm trong khối lệnh đó. Ở pascal, nó là begin...end; Ở C nó là {....} v.v.. Nhưng điều đặc biệt là ở Python không có kí hiệu bắt đầu và kết thúc khối lệnh như ở các ngôn ngữ khác. Vậy Python sử dụng gì để xác định khối lệnh? Các bạn chú ý là ở Python thì khối lệnh được xác định bằng độ thụt vào của các lệnh tính từ đầu dòng. Các lệnh liên tiếp có độ thụt vào bằng nhau sẽ được coi như 1 khối lệnh. Khi thụt vào chúng ta có thể dùng khoảng trắng (space) hoặc tab. Một tab được tính bằng 4 dấu cách nhé.
Để hiểu rõ hơn, chúng ta đi vào ví dụ minh họa nhé:
Code:
#coding: utf-8
print "Đây là khối lệnh thứ nhất"
print "Nó nằm trực tiếp từ đầu dòng"
    print "Đây là khối lệnh thứ hai"
    print "Nó được lùi vào 1 tab so với khối lệnh thứ nhất"
    print "Nó có thể coi là khối lệnh con của khối lệnh thứ nhất"  
     print "Đây là khối lệnh thứ ba",
     print "Nó được lùi vào 1 khoảng trắng so với khối lệnh thứ hai"
     print "Nó có thể coi là khối lệnh con của khối lệnh thứ hai"
2, Cấu trúc rẽ nhánh if .... else và if ..... elif
Cú pháp của câu lệnh if .... else:
Code:
if <điều kiện>:
    <khối lệnh được thụt vào so với if>
hoặc
if <điều kiện>:
    <khối lệnh 1 được thụt vào so với if>
else:
    <khối lệnh 2 được thụt vào so với else>
Điều kiện sẽ xác định xem có thực hiện khối lệnh con của if hay không. Điều kiện sẽ được trả về giá trị logic True hoặc False. Cách thức thực hiện của IDE sẽ là:
  • Kiểm tra điều kiện, nếu điều kiện trả về giá trị đúng thì thực hiện khối lệnh con ngay sau if, nếu điều kiện sai kiểm tra tiếp có else hay không, nếu có else sẽ thực hiện tiếp khối lệnh con sau else, còn không có else sẽ chuyển tiếp sang lệnh tiếp theo.
Cú pháp của câu lệnh if ..... elif:
Code:
if <điều kiện 1>:
    <Khối lệnh 1>
elif <điều kiện 2>:
    <Khối lệnh 2>
.
.
elif <điều kiện n>:
    <Khối lệnh n>
else:
    <khối lệnh mặc định>
Cách thức hoạt động của khối if...elif tương tự if...else. Phần else là không bắt buộc. Từ khóa `elif' là viết tắt của `else if', và dùng để tránh thụt vào quá nhiều. Dãy if ... elif ... elif ... dùng thay cho câu lệnh switch hay case tìm thấy trong các ngôn ngữ khác.
Các bạn hãy xem ví dụ dưới để hiểu rõ hơn về cấu trúc rẽ nhánh nhé:
Code:
thang = int(raw_input('Nhap vao thang nay (0 < thang < 13): '))
nam = int(raw_input('Nhap vao nam nay (0 < nam): '))
if thang in [1,3,5,7,8,10,12]:
    print "Thang %s nam %s co 31 ngay." % (thang,nam)
elif thang in [4,6,9,11]:
    print "Thang %s nam %s co 30 ngay." % (thang,nam)
else:
    if (nam%4 == 0 and nam%100 <> 0) or (nam%400 == 0):
        print "Thang hai nam %s co 29 ngay." % nam
    else:
        print "Thang hai nam %s co 28 ngay." % nam
Output:
[​IMG]