Tôi đã tạo X như Folowing
num_locations = 2
X= [ ]
for n in range[num_locations]:
X.append[[0 for j in range[num_locations]]]
Bây giờ tôi muốn tổng hợp các giá trị x [n] [m] cho trường hợp n! = M. Như vậy mà kết quả sẽ giống như
X[0][1]+X[1][0]
Có cách nào để làm điều đó với công thức tổng?
X[n][m] for n in range[num_locations]for m in range[num_locations]]
hỏi ngày 17 tháng 6 năm 2016 lúc 14:06Jun 17, 2016 at 14:06
3
Điều này có hiệu quả lấy tổng các phần tử không đường chéo của mảng 2D của bạn. Một tùy chọn sử dụng Numpy có thể chỉ đơn giản là trừ đi tổng của đường chéo chính [
sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
2] khỏi tổng của toàn bộ mảng.num_locations = 2
X= [[1,2],[2,1]]
import numpy as np
s = np.sum[X] - np.trace[X]
print[s]
Outputs::
4
Đã trả lời ngày 17 tháng 6 năm 2016 lúc 14:15Jun 17, 2016 at 14:15
Miradulomiradulomiradulo
Phù hiệu vàng 27,7K677 Huy hiệu bạc92 Huy hiệu đồng6 gold badges77 silver badges92 bronze badges
0
Bạn chỉ có thể sử dụng
sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
3>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
Trong đó
sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
4 và sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
5 lần lượt là hàng [1st Dim] và cột [DIM thứ 2] tương ứngĐã trả lời ngày 17 tháng 6 năm 2016 lúc 14:11Jun 17, 2016 at 14:11
Moses Koledoyemoses KoledoyeMoses Koledoye
76K8 Huy hiệu vàng125 Huy hiệu bạc133 Huy hiệu đồng8 gold badges125 silver badges133 bronze badges
Điều này sẽ hoạt động
sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
Nó chạy trên mỗi hàng trong mảng 2D và tổng hợp nó, sau đó lấy ra ô
sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
4 [nếu tồn tại] để nó không được tổng hợpĐã trả lời ngày 17 tháng 6 năm 2016 lúc 14:11Jun 17, 2016 at 14:11
Moses Koledoyemoses KoledoyeNeo
76K8 Huy hiệu vàng125 Huy hiệu bạc133 Huy hiệu đồng2 gold badges18 silver badges32 bronze badges
Bên cạnh tuyên bố
sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
7 vừa được giới thiệu, Python sử dụng các câu lệnh điều khiển dòng chảy thông thường được biết đến từ các ngôn ngữ khác, với một số vòng xoắn.4.1. sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
8 Báo cáo Jorsum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
8
Statements¶
sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
Có lẽ loại tuyên bố nổi tiếng nhất là tuyên bố
sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
8. Ví dụ:>>> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> # Measure some strings: ... words = ['cat', 'window', 'defenestrate'] >>> for w in words: ... print[w, len[w]] ... cat 3 window 6 defenestrate 12
Mã sửa đổi một bộ sưu tập trong khi lặp lại trên cùng một bộ sưu tập có thể là khó khăn để có được đúng. Thay vào đó, thường là lặp đi về phía trước để lặp qua một bản sao của bộ sưu tập hoặc để tạo một bộ sưu tập mới:
# Create a sample collection users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'} # Strategy: Iterate over a copy for user, status in users.copy[].items[]: if status == 'inactive': del users[user] # Strategy: Create a new collection active_users = {} for user, status in users.items[]: if status == 'active': active_users[user] = status
4.3. Hàm >>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
... print[w, len[w]]
...
cat 3
window 6
defenestrate 12
2The
>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
... print[w, len[w]]
...
cat 3
window 6
defenestrate 12
2 Function¶
Nếu bạn cần lặp lại một chuỗi các số, hàm tích hợp
>>> # Measure some strings: ... words = ['cat', 'window', 'defenestrate'] >>> for w in words: ... print[w, len[w]] ... cat 3 window 6 defenestrate 122 có ích. Nó tạo ra các tiến trình số học:
X[0][1]+X[1][0]
0Điểm cuối đã cho không bao giờ là một phần của chuỗi được tạo ra;
>>> # Measure some strings: ... words = ['cat', 'window', 'defenestrate'] >>> for w in words: ... print[w, len[w]] ... cat 3 window 6 defenestrate 124 tạo ra 10 giá trị, các chỉ số pháp lý cho các mục có chuỗi độ dài 10. Có thể để phạm vi bắt đầu ở một số khác hoặc để chỉ định một mức tăng khác [thậm chí âm; đôi khi điều này được gọi là ‘bước,]:
X[0][1]+X[1][0]
1Để lặp lại các chỉ số của một chuỗi, bạn có thể kết hợp
>>> # Measure some strings: ... words = ['cat', 'window', 'defenestrate'] >>> for w in words: ... print[w, len[w]] ... cat 3 window 6 defenestrate 122 và
>>> # Measure some strings: ... words = ['cat', 'window', 'defenestrate'] >>> for w in words: ... print[w, len[w]] ... cat 3 window 6 defenestrate 126 như sau:
X[0][1]+X[1][0]
2Tuy nhiên, trong hầu hết các trường hợp như vậy, thuận tiện khi sử dụng hàm
>>> # Measure some strings: ... words = ['cat', 'window', 'defenestrate'] >>> for w in words: ... print[w, len[w]] ... cat 3 window 6 defenestrate 127, xem các kỹ thuật lặp.Looping Techniques.
Một điều kỳ lạ xảy ra nếu bạn chỉ in một phạm vi:
X[0][1]+X[1][0]
3Theo nhiều cách, đối tượng được trả về bởi
>>> # Measure some strings: ... words = ['cat', 'window', 'defenestrate'] >>> for w in words: ... print[w, len[w]] ... cat 3 window 6 defenestrate 122 hành xử như thể đó là một danh sách, nhưng thực tế nó không phải là. Đó là một đối tượng trả về các mục liên tiếp của chuỗi mong muốn khi bạn lặp lại nó, nhưng nó không thực sự tạo ra danh sách, do đó tiết kiệm không gian.
Chúng tôi nói một đối tượng như vậy là có thể sử dụng được, nghĩa là phù hợp như một mục tiêu cho các chức năng và cấu trúc mong đợi một cái gì đó mà chúng có thể có được các mặt hàng liên tiếp cho đến khi nguồn cung bị cạn kiệt. Chúng tôi đã thấy rằng câu lệnh
>>> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> x = int[input["Please enter an integer: "]] Please enter an integer: 42 >>> if x >> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j] 00
Không có cuộc gọi nào có thể làm cho nó trả về
X[0][1]+X[1][0]
47 vì từ khóa X[n][m] for n in range[num_locations]for m in range[num_locations]]
06 sẽ luôn liên kết với tham số đầu tiên. Ví dụ:>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
1Nhưng sử dụng
X[0][1]+X[1][0]
86 [đối số chỉ có vị trí], có thể vì nó cho phép X[n][m] for n in range[num_locations]for m in range[num_locations]]
02 làm đối số vị trí và X[n][m] for n in range[num_locations]for m in range[num_locations]]
06 làm khóa trong các đối số từ khóa:>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
2Nói cách khác, tên của các tham số chỉ có vị trí có thể được sử dụng trong
X[n][m] for n in range[num_locations]for m in range[num_locations]]
03 mà không có sự mơ hồ.4.8.3.5. Tóm tắt lại¶Recap¶
Trường hợp sử dụng sẽ xác định sử dụng tham số nào trong định nghĩa hàm:
>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
3Theo hướng dẫn:
Sử dụng chỉ vị trí nếu bạn muốn tên của các tham số không có sẵn cho người dùng. Điều này rất hữu ích khi tên tham số không có ý nghĩa thực sự, nếu bạn muốn thực thi thứ tự của các đối số khi hàm được gọi hoặc nếu bạn cần lấy một số tham số vị trí và từ khóa tùy ý.
Sử dụng từ khóa chỉ khi tên có ý nghĩa và định nghĩa hàm dễ hiểu hơn bằng cách rõ ràng với tên hoặc bạn muốn ngăn người dùng dựa vào vị trí của đối số được truyền.
Đối với API, hãy sử dụng chỉ có vị trí để ngăn chặn các thay đổi API nếu tên tham số được sửa đổi trong tương lai.
4.8.4. Danh sách lập luận tùy ýArbitrary Argument Lists¶
Cuối cùng, tùy chọn ít được sử dụng nhất là chỉ định rằng một hàm có thể được gọi với số lượng đối số tùy ý. Những đối số này sẽ được kết thúc thành một tuple [xem các bộ dữ liệu và trình tự]. Trước khi có số lượng đối số, không có hoặc nhiều đối số bình thường hơn có thể xảy ra.Tuples and Sequences]. Before the variable number of arguments, zero or more normal arguments may occur.
>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
4Thông thường, các đối số variadic này sẽ là lần cuối cùng trong danh sách các tham số chính thức, bởi vì chúng tìm ra tất cả các đối số đầu vào còn lại được truyền cho hàm. Bất kỳ tham số chính thức nào xảy ra sau tham số
X[n][m] for n in range[num_locations]for m in range[num_locations]]
11 đều là đối số chỉ từ khóa, có nghĩa là chúng chỉ có thể được sử dụng làm từ khóa thay vì đối số vị trí.>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
54.8.5. Giải nén Danh sách đối sốUnpacking Argument Lists¶
Tình huống ngược lại xảy ra khi các đối số đã nằm trong danh sách hoặc tuple nhưng cần phải được giải nén cho một cuộc gọi chức năng yêu cầu các đối số vị trí riêng biệt. Chẳng hạn, hàm
>>> # Measure some strings: ... words = ['cat', 'window', 'defenestrate'] >>> for w in words: ... print[w, len[w]] ... cat 3 window 6 defenestrate 122 tích hợp mong đợi các đối số bắt đầu và dừng riêng biệt. Nếu chúng không có sẵn một cách riêng biệt, hãy viết cuộc gọi chức năng với ____ 137 người vận hành để giải nén các đối số ra khỏi danh sách hoặc tuple:
>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
6Trong cùng một thời trang, từ điển có thể cung cấp các đối số từ khóa với ________ 214-coper:
>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
74.8.6. Biểu thức Lambda¶Lambda Expressions¶
Các hàm ẩn danh nhỏ có thể được tạo với từ khóa
X[n][m] for n in range[num_locations]for m in range[num_locations]]
15. Hàm này trả về tổng của hai đối số của nó: X[n][m] for n in range[num_locations]for m in range[num_locations]]
16. Các hàm Lambda có thể được sử dụng bất cứ nơi nào các đối tượng chức năng được yêu cầu. Chúng bị giới hạn về mặt cú pháp trong một biểu thức duy nhất. Về mặt ngữ nghĩa, chúng chỉ là đường cú pháp cho một định nghĩa chức năng bình thường. Giống như các định nghĩa chức năng lồng nhau, các hàm Lambda có thể tham chiếu các biến từ phạm vi chứa:>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
8Ví dụ trên sử dụng biểu thức lambda để trả về một hàm. Một cách sử dụng khác là chuyển một chức năng nhỏ như một đối số:
>>> sum[o for i, a in enumerate[X] for j, o in enumerate[a] if i!=j]
0
94.8.7. Chuỗi tài liệuDocumentation Strings¶
Dưới đây là một số quy ước về nội dung và định dạng của chuỗi tài liệu.
Dòng đầu tiên phải luôn luôn là một bản tóm tắt ngắn gọn, ngắn gọn về mục đích của đối tượng. Đối với sự ngắn gọn, nó không nên nêu rõ ràng tên hoặc loại đối tượng, vì chúng có sẵn bằng các phương tiện khác [trừ khi tên xảy ra là một động từ mô tả hoạt động của chức năng]. Dòng này nên bắt đầu bằng một chữ cái viết hoa và kết thúc bằng một khoảng thời gian.
Nếu có nhiều dòng hơn trong chuỗi tài liệu, dòng thứ hai phải trống, phân tách trực quan bản tóm tắt với phần còn lại của mô tả. Các dòng sau đây phải là một hoặc nhiều đoạn mô tả các quy ước gọi đối tượng, các tác dụng phụ của nó, v.v.
Trình phân tích cú pháp Python không thoát khỏi thụt lề từ các chuỗi chuỗi đa dòng trong Python, do đó, các công cụ mà tài liệu xử lý phải dải thụt vào nếu muốn. Điều này được thực hiện bằng cách sử dụng quy ước sau. Dòng không trống đầu tiên sau dòng đầu tiên của chuỗi xác định lượng thụt vào toàn bộ chuỗi tài liệu. . . Các dòng được thụt vào ít hơn không nên xảy ra, nhưng nếu chúng xảy ra tất cả khoảng trắng hàng đầu của chúng nên bị tước. Tương đương của khoảng trắng phải được kiểm tra sau khi mở rộng các tab [đến 8 khoảng trống, thông thường].
Dưới đây là một ví dụ về tài liệu đa dòng:
sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
04.8.8. Chú thích chức năngFunction Annotations¶
Chú thích chức năng là thông tin siêu dữ liệu hoàn toàn tùy chọn về các loại được sử dụng bởi các chức năng do người dùng xác định [xem PEP 3107 và PEP 484 để biết thêm thông tin]. are completely optional metadata information about the types used by user-defined functions [see PEP 3107 and PEP 484 for more information].
Các chú thích được lưu trữ trong thuộc tính
17 của hàm dưới dạng từ điển và không có tác dụng đối với bất kỳ phần nào khác của hàm. Các chú thích tham số được xác định bởi một dấu hai chấm sau tên tham số, theo sau là một biểu thức đánh giá theo giá trị của chú thích. Các chú thích trả lại được xác định bởi một X[n][m] for n in range[num_locations]for m in range[num_locations]]
18 theo nghĩa đen, theo sau là một biểu thức, giữa danh sách tham số và đại tràng biểu thị kết thúc của câu lệnh X[n][m] for n in range[num_locations]for m in range[num_locations]]
50. Ví dụ sau có một đối số bắt buộc, đối số tùy chọn và giá trị trả về được chú thích: are stored in the X[0][1]+X[1][0]
X[n][m] for n in range[num_locations]for m in range[num_locations]]
17 attribute of the function as a dictionary and have no effect on any other part of the
function. Parameter annotations are defined by a colon after the parameter name, followed by an expression evaluating to the value of the annotation. Return annotations are defined by a literal X[n][m] for n in range[num_locations]for m in range[num_locations]]
18, followed by an expression, between the parameter list and the colon denoting the end of the X[0][1]+X[1][0]
50 statement. The following example has a required argument, an optional argument, and the return value
annotated:sum[[sum[row] - [row[i] if len[row] < i else 0] for i,row in enumerate[X]]]
14.9. Intermezzo: Kiểu mãIntermezzo: Coding Style¶
Bây giờ bạn sắp viết những mảnh python dài hơn, phức tạp hơn, đây là thời điểm tốt để nói về phong cách mã hóa. Hầu hết các ngôn ngữ có thể được viết [hoặc súc tích hơn, được định dạng] theo các phong cách khác nhau; Một số dễ đọc hơn những người khác. Làm cho người khác dễ dàng đọc mã của bạn luôn là một ý tưởng tốt, và việc áp dụng một phong cách mã hóa đẹp giúp rất nhiều cho điều đó.
Đối với Python, Pep 8 đã nổi lên như một hướng dẫn phong cách mà hầu hết các dự án tuân thủ; Nó thúc đẩy một phong cách mã hóa rất dễ đọc và làm hài lòng. Mỗi nhà phát triển Python nên đọc nó tại một số điểm; Dưới đây là những điểm quan trọng nhất được trích xuất cho bạn:PEP 8 has emerged as the style guide that most projects adhere to; it promotes a very readable and eye-pleasing coding style. Every Python developer should read it at some point; here are the most important points extracted for you:
Sử dụng thụt 4 không gian, và không có tab.
4 không gian là một sự thỏa hiệp tốt giữa vết lõm nhỏ [cho phép độ sâu làm tổ lớn hơn] và thụt lớn [dễ đọc hơn]. Các tab giới thiệu nhầm lẫn, và tốt nhất là bị bỏ rơi.
Bao bọc các dòng để chúng không vượt quá 79 ký tự.
Điều này giúp người dùng có màn hình nhỏ và có thể có một số tệp mã bên cạnh các màn hình lớn hơn.
Sử dụng các dòng trống để phân tách các chức năng và các lớp và các khối mã bên trong các chức năng lớn hơn.
Khi có thể, hãy đặt ý kiến trên một dòng của riêng họ.
Sử dụng tài liệu.
Sử dụng không gian xung quanh các toán tử và sau dấu phẩy, nhưng không trực tiếp bên trong các cấu trúc khung:
20.X[n][m] for n in range[num_locations]for m in range[num_locations]]
Đặt tên cho các lớp học và chức năng của bạn một cách nhất quán; Công ước là sử dụng
21 cho các lớp vàX[n][m] for n in range[num_locations]for m in range[num_locations]]
22 cho các chức năng và phương pháp. Luôn luôn sử dụngX[n][m] for n in range[num_locations]for m in range[num_locations]]
23 làm tên cho đối số phương thức đầu tiên [xem cái nhìn đầu tiên về các lớp để biết thêm về các lớp và phương thức].A First Look at Classes for more on classes and methods].X[n][m] for n in range[num_locations]for m in range[num_locations]]
Don Tiết sử dụng các mã hóa ưa thích nếu mã của bạn được sử dụng trong môi trường quốc tế. Python sườn mặc định, UTF-8 hoặc thậm chí ASCII đơn giản hoạt động tốt nhất trong mọi trường hợp.
Tương tự như vậy, don lồng sử dụng các ký tự không phải ASCII trong các định danh nếu chỉ có cơ hội nhỏ nhất mà mọi người nói một ngôn ngữ khác sẽ đọc hoặc duy trì mã.
Chú thích
1Trên thực tế, gọi theo tham chiếu đối tượng sẽ là một mô tả tốt hơn, vì nếu một đối tượng có thể thay đổi được truyền, người gọi sẽ thấy bất kỳ thay đổi nào mà callee thực hiện đối với nó [các mục được chèn vào danh sách].