Hướng dẫn what are fruitful and non fruitful function in python? - chức năng có quả và không có quả ở trăn là gì?

Hàm hiệu quả: Hàm trả về giá trị

 def power(x,y):
   for i in range(y):
     r=r*x
   print(r)
 
 a=intinput((“Enter Base”))
 b=intinput((“Enter Exponent”))
 
 power(a,b) 


Hàm không đầy đủ: Hàm không trả về bất kỳ giá trị nào.

 def power(x,y=3):
   for i in range(y):
     r=r*x
   return r
 
 a=intinput((“Enter Base”))
 b=intinput((“Enter Exponent”))
 
 total = power(a,b)
 print(total) 

6.1. Trả về các giá trị

Các chức năng tích hợp mà chúng tôi đã sử dụng, chẳng hạn như ABS, POW, INT, MAX và phạm vi, đã tạo ra kết quả. Gọi từng hàm này tạo ra một giá trị, mà chúng ta thường gán cho một biến hoặc sử dụng như một phần của biểu thức.abs, pow, int, max, and range, have produced results. Calling each of these functions generates a value, which we usually assign to a variable or use as part of an expression.

biggest = max(3, 7, 2, 5)
x = abs(3 - 11) + 10

Chúng tôi cũng đã viết chức năng của riêng mình để trả lại số tiền cuối cùng để tính toán lãi kép.

Trong chương này, chúng ta sẽ viết nhiều chức năng trả về các giá trị, mà chúng ta sẽ gọi là các chức năng hiệu quả, vì muốn có một cái tên tốt hơn. Ví dụ đầu tiên là khu vực, trả về khu vực của một vòng tròn với bán kính đã cho:area, which returns the area of a circle with the given radius:

def area(radius):
    b = 3.14159 * radius**2
    return b

Chúng tôi đã thấy câu lệnh trả lại trước đây, nhưng trong một hàm hiệu quả, câu lệnh trả về bao gồm giá trị trả về. Tuyên bố này có nghĩa là: Đánh giá biểu thức trả về, và sau đó trả về nó ngay lập tức là kết quả (trái cây) của hàm này. Biểu thức được cung cấp có thể phức tạp một cách tùy ý, vì vậy chúng tôi có thể viết chức năng này như sau:return statement before, but in a fruitful function the return statement includes a return value. This statement means: evaluate the return expression, and then return it immediately as the result (the fruit) of this function. The expression provided can be arbitrarily complicated, so we could have written this function like this:

def area(radius):
    return 3.14159 * radius * radius

Mặt khác, các biến tạm thời như B ở trên thường làm cho việc gỡ lỗi dễ dàng hơn.temporary variables like b above often make debugging easier.

Đôi khi rất hữu ích khi có nhiều câu lệnh trả lại, một trong mỗi nhánh của một điều kiện. Chúng ta đã thấy cơ bụng tích hợp, bây giờ chúng ta thấy cách viết của riêng mình:abs, now we see how to write our own:

def absolute_value(x):
    if x < 0:
        return -x
    else:
        return x

Một cách khác để viết hàm trên là bỏ qua và chỉ theo điều kiện IF theo câu lệnh trả về thứ hai.else and just follow the if condition by the second return statement.

def absolute_value(x):
    if x < 0:
        return -x
    return x

Hãy suy nghĩ về phiên bản này và thuyết phục bản thân nó hoạt động giống như phiên bản đầu tiên.

Mã xuất hiện sau một tuyên bố trả lại, hoặc bất kỳ nơi nào khác, luồng thực thi không bao giờ có thể đạt được, được gọi là mã chết hoặc mã không thể truy cập được.return statement, or any other place the flow of execution can never reach, is called dead code, or unreachable code.

Trong một chức năng hiệu quả, bạn nên đảm bảo rằng mọi con đường có thể thông qua chương trình đều đạt được tuyên bố trả lại. Phiên bản sau của usolute_value không thực hiện được điều này:return statement. The following version of absolute_value fails to do this:

def bad_absolute_value(x):
    if x < 0:
        return -x
    elif x > 0:
        return x

Phiên bản này không chính xác vì nếu X xảy ra là 0, thì không điều kiện là đúng và hàm kết thúc mà không nhấn câu lệnh trả về. Trong trường hợp này, giá trị trả về là một giá trị đặc biệt được gọi là không:x happens to be 0, neither condition is true, and the function ends without hitting a return statement. In this case, the return value is a special value called None:

>>> print(bad_absolute_value(0))
None

Tất cả các hàm Python không trả lại bất cứ khi nào chúng không trả về giá trị khác.None whenever they do not return another value.

Cũng có thể sử dụng một câu lệnh trả về ở giữa một vòng lặp, trong đó điều khiển trường hợp ngay lập tức trở lại từ hàm. Chúng ta hãy giả sử rằng chúng ta muốn một hàm xem qua danh sách các từ. Nó sẽ trả lại từ 2 chữ cái đầu tiên. Nếu không có một, nó sẽ trả lại chuỗi trống:for loop, in which case control immediately returns from the function. Let us assume that we want a function which looks through a list of words. It should return the first 2-letter word. If there is not one, it should return the empty string:

def find_first_2_letter_word(xs):
    for wd in xs:
        if len(wd) == 2:
           return wd
    return ""

 def power(x,y=3):
   for i in range(y):
     r=r*x
   return r
 
 a=intinput((“Enter Base”))
 b=intinput((“Enter Exponent”))
 
 total = power(a,b)
 print(total) 
0

Một bước thông qua mã này và thuyết phục bản thân rằng trong trường hợp thử nghiệm đầu tiên mà chúng tôi đã cung cấp, chức năng trả về trong khi xử lý phần tử thứ hai trong danh sách: nó không phải đi qua toàn bộ danh sách.

6.2. Phát triển chương trình¶

Tại thời điểm này, bạn sẽ có thể xem xét các chức năng hoàn chỉnh và cho biết những gì họ làm. Ngoài ra, nếu bạn đã thực hiện các bài tập, bạn đã viết một số chức năng nhỏ. Khi bạn viết các chức năng lớn hơn, bạn có thể bắt đầu gặp nhiều khó khăn hơn, đặc biệt là với thời gian chạy và các lỗi ngữ nghĩa.

Để đối phó với các chương trình ngày càng phức tạp, chúng tôi sẽ đề xuất một kỹ thuật gọi là phát triển gia tăng. Mục tiêu của sự phát triển gia tăng là tránh các phiên gỡ lỗi dài bằng cách thêm và chỉ kiểm tra một lượng nhỏ mã tại một thời điểm.incremental development. The goal of incremental development is to avoid long debugging sessions by adding and testing only a small amount of code at a time.

Ví dụ, giả sử chúng ta muốn tìm khoảng cách giữa hai điểm, được đưa ra bởi tọa độ (x1, y1) và (x2, y2). Theo định lý Pythagore, khoảng cách là:

Hướng dẫn what are fruitful and non fruitful function in python? - chức năng có quả và không có quả ở trăn là gì?

Bước đầu tiên là xem xét chức năng khoảng cách sẽ trông như thế nào trong Python. Nói cách khác, các đầu vào (tham số) là gì và đầu ra (giá trị trả về) là gì?distance function should look like in Python. In other words, what are the inputs (parameters) and what is the output (return value)?

Trong trường hợp này, hai điểm là các đầu vào, chúng ta có thể biểu diễn bằng bốn tham số. Giá trị trả về là khoảng cách, là giá trị điểm nổi.

Chúng ta đã có thể viết một phác thảo về chức năng nắm bắt suy nghĩ của chúng ta cho đến nay:

 def power(x,y=3):
   for i in range(y):
     r=r*x
   return r
 
 a=intinput((“Enter Base”))
 b=intinput((“Enter Exponent”))
 
 total = power(a,b)
 print(total) 
1

Rõ ràng, phiên bản này của hàm này không tính toán khoảng cách; Nó luôn luôn trả về 0. Nhưng nó là chính xác về mặt cú pháp, và nó sẽ chạy, điều đó có nghĩa là chúng ta có thể kiểm tra nó trước khi chúng ta làm cho nó phức tạp hơn.

Để kiểm tra chức năng mới, chúng tôi gọi nó với các giá trị mẫu:

 def power(x,y=3):
   for i in range(y):
     r=r*x
   return r
 
 a=intinput((“Enter Base”))
 b=intinput((“Enter Exponent”))
 
 total = power(a,b)
 print(total) 
2

Chúng tôi đã chọn các giá trị này để khoảng cách ngang bằng 3 và khoảng cách dọc bằng 4; Bằng cách đó, kết quả là 5 (hypotenuse của tam giác 3-4-5). Khi kiểm tra một hàm, rất hữu ích khi biết câu trả lời đúng.

Tại thời điểm này, chúng tôi đã xác nhận rằng hàm là chính xác về mặt cú pháp và chúng tôi có thể bắt đầu thêm các dòng mã. Sau mỗi lần thay đổi gia tăng, chúng tôi kiểm tra lại chức năng. Nếu một lỗi xảy ra tại bất kỳ điểm nào, chúng tôi biết nó phải ở đâu - trong dòng cuối cùng chúng tôi đã thêm.

Bước đầu tiên hợp lý trong tính toán là tìm sự khác biệt x2- x1 và y2- y1. Chúng tôi sẽ đề cập đến các giá trị đó bằng các biến tạm thời có tên DX và DY.dx and dy.

 def power(x,y=3):
   for i in range(y):
     r=r*x
   return r
 
 a=intinput((“Enter Base”))
 b=intinput((“Enter Exponent”))
 
 total = power(a,b)
 print(total) 
3

Nếu chúng ta gọi chức năng với các đối số được hiển thị ở trên, khi luồng thực thi đến câu lệnh trả về, DX nên là 3 và DY nên là 4. Chúng ta có thể kiểm tra xem đây có phải là trường hợp trong pyscripter bằng cách đặt con trỏ vào câu lệnh trả về câu trả lời và chạy chương trình để phá vỡ thực thi khi đến con trỏ (sử dụng phím F4). Sau đó, chúng tôi kiểm tra các biến DX và DY bằng cách di chuột lên trên chúng, để xác nhận rằng hàm đang nhận đúng các tham số và thực hiện tính toán đầu tiên một cách chính xác. Nếu không, chỉ có một vài dòng để kiểm tra.dx should be 3 and dy should be 4. We can check that this is the case in PyScripter by putting the cursor on the return statement, and running the program to break execution when it gets to the cursor (using the F4 key). Then we inspect the variables dx and dy by hovering the mouse above them, to confirm that the function is getting the right parameters and performing the first computation correctly. If not, there are only a few lines to check.

Tiếp theo, chúng tôi tính tổng các bình phương của DX và DY:dx and dy:

 def power(x,y=3):
   for i in range(y):
     r=r*x
   return r
 
 a=intinput((“Enter Base”))
 b=intinput((“Enter Exponent”))
 
 total = power(a,b)
 print(total) 
4

Một lần nữa, chúng tôi có thể chạy chương trình ở giai đoạn này và kiểm tra giá trị của DSquared (phải là 25).dsquared (which should be 25).

Cuối cùng, sử dụng số mũ phân đoạn 0,5 để tìm căn bậc hai, chúng tôi tính toán và trả về kết quả:0.5 to find the square root, we compute and return the result:

 def power(x,y=3):
   for i in range(y):
     r=r*x
   return r
 
 a=intinput((“Enter Base”))
 b=intinput((“Enter Exponent”))
 
 total = power(a,b)
 print(total) 
5

Nếu điều đó hoạt động chính xác, bạn đã hoàn thành. Nếu không, bạn có thể muốn kiểm tra giá trị của kết quả trước câu lệnh trả về.result before the return statement.

Khi bạn bắt đầu, bạn chỉ có thể thêm một hoặc hai dòng mã tại một thời điểm. Khi bạn có được nhiều kinh nghiệm hơn, bạn có thể thấy mình viết và gỡ lỗi các khối khái niệm lớn hơn. Dù bằng cách nào, bước qua mã của bạn một dòng tại một thời điểm và xác minh rằng mỗi bước phù hợp với mong đợi của bạn có thể giúp bạn tiết kiệm rất nhiều thời gian gỡ lỗi. Khi bạn cải thiện các kỹ năng lập trình của mình, bạn nên thấy mình quản lý các phần lớn hơn và lớn hơn: điều này rất giống với cách chúng ta học đọc chữ cái, âm tiết, từ, cụm từ, câu, đoạn văn, v.v. - Từ ghi chú cá nhân đến hợp âm, thanh, cụm từ, v.v.

Các khía cạnh chính của quy trình là:

  1. Bắt đầu với một chương trình bộ xương hoạt động và thực hiện các thay đổi nhỏ. Tại bất kỳ điểm nào, nếu có lỗi, bạn sẽ biết chính xác nó ở đâu.
  2. Sử dụng các biến tạm thời để chỉ các giá trị trung gian để bạn có thể dễ dàng kiểm tra và kiểm tra chúng.
  3. Khi chương trình đang hoạt động, thư giãn, ngồi lại và chơi xung quanh với các tùy chọn của bạn. . Biểu thức hoặc đổi tên các biến bạn đã sử dụng hoặc xem liệu bạn có thể làm cho hàm ngắn hơn không. Một hướng dẫn tốt là nhằm mục đích làm mã dễ dàng nhất có thể cho những người khác đọc.

Đây là một phiên bản khác của chức năng. Nó sử dụng hàm căn bậc hai trong mô -đun toán học (chúng tôi sẽ tìm hiểu về các mô -đun trong thời gian ngắn). Bạn thích cái nào hơn? Cái nào trông gần gũi hơn với công thức Pythagore mà chúng tôi bắt đầu?math module (we’ll learn about modules shortly). Which do you prefer? Which looks “closer” to the Pythagorean formula we started out with?

 def power(x,y=3):
   for i in range(y):
     r=r*x
   return r
 
 a=intinput((“Enter Base”))
 b=intinput((“Enter Exponent”))
 
 total = power(a,b)
 print(total) 
6

 def power(x,y=3):
   for i in range(y):
     r=r*x
   return r
 
 a=intinput((“Enter Base”))
 b=intinput((“Enter Exponent”))
 
 total = power(a,b)
 print(total) 
7

6.3. Gỡ lỗi với Print¶print¶

Một kỹ thuật mạnh mẽ khác để gỡ lỗi (một giải pháp thay thế cho việc một bước và kiểm tra các biến chương trình), là chèn thêm các chức năng in ở những nơi được lựa chọn cẩn thận trong mã của bạn. Sau đó, bằng cách kiểm tra đầu ra của chương trình, bạn có thể kiểm tra xem thuật toán có đang làm những gì bạn mong đợi hay không. Tuy nhiên, hãy rõ ràng về những điều sau đây:print functions in carefully selected places in your code. Then, by inspecting the output of the program, you can check whether the algorithm is doing what you expect it to. Be clear about the following, however:

  • Bạn phải có một giải pháp rõ ràng cho vấn đề và phải biết điều gì sẽ xảy ra trước khi bạn có thể gỡ lỗi một chương trình. Làm việc để giải quyết vấn đề trên một tờ giấy (có lẽ sử dụng sơ đồ để ghi lại các bước bạn thực hiện) trước khi bạn quan tâm đến mã viết. Viết một chương trình không giải quyết vấn đề - nó chỉ đơn giản là tự động hóa các bước thủ công bạn sẽ thực hiện. Vì vậy, trước tiên hãy chắc chắn rằng bạn có một giải pháp thủ công bút và giấy hoạt động. Lập trình sau đó là về việc làm cho các bước thủ công đó tự động xảy ra.

  • Không viết các chức năng Chatterbox. Chatterbox là một chức năng hiệu quả, ngoài nhiệm vụ chính của nó, còn yêu cầu người dùng đầu vào hoặc in đầu ra, khi nó sẽ hữu ích hơn nếu nó chỉ đơn giản là im lặng và làm công việc của nó một cách lặng lẽ.chatterbox functions. A chatterbox is a fruitful function that, in addition to its primary task, also asks the user for input, or prints output, when it would be more useful if it simply shut up and did its work quietly.

    Ví dụ, chúng tôi đã thấy các chức năng tích hợp như phạm vi, tối đa và ABS. Không ai trong số này sẽ là khối xây dựng hữu ích cho các chương trình khác nếu họ nhắc người dùng về đầu vào hoặc in kết quả của họ trong khi họ thực hiện các nhiệm vụ của họ.range, max and abs. None of these would be useful building blocks for other programs if they prompted the user for input, or printed their results while they performed their tasks.

    Vì vậy, một mẹo hay là tránh gọi các chức năng in và đầu vào bên trong các chức năng hiệu quả, trừ khi mục đích chính của chức năng của bạn là thực hiện đầu vào và đầu ra. Một ngoại lệ cho quy tắc này có thể là tạm thời rắc một số cuộc gọi để in vào mã của bạn để giúp gỡ lỗi và hiểu những gì đang xảy ra khi mã chạy, nhưng sau đó chúng sẽ bị xóa khi bạn có mọi thứ hoạt động.print and input functions inside fruitful functions, unless the primary purpose of your function is to perform input and output. The one exception to this rule might be to temporarily sprinkle some calls to print into your code to help debug and understand what is happening when the code runs, but these will then be removed once you get things working.

6.4. Thành phần¶

Như bạn nên mong đợi bây giờ, bạn có thể gọi một chức năng từ trong một chức năng khác. Khả năng này được gọi là sáng tác.composition.

Ví dụ, chúng tôi sẽ viết một hàm có hai điểm, trung tâm của vòng tròn và một điểm trên chu vi và tính toán diện tích của vòng tròn.

Giả sử rằng điểm trung tâm được lưu trữ trong các biến XC và YC, và điểm chu vi nằm trong XP và YP. Bước đầu tiên là tìm bán kính của vòng tròn, đó là khoảng cách giữa hai điểm. May mắn thay, chúng tôi chỉ viết một chức năng, khoảng cách, điều đó chỉ làm điều đó, vì vậy bây giờ tất cả những gì chúng ta phải làm là sử dụng nó:xc and yc, and the perimeter point is in xp and yp. The first step is to find the radius of the circle, which is the distance between the two points. Fortunately, we’ve just written a function, distance, that does just that, so now all we have to do is use it:

 def power(x,y=3):
   for i in range(y):
     r=r*x
   return r
 
 a=intinput((“Enter Base”))
 b=intinput((“Enter Exponent”))
 
 total = power(a,b)
 print(total) 
8

Bước thứ hai là tìm khu vực của một vòng tròn với bán kính đó và trả lại nó. Một lần nữa chúng tôi sẽ sử dụng một trong những chức năng trước đây của chúng tôi:

 def power(x,y=3):
   for i in range(y):
     r=r*x
   return r
 
 a=intinput((“Enter Base”))
 b=intinput((“Enter Exponent”))
 
 total = power(a,b)
 print(total) 
9

Kết thúc điều đó trong một chức năng, chúng tôi nhận được:

biggest = max(3, 7, 2, 5)
x = abs(3 - 11) + 10
0

Chúng tôi đã gọi chức năng này khu vực2 để phân biệt nó với hàm khu vực được xác định trước đó.area2 to distinguish it from the area function defined earlier.

Bán kính và kết quả các biến tạm thời rất hữu ích cho việc phát triển, gỡ lỗi và một bước thông qua mã để kiểm tra những gì đang xảy ra, nhưng một khi chương trình đang hoạt động, chúng ta có thể làm cho nó súc tích hơn bằng cách soạn các cuộc gọi chức năng:radius and result are useful for development, debugging, and single-stepping through the code to inspect what is happening, but once the program is working, we can make it more concise by composing the function calls:

biggest = max(3, 7, 2, 5)
x = abs(3 - 11) + 10
1

6.5. Chức năng Boolean

Các chức năng có thể trả về các giá trị Boolean, thường thuận tiện để che giấu các thử nghiệm phức tạp bên trong các chức năng. Ví dụ:

biggest = max(3, 7, 2, 5)
x = abs(3 - 11) + 10
2

Người ta thường đưa ra các tên chức năng Boolean nghe có vẻ như có/không có câu hỏi. is_divisible trả về đúng hay sai để cho biết x có phải không chia hết cho y.Boolean functions names that sound like yes/no questions. is_divisible returns either True or False to indicate whether the x is or is not divisible by y.

Chúng ta có thể làm cho chức năng súc tích hơn bằng cách tận dụng thực tế là điều kiện của câu lệnh IF là một biểu thức boolean. Chúng ta có thể trả lại trực tiếp, tránh hoàn toàn câu lệnh IF:if statement is itself a Boolean expression. We can return it directly, avoiding the if statement altogether:

biggest = max(3, 7, 2, 5)
x = abs(3 - 11) + 10
3

Phiên này hiển thị chức năng mới trong hành động:

biggest = max(3, 7, 2, 5)
x = abs(3 - 11) + 10
4

Các chức năng Boolean thường được sử dụng trong các câu lệnh có điều kiện:

biggest = max(3, 7, 2, 5)
x = abs(3 - 11) + 10
5

Có thể rất hấp dẫn khi viết một cái gì đó như:

biggest = max(3, 7, 2, 5)
x = abs(3 - 11) + 10
6

Nhưng so sánh thêm là không cần thiết.

6.6. Lập trình với Style¶

Khả năng đọc là rất quan trọng đối với các lập trình viên, vì trong các chương trình thực tế được đọc và sửa đổi thường xuyên hơn nhiều sau đó chúng được viết. Nhưng, giống như hầu hết các quy tắc, chúng tôi thỉnh thoảng phá vỡ chúng. Hầu hết các ví dụ mã trong cuốn sách này sẽ phù hợp với đề xuất nâng cao Python 8 (PEP 8), một hướng dẫn phong cách được phát triển bởi cộng đồng Python.

Chúng tôi có nhiều điều để nói về phong cách khi các chương trình của chúng tôi trở nên phức tạp hơn, nhưng một vài gợi ý sẽ hữu ích:

  • Sử dụng 4 không gian (thay vì tab) để thụt
  • giới hạn độ dài dòng đến 78 ký tự
  • Khi đặt tên định danh, hãy sử dụng Camelcase cho các lớp (chúng tôi sẽ đến đó) và chữ thường_with_underscores cho các functon và biếnCamelCase for classes (we’ll get to those) and lowercase_with_underscores for functons and variables
  • Đặt nhập khẩu ở đầu tệp
  • Giữ các định nghĩa chức năng cùng nhau
  • Sử dụng DocStrings để ghi lại các chức năng
  • Sử dụng hai dòng trống để tách các định nghĩa chức năng với nhau
  • Giữ các câu lệnh cấp cao nhất, bao gồm các cuộc gọi chức năng, cùng nhau ở cuối chương trình

6.7. Kiểm tra đơn vị¶

Đó là một thực tiễn tốt nhất trong phát triển phần mềm để bao gồm kiểm tra đơn vị tự động của mã nguồn. Kiểm tra đơn vị cung cấp một cách để tự động xác minh rằng các đoạn mã riêng lẻ, chẳng hạn như các chức năng, đang hoạt động đúng. Điều này cho phép thay đổi việc thực hiện một chức năng sau đó và nhanh chóng kiểm tra rằng nó vẫn làm những gì nó dự định làm.unit testing of source code. Unit testing provides a way to automatically verify that individual pieces of code, such as functions, are working properly. This makes it possible to change the implementation of a function at a later time and quickly test that it still does what it was intended to do.

Một số năm trước, các tổ chức đã có VEIW rằng tài sản có giá trị của họ là mã và tài liệu chương trình. Các tổ chức hiện sẽ chi một phần lớn ngân sách phần mềm của họ cho việc chế tạo (và bảo quản) các bài kiểm tra của họ.

Kiểm tra đơn vị cũng buộc lập trình viên phải suy nghĩ về các trường hợp khác nhau mà chức năng cần phải xử lý. Bạn cũng chỉ phải nhập các bài kiểm tra một lần vào tập lệnh, thay vì phải tiếp tục nhập cùng một dữ liệu kiểm tra nhiều lần khi bạn phát triển mã của mình.

Mã thêm trong chương trình của bạn ở đó vì nó giúp gỡ lỗi hoặc kiểm tra dễ dàng hơn được gọi là giàn giáo.scaffolding.

Một bộ sưu tập các bài kiểm tra cho một số mã được gọi là bộ thử nghiệm của nó.test suite.

Có một vài cách khác nhau để thực hiện thử nghiệm đơn vị trong Python - nhưng ở giai đoạn này, chúng tôi sẽ bỏ qua những gì cộng đồng Python thường làm và chúng tôi sẽ bắt đầu với hai chức năng mà chúng tôi sẽ tự viết. Chúng tôi sẽ sử dụng những điều này để viết các bài kiểm tra đơn vị của chúng tôi.

Hãy bắt đầu với chức năng tuyệt đối_value mà chúng tôi đã viết trước đó trong chương này. Hãy nhớ lại rằng chúng tôi đã viết một vài phiên bản khác nhau, trong số đó không chính xác và có lỗi. Các bài kiểm tra có bắt được lỗi này không?absolute_value function that we wrote earlier in this chapter. Recall that we wrote a few different versions, the last of which was incorrect, and had a bug. Would tests have caught this bug?

Đầu tiên chúng tôi lên kế hoạch cho các bài kiểm tra của chúng tôi. Chúng tôi muốn biết liệu hàm có trả về giá trị chính xác khi đối số của nó âm hay khi đối số của nó dương hay khi đối số của nó bằng không. Khi lên kế hoạch cho các bài kiểm tra của mình, bạn sẽ luôn muốn suy nghĩ cẩn thận về các trường hợp của Edge Edge - ở đây, một đối số của 0 đến tuyệt đối_value nằm trên cạnh của nơi hành vi chức năng thay đổi và như chúng ta đã thấy ở đầu chương, Đó là một điểm dễ dàng để lập trình viên phạm sai lầm! Vì vậy, đó là một trường hợp tốt để đưa vào bộ thử nghiệm của chúng tôi.absolute_value is on the edge of where the function behaviour changes, and as we saw at the beginning of the chapter, it is an easy spot for the programmer to make a mistake! So it is a good case to include in our test suite.

Chúng tôi sẽ viết một chức năng trợ giúp để kiểm tra kết quả của một bài kiểm tra. Nó có một đối số boolean và sẽ in một tin nhắn cho chúng tôi biết rằng bài kiểm tra đã được thông qua, hoặc nó sẽ in một tin nhắn để thông báo cho chúng tôi rằng bài kiểm tra đã thất bại. Dòng đầu tiên của cơ thể (sau chức năng Doc DocString) xác định một cách kỳ diệu số dòng trong tập lệnh nơi cuộc gọi được thực hiện từ. Điều này cho phép chúng tôi in số dòng của bài kiểm tra, điều này sẽ giúp ích khi chúng tôi muốn xác định các bài kiểm tra nào đã vượt qua hoặc thất bại.

biggest = max(3, 7, 2, 5)
x = abs(3 - 11) + 10
7

Ngoài ra còn có một số định dạng chuỗi hơi khó sử dụng phương thức định dạng mà chúng ta sẽ che đậy trong thời điểm này và bao gồm chi tiết trong một chương trong tương lai. Nhưng với chức năng này được viết, chúng tôi có thể tiến hành xây dựng bộ thử nghiệm của mình:format method which we will gloss over for the moment, and cover in detail in a future chapter. But with this function written, we can proceed to construct our test suite:

biggest = max(3, 7, 2, 5)
x = abs(3 - 11) + 10
8

Tại đây, bạn sẽ thấy rằng chúng tôi đã xây dựng năm thử nghiệm trong bộ thử nghiệm của chúng tôi. Chúng tôi có thể chạy điều này so với các phiên bản thứ nhất hoặc thứ hai (phiên bản chính xác) của exicute_value và chúng tôi đã nhận được đầu ra tương tự như sau:absolute_value, and we’d get output similar to the following:

biggest = max(3, 7, 2, 5)
x = abs(3 - 11) + 10
9

Nhưng hãy để nói rằng bạn thay đổi chức năng thành một phiên bản không chính xác như thế này:

def area(radius):
    b = 3.14159 * radius**2
    return b
0

Bạn có thể tìm thấy ít nhất hai lỗi trong mã này không? Bộ thử nghiệm của chúng tôi có thể! Chúng tôi nhận được:

def area(radius):
    b = 3.14159 * radius**2
    return b
1

Đây là ba ví dụ về các bài kiểm tra thất bại.

Có một câu lệnh Python tích hợp có tên Assert gần giống như chức năng thử nghiệm của chúng tôi (ngoại trừ chương trình dừng khi khẳng định đầu tiên thất bại). Bạn có thể muốn đọc về nó và sử dụng nó thay vì chức năng kiểm tra của chúng tôi.assert that does almost the same as our test function (except the program stops when the first assertion fails). You may want to read about it, and use it instead of our test function.

6.8. Bảng chú giải¶

Chức năng boolean trả về giá trị boolean. Các giá trị duy nhất có thể của loại bool là false và true. Hàm chức năng hộp thư tương tác với người dùng (sử dụng đầu vào hoặc in) khi không nên. Các hàm im lặng chỉ chuyển đổi các đối số đầu vào của chúng thành kết quả đầu ra của chúng thường là các chức năng hữu ích nhất. . của mã tại một thời điểm. Giá trị python đặc biệt. Một cách sử dụng trong Python là nó được trả về bởi các chức năng không thực thi câu lệnh trả về với đối số trả về. Giá trị valuethe được cung cấp do kết quả của một hàm gọi.scaffoldingCode được sử dụng trong quá trình phát triển chương trình để hỗ trợ phát triển và gỡ lỗi. Mã kiểm tra đơn vị mà chúng tôi đã thêm trong chương này là các ví dụ về tính toán. Các đơn vị mã đang hoạt động đúng. Có một bộ kiểm tra cực kỳ hữu ích khi ai đó sửa đổi hoặc mở rộng mã: nó cung cấp một mạng lưới an toàn chống lại đi ngược bằng cách đặt các lỗi mới vào mã làm việc trước đó. Thuật ngữ kiểm tra hồi quy thường được sử dụng để nắm bắt ý tưởng này mà chúng tôi không muốn đi ngược!bool type are False and True.chatterbox functionA function which interacts with the user (using input or print) when it should not. Silent functions that just convert their input arguments into their output results are usually the most useful ones.composition (of functions)Calling one function from within the body of another, or using the return value of one function as an argument to the call of another.dead codePart of a program that can never be executed, often because it appears after a return statement.fruitful functionA function that yields a return value instead of None.incremental developmentA program development plan intended to simplify debugging by adding and testing only a small amount of code at a time.NoneA special Python value. One use in Python is that it is returned by functions that do not execute a return statement with a return argument.return valueThe value provided as the result of a function call.scaffoldingCode that is used during program development to assist with development and debugging. The unit test code that we added in this chapter are examples of scaffolding.temporary variableA variable used to store an intermediate value in a complex calculation.test suiteA collection of tests for some code you have written.unit testingAn automatic procedure used to validate that individual units of code are working properly. Having a test suite is extremely useful when somebody modifies or extends the code: it provides a safety net against going backwards by putting new bugs into previously working code. The term regression testing is often used to capture this idea that we don’t want to go backwards!

6.9. Bài tập

Tất cả các bài tập dưới đây nên được thêm vào một tệp. Trong tập tin đó, bạn cũng nên thêm các chức năng kiểm tra và kiểm tra của các chức năng giàn giáo được hiển thị ở trên, và sau đó, khi bạn làm việc thông qua các bài tập, thêm các bài kiểm tra mới vào bộ thử nghiệm của bạn. (Nếu bạn mở phiên bản trực tuyến của sách giáo khoa, bạn có thể dễ dàng sao chép và dán các bài kiểm tra và các đoạn mã vào trình soạn thảo Python của bạn.)test and test_suite scaffolding functions shown above, and then, as you work through the exercises, add the new tests to your test suite. (If you open the online version of the textbook, you can easily copy and paste the tests and the fragments of code into your Python editor.)

Sau khi hoàn thành mỗi bài tập, xác nhận rằng tất cả các bài kiểm tra vượt qua.

  1. Bốn điểm la bàn có thể được viết tắt bởi các chuỗi một chữ cái như là N N ,, Viết một chức năng Turn_clockwise lấy một trong bốn điểm la bàn này làm tham số của nó và trả về điểm la bàn tiếp theo theo hướng theo chiều kim đồng hồ. Dưới đây là một số bài kiểm tra nên vượt qua:turn_clockwise that takes one of these four compass points as its parameter, and returns the next compass point in the clockwise direction. Here are some tests that should pass:

    def area(radius):
        b = 3.14159 * radius**2
        return b
    
    2

    Bạn có thể hỏi những gì nếu đối số cho hàm là một số giá trị khác? Đối với tất cả các trường hợp khác, hàm sẽ trả về giá trị không có:None:

    def area(radius):
        b = 3.14159 * radius**2
        return b
    
    3

  2. Viết một hàm day_name chuyển đổi số nguyên số 0 thành 6 thành tên của một ngày. Giả sử ngày 0 là Chủ nhật của người Viking. Một lần nữa, không trả về không nếu các đối số cho hàm không hợp lệ. Dưới đây là một số bài kiểm tra nên vượt qua:day_name that converts an integer number 0 to 6 into the name of a day. Assume day 0 is “Sunday”. Once again, return None if the arguments to the function are not valid. Here are some tests that should pass:

    def area(radius):
        b = 3.14159 * radius**2
        return b
    
    4

  3. Viết hàm nghịch đảo day_num được đặt tên trong ngày và trả về số của nó:day_num which is given a day name, and returns its number:

    def area(radius):
        b = 3.14159 * radius**2
        return b
    
    5

    Một lần nữa, nếu hàm này được đưa ra một đối số không hợp lệ, nó sẽ không trả về không:None:

    def area(radius):
        b = 3.14159 * radius**2
        return b
    
    6

  4. Viết một chức năng giúp trả lời các câu hỏi như ‘Hôm nay là thứ Tư. Tôi rời đi vào kỳ nghỉ sau 19 ngày. Đó sẽ là ngày nào?delta argument — the number of days to add — and should return the resulting day name:

    def area(radius):
        b = 3.14159 * radius**2
        return b
    
    7

    Gợi ý: Sử dụng hai chức năng đầu tiên được viết ở trên để giúp bạn viết cái này.

  5. Chức năng DAY_ADD của bạn đã hoạt động với các đồng bằng tiêu cực? Ví dụ, -1 sẽ là ngày hôm qua, hoặc -7 sẽ là một tuần trước:day_add function already work with negative deltas? For example, -1 would be yesterday, or -7 would be a week ago:

    def area(radius):
        b = 3.14159 * radius**2
        return b
    
    8

    Nếu chức năng của bạn đã hoạt động, giải thích tại sao. Nếu nó không hoạt động, hãy làm cho nó hoạt động.

    Gợi ý: Chơi với một số trường hợp sử dụng hàm mô đun % (được giới thiệu ở đầu chương trước). Cụ thể, khám phá những gì xảy ra với x%7 khi x âm.x % 7 when x is negative.

  6. Viết một chức năng Days_in_month lấy tên của một tháng và trả về số ngày trong tháng. Bỏ qua những năm bước nhảy:days_in_month which takes the name of a month, and returns the number of days in the month. Ignore leap years:

    def area(radius):
        b = 3.14159 * radius**2
        return b
    
    9

    Nếu hàm được đưa ra các đối số không hợp lệ, nó sẽ không trả về không.None.

  7. Viết một hàm TO_SEC chuyển đổi giờ, phút và giây thành tổng số giây. Dưới đây là một số bài kiểm tra nên vượt qua:to_secs that converts hours, minutes and seconds to a total number of seconds. Here are some tests that should pass:

    def area(radius):
        return 3.14159 * radius * radius
    
    0

  8. Mở rộng TO_SECS để nó có thể đối phó với các giá trị thực là đầu vào. Nó phải luôn luôn trả về một số nguyên số giây (cắt ngắn về 0):to_secs so that it can cope with real values as inputs. It should always return an integer number of seconds (truncated towards zero):

    def area(radius):
        return 3.14159 * radius * radius
    
    1

  9. Viết ba chức năng là các nghịch đảo của các thành phố của TO_SECS:to_secs:

    1. giờ_in trả về toàn bộ số lượng số giờ được biểu thị bằng tổng số giây. returns the whole integer number of hours represented by a total number of seconds.
    2. Biên bản_in trả về toàn bộ số nguyên còn lại trong vài phút trong tổng số giây, sau khi số giờ được lấy ra. returns the whole integer number of left over minutes in a total number of seconds, once the hours have been taken out.
    3. giây_in trả về bên trái trong vài giây được biểu thị bằng tổng số giây. returns the left over seconds represented by a total number of seconds.

    Bạn có thể cho rằng tổng số giây được truyền cho các hàm này là một số nguyên. Dưới đây là một số trường hợp thử nghiệm:

    def area(radius):
        return 3.14159 * radius * radius
    
    2

    Nó đã giành chiến thắng luôn luôn rõ ràng những gì mong muốn ...

    Trong trường hợp thứ ba ở trên, yêu cầu có vẻ khá mơ hồ và mờ nhạt. Nhưng bài kiểm tra làm rõ những gì chúng ta thực sự cần làm.

    Các bài kiểm tra đơn vị thường có lợi ích thứ cấp này là làm rõ các thông số kỹ thuật. Nếu bạn viết các bộ thử nghiệm của riêng mình, hãy xem xét nó là một phần của quá trình giải quyết vấn đề khi bạn đặt câu hỏi về những gì bạn thực sự mong đợi sẽ xảy ra, và liệu bạn có xem xét tất cả các trường hợp có thể không.

    Vì cuốn sách của chúng tôi có tựa đề Làm thế nào để suy nghĩ như ... bạn có thể thích đọc ít nhất một tài liệu tham khảo về suy nghĩ và về những ý tưởng thú vị như Influid Intelligence, một thành phần quan trọng trong việc giải quyết vấn đề. Xem, ví dụ, http://psychology.about.com/od/cognitivepsychology/a/fluid-crystal.htm. Học khoa học máy tính đòi hỏi một sự pha trộn tốt của cả hai loại trí thông minh chất lỏng và tinh thể.

  10. Những thử nghiệm nào trong số này thất bại? Giải thích vì sao.

    def area(radius):
        return 3.14159 * radius * radius
    
    3

  11. Viết một hàm so sánh trả về 1 nếu a> b, 0 nếu a == b và -1 nếu acompare function that returns 1 if a > b, 0 if a == b, and -1 if a < b

    def area(radius):
        return 3.14159 * radius * radius
    
    4

  12. Viết một chức năng gọi là Hypotenuse trả về chiều dài của hypotenuse của một tam giác vuông với chiều dài của hai chân làm tham số:hypotenuse that returns the length of the hypotenuse of a right triangle given the lengths of the two legs as parameters:

    def area(radius):
        return 3.14159 * radius * radius
    
    5

  13. Viết độ dốc hàm (x1, y1, x2, y2) trả về độ dốc của đường thông qua các điểm (x1, y1) và (x2, y2). Hãy chắc chắn rằng việc thực hiện độ dốc của bạn có thể vượt qua các bài kiểm tra sau:slope(x1, y1, x2, y2) that returns the slope of the line through the points (x1, y1) and (x2, y2). Be sure your implementation of slope can pass the following tests:

    def area(radius):
        return 3.14159 * radius * radius
    
    6

    Sau đó, sử dụng một cuộc gọi đến độ dốc trong một hàm mới có tên chặn (x1, y1, x2, y2) trả về hệ thống y của dòng thông qua các điểm (x1, y1) và (x2, y2)slope in a new function named intercept(x1, y1, x2, y2) that returns the y-intercept of the line through the points (x1, y1) and (x2, y2)

    def area(radius):
        return 3.14159 * radius * radius
    
    7

  14. Viết một hàm có tên IS_EVEN (n) lấy số nguyên làm đối số và trả về đúng nếu đối số là số chẵn và sai nếu nó là lẻ.is_even(n) that takes an integer as an argument and returns True if the argument is an even number and False if it is odd.

    Thêm các bài kiểm tra của riêng bạn vào bộ thử nghiệm.

  15. Bây giờ hãy viết hàm is_odd (n) trả về true khi n là lẻ và sai nếu không. Bao gồm các bài kiểm tra đơn vị cho chức năng này quá.is_odd(n) that returns True when n is odd and False otherwise. Include unit tests for this function too.

    Cuối cùng, sửa đổi nó để nó sử dụng một cuộc gọi đến IS_EVEN để xác định xem đối số của nó có phải là một số nguyên lẻ hay không và đảm bảo rằng thử nghiệm của nó vẫn vượt qua.is_even to determine if its argument is an odd integer, and ensure that its test still pass.

  16. Viết một hàm is_factor (f, n) vượt qua các bài kiểm tra sau:is_factor(f, n) that passes these tests:

    def area(radius):
        return 3.14159 * radius * radius
    
    8

    Một vai trò quan trọng của các bài kiểm tra đơn vị là chúng cũng có thể đóng vai trò là thông số kỹ thuật rõ ràng của người Hồi giáo về những gì được mong đợi. Những trường hợp kiểm tra này trả lời câu hỏi chúng ta có coi 1 và 15 là yếu tố của 15 không?

  17. Viết IS_Multiple để đáp ứng các bài kiểm tra đơn vị này:is_multiple to satisfy these unit tests:

    def area(radius):
        return 3.14159 * radius * radius
    
    9

    Bạn có thể tìm cách sử dụng is_factor trong định nghĩa của bạn về is_multiple không?is_factor in your definition of is_multiple?

  18. Viết hàm F2C (t) được thiết kế để trả về giá trị số nguyên của độ Celsius gần nhất cho nhiệt độ đã cho ở Fahrenheit. (Gợi ý: Bạn có thể muốn sử dụng chức năng tích hợp, tròn. Hãy thử in tròn.f2c(t) designed to return the integer value of the nearest degree Celsius for given temperature in Fahrenheit. (hint: you may want to make use of the built-in function, round. Try printing round.__doc__ in a Python shell or looking up help for the round function, and experimenting with it until you are comfortable with how it works.)

    def absolute_value(x):
        if x < 0:
            return -x
        else:
            return x
    
    0

  19. Bây giờ hãy làm điều ngược lại: Viết hàm C2F chuyển đổi Celsius thành Fahrenheit:c2f which converts Celsius to Fahrenheit:

    def absolute_value(x):
        if x < 0:
            return -x
        else:
            return x
    
    1

Các chức năng hiệu quả trong Python là gì?

Đây là các chức năng trả về một giá trị sau khi hoàn thành. Một chức năng hiệu quả phải luôn luôn trả về một giá trị cho nơi nó được gọi từ. Một hàm hiệu quả có thể trả về bất kỳ loại giá trị nào có thể là chuỗi, số nguyên, boolean, v.v.functions that return a value after their completion. A fruitful function must always return a value to where it is called from. A fruitful function can return any type of value may it be string, integer, boolean, etc.

Ví dụ chức năng hiệu quả là gì?

Các hàm hiệu quả có nghĩa là hàm cho kết quả hoặc trả về giá trị sau khi thực hiện.Một số chức năng được thực thi nhưng không trả về bất kỳ giá trị nào.Trong khi viết các hàm hiệu quả, chúng tôi ngoại trừ giá trị trả về và vì vậy chúng tôi phải gán nó cho một biến để giữ giá trị trả về.the function that gives result or return values after execution. Some functions gets executed but doesn't return any value. While writing fruitful functions we except a return value and so we must assign it to a variable to hold return value.

Cái nào là một hàm void trong Python?

Trong Python, có thể soạn một hàm mà không có câu lệnh trả về.Các chức năng như thế này được gọi là void và chúng không trả lại, đối tượng đặc biệt của Python cho "không có gì".Đây là một ví dụ về hàm void: >>> def Sayhello (WHO): In 'Xin chào,', ai + '!'a function without a return statement. Functions like this are called void, and they return None, Python's special object for "nothing". Here's an example of a void function: >>> def sayhello(who): print 'Hello,', who + '!'

Các chức năng Python là gì?

Một hàm là một khối mã chỉ chạy khi nó được gọi.Bạn có thể truyền dữ liệu, được gọi là tham số, thành một hàm.Một chức năng có thể trả về dữ liệu như là kết quả.a block of code which only runs when it is called. You can pass data, known as parameters, into a function. A function can return data as a result.