2016-01-17 12 views
5

Cách tốt nhất để viết hàm constrain là gì? hoặc là đã có một hàm python dựng sẵn thực hiện điều này?cách nhiệt đới để viết hàm constrain()

Lựa chọn 1:

def constrain(val, min_val, max_val): 

    if val < min_val: return min_val 
    if val > max_val: return max_val 
    return val 

Phương án 2:

def constrain(val, min_val, max_val): 

    if val < min_val: 
     val = min_val 

    elif val > max_val: 
     val = max_val 

    return val 

Trả lời

10

Tôi không biết nếu điều này là nhiều hơn "pythonic", nhưng bạn có thể sử dụng built-in min()max() như sau:

def constrain(val, min_val, max_val): 
    return min(max_val, max(min_val, val)) 
+0

Xin vui lòng, giải thích downvote. – Delgan

5

Trong trường hợp bạn cần thực hiện điều này cho nhiều số (mảng đầy đủ), có thể bạn đang sử dụng Numpy, có chức năng được xây dựng trong clip. Đối với các chương trình Python đơn giản, hãy truy cập với answer của Delgan.

+0

"Đối với các chương trình Python đơn giản, hãy đi với câu trả lời của Delgan." - Tại sao không sử dụng 'clip()' luôn? –

+2

@Fermiparadox vì bạn thường không muốn có thư viện Numpy khổng lồ như một phụ thuộc cho một tập lệnh đơn giản, nó không phải là một phần của thư viện chuẩn. Ngoài ra kiểu trả về sẽ là một vô hướng Numpy, thường sẽ hoạt động như mong đợi, nhưng điều này có thể không phải là những gì bạn muốn khi làm việc với các số thập phân hoặc phân số Python. –

0

Nếu bạn có thể xử lý một loạt các giá trị cùng một lúc, bạn có thể thử một danh sách hiểu:

a = [1,1,5,1,1] 
b = [7,2,8,5,3] 
c = [3,3,3,3,3] 
[min(y,max(x,z)) for x,y,z in zip(a, b, c)] 

[3, 2, 5, 3, 3] 

hoặc thậm chí NumPy:

import numpy as np 

a = np.array(a) 
b = np.array(b) 
c = np.array(c) 

np.minimum(b, np.maximum(a, c)) 
np.minimum(b, np.maximum(a, 3)) # just use 3 if they are all the same 

c.clip(a, b) # or just use NumPy's clip method 
np.clip(c, a, b) 

array([3, 2, 5, 3, 3]) 
array([3, 2, 5, 3, 3]) 
array([3, 2, 5, 3, 3]) 
array([3, 2, 5, 3, 3]) 
+0

Oh @BasSwinckels đã đến đó trước! – uhoh

Các vấn đề liên quan