Các hàm do người dùng xác định trong Python W3schools

Tìm hiểu nghệ thuật viết các hàm của riêng bạn bằng Python, cũng như các khái niệm chính như xác định phạm vi và xử lý lỗi

Xem chi tiết Mũi tên phải

bắt đầu khóa học

Viết hàm trong Python

Người bắt đầu

4 giờ

61. 4K

Học cách sử dụng các phương pháp hay nhất để viết các hàm phức tạp, có thể bảo trì, tái sử dụng với tài liệu tốt

Hàm do người dùng xác định (UDF) cho phép bạn tạo một hàm bằng cách sử dụng biểu thức SQL hoặc mã JavaScript. UDF chấp nhận các cột đầu vào, thực hiện các hành động trên đầu vào và trả về kết quả của các hành động đó dưới dạng giá trị

Bạn có thể xác định UDF là liên tục hoặc tạm thời. Bạn có thể sử dụng lại các UDF liên tục trên nhiều truy vấn, trong khi các UDF tạm thời chỉ tồn tại trong phạm vi của một truy vấn

Ghi chú. Các UDF liên tục được gọi an toàn khi được chia sẻ giữa các chủ sở hữu. UDF không thể thay đổi dữ liệu, nói chuyện với các hệ thống bên ngoài hoặc gửi nhật ký tới bộ hoạt động của Google Cloud hoặc các ứng dụng tương tự.

Để tạo UDF, hãy sử dụng câu lệnh

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
4. Để xóa một hàm liên tục do người dùng xác định, hãy sử dụng câu lệnh
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
5. UDF tạm thời hết hạn ngay sau khi truy vấn kết thúc. Câu lệnh
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
5 chỉ được hỗ trợ cho các UDF tạm thời trong các thủ tục và truy vấn đa câu lệnh

Để biết thông tin về UDF trong SQL kế thừa, hãy xem Hàm do người dùng xác định trong SQL kế thừa

SQL UDF

Ví dụ sau tạo một UDF SQL tạm thời có tên là

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
7 và gọi nó từ bên trong câu lệnh
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
8

CREATE TEMP FUNCTION AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);

SELECT
  val, AddFourAndDivide(val, 2)
FROM
  UNNEST([2,3,5,8]) AS val;

Ví dụ này tạo ra đầu ra sau

+-----+-----+
| val | f0_ |
+-----+-----+
|   2 | 3.0 |
|   3 | 3.5 |
|   5 | 4.5 |
|   8 | 6.0 |
+-----+-----+

Ví dụ tiếp theo tạo chức năng tương tự như một UDF liên tục

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);

Vì UDF này là liên tục, nên bạn phải chỉ định tập dữ liệu cho hàm (

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
9 trong ví dụ này). Sau khi bạn chạy câu lệnh
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
4, bạn có thể gọi hàm từ một truy vấn

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
0

Các tham số SQL UDF được tạo mẫu

Một tham số có loại bằng

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
01 có thể khớp với nhiều loại đối số khi hàm được gọi

  • Nếu nhiều tham số có loại
    CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
    RETURNS FLOAT64
    AS (
      (x + 4) / y
    );
    
    01 thì BigQuery không thực thi bất kỳ mối quan hệ loại nào giữa các đối số này
  • Kiểu trả về của hàm không được là
    CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
    RETURNS FLOAT64
    AS (
      (x + 4) / y
    );
    
    01. Nó phải được bỏ qua, có nghĩa là được xác định tự động dựa trên
    CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
    RETURNS FLOAT64
    AS (
      (x + 4) / y
    );
    
    04 hoặc một loại rõ ràng
  • Truyền các đối số hàm của các loại không tương thích với định nghĩa hàm sẽ dẫn đến lỗi khi gọi

Ví dụ sau đây cho thấy một SQL UDF sử dụng tham số templated

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
5

Ví dụ này tạo ra đầu ra sau

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
6

Ví dụ tiếp theo sử dụng tham số templated để trả về phần tử cuối cùng của một mảng thuộc bất kỳ loại nào

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
7

Ví dụ này tạo ra đầu ra sau

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
8

Truy vấn con vô hướng

SQL UDF có thể trả về giá trị của truy vấn con vô hướng. Một truy vấn con vô hướng phải chọn một cột duy nhất

Ví dụ sau đây cho thấy một SQL UDF sử dụng truy vấn con vô hướng để đếm số lượng người dùng có độ tuổi nhất định trong bảng người dùng

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
9

Ví dụ này tạo ra đầu ra sau

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
0

Dự án mặc định trong các biểu thức SQL

Trong nội dung của SQL UDF, mọi tham chiếu đến các thực thể BigQuery, chẳng hạn như bảng hoặc dạng xem, phải bao gồm ID dự án, trừ khi thực thể nằm trong cùng một dự án chạy câu lệnh

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
4

Ví dụ, hãy xem xét tuyên bố sau

+-----+-----+
| val | f0_ |
+-----+-----+
|   2 | 3.0 |
|   3 | 3.5 |
|   5 | 4.5 |
|   8 | 6.0 |
+-----+-----+
0

Nếu bạn chạy câu lệnh này từ ________ 106 và _______ 107 tồn tại trong ________ 106, thì câu lệnh thành công. Tuy nhiên, nếu bạn chạy câu lệnh này từ một dự án khác, thì câu lệnh sẽ không thành công. Để sửa lỗi, hãy bao gồm ID dự án trong tham chiếu bảng

+-----+-----+
| val | f0_ |
+-----+-----+
|   2 | 3.0 |
|   3 | 3.5 |
|   5 | 4.5 |
|   8 | 6.0 |
+-----+-----+
1

Bạn cũng có thể tham chiếu một thực thể trong một dự án hoặc tập dữ liệu khác với dự án hoặc tập dữ liệu mà bạn tạo hàm

+-----+-----+
| val | f0_ |
+-----+-----+
|   2 | 3.0 |
|   3 | 3.5 |
|   5 | 4.5 |
|   8 | 6.0 |
+-----+-----+
2

JavaScript UDF

JavaScript UDF cho phép bạn gọi mã được viết bằng JavaScript từ truy vấn SQL

Ví dụ sau hiển thị JavaScript UDF. Mã JavaScript được trích dẫn trong một chuỗi thô

+-----+-----+
| val | f0_ |
+-----+-----+
|   2 | 3.0 |
|   3 | 3.5 |
|   5 | 4.5 |
|   8 | 6.0 |
+-----+-----+
3

Ví dụ này tạo ra đầu ra sau

+-----+-----+
| val | f0_ |
+-----+-----+
|   2 | 3.0 |
|   3 | 3.5 |
|   5 | 4.5 |
|   8 | 6.0 |
+-----+-----+
4

Ví dụ tiếp theo tính tổng giá trị của tất cả các trường có tên

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
09 trong chuỗi JSON đã cho

+-----+-----+
| val | f0_ |
+-----+-----+
|   2 | 3.0 |
|   3 | 3.5 |
|   5 | 4.5 |
|   8 | 6.0 |
+-----+-----+
5

Ví dụ tạo ra đầu ra sau

+-----+-----+
| val | f0_ |
+-----+-----+
|   2 | 3.0 |
|   3 | 3.5 |
|   5 | 4.5 |
|   8 | 6.0 |
+-----+-----+
6

Các loại dữ liệu JavaScript UDF được hỗ trợ

Một số loại SQL có ánh xạ trực tiếp tới các loại JavaScript, nhưng những loại khác thì không. BigQuery đại diện cho các loại theo cách sau

Loại dữ liệu BigQuery Loại dữ liệu JavaScriptARRAYARRAYBOOLBOOLEANBYTESSTRINGFLOAT64NUMBERNUMERIC, BIGNUMERIC được mã hóa base64Nếu giá trị NUMERIC hoặc BIGNUMERIC có thể được biểu thị chính xác dưới dạng giá trị dấu phẩy động IEEE 754 và không có phần phân số, thì giá trị đó được mã hóa dưới dạng Số. Các giá trị này nằm trong phạm vi [-253, 253]. Mặt khác, nó được mã hóa dưới dạng Chuỗi. STRINGSTRINGSTRUCTOBJECT trong đó mỗi trường STRUCT là một trường được đặt tênTIMESTAMPDATE với trường micro giây chứa phân số
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
50 của dấu thời gianDATEDATE

Vì JavaScript không hỗ trợ loại số nguyên 64 bit, nên

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
51 không được hỗ trợ làm loại đầu vào cho JavaScript UDF. Thay vào đó, hãy sử dụng
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
52 để biểu thị giá trị nguyên dưới dạng số hoặc
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
53 để biểu thị giá trị nguyên dưới dạng chuỗi

BigQuery không hỗ trợ

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
51 dưới dạng loại trả về trong JavaScript UDF. Trong trường hợp này, thân hàm JavaScript có thể trả về Số JavaScript hoặc Chuỗi. BigQuery sau đó chuyển đổi một trong hai loại này thành
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
51

Nếu giá trị trả về của JavaScript UDF là một

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
56, thì BigQuery sẽ đợi
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
56 cho đến khi nó được giải quyết. Nếu
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
56 ổn định ở trạng thái hoàn thành, BigQuery sẽ trả về kết quả của nó. Nếu
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
56 chuyển sang trạng thái bị từ chối, BigQuery sẽ trả về lỗi

Quy tắc trích dẫn

Bạn phải đặt mã JavaScript trong dấu ngoặc kép. Đối với các đoạn mã đơn giản, một dòng, bạn có thể sử dụng một chuỗi trích dẫn tiêu chuẩn

+-----+-----+
| val | f0_ |
+-----+-----+
|   2 | 3.0 |
|   3 | 3.5 |
|   5 | 4.5 |
|   8 | 6.0 |
+-----+-----+
7

Ví dụ này tạo ra đầu ra sau

+-----+-----+
| val | f0_ |
+-----+-----+
|   2 | 3.0 |
|   3 | 3.5 |
|   5 | 4.5 |
|   8 | 6.0 |
+-----+-----+
8

Trong trường hợp đoạn mã chứa dấu ngoặc kép hoặc bao gồm nhiều dòng, hãy sử dụng khối dấu ngoặc kép

+-----+-----+
| val | f0_ |
+-----+-----+
|   2 | 3.0 |
|   3 | 3.5 |
|   5 | 4.5 |
|   8 | 6.0 |
+-----+-----+
9

Ví dụ này tạo ra đầu ra sau

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
0

Bao gồm các thư viện JavaScript

Bạn có thể mở rộng UDF JavaScript của mình bằng phần

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
60. Phần này cho phép bạn chỉ định các thư viện mã bên ngoài cho UDF

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
1

Trong ví dụ trước, mã trong

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
61 và
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
62 có sẵn cho bất kỳ mã nào trong phần
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
63 của UDF

Các phương pháp hay nhất cho JavaScript UDF

Lọc trước đầu vào của bạn

Nếu thông tin đầu vào của bạn có thể dễ dàng được lọc xuống trước khi được chuyển đến JavaScript UDF, thì truy vấn của bạn có thể sẽ nhanh hơn và rẻ hơn

Tránh trạng thái có thể thay đổi liên tục

Không lưu trữ hoặc truy cập trạng thái có thể thay đổi qua lệnh gọi JavaScript UDF. Ví dụ: tránh mẫu sau

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
2

Sử dụng bộ nhớ hiệu quả

Môi trường xử lý JavaScript có giới hạn bộ nhớ khả dụng cho mỗi truy vấn. Các truy vấn JavaScript UDF tích lũy quá nhiều trạng thái cục bộ có thể không thành công do cạn kiệt bộ nhớ

UDF được ủy quyền

Các chức năng được ủy quyền cho phép bạn chia sẻ kết quả truy vấn với những người dùng hoặc nhóm cụ thể mà không cấp cho những người dùng hoặc nhóm đó quyền truy cập vào các bảng bên dưới. Ví dụ: một hàm được ủy quyền có thể tính toán tổng hợp trên dữ liệu hoặc tra cứu giá trị bảng và sử dụng giá trị đó trong tính toán

Để biết thêm thông tin, hãy xem Tạo chức năng được ủy quyền

Thêm mô tả vào UDF

Để thêm mô tả vào UDF, hãy làm theo các bước sau

Bảng điều khiển

  1. Truy cập trang BigQuery trong bảng điều khiển Google Cloud

    Truy cập BigQuery

  2. Trong bảng Explorer, mở rộng dự án và tập dữ liệu của bạn, sau đó chọn chức năng

  3. Trong ngăn Chi tiết, nhấp vào mode_edit Chỉnh sửa chi tiết quy trình để chỉnh sửa văn bản mô tả.

  4. Trong hộp thoại, nhập mô tả vào hộp hoặc chỉnh sửa mô tả hiện có. Bấm Lưu để lưu văn bản mô tả mới

SQL

Để cập nhật mô tả của hàm, hãy tạo lại hàm của bạn bằng cách sử dụng câu lệnh DDL

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
4 và đặt trường
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
65 trong danh sách
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
60

  1. Trong bảng điều khiển Google Cloud, hãy truy cập trang BigQuery

    Truy cập BigQuery

  2. Trong trình chỉnh sửa truy vấn, hãy nhập câu lệnh sau

    CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
    RETURNS FLOAT64
    AS (
      (x + 4) / y
    );
    
    3
  3. Nhấp vào play_circle Chạy.

Để biết thêm thông tin về cách chạy truy vấn, hãy xem Chạy truy vấn tương tác

Các chức năng do cộng đồng đóng góp

Các UDF do cộng đồng đóng góp có sẵn trong bộ dữ liệu công khai

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
67 và kho lưu trữ mã nguồn mở
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
68 GitHub. Bạn có thể xem tất cả các UDF cộng đồng trong bảng điều khiển Google Cloud bằng cách gắn dấu sao cho dự án
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
69 trong ngăn Explorer, sau đó mở rộng tập dữ liệu
CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);
70 lồng nhau trong dự án đó

người dùng là gì

Các hàm do người dùng định nghĩa trong Python là gì? . Cách chúng ta định nghĩa và gọi hàm trong Python đã được thảo luận. Các chức năng dễ dàng đi kèm với Python được gọi là các chức năng tích hợp sẵn. Functions that we define ourselves to do certain specific task are referred as user-defined functions. The way in which we define and call functions in Python are already discussed. Functions that readily come with Python are called built-in functions.

Làm thế nào bạn sẽ viết một người dùng

Cách tạo hàm do người dùng xác định trong Python .
Sử dụng từ khóa def để bắt đầu định nghĩa hàm
Đặt tên cho chức năng của bạn
Cung cấp một hoặc nhiều tham số. .
Nhập các dòng mã làm cho chức năng của bạn làm bất cứ điều gì nó làm. .
Sử dụng từ khóa return ở cuối hàm để trả về kết quả

Chúng ta có thể tạo người dùng không

Python cung cấp các hàm dựng sẵn như print(), v.v. nhưng chúng tôi cũng có thể tạo các chức năng của riêng bạn . Các hàm này được gọi là hàm do người dùng định nghĩa.

4 loại hàm trong Python là gì?

Hàm Python – Mục tiêu . Các hàm tích hợp sẵn của Python, hàm đệ quy Python, hàm lambda Python và các hàm do người dùng Python xác định cùng với cú pháp và ví dụ của chúng