1. Trang chủ
  2. » Giáo án - Bài giảng

Bài 2 functions và packages

15 1 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Trong Python, một hàm là một nhóm các câu lệnh liên quan thực hiện một tác vụ cụ thể. Các hàm giúp chia nhỏ chương trình của chúng ta thành các phần nhỏ hơn và tổ chức lại theo từng môđun. Khi chương trình của chúng ta phát triển ngày càng lớn hơn, các hàm giúp cho nó dễ tổ chức và dễ quản lý hơn. Hơn nữa, nó tránh lặp lại các đoạn code và làm cho code có thể được sử dụng lại.

ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC BÀI FUNCTIONS & PACKAGES Functions (các hàm) Trong Python, hàm nhóm câu lệnh liên quan thực tác vụ cụ thể Các hàm giúp chia nhỏ chương trình thành phần nhỏ tổ chức lại theo mơ-đun Khi chương trình phát triển ngày lớn hơn, hàm giúp cho dễ tổ chức dễ quản lý Hơn nữa, tránh lặp lại đoạn code làm cho code sử dụng lại  Cú pháp hàm: def Tên_hàm(Các tham số): """Docstring""" Thân hàm Trong đó: o Từ khóa def: đánh dấu bắt đầu tiêu đề hàm o Tên_hàm: Được người lập trình đặt Việc đặt tên hàm tuân theo quy tắc đặt tên Python (xem 1) o Các tham số: Mà qua truyền giá trị cho hàm Chúng tùy chọn o Dấu hai chấm (:) để đánh dấu phần cuối tiêu đề hàm o Chuỗi docstring tùy chọn: Để mô tả chức hàm o Thân hàm: Một nhiều câu lệnh python hợp lệ tạo nên thân hàm Các câu lệnh phải có mức tab đầu dịng (thụt lề, thường dấu cách) Một câu lệnh return (tùy chọn) để trả giá trị từ hàm hàm muốn Ví dụ: Viết hàm tính n! với n số nguyên dương def Giaithua(n): G = for i in range(1, n+1): G *= i return G Hàm với tên gọi Giaithua, tham số n Trong thân hàm, ta sử dụng vòng lặp for để tính n! Câu lệnh return G trả giá trị n! tính Trang ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC  Gọi hàm Khi định nghĩa hàm, gọi từ hàm khác, chương trình khác chí dấu nhắc lệnh Python Để gọi hàm, cần gõ tên hàm với đối số thích hợp cho tham số (nếu có) Ví dụ: với hàm Giaithua() trên, ta muốn in 5!, ta gọi hàm sau: print(Giaithua(5)) Số (được gọi đối số, argument) truyền vào hàm thông qua tham số (parameter) n (n nhận giá trị 5) Đối số biến, ví dụ: a = print(Giaithua(a)) Lưu ý: Trong python, định nghĩa hàm phải ln có trước lệnh gọi hàm Nếu không, gặp lỗi  Câu lệnh return Câu lệnh return sử dụng để thoát hàm quay trở lại vị trí mà gọi Giá trị sau return (nếu có) gọi giá trị trả hàm Lời gọi hàm tương đương với biến biến chứa giá trị trả Lệnh return Python trả nhiều giá trị, gọi danh sách biểu thức (expression list), biểu thức cách dấu cách Cú pháp: return [danh sách biểu thức] Ví dụ: Hàm sau trả max ba số a, b, c: def MaxMin(a, b, c): max = = a if b > max: max = b if c > max: max = c if b < min: = b if c < min: = c return max, Lệnh return hàm MaxMin() trả hai giá trị, thông qua hai biểu thức đặt sau nó, cách dấu cách (max min) Đoạn trình sau sử dụng hàm MaxMin() để tìm số lớn nhỏ ba số 5, 2, 8: Trang ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC max, = MaxMin(5, 2, 8) print('Max:', max) print('Min:', min) Kết ta thu được: Max: Min: Nếu biểu thức sau câu lệnh return, thân câu lệnh return khơng có bên hàm, hàm trả trả đối tượng None  Phạm vi hoạt động biến Phạm vi biến đoạn trình mà biến nhận Các tham số hàm biến định nghĩa bên hàm khơng “nhìn thấy” từ bên ngồi hàm Nói cách khác, phạm vi hoạt động thân hàm Do đó, chúng có phạm vi cục (local variable) Thời gian tồn biến khoảng thời gian mà biến tồn nhớ Thời gian tồn biến bên hàm thời gian mà hàm thực thi Chúng bị giải phóng quay trở lại chỗ gọi hàm Do đó, hàm khơng nhớ giá trị biến từ lần gọi trước Ví dụ: Trong đoạn code sau, ta sử dụng hai biến x Một biến x cục thân hàm Nó mang giá trị 10 Biến có phạm vi hoạt động thân hàm my_func() Biến x thứ có giá trị 20 biến hồn tồn mới, có phạm vi hoạt động khác với biến x thứ nhất: def my_func(): x = 10 print("Giá trị x hàm:",x) x = 20 my_func() print("Giá trị x hàm: ",x) Kết ta thu được: Giá trị x hàm: 10 Giá trị x hàm: 20 Bài tập 2.1 o Viết hàm tính khoảng cách Euclidean hai điểm A(x1, y1) B(x2, y2) o Viết hàm kiểm tra xem hai điểm A, B, điểm gần tâm O Trang ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGÔN NGỮ LẬP TRÌNH KHOA HỌC o Chương trình chính: Nhập vào tọa độ hai điểm A, B Sử dụng hàm để tính in ra: - Khoảng cách A, B - Chu vi tam giác OAB - Cho biết A hay B gần tâm O Argument (đối số) Khi định nghĩa hàm, hàm có tham số, gọi hàm, ta cần truyền đầy đủ giá trị cho tham số Giá trị truyền vào hàm gọi hàm (thông qua tham số) gọi đối số Ví dụ: Hàm Chao() sau có hai tham số Ten Thongdiep: def Chao(Ten, Thongdiep): print("Xin chào", Ten + ', ' + Thongdiep) Khi gọi hàm, giả sử ta viết: Chao("Hoàng", "chúc buổi sáng tốt lành!") Kết ta thu được: Xin chào Hồng, Chúc buổi sáng tốt lành! Vì hàm Chao() có hai tham số gọi nó, ta truyền cho hai đối số nên hàm thực thi mà không xảy lỗi đối số Nếu ta truyền cho đối số, hàm báo lỗi: Chao("Hồng") Thơng báo lỗi là: “TypeError: Chao() missing required positional argument: 'Thongdiep'” Tuy nhiên, số lượng đối số số lượng tham số số trường hợp, ví dụ trường hợp sử dụng đối số mặc định sau đây:  Đối số mặc định Tham số sử dụng đối số mặc định Khi gọi hàm, ta có hai lựa chọn: 1) Truyền đầy đủ đối số cho tham số và, 2) Truyền thiếu đối số cho tham số có định nghĩa đối số mặc định Như vậy, muốn tham số sử dụng đối số mặc định, ta cần rõ lúc định nghĩa hàm Ví dụ: def Chao(Ten, Thongdiep = "Bạn khỏe khơng ?"): print("Xin chào", Ten + ', ' + Thongdiep) Chao("Hoàng") Kết ta thu được: Trang ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC Xin chào Hồng, Bạn khỏe khơng ? Trong hàm Chao(), tham số Ten khơng có giá trị mặc định u cầu đối số (bắt buộc) gọi Mặt khác, tham số Thongdiep có giá trị mặc định "Bạn khỏe khơng ?" Vì vậy, ta có hai lựa chọn Nếu giá trị cung cấp cho tham số thứ 2, ghi đè lên giá trị mặc định Ngược lại, thiếu đối số cho tham số này, sử dụng giá trị mặc định Tại lời gọi hàm Chao("Hoàng"), ta thiếu đối số dành cho tham số thứ hai Nhưng định nghĩa hàm, tham số thứ hai có đối số mặc định “Bạn khỏe khơng ?” Do vậy, sử dụng đối số mặc định Hàm sử dụng đối số mặc định ta không truyền đối số cho tham số tham số định nghĩa đối số mặc định Cách định nghĩa tham số có đối số mặc định: Tên_tham_số = Giá_trị_mặc_định Bất kỳ tham số hàm định nghĩa giá trị đối số mặc định Nhưng có tham số có giá trị mặc định, tất tham số bên phải phải có giá trị mặc định Nói khác đi, ta khơng thể định nghĩa tham số Ten có giá trị mặc định, tham số Thongdiep lại khơng có Hàm sau có báo lỗi thực thi: def Chao(Ten = 'Bạn ơi', Thongdiep): print("Xin chào", Ten + ', ' + Thongdiep) Chao("Chúc buổi sáng tốt lành") Thơng báo lỗi là: “SyntaxError: non-default argument follows default argument”  Truyền tham số theo tên Khi gọi hàm với đối số, giá trị gán cho tham số theo thứ tự chúng Ví dụ: Với lời gọi hàm: Chao("Hồng", "chúc buổi sáng tốt lành!") tham số thứ Ten nhận đối số “Hoang”, tham số thứ hai Thongdiep nhận đối số thứ “chúc buổi sang tốt lành !” Python cho phép hàm gọi cách sử dụng đối số không theo thứ tự phải rõ tên tham số nhận đối số Khi gọi hàm theo cách này, thứ tự (vị trí) đối số bị thay đổi Ví dụ với hàm Chao() trên: Trang ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGÔN NGỮ LẬP TRÌNH KHOA HỌC def Chao(Ten, Thongdiep): print("Xin chào", Ten + ', ' + Thongdiep) Câu lệnh gọi hàm sau hợp lệ: Chao(Thongdiep='Chúc buổi sáng tốt lành', Ten='Hoang') Lúc đó, thứ tự đối số khơng cịn quan trọng Nếu tham số truyền giá trị theo tên, tất tham số sau phải truyền theo tên Câu lệnh sau không hợp lệ: Chao(Ten='Hoàng', 'Chúc buổi sáng tốt lành')  Truyền tham số với số lượng đối số tùy ý Đôi khi, trước số lượng đối số truyền vào hàm Python cho phép xử lý tình thơng qua lệnh gọi hàm với số lượng đối số tùy ý Trong định nghĩa hàm, sử dụng dấu hoa thị (*) trước tên tham số để biểu thị loại đối số Đây ví dụ: Hàm Chao() sau muốn in lời chào tới nhiều người Số lượng người chào trước nên ta định nghĩa (thêm * vào trước tham số CacTen): def Chao(*CacTen): for x in CacTen: print("Xin chào", x) Khi gọi hàm, ta truyền số lượng đối số tùy thích Sau lời gọi hàm truyền ba đối số: Chao('Hoa', 'Hà', 'Hải') Kết ta thu được: Xin chào Hoa Xin chào Hà Xin chào Hải Global variables (Các biến toàn cục) Trong Python, biến khai báo bên hàm phạm vi toàn cục gọi biến tồn cục Điều có nghĩa biến tồn cục truy cập bên bên ngồi hàm Hãy xem ví dụ cách biến toàn cục tạo Python x = "Biến toàn cục" def foo(): print("x bên trong:", x) Trang ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC foo() print("x bên ngồi:", x) Kết ta thu được: x bên trong: Biến toàn cục x bên ngoài: Biến toàn cục Trong đoạn mã trên, tạo x biến toàn cục định nghĩa hàm foo() để in biến tồn cục x Biến x sử dụng bên hàm hay bên hàm foo()  Phạm vi hoạt động biến Phạm vi biến đoạn trình mà biến nhận Các tham số hàm biến định nghĩa bên hàm không “nhìn thấy” từ bên ngồi hàm Nói cách khác, phạm vi hoạt động thân hàm Do đó, chúng có phạm vi cục (local variable) Thời gian tồn biến khoảng thời gian mà biến tồn nhớ Thời gian tồn biến bên hàm thời gian mà hàm thực thi Chúng bị giải phóng quay trở lại chỗ gọi hàm Do đó, hàm khơng nhớ giá trị biến từ lần gọi trước Ví dụ: Trong đoạn code sau, ta sử dụng hai biến x Một biến x cục thân hàm Nó mang giá trị 10 Biến có phạm vi hoạt động thân hàm my_func() Biến x thứ có giá trị 20 biến hồn tồn mới, có phạm vi hoạt động khác với biến x thứ nhất: def my_func(): x = 10 print("Giá trị x hàm:",x) x = 20 my_func() print("Giá trị x hàm: ",x) Kết ta thu được: Giá trị x hàm: 10 Giá trị x hàm: 20 Ở đây, thấy giá trị x ban đầu 20 Mặc dù hàm my_func() thay đổi giá trị x thành 10, khơng ảnh hưởng đến giá trị bên ngồi hàm Điều biến x bên hàm (cục bộ) khác với biến bên ngồi Mặc dù chúng có tên, chúng hai biến khác với phạm vi khác Trang ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC Mặt khác, biến bên ngồi hàm nhìn thấy từ bên Chúng có phạm vi tồn cục Chú ý: Chúng ta đọc giá trị biến tồn cục từ bên hàm khơng thể thay đổi (ghi) giá trị Ví dụ: x = "Biến toàn cục" def foo(): x = 10 print("x bên trong:", x) foo() print("x bên ngoài:", x) Hàm foo() cố gắng thay đổi giá trị x thành 10 Khi đó, biến x thân hàm foo() biến cục Nó khác với biến x toàn cục Kết ta thu được: x bên trong: 10 x bên ngoài: Biến toàn cục Để sửa đổi giá trị biến bên hàm, chúng phải khai báo biến toàn cục cách sử dụng từ khóa global x = "Biến tồn cục" def foo(): global x x = 10 print("x bên trong:", x) foo() print("x bên ngoài:", x) Kết ta thu được: x bên trong: 10 x bên ngoài: 10 Python modules (Module Python) Một mô-đun tệp chứa câu lệnh Python định nghĩa Một tệp chứa code Python, ví dụ: example.py, gọi mơ-đun tên mơ-đun example Trang ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC Chúng ta sử dụng mô-đun để chia nhỏ chương trình lớn thành tệp mà ta quản lý tổ chức chúng Hơn nữa, mô-đun cung cấp khả tái sử dụng code Chúng ta định nghĩa hàm mà ta sử dụng nhiều mô-đun sử dụng chương trình, ta import nó, thay chép hàm vào chương trình khác  Tạo sử dụng module: Bước Tạo module có tên MyModule: Thêm file py vào project, đặt tên MyModule.py Trong file này, ta định nghĩa hai hàm Cong() Tru() hai số a, b (Hình 2.1) Bước Sử dụng module MyModule.py: Tong file py khác (giả sử file main.py), để sử dụng hai hàm Cong() Tru() chứa MyModule, ta sử dụng câu lệnh import MyModule (Hình 2.2) Python packages (Gói Python) Hình 2.1 Tạo module có tên MyModule Trang ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGÔN NGỮ LẬP TRÌNH KHOA HỌC Hình 2.2 Sử dụng module MyModule lệnh import  Lệnh import [1] Sử dụng tồn module import Tên_module Ví dụ: import MyModule #sử dụng module có tên MyModule import math #sử dụng module có tên math Khi sử dụng tồn module, để truy cập hàm, biến, hằng, định nghĩa module, ta viết thêm tên module vào trước hàm, biến, hằng, Ví dụ: MyModule.cong(a, b) MyModule.tru(a, b) Đặt bí danh cho module: Ta đặt bí danh cho module để sử dụng thành phần nó, ta khơng cần viết tên thật module mà sử dụng bí danh Ví dụ: import MyModule as md print('Tong', md(a, b)) print('Hieu', md(a, b)) [2] Chỉ sử dụng số thứ module Đơi ta khơng cần import tồn module mà cần sử dụng số thành phần (hàm, biến, hằng, ) module Khi ta sử dụng from/ import Ví dụ, ta import riêng rẽ hai hàm cong() tru() MyModule sau: Trang 10 ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGÔN NGỮ LẬP TRÌNH KHOA HỌC from MyModule import cong from MyModule import tru a = 5.5 b = 6.6 print('Tong', cong(a, b)) print('Hieu', tru(a, b)) Khi đó, ta sử dụng hai hàm cong() tru() mà không cần đặt tên module vào trước Ta đặt bí danh cho thành phần mà ta import cho dễ sử dụng, ví dụ hàm cong() đặt bí danh add, hàm tru() đặt bí danh minus Khi đó, ta gọi hai hàm thơng qua bí danh mà khơng thể gọi tên thật: from MyModule from MyModule a = 5.5 b = 6.6 print('Tong', print('Hieu', import cong as add import tru as minus add(a, b)) minus(a, b)) [3] import tất tên module: Để sử dụng tất tên, bao gồm hàm, biến, hằng, module mà không cần rõ tên module sử dụng, ta sử dụng lệnh import * sau (ví dụ sử dụng module MyModule: from MyModule import * Khi đó, thành phần MyModule sử dụng qua tên mà khơng cần đặt tên module phía trước: print('Tong', cong(a, b)) print('Hieu', tru(a, b))  Đặt đường dẫn tới module Khi module đặt thư mục với file py sử dụng nó, trình thơng dịch dễ dàng tìm thấy module Nhưng đặt module nơi đó, chương trình khơng tìm thấy module đó, báo lỗi Khi đó, ta cần biết cách thiết lập đường dẫn tới module: Trong PyCharm, ta làm sau: Bước 1: Chọn tên project, chọn setting (nút setting có biểu tượng góc tên, bên phải cửa sổ Pycharm) Trang nằm 11 ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC Bước 2: Chọn Project: MyProject (ví dụ tên project MyProject), chọn Python Interpreter Cửa sổ hình 2.3 Hình 2.3 Cửa sổ thiết lập đường dẫn tới module Bước Chọn biểu tượng hình 2.4 (góc trên, bên phải), chọn show all Cửa sổ Hình 2.4 Cửa sổ hiển thị tất đường dẫn có Trang 12 ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGÔN NGỮ LẬP TRÌNH KHOA HỌC Bước Chọn biểu tượng (màu đỏ hình 2.4) Một cửa sổ ra, ta chọn biểu tượng dấu +, sau chọn thư mục chứa module chọn OK Bài tập 2.2: Hãy tổ chức mơt chương trình module sau: Module 1: Định nghĩa tỷ giá: USD = 23000, EUR = 26000, RUB = 170 Module 2: - Các hàm quy đổi n USD/ EUR/ RUB VND (ba hàm) - Định nghĩa hàm cộng ba số thực, cộng hai số thực Chương trình chính: - Sử dụng hàm hai module để: Nhập vào số tiền USD, EUR, RUB có; In tổng số tiền VND sau quy đổi Python Packages (Gói module) Một chương trình lớn tạo nhiều module Khi đó, Python cho phép ta tổ chức module cấu trúc thư mục đặc biệt, gọi gói (packages) Chúng ta thường khơng lưu trữ tất tệp máy tính vị trí Chúng ta sử dụng hệ thống phân cấp thư mục tổ chức tốt để truy cập dễ dàng Các tệp tương tự giữ thư mục, chẳng hạn, giữ tất hát thư mục "nhạc" Tương tự vậy, Python có khái niệm gói khái niệm thư mục khái niệm mơ-đun tệp Khi chương trình ứng dụng phát triển kích thước lớn với nhiều mô-đun, đặt mơ-đun tương tự gói Điều làm cho dự án (chương trình) dễ quản lý rõ ràng mặt khái niệm Tương tự, thư mục chứa thư mục tệp, gói Python có gói (sub-packge) mô-đun Một thư mục muốn trở thành gói, ta cần đặt file có tên ‘ init .py’ vào thư mục để Python coi gói Tệp để trống nội dung Tương tự với gói con, có chứa file ‘ init .py’ Vì vậy: o Trong package/ sub-package có chứa: - File dấu: init .py (bắt buộc) - Các file module Trang 13 ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGƠN NGỮ LẬP TRÌNH KHOA HỌC - Sub-packages Hình 2.5 cho thấy gói có tên Game, bên chứa ba gói (Sound, Image, Level) Trong gói module Tất package, subpackage chứa file dấu init .py Hình 2.5 Ví dụ cấu trúc gói  Sử dụng module gói Để import module gói, ta sử dụng tốn tử dấu chấm (.): import Tên_gói.[Tên_gói_con.]Tên_module Ví dụ: để sử dụng module có tên open hình 2.5, ta viết: import Game.Image.open import Game.Image.open as op from Game.Image.open import * from Game.Image import open Đặt đường dẫn tới gói: Nếu chương trình khơng tìm thấy gói mà ta sử dụng có sẵn máy tính, ta đặt đường dẫn tới gói Cách đặt tương tự đặt đường dẫn tới module, giới thiệu phần Trang 14 ĐỀ CƯƠNG BÀI GIẢNG IT6073 – NGÔN NGỮ LẬP TRÌNH KHOA HỌC Bài tập 2.3: o Tạo package theo cấu trúc sau Vớ i module1.py module2.py hai module đ ã tạ o BÀI TẬ P 2.2 MYPACK SUBPACK1 module1.p y SUBPACK2 module2.p y o Viết chương trình BÀI TẬP 2.2 để sử dụng package vừa tạo Trang 15

Ngày đăng: 27/07/2023, 23:38

Xem thêm: