Lưu ý ký tự khoảng trắng sau
result = example[]
print[result]
0 và result = example[]
print[result]
1, nếu không có chúng, kết quả sẽ là "Pythonisawesome"Đối với các số, ký tự
result = example[]
print[result]
2 hoạt động như một toán tử toán họcTrong hàm
result = example[]
print[result]
3, khi bạn cố gắng kết hợp một chuỗi và một số bằng toán tử result = example[]
print[result]
2, Python sẽ báo lỗi cho bạnCách tốt nhất để xuất nhiều biến trong hàm
result = example[]
print[result]
3 là phân tách chúng bằng dấu phẩy, thậm chí hỗ trợ các loại dữ liệu khác nhau Cách trực tiếp là
result = example[]
print[result]
2 một giá trị từ hàm, như bạn đã thử, và để mã gọi sử dụng giá trị đó. Đây thường là những gì bạn muốn. Cách tự nhiên, đơn giản, trực tiếp, rõ ràng để lấy lại thông tin từ một chức năng là result = example[]
print[result]
2 nó. Nói chung, mục đích của một hàm là tính toán một giá trị và result = example[]
print[result]
2 có nghĩa là "đây là giá trị mà chúng tôi đã tính toán; chúng tôi đã hoàn thành ở đây"Trực tiếp sử dụng result = example[]
print[result]
2
result = example[]
print[result]
Thủ thuật chính ở đây là
result = example[]
print[result]
2 trả về một giá trị, không phải một biến. Vì vậy, result = example[]
print[result]
7 không kích hoạt mã gọi để sử dụng result = example[]
print[result]
8 sau khi gọi hàm và không sửa đổi bất kỳ giá trị hiện có nào mà result = example[]
print[result]
8 có trong ngữ cảnh của cuộc gọi. [Đó có lẽ là lý do tại sao bạn có một def called[mutable]:
mutable.append['world']
def caller[]:
my_value = ['hello'] # a list with just that string
called[my_value]
# now it contains both strings
0. ]Sau khi chúng tôi sử dụng
result = example[]
print[result]
2 trong chức năngresult = example[]
print[result]
0chúng ta cần viết mã gọi để sử dụng giá trị trả về
result = example[]
print[result]
Điểm mấu chốt khác ở đây là lệnh gọi hàm là một biểu thức, vì vậy chúng ta có thể sử dụng nó giống như cách chúng ta sử dụng, chẳng hạn như kết quả của phép cộng. Giống như chúng ta có thể nói
def called[mutable]:
mutable.append['world']
def caller[]:
my_value = ['hello'] # a list with just that string
called[my_value]
# now it contains both strings
2, chúng ta có thể nói def called[mutable]:
mutable.append['world']
def caller[]:
my_value = ['hello'] # a list with just that string
called[my_value]
# now it contains both strings
3. Sau đó, def called[mutable]:
mutable.append['world']
def caller[]:
my_value = ['hello'] # a list with just that string
called[my_value]
# now it contains both strings
4 là tên cục bộ, riêng của chúng tôi cho chuỗi đó và chúng tôi có thể làm bất cứ điều gì chúng tôi muốn với nóChúng ta có thể sử dụng cùng tên,
result = example[]
print[result]
8, nếu muốn. Hoặc chúng ta có thể sử dụng một tên khác. Mã gọi không cần phải biết bất cứ điều gì về cách viết hàm hoặc tên mà nó sử dụng cho mọi thứ. 1Chúng ta có thể sử dụng giá trị trực tiếp để gọi một chức năng khác. ví dụ,
def called[mutable]:
mutable.append['world']
def caller[]:
my_value = ['hello'] # a list with just that string
called[my_value]
# now it contains both strings
6. 2 Chúng tôi có thể trả lại giá trị trực tiếp. chỉ đơn giản là def called[mutable]:
mutable.append['world']
def caller[]:
my_value = ['hello'] # a list with just that string
called[my_value]
# now it contains both strings
7, mà không gán cho result = example[]
print[result]
8. [Lại. chúng tôi đang trả về một giá trị, không phải là một biến. ]Hàm chỉ có thể
result = example[]
print[result]
2 một lần mỗi khi nó được gọi. result = example[]
print[result]
2 kết thúc hàm - một lần nữa, chúng tôi chỉ xác định kết quả của phép tính, vì vậy không có lý do gì để tính toán thêm. Do đó, nếu chúng ta muốn trả về nhiều mẩu thông tin, chúng ta sẽ cần tìm ra một đối tượng duy nhất [trong Python, "giá trị" và "đối tượng" là các từ đồng nghĩa hiệu quả; điều này không hoạt động tốt đối với một số ngôn ngữ khác. ]Chúng ta có thể tạo một bộ ngay trên dòng trả về; . 6+], một
result = example[]
print[result]
12 [Python 3. 3+], một result = example[]
print[result]
13 [Python 3. 7+] hoặc một số lớp khác [thậm chí có thể là lớp chúng tôi tự viết] để liên kết tên với các giá trị đang được trả về; . vân vân. Khả năng là vô tậnMặt khác, chức năng
result = example[]
print[result]
2s cho dù bạn có thích hay không [trừ khi một ngoại lệ được nêu ra]. Nếu nó đến cuối, nó sẽ ngầm result = example[]
print[result]
2 giá trị đặc biệt result = example[]
print[result]
16. Thay vào đó, bạn có thể hoặc không muốn làm điều đó một cách rõ ràngphương pháp gián tiếp
Ngoài việc gửi trực tiếp kết quả về cho người gọi, chúng ta có thể truyền đạt nó bằng cách sửa đổi một số đối tượng hiện có mà người gọi biết về. Có nhiều cách để làm điều đó, nhưng tất cả chúng đều là các biến thể của cùng một chủ đề
Nếu bạn muốn mã truyền đạt thông tin trở lại theo cách này, vui lòng để mã trả về
result = example[]
print[result]
16 - cũng không sử dụng giá trị trả về cho điều gì đó có ý nghĩa. Đó là cách chức năng tích hợp hoạt độngĐể sửa đổi đối tượng đó, tất nhiên hàm được gọi cũng phải biết về nó. Điều đó có nghĩa là, có một tên cho đối tượng có thể được tra cứu trong phạm vi hiện tại. Vì vậy, chúng ta hãy đi qua những thứ theo thứ tự
phạm vi cục bộ. Sửa đổi một đối số được truyền vào
Nếu một trong các tham số của chúng tôi có thể thay đổi, chúng tôi chỉ có thể thay đổi nó và dựa vào người gọi để kiểm tra sự thay đổi. Đây thường không phải là một ý tưởng tuyệt vời, bởi vì có thể khó suy luận về mã. Nó có vẻ như
________số 8Nếu giá trị là một thể hiện của lớp riêng của chúng ta, chúng ta cũng có thể gán cho một thuộc tính
result = example[]
print[result]
1Việc gán cho một thuộc tính không hoạt động đối với các loại tích hợp sẵn, bao gồm
result = example[]
print[result]
19; phạm vi cục bộ. Sửa đổi result = example[]
print[result]
20, trong một phương pháp
result = example[]
print[result]
Chúng tôi đã có một ví dụ về điều này ở trên. thiết lập
result = example[]
print[result]
21 trong mã result = example[]
print[result]
22. Đây là trường hợp đặc biệt của việc sửa đổi một đối số được truyền vào; . Thông thường, khi chúng ta làm điều này, lệnh gọi sẽ không thực sự kiểm tra các thay đổi đối với result = example[]
print[result]
20 - nó sẽ chỉ sử dụng đối tượng đã sửa đổi trong bước tiếp theo của logic. Đó là lý do thích hợp để viết mã theo cách này. chúng tôi vẫn đang trình bày một giao diện, vì vậy người gọi không phải lo lắng về các chi tiếtresult = example[]
print[result]
2Trong ví dụ, việc gọi
result = example[]
print[result]
24 đã cung cấp thông tin trở lại mã cấp cao nhất - nhưng thay vì tìm kiếm nó, chúng ta chỉ cần tiếp tục và gọi result = example[]
print[result]
25. 3Xem thêm. Truyền biến giữa các phương thức trong Python?
phạm vi kèm theo
Đây là trường hợp đặc biệt hiếm gặp khi sử dụng các hàm lồng nhau. Không có nhiều điều để nói ở đây - nó hoạt động giống như với phạm vi toàn cầu, chỉ sử dụng từ khóa
result = example[]
print[result]
26 thay vì result = example[]
print[result]
27. 4Phạm vi toàn cầu. Sửa đổi một toàn cầu
Nói chung, không nên thay đổi bất kỳ thứ gì trong phạm vi toàn cầu sau khi thiết lập nó ngay từ đầu. Nó làm cho mã khó giải thích hơn, bởi vì bất kỳ thứ gì sử dụng toàn cầu đó [ngoài bất kỳ thứ gì chịu trách nhiệm cho sự thay đổi] đều có nguồn đầu vào "ẩn"
Nếu bạn vẫn muốn làm điều đó, cú pháp rất đơn giản
result = example[]
print[result]
1Phạm vi toàn cầu. Gán cho một toàn cầu mới hoặc hiện có
Đây thực sự là một trường hợp đặc biệt của việc sửa đổi một toàn cầu. Ý tôi không phải là nhiệm vụ đó là một loại sửa đổi [không phải vậy]. Ý tôi là khi bạn gán một tên chung, Python sẽ tự động cập nhật một lệnh đại diện cho không gian tên chung. Bạn có thể lấy lệnh đó bằng
result = example[]
print[result]
28 và bạn có thể sửa đổi lệnh đó và nó thực sự sẽ tác động đến những biến toàn cục tồn tại. [TÔI. e. , sự trở lại từ result = example[]
print[result]
28 là từ điển chính nó, không phải là một bản sao. ]5Nhưng làm ơn đừng. Ý tưởng đó thậm chí còn tồi tệ hơn ý tưởng trước đó. Nếu bạn thực sự cần lấy kết quả từ hàm của mình bằng cách gán cho một biến toàn cục, hãy sử dụng từ khóa
result = example[]
print[result]
27 để nói với Python rằng tên đó sẽ được tra cứu trong phạm vi toàn cầuresult = example[]
print[result]
5Phạm vi toàn cầu. Gán hoặc sửa đổi một thuộc tính của chính chức năng đó
Đây là một trường hợp đặc biệt hiếm gặp, nhưng bây giờ bạn đã xem các ví dụ khác, lý thuyết sẽ rõ ràng. Trong Python, các hàm có thể thay đổi [i. e. bạn có thể đặt thuộc tính cho chúng]; . Vì vậy, điều này thực sự chỉ sửa đổi một toàn cầu
result = example[]
print[result]
6Chúng tôi thực sự không nên sử dụng điều này để gửi thông tin cho người gọi. Nó có tất cả các vấn đề thông thường với toàn cầu và thậm chí còn khó hiểu hơn. Nhưng có thể hữu ích nếu đặt các thuộc tính của hàm từ bên trong hàm, để hàm ghi nhớ điều gì đó giữa các lần gọi. [Tương tự như cách các phương thức ghi nhớ mọi thứ giữa các cuộc gọi bằng cách sửa đổi
result = example[]
print[result]
20. ] Thư viện chuẩn result = example[]
print[result]
12 thực hiện việc này, ví dụ như trong triển khai result = example[]
print[result]
13phạm vi dựng sẵn
Điều này không làm việc. Không gian tên dựng sẵn không chứa bất kỳ đối tượng có thể thay đổi nào và bạn không thể gán tên dựng sẵn mới [thay vào đó, chúng sẽ đi vào không gian tên chung]
Một số cách tiếp cận không hoạt động trong Python
Chỉ cần tính toán một cái gì đó trước khi chức năng kết thúc
Trong một số ngôn ngữ lập trình khác, có một số loại biến ẩn tự động lấy kết quả của phép tính cuối cùng, mỗi khi tính toán một thứ gì đó; . Điều đó không hoạt động trong Python. Nếu bạn đến cuối mà không có
result = example[]
print[result]
2ing bất cứ thứ gì, hàm của bạn sẽ trả về result = example[]
print[result]
16Gán tên hàm
Trong một số ngôn ngữ lập trình khác, bạn được phép [hoặc được yêu cầu] gán cho một biến có cùng tên với hàm; . Điều đó vẫn không hoạt động trong Python. Nếu bạn đến cuối mà không có
result = example[]
print[result]
2ing gì, hàm của bạn vẫn trả về result = example[]
print[result]
16result = example[]
print[result]
5Có vẻ như ít nhất bạn có thể sử dụng giá trị theo cách đó, nếu bạn sử dụng từ khóa
result = example[]
print[result]
27result = example[]
print[result]
7Nhưng tất nhiên, đây chỉ là một trường hợp đặc biệt của việc gán cho một toàn cục. Và có một vấn đề lớn với nó - cùng một tên không thể đề cập đến hai điều cùng một lúc. Bằng cách này, hàm đã thay thế tên riêng của nó. Vì vậy, nó sẽ thất bại lần sau
result = example[]
print[result]
0Gán cho một tham số
Đôi khi mọi người mong đợi có thể gán cho một trong các tham số của hàm và để nó ảnh hưởng đến một biến được sử dụng cho đối số tương ứng. Tuy nhiên, điều này không làm việc
result = example[]
print[result]
1Giống như cách Python trả về giá trị chứ không phải biến, nó cũng truyền giá trị chứ không phải biến.
result = example[]
print[result]
50 là tên địa phương; Một trong những phương pháp làm việc mà chúng tôi đã thấy là sửa đổi danh sách đã chuyển vào. Điều đó hoạt động bởi vì nếu bản thân danh sách thay đổi, thì nó sẽ thay đổi - không quan trọng tên nào được sử dụng cho nó hoặc phần nào của mã sử dụng tên đó. Tuy nhiên, việc gán danh sách mới cho
result = example[]
print[result]
50 không khiến danh sách hiện tại thay đổi. Nó chỉ làm cho result = example[]
print[result]
50 bắt đầu trở thành tên cho một danh sách khácĐể biết thêm thông tin, hãy xem Làm cách nào để chuyển một biến theo tham chiếu?
1 Ít nhất, không phải để lấy lại giá trị. Nếu bạn muốn sử dụng đối số từ khóa, bạn cần biết tên từ khóa là gì. Nhưng nói chung, quan điểm của các hàm là chúng là một sự trừu tượng;
2 trong 2. x,
result = example[]
print[result]
53 là một câu lệnh chứ không phải là một hàm, vì vậy đây không phải là ví dụ về việc gọi trực tiếp một hàm khác. Tuy nhiên, result = example[]
print[result]
54 vẫn hoạt động với 2. x, và def called[mutable]:
mutable.append['world']
def caller[]:
my_value = ['hello'] # a list with just that string
called[my_value]
# now it contains both strings
6 cũng vậy [trong trường hợp này, dấu ngoặc đơn bổ sung chỉ là dấu ngoặc đơn nhóm bình thường]. Bên cạnh đó, 2. 7 [2 cuối cùng. x] đã không được hỗ trợ kể từ đầu năm 2020 - tức là đã kéo dài gần 5 năm so với lịch trình thông thường. Nhưng sau đó, câu hỏi này ban đầu được hỏi vào năm 20103Một lần nữa. nếu mục đích của một phương thức là cập nhật đối tượng, thì cũng đừng
result = example[]
print[result]
2 một giá trị. Một số người muốn trả về result = example[]
print[result]
20 để bạn có thể "xâu chuỗi" các lệnh gọi phương thức; . Nếu bạn muốn loại giao diện "thông thạo" đó, thì thay vì viết các phương thức cập nhật result = example[]
print[result]
20, hãy viết các phương thức tạo một thể hiện mới, đã sửa đổi của lớp4 Tất nhiên, ngoại trừ việc nếu chúng ta đang sửa đổi một giá trị thay vì chỉ định, thì chúng ta không cần cả hai từ khóa
5 Ngoài ra còn có một
result = example[]
print[result]
59 cung cấp cho bạn lệnh của các biến cục bộ. Tuy nhiên, điều này không thể được sử dụng để tạo các biến cục bộ mới - hành vi không được xác định trong 2. x và trong 3. x, dict được tạo nhanh chóng và gán cho nó không có tác dụng. Một số tối ưu hóa của Python phụ thuộc vào các biến cục bộ cho một hàm được biết trước