Lý do mã của bạn chỉ trở về một cái tên ngày là vì weekday
sẽ không bao giờ phù hợp với nhiều hơn một chuỗi trong days
tuple và do đó sẽ không thêm bất kỳ của những ngày của tuần làm theo nó (cũng không quấn quanh những người trước đó). Ngay cả khi nó đã làm bằng cách nào đó, nó sẽ vẫn trả lại tất cả chúng như là một chuỗi dài bởi vì bạn đang khởi tạo result
đến một chuỗi rỗng, không phải là trống list
.
Đây là giải pháp sử dụng mô-đun datetime
để tạo danh sách tất cả tên ngày trong tuần bắt đầu bằng "Thứ hai" bằng ngôn ngữ của ngôn ngữ hiện tại. Danh sách này sau đó được sử dụng để tạo một danh sách tên khác theo thứ tự mong muốn được trả về. Nó thực hiện thứ tự bằng cách tìm chỉ mục của ngày được chỉ định trong danh sách ban đầu và sau đó ghép hai lát của nó tương ứng với chỉ mục đó để tạo thành kết quả. Khi tối ưu hóa nó cũng lưu trữ tên ngày của miền địa phương để nếu nó được gọi lại với cùng một ngôn ngữ hiện tại (một kịch bản có khả năng), nó sẽ không cần phải tạo lại danh sách riêng tư này.
import datetime
import locale
def weekdays(weekday):
current_locale = locale.getlocale()
if current_locale not in weekdays._days_cache:
# Add day names from a reference date, Monday 2001-Jan-1 to cache.
weekdays._days_cache[current_locale] = [
datetime.date(2001, 1, i).strftime('%A') for i in range(1, 8)]
days = weekdays._days_cache[current_locale]
index = days.index(weekday)
return days[index:] + days[:index]
weekdays._days_cache = {} # initialize cache
print(weekdays('Wednesday'))
# ['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']
Bên cạnh đó không cần phải mã hóa cứng ngày tên trong hàm, một lợi thế để sử dụng các mô-đun datetime
là mã sử dụng nó sẽ tự động làm việc trong các ngôn ngữ khác. Điều này có thể được minh họa bằng cách thay đổi ngôn ngữ và sau đó gọi hàm bằng tên ngày theo ngôn ngữ tương ứng.
Ví dụ: mặc dù Pháp không phải là ngôn ngữ mặc định của tôi, tôi có thể đặt ngôn ngữ đó là ngôn ngữ hiện tại cho mục đích thử nghiệm như được hiển thị bên dưới. Lưu ý: Theo bài viết Capitalization of day names này, tên của các ngày trong tuần không được viết hoa bằng tiếng Pháp giống như ngôn ngữ mặc định của tiếng Anh, nhưng cũng được tính đến tự động, có nghĩa là tên weekday
được chuyển đến bằng ngôn ngữ của ngôn ngữ hiện tại và cũng phân biệt chữ hoa chữ thường. Tất nhiên bạn có thể sửa đổi chức năng để bỏ qua chữ cái của đối số đầu vào, nếu muốn.
# set or change locale
locale.setlocale(locale.LC_ALL, 'french_france')
print(weekdays('mercredi')) # use French equivalent of 'Wednesday'
# ['mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche', 'lundi', 'mardi']
giải pháp tốt và đơn giản) – Gusto