Python truyền tham số cho hàm

(vài tháng sau) một ví dụ thực tế nhỏ trong đó lambda hữu ích, một phần thì không
giả sử bạn muốn các mặt cắt 1 chiều khác nhau thông qua hàm 2 chiều, giống như các lát cắt qua một dãy đồi
quadf( x, f ) lấy 1-d f và gọi nó cho nhiều x
Để gọi nó là các vết cắt dọc tại y = -1 0 1 và các vết cắt ngang tại x = -1 0 1,

fx1 = quadf( x, lambda x: f( x, 1 ))
fx0 = quadf( x, lambda x: f( x, 0 ))
fx_1 = quadf( x, lambda x: f( x, -1 ))
fxy = parabola( y, fx_1, fx0, fx1 )

f_1y = quadf( y, lambda y: f( -1, y ))
f0y = quadf( y, lambda y: f( 0, y ))
f1y = quadf( y, lambda y: f( 1, y ))
fyx = parabola( x, f_1y, f0y, f1y )

Theo những gì tôi biết, partial không thể làm điều này --

quadf( y, partial( f, x=1 ))
TypeError: f() got multiple values for keyword argument 'x'

(Làm cách nào để thêm thẻ numpy, partial, lambda vào đây?)

Hàm là một khối mã có tổ chức, có thể sử dụng lại được dùng để thực hiện một hành động đơn lẻ có liên quan. Các chức năng cung cấp tính mô-đun tốt hơn cho ứng dụng của bạn và mức độ tái sử dụng mã cao

Như bạn đã biết, Python cung cấp cho bạn nhiều hàm tích hợp sẵn như print(), v.v. nhưng bạn cũng có thể tạo các chức năng của riêng mình. Các chức năng này được gọi là chức năng do người dùng định nghĩa

Xác định một chức năng

Bạn có thể xác định chức năng để cung cấp chức năng cần thiết. Dưới đây là các quy tắc đơn giản để xác định hàm trong Python

  • Các khối hàm bắt đầu bằng từ khóa def theo sau là tên hàm và dấu ngoặc đơn ( ( ) )

  • Mọi tham số hoặc đối số đầu vào phải được đặt trong các dấu ngoặc đơn này. Bạn cũng có thể xác định các tham số bên trong các dấu ngoặc đơn này

  • Câu lệnh đầu tiên của hàm có thể là câu lệnh tùy chọn - chuỗi tài liệu của hàm hoặc chuỗi tài liệu

  • Khối mã trong mọi chức năng bắt đầu bằng dấu hai chấm (. ) và được thụt vào

  • Câu lệnh return [biểu thức] thoát khỏi một hàm, tùy chọn trả lại một biểu thức cho người gọi. Một câu lệnh trả về không có đối số cũng giống như câu lệnh trả về Không có

cú pháp

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]

Theo mặc định, các tham số có hành vi theo vị trí và bạn cần thông báo cho chúng theo cùng thứ tự mà chúng được xác định

Ví dụ

Hàm sau lấy một chuỗi làm tham số đầu vào và in nó trên màn hình tiêu chuẩn

def printme( str ):
   "This prints a passed string into this function"
   print str
   return

Gọi một chức năng

Việc xác định một hàm chỉ đặt tên cho nó, chỉ định các tham số sẽ được đưa vào hàm và cấu trúc các khối mã

Khi cấu trúc cơ bản của một hàm được hoàn thiện, bạn có thể thực thi nó bằng cách gọi nó từ một hàm khác hoặc trực tiếp từ dấu nhắc Python. Sau đây là ví dụ gọi hàm printme() −

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme("I'm first call to user defined function!")
printme("Again second call to the same function")

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

I'm first call to user defined function!
Again second call to the same function

Chuyển theo tham chiếu so với giá trị

Tất cả các tham số (đối số) trong ngôn ngữ Python đều được truyền theo tham chiếu. Điều đó có nghĩa là nếu bạn thay đổi tham số đề cập đến trong một hàm, thì thay đổi đó cũng phản ánh lại trong hàm gọi. Ví dụ -

#!/usr/bin/python

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist.append([1,2,3,4]);
   print "Values inside the function: ", mylist
   return

# Now you can call changeme function
mylist = [10,20,30];
changeme( mylist );
print "Values outside the function: ", mylist

Ở đây, chúng tôi đang duy trì tham chiếu của đối tượng đã truyền và các giá trị nối thêm trong cùng một đối tượng. Vì vậy, điều này sẽ tạo ra kết quả sau -

Values inside the function:  [10, 20, 30, [1, 2, 3, 4]]
Values outside the function:  [10, 20, 30, [1, 2, 3, 4]]

Có một ví dụ nữa trong đó đối số được truyền theo tham chiếu và tham chiếu đang bị ghi đè bên trong hàm được gọi

________số 8_______

Tham số mylist là cục bộ của hàm changeme. Thay đổi danh sách của tôi trong chức năng không ảnh hưởng đến danh sách của tôi. Hàm này không hoàn thành gì và cuối cùng, điều này sẽ tạo ra kết quả sau -

Values inside the function:  [1, 2, 3, 4]
Values outside the function:  [10, 20, 30]

Đối số chức năng

Bạn có thể gọi một hàm bằng cách sử dụng các loại đối số chính thức sau -

  • Đối số bắt buộc
  • Đối số từ khóa
  • đối số mặc định
  • Đối số có độ dài thay đổi

Đối số bắt buộc

Các đối số bắt buộc là các đối số được truyền cho một hàm theo đúng thứ tự vị trí. Ở đây, số lượng đối số trong lệnh gọi hàm phải khớp chính xác với định nghĩa hàm

Để gọi hàm printme(), bạn chắc chắn cần truyền một đối số, nếu không nó sẽ báo lỗi cú pháp như sau –

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme()

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

Traceback (most recent call last):
   File "test.py", line 11, in 
      printme();
TypeError: printme() takes exactly 1 argument (0 given)

Đối số từ khóa

Các đối số từ khóa có liên quan đến các lệnh gọi hàm. Khi bạn sử dụng đối số từ khóa trong lệnh gọi hàm, trình gọi sẽ xác định đối số theo tên tham số

Điều này cho phép bạn bỏ qua các đối số hoặc sắp xếp chúng không theo thứ tự vì trình thông dịch Python có thể sử dụng các từ khóa được cung cấp để khớp các giá trị với tham số. Bạn cũng có thể gọi hàm printme() bằng từ khóa theo các cách sau –

def printme( str ):
   "This prints a passed string into this function"
   print str
   return
0

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

def printme( str ):
   "This prints a passed string into this function"
   print str
   return
1

Ví dụ sau đây cho hình ảnh rõ ràng hơn. Lưu ý rằng thứ tự của các tham số không quan trọng

def printme( str ):
   "This prints a passed string into this function"
   print str
   return
2

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

def printme( str ):
   "This prints a passed string into this function"
   print str
   return
3

đối số mặc định

Đối số mặc định là đối số giả định giá trị mặc định nếu giá trị không được cung cấp trong lệnh gọi hàm cho đối số đó. Ví dụ sau đưa ra ý tưởng về các đối số mặc định, nó sẽ in tuổi mặc định nếu nó không được thông qua -

def printme( str ):
   "This prints a passed string into this function"
   print str
   return
4

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

def printme( str ):
   "This prints a passed string into this function"
   print str
   return
5

Đối số có độ dài thay đổi

Bạn có thể cần xử lý một hàm để có nhiều đối số hơn bạn đã chỉ định trong khi xác định hàm. Các đối số này được gọi là đối số có độ dài thay đổi và không được đặt tên trong định nghĩa hàm, không giống như đối số bắt buộc và mặc định

Cú pháp cho một hàm với các đối số biến không phải từ khóa là thế này -

def printme( str ):
   "This prints a passed string into this function"
   print str
   return
6

Dấu hoa thị (*) được đặt trước tên biến chứa các giá trị của tất cả các đối số biến không phải từ khóa. Bộ dữ liệu này vẫn trống nếu không có đối số bổ sung nào được chỉ định trong khi gọi hàm. Sau đây là một ví dụ đơn giản -

def printme( str ):
   "This prints a passed string into this function"
   print str
   return
7

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

def printme( str ):
   "This prints a passed string into this function"
   print str
   return
8

Các chức năng ẩn danh

Các hàm này được gọi là ẩn danh vì chúng không được khai báo theo cách tiêu chuẩn bằng cách sử dụng từ khóa def. Bạn có thể sử dụng từ khóa lambda để tạo các hàm ẩn danh nhỏ

  • Biểu mẫu Lambda có thể nhận bất kỳ số lượng đối số nào nhưng chỉ trả về một giá trị ở dạng biểu thức. Chúng không thể chứa các lệnh hoặc nhiều biểu thức

  • Hàm ẩn danh không thể là lệnh gọi trực tiếp để in vì lambda yêu cầu một biểu thức

  • Các hàm lambda có không gian tên cục bộ riêng và không thể truy cập các biến khác với các biến trong danh sách tham số của chúng và các biến trong không gian tên chung

  • Mặc dù có vẻ như lambda là phiên bản một dòng của hàm, nhưng chúng không tương đương với các câu lệnh nội tuyến trong C hoặc C++, mục đích của chúng là chuyển phân bổ ngăn xếp hàm trong khi gọi vì lý do hiệu suất

cú pháp

Cú pháp của các hàm lambda chỉ chứa một câu lệnh duy nhất, như sau –

def printme( str ):
   "This prints a passed string into this function"
   print str
   return
9

Sau đây là ví dụ cho thấy cách thức hoạt động của dạng hàm lambda -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme("I'm first call to user defined function!")
printme("Again second call to the same function")
0

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme("I'm first call to user defined function!")
printme("Again second call to the same function")
1

Tuyên bố trở lại

Câu lệnh return [biểu thức] thoát khỏi một hàm, tùy chọn trả lại một biểu thức cho người gọi. Một câu lệnh trả về không có đối số cũng giống như câu lệnh trả về Không có

Tất cả các ví dụ trên không trả về bất kỳ giá trị nào. Bạn có thể trả về một giá trị từ một hàm như sau -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme("I'm first call to user defined function!")
printme("Again second call to the same function")
2

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau -

#!/usr/bin/python

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print str
   return;

# Now you can call printme function
printme("I'm first call to user defined function!")
printme("Again second call to the same function")
3

Phạm vi biến

Tất cả các biến trong một chương trình có thể không truy cập được ở tất cả các vị trí trong chương trình đó. Điều này phụ thuộc vào nơi bạn đã khai báo một biến

Phạm vi của biến xác định phần chương trình mà bạn có thể truy cập vào một mã định danh cụ thể. Có hai phạm vi biến cơ bản trong Python -

  • biến toàn cục
  • Biến cục bộ

Toàn cầu so với. Biến cục bộ

Các biến được xác định bên trong thân hàm có phạm vi cục bộ và các biến được xác định bên ngoài có phạm vi toàn cục

Điều này có nghĩa là các biến cục bộ chỉ có thể được truy cập bên trong hàm mà chúng được khai báo, trong khi các biến toàn cục có thể được truy cập trong toàn bộ thân chương trình bởi tất cả các hàm. Khi bạn gọi một hàm, các biến được khai báo bên trong nó sẽ được đưa vào phạm vi. Sau đây là một ví dụ đơn giản -

Bạn có thể chuyển một biến cho một hàm trong Python không?

Khi bạn truyền một biến cho hàm, python sẽ chuyển tham chiếu đến đối tượng mà biến tham chiếu (giá trị) . Không phải bản thân biến. Các hàm có một bảng biến cục bộ được gọi là không gian tên cục bộ. Biến x chỉ tồn tại trong hàm try_to_modify.

Các cách truyền tham số trong Python là gì?

Việc truyền đối số của Python là được truyền theo phép gán hoặc truyền theo tham chiếu đối tượng . Các kiểu dữ liệu trong Python đều là đối tượng nên khi truyền tham số chỉ để biến mới và biến ban đầu trỏ về cùng một đối tượng, không có chuyện truyền giá trị hay truyền tham chiếu.

Chúng ta có thể truyền tham số trong hàm không?

Các đối số được truyền theo giá trị . Đối số JavaScript được truyền theo giá trị. Hàm chỉ biết các giá trị, không biết vị trí của đối số. Nếu một hàm thay đổi giá trị của đối số, thì nó không thay đổi giá trị ban đầu của tham số.