Python - Chương 02: Cơ bản về Python

Xin chào, hôm nay chúng ta sẽ tiếp tục học về các khái niệm cơ bản trong lập trình và cách sử dụng chúng trong ngôn ngữ Python. Trong chương này, chúng ta sẽ giới thiệu về các cú pháp cơ bản trong ngôn ngữ Python.





Cú pháp cơ bản
Mục tiêu của bạn trong chương này là học cách sử dụng Python và áp dụng vào trong các chương trình của bạn. Để làm điều đó, bạn sẽ cần học các khái niệm khác cần thiết trong ngôn ngữ Python. Bạn cũng sẽ cần tạo một đoạn script dễ hiểu cho việc đánh giá trong tương lai, trong mọi trường hợp bạn muốn cải thiện nó và biến nó thành một công cụ làm việc cho các dự án hacking của bạn.


Định danh
Định danh (identifiers) trong Python là tên được sử dụng để xác định một biến (variable), hàm (function), lớp (class), mô-đun (module) hoặc các đối tượng (object) khác. Một định danh bắt đầu bằng một chữ cái từ A đến Z hoặc a đến z hoặc dấu gạch dưới (_) theo sau là 0 hoặc nhiều chữ cái, dấu gạch dưới và chữ số (0 đến 9).

Python không cho phép các ký tự dấu chấm câu như @, $% trong các định danh. Python là một ngôn ngữ lập trình phân biệt chữ hoachữ thường. Ví dụ, Peoplepeople là hai định danh khác nhau trong Python.

Dưới đây là các quy ước đặt tên định danh trong Python:
  • Tên lớp bắt đầu bằng một chữ cái viết hoa và tất cả các định danh khác bằng một chữ cái viết thường.
  • Nếu bạn đặt dấu gạch dưới cho một định danh, thì định danh đó sẽ được xem là riêng tư (private).
  • Nếu bạn đặt 2 dấu gạch dưới cho một định danh, thì định danh đó được xem là riêng tư rất mạnh (strongly private).
  • Nếu định danh cũng kết thúc bằng 2 dấu gạch dưới, thì định danh đó là tên đặc biệt do ngôn ngữ Python xác định.


Từ đặc biệt
Bảng sau đây cho thấy các từ dành riêng trong Python. Những từ đặc biệt này có thể không được sử dụng dưới dạng hằng (constant) hoặc biến hoặc bất kỳ tên định danh nào khác. Tất cả các từ khóa Python chỉ chứa các chữ cái viết thường.


And Assert Break Class Continue Def Del Elif Else Except
Exec Finally For From Global if import in is lambda
Not Or Pass Print Raise Return Try While With Yield


Dòng và căn lề
Một trong những lưu ý đầu tiên mà các lập trình viên gặp phải khi học Python là thực tế là không có dấu ngoặc nhọn để chỉ ra các khối code cho các lớp và hàm hoặc kiểm soát luồng. Các khối code được biểu thị bằng cách thụt dòng, được cho là khá bất tiện.

Số lượng khoảng trắng trong căn lề có thể thay đổi, nhưng tất cả các câu lệnh trong khối code phải được căn chỉnh lề cùng một lượng. Cả 2 khối code trong ví dụ dưới đây đều chạy bình thường:
if True:
    print "True"
else:
  print "False"
Tuy nhiên, khối code thứ hai trong ví dụ này sẽ tạo ra lỗi:
if True:
    print "Answer"
    print "True"
else:
    print "Answer"
  print "False"
Do đó, trong Python thì tất cả các dòng liên tục được thụt lề với số lượng khoảng trắng tương tự sẽ tạo thành một khối. Sau đây là ví dụ có các khối câu lệnh khác nhau:

*Lưu ý: Đừng cố gắng hiểu logic hoặc các hàm khác nhau được sử dụng. Chỉ cần chắc chắn rằng bạn hiểu được các khối khác nhau ngay cả khi chúng không có sự liên kết chặt chẽ.
#!/usr/bin/python

import sys

try:
  # open file stream
  file = open(file_name, "w")
except IOError:   
  print "There was an error writing to", file_name   
  sys.exit() 
print "Enter '", file_finish, 
print "' When finished" 
while file_text != file_finish:   
  file_text = raw_input("Enter text: ")   
  if file_text == file_finish:     
    # close the file     
    file.close     
    break   
  file.write(file_text)   
  file.write("\n") 
file.close()
file_name = raw_input("Enter filename: ") 
if len(file_name) == 0:   
  print "Next time please enter something"   
  sys.exit() 
try:   
  file = open(file_name, "r") 
except IOError:   
  print "There was an error reading file"   
  sys.exit() 
file_text = file.read() 
file.close() 
print file_text



Câu lệnh nhiều dòng
Các câu lệnh trong Python thường kết thúc bằng một dòng mới. Tuy nhiên, Python cho phép sử dụng ký tự tiếp tục dòng (\) để biểu thị rằng dòng sẽ tiếp tục. Ví dụ:
total = item_one + \         
        item_two + \         
        item_three
Các câu lệnh có trong dấu ngoặc [], {} hoặc () không cần sử dụng ký tự tiếp tục dòng. Ví dụ:
days = ['Monday', 'Tuesday', 'Wednesday',
        'Thursday', 'Friday']



Dấu nháy
Python chấp nhận dấu single ('), double (") và triple (''' hoặc """) để biểu diễn chuỗi ký tự. Dấu triple có thể được sử dụng để kéo dài chuỗi trên nhiều dòng.

*Lưu ý, các dấu singledouble có chức năng tương tự trong Python và bạn có thể diễn đạt chúng một cách tự do bên trong triple.
word ='word'
sentence ="This is a sentence."
paragraph ="""This is a paragraph. 
It ismade up of multiple lines and sentences."""
Chuỗi cũng không thay đổi, có nghĩa là bạn không thể thay đổi chuỗi sau khi bạn đã tạo chuỗi.


Chú thích
Dấu băm (#) không nằm trong chuỗi ký tự mà là cú pháp để bắt đầu một câu chú thích. Tất cả các ký tự sau # và cho đến cuối dòng là một câu chú thích và trình biên dịch của Python sẽ luôn bỏ qua các câu chú thích này.
#!/usr/bin/python 

# First comment print "Hello, Python!";  # second comment

Đoạn code trên sẽ in ra kết quả:
Result

Hello, Python!


Một chú thích có thể nằm trên cùng một dòng sau một câu lệnh hoặc biểu thức:
name = "Madisetti" # This is again comment

Bạn có thể chú thích nhiều dòng giống như dưới đây:
# This is a comment. 
# This is a comment, too. 
# This is a comment, too. 
# I said that already.



Dòng trống
Một dòng chỉ chứa khoảng trắng (có thể có một chú thích) được gọi là một dòng trống và Python hoàn toàn bỏ qua nó. Trong phiên phiên dịch tương tác, bạn phải nhập một dòng trống để chấm dứt câu lệnh đa dòng.


Chờ người dùng
Câu lệnh dưới đây của chương trình hiển thị thông báo "Press the enter key to exit" và đợi người dùng nhấn phím Enter:
#!/usr/bin/python 

raw_input("\n\nPress the enter key to exit.")

Ở đây, "\n\n" đang được sử dụng để tạo hai dòng mới trước khi hiển thị một dòng thực sự. Khi người dùng nhấn phím Enter, chương trình kết thúc. Đây là một mẹo hay để giữ cửa sổ giao diện console mở cho đến khi người dùng hoàn thành với một ứng dụng.


Đa câu lệnh trong một dòng
Dấu chấm phẩy (;) cho phép nhiều câu lệnh trên một dòng được đưa ra mà không câu lệnh nào bắt đầu một khối code mới. Đây là một ví dụ mẫu về cách sử dụng dấu chấm phẩy:
import sys; x = 'foo'; sys.stdout.write(x + '\n')



Nhóm đa câu lệnh (Suites)
Một nhóm các câu lệnh riêng lẻ tạo ra một khối code duy nhất được gọi là bộ (suite) trong Python. Các câu lệnh ghép hoặc phức - chẳng hạn như if, while, defclass là các câu lệnh yêu cầu một dòng tiêu đề (header) và một bộ (suite).

Các dòng tiêu đề (header) bắt đầu câu lệnh (với từ khóa) và chấm dứt bằng dấu hai chấm (:) và được theo sau bởi một hoặc nhiều dòng, tạo nên bộ. Ví dụ:
if expression :
  suite 
elif expression :     
  suite  
else :     
  suite



Các đối số dòng lệnh
Ví dụ, bạn có thể đã thấy rằng nhiều chương trình có thể được chạy và họ cung cấp cho bạn một số thông tin cơ bản về cách chúng được chạy như thế nào. Python cho phép bạn làm điều này với dòng lệnh -h:
$ python -h 
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... 
Options and arguments (and corresponding environment variables): 
-c cmd : program passed in as string (terminates option list) 
-d     : debug output from parser (also PYTHONDEBUG=x) 
-E     : ignore environment variables (such as PYTHONPATH) 
-h     : print this help message and exit 

[ etc. ]

Bạn cũng có thể lập trình các dòng lệnh của mình theo cách nó sẽ chấp nhận các tùy chọn khác nhau.


Truy cập các đối số dòng lệnh
Python cung cấp một module getopt giúp bạn phân tích các tùy chọn và các đối số dòng lệnh.
$ python test.py arg1 arg2 arg3

Module sys cung cấp quyền truy cập vào bất kỳ đối số dòng lệnh nào thông qua sys.argv. Điều này phục vụ hai mục đích:
  • sys.argv là danh sách các đối số dòng lệnh.
  • len(sys.argv) là số lượng các đối số dòng lệnh.
Xem xét một ví dụ đơn giản như dưới đây:
#!/usr/bin/python 

import sys 
print 'Number of arguments:', len(sys.argv), 'arguments.' 
print 'Argument List:', str(sys.argv)

Chạy thử đoạn script
$ python test.py arg1 arg2 arg3

Màn hình console sẽ cho ra kết quả như dưới đây:
Result

Number of arguments: 4 arguments.


Argument List: ['test.py', 'arg1', 'arg2', 'arg3']


*Lưu ý: Như đã đề cập ở trên, đối số đầu tiên luôn là tên script và nó cũng đang được tính theo số lượng các đối số.


Phân tích cú pháp các đối số dòng lệnh
Python cung cấp một module getopt giúp bạn phân tích các tùy chọn và đối số dòng lệnh. Module này cung cấp hai hàm (function) và một ngoại lệ (exception) để cho phép phân tích cú pháp đối số dòng lệnh. Hướng dẫn này sẽ thảo luận về một hàm và một ngoại lệ, đủ cho các yêu cầu lập trình của bạn.

Hàm getopt.getopt phân tích các tùy chọn dòng lệnh và danh sách tham số. Sau đây là cú pháp đơn giản cho hàm này:
getopt.getopt(args, options[, long_options])

Đây là danh sách các tham số trong hàm này:
  • args: Đây là danh sách đối số sẽ được phân tích cú pháp.
  • options: Đây là chuỗi các chữ cái tùy chọn mà đoạn script muốn nhận ra, với các tùy chọn yêu cầu một đối số nên được theo sau bởi dấu hai chấm (:).
  • long_options: Đây là tham số tùy chọn và nếu được chỉ định thì phải là danh sách các chuỗi có tên của các tùy chọn dài mà chúng phải được hỗ trợ. Các tùy chọn dài yêu cầu một đối số nên được theo sau bởi một dấu bằng (=). Để chấp nhận các tùy chọn dài, các tùy chọn phải là một chuỗi trống.

Hàm này trả về giá trị bao gồm hai phần tử: đầu tiên là danh sách các cặp tuỳ chọn - giá trị (option - value). Thứ hai là danh sách các đối số chương trình còn lại sau khi danh sách tùy chọn bị lấy đi.

Mỗi cặp tùy chọn - giá trị được trả về có tùy chọn là phần tử đầu tiên của nó, có tiền tố là dấu gạch nối cho các tùy chọn ngắn (ví dụ: '-x') hoặc hai dấu gạch nối cho các tùy chọn dài (ví dụ: '--long-option').

Ngoại lệ getopt.GetoptError xuất hiện khi một tùy chọn không được nhận dạng hoặc không tìm thấy trong danh sách đối số hoặc khi một tùy chọn yêu cầu đối số không được đưa ra.

Đối số cho ngoại lệ là một chuỗi chỉ ra nguyên nhân bị lỗi. Cả 2 thuộc tính msgopt cung cấp thông báo lỗi và tùy chọn liên quan.

Chúng ta hãy xem xét trường hợp muốn chuyển tên 2 đoạn script thông qua dòng lệnh và chúng ta cũng muốn cung cấp tùy chọn để kiểm tra việc sử dụng đoạn script. Cách sử dụng script như sau:
usage: test.py -i  -o 

Đây là đoạn code script test.py:
#!/usr/bin/python 

import sys, getopt 

def main(argv):    
  inputfile = ''    
  outputfile = ''    
  try:       
    opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])    
  except getopt.GetoptError:       
    print 'test.py -i  -o '       
    sys.exit(2)    
  for opt, arg in opts:       
    if opt == '-h':          
      print 'test.py -i  -o '          
      sys.exit()       
    elif opt in ("-i", "--ifile"):          
      inputfile = arg       
    elif opt in ("-o", "--ofile"):          
      outputfile = arg
    print 'Input file is "', inputfile    
    print 'Output file is "', outputfile
 
if __name__ == "__main__":    
  main(sys.argv[1:])




Tóm tắt
Trong chương này chúng ta đã được học các khái niệm cơ bản trong lập trình và cách sử dụng các định danh, biến, hàm số, và các câu chú thích trong Python. Ở chương sau, chúng ta sẽ đi sâu tìm hiểu về biến trong Python và cách sử dụng chúng. Cám ơn các bạn đã xem bài viết.
Next Post Previous Post
No Comment
Add Comment
comment url