it-swarm-vi.com

Có phải là xấu khi sử dụng các ký tự Unicode trong tên biến?

Gần đây tôi đã cố gắng thực hiện một thuật toán xếp hạng, AllegSkill, thành Python 3.

Đây là những gì toán học trông giống như:

alt text

Không, thực sự.

Đây là những gì tôi đã viết:

t = (µw-µl)/c  # those are used in
e = ε/c        # multiple places.
σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

Tôi thực sự nghĩ rằng thật không may khi Python 3 không chấp nhận hoặc là ² dưới dạng tên biến.

>>> √ = lambda x: x**.5
  File "<stdin>", line 1
    √ = lambda x: x**.5
      ^
SyntaxError: invalid character in identifier

Tôi có mất trí không? Tôi có nên dùng đến phiên bản ASCII không? Tại sao? Sẽ không ASCII phiên bản duy nhất ở trên khó xác nhận tính tương đương với các công thức?

Nhắc bạn, tôi hiểu một số glyph Unicode trông rất giống nhau và một số như (hoặc đó là ▗▖) hoặc ╦ không thể có ý nghĩa gì trong mã viết. Tuy nhiên, điều này hầu như không xảy ra đối với môn Toán hoặc mũi tên glyphs.


Mỗi yêu cầu, phiên bản chỉ ASCII sẽ là thứ gì đó dọc theo dòng:

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

... Mỗi bước của thuật toán.

84
badp

Tôi cảm thấy mạnh mẽ rằng chỉ cần thay thế σ với s hoặc sigma sẽ là ngu ngốc, giáp với não chết.

Những gì mà lợi ích tiềm năng đạt được? Được rồi để xem …

  • Nó cải thiện khả năng đọc? Không, không phải trong một chút. Nếu đó là như vậy, công thức ban đầu chắc chắn cũng đã sử dụng các chữ cái Latinh.

  • Nó có cải thiện khả năng viết không? Trong cái nhìn đầu tiên, có. Nhưng về thứ hai, không. Bởi vì công thức này là sẽ không bao giờ thay đổi (tốt, không bao giờ được). Thông thường sẽ không cần phải thay đổi mã, cũng như không mở rộng nó bằng các biến này. Vì vậy, khả năng ghi là - chỉ một lần này - không phải là một vấn đề.

Cá nhân, tôi nghĩ rằng ngôn ngữ lập trình có một lợi thế so với các công thức toán học: bạn có thể sử dụng các định danh biểu cảm, có ý nghĩa. Trong toán học, đây không phải là trường hợp thông thường, vì vậy chúng tôi sử dụng các biến một chữ cái, đôi khi biến chúng thành tiếng Hy Lạp.

Nhưng Hy Lạp không phải là vấn đề. Các định danh không mô tả, một chữ cái là.

Vì vậy, hãy giữ nguyên ký hiệu ban đầu, nếu ngôn ngữ lập trình does hỗ trợ Unicode trong các định danh, do đó, không có rào cản kỹ thuật. Hoặc sử dụng định danh có ý nghĩa. Donv chỉ thay thế glyphs Hy Lạp bằng glyphs Latin. Hoặc tiếng Ả Rập, hoặc tiếng Hindi.

54
Konrad Rudolph

Cá nhân, tôi ghét phải xem mã nơi tôi phải đưa ra sơ đồ nhân vật để gõ lại. Mặc dù unicode rất khớp với những gì trong thuật toán, nhưng nó thực sự gây tổn hại cho khả năng đọc và khả năng chỉnh sửa. Một số biên tập viên thậm chí có thể không có phông chữ hỗ trợ ký tự đó.

Điều gì về một sự thay thế và chỉ cần lên top //µ = u và viết mọi thứ bằng ascii?

34
TheLQ

Đối số này cho rằng bạn không có vấn đề gì với việc gõ unicodes cũng như không đọc các chữ cái Hy Lạp

Đây là đối số: bạn muốn pi hay circle_ratio?

Trong trường hợp này, tôi thích pi hơn tròn_ratio vì tôi đã học về pi từ khi còn học tiểu học và tôi có thể hy vọng định nghĩa về pi đã ăn sâu vào mọi lập trình viên đáng muối của mình. Vì vậy, tôi sẽ không nhớ gõ π để có nghĩa là circle_ratio.

Tuy nhiên, những gì về

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

hoặc là

σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

Đối với tôi, cả hai phiên bản đều mờ đục như nhau, giống như pi hoặc π là, ngoại trừ Tôi không học công thức này ở trường. winner_sigmaWwin không có nghĩa gì với tôi hoặc với bất kỳ ai khác đang đọc mã và không sử dụng σw không làm cho nó tốt hơn.

Vì vậy, sử dụng tên mô tả, ví dụ: total_score, winning_ratio, v.v. sẽ tăng khả năng đọc tốt hơn nhiều so với việc sử dụng tên ascii chỉ phát âm các chữ cái Hy Lạp . Vấn đề không phải là tôi không thể đọc các chữ cái Hy Lạp, nhưng tôi không thể liên kết các ký tự (tiếng Hy Lạp hay không) với "ý nghĩa" của biến.

Bạn chắc chắn đã hiểu vấn đề của chính mình khi bạn nhận xét: You should have seen the paper. It's just eight pages.... Vấn đề là nếu bạn căn cứ vào việc đặt tên biến của mình trên một tờ giấy, trong đó chọn tên một chữ cái cho đơn giản hơn là dễ đọc (bất kể họ là người Hy Lạp), thì mọi người sẽ phải đọc bài báo để có thể liên kết các chữ cái với "Ý nghĩa"; điều này có nghĩa là bạn đang đặt một rào cản nhân tạo để mọi người có thể hiểu mã của bạn và đó luôn là một điều xấu.

Ngay cả khi bạn sống trong một thế giới chỉ có ASCII, cả hai a * b / 2alpha * beta / 2 là một kết xuất mờ không kém của height * base / 2, công thức diện tích tam giác. Khả năng không đọc được của việc sử dụng các biến đơn ký tự tăng theo cấp số nhân khi công thức phát triển phức tạp và công thức AllegSkill chắc chắn không phải là một công thức tầm thường.

Biến một chữ cái chỉ được chấp nhận như một bộ đếm vòng lặp đơn giản, cho dù chúng là chữ cái đơn của Hy Lạp hay chữ cái đơn, tôi không quan tâm; không có biến nào khác chỉ nên bao gồm một chữ cái duy nhất. Tôi không quan tâm nếu bạn sử dụng các chữ cái Hy Lạp cho tên của mình, nhưng khi bạn sử dụng chúng, hãy đảm bảo tôi có thể liên kết các tên đó với một "ý nghĩa" mà không cần phải đọc một tờ giấy tùy ý ở nơi nào khác.

Khi ở trường, tôi chắc chắn sẽ không thấy các biểu thức toán học sử dụng các ký hiệu như: +, -, ×, đối với các phép tính cơ bản và () sẽ là hàm căn bậc hai. Sau khi tôi tốt nghiệp lớp, tôi không ngại việc thêm một biểu tượng mới sáng bóng: để tích hợp. Lưu ý xu hướng, đây là tất cả các nhà khai thác. Các toán tử được sử dụng nhiều hơn so với các tên biến, nhưng chúng thường ít được sử dụng lại cho một ý nghĩa hoàn toàn khác (trong trường hợp các nhà toán học sử dụng lại các toán tử, nghĩa mới thường vẫn giữ một số tính chất cơ bản của nghĩa cũ; khi sử dụng lại tên biến).

Tóm lại, không, không tệ khi sử dụng các ký tự Unicode cho các tên biến; tuy nhiên, thật tệ khi sử dụng tên một chữ cái cho tên biến và được phép sử dụng tên Unicode không phải là giấy phép sử dụng tên biến chữ cái đơn.

31
Lie Ryan

Bạn có hiểu mã không? Có ai khác cần đọc nó không? Nếu vậy, không có vấn đề gì.

Cá nhân tôi rất vui khi thấy mặt sau của mã nguồn chỉ ASCII.

14
user4051

Vâng, bạn ra khỏi tâm trí của bạn. Cá nhân tôi sẽ tham khảo số giấy và số công thức trong một bình luận, và viết mọi thứ bằng ASCII thẳng. Sau đó, bất cứ ai quan tâm sẽ có thể tương quan mã và công thức.

9
zvrba

Tôi muốn nói rằng sử dụng tên biến Unicode là một ý tưởng tồi vì hai lý do:

  1. Họ là một Pita để gõ.

  2. Chúng thường trông gần giống như chữ cái tiếng Anh. Đây là cùng một lý do tại sao tôi ghét nhìn thấy các chữ cái Hy Lạp trong ký hiệu toán học. Hãy thử nói với rho ngoài p. Nó không dễ.

5
dsimcha

Trong trường hợp này, một công thức toán học phức tạp, tôi muốn nói là đi cho nó.

Tôi có thể nói trong 20 năm tôi chưa bao giờ phải viết mã gì đó phức tạp và các chữ cái Hy Lạp này giữ cho nó gần với toán học gốc. Nếu bạn không thể hiểu nó, bạn không nên duy trì nó.

Nói rằng, nếu tôi phải duy trì mật mã và σ trong mã tiêu chuẩn không có thật mà bạn đã để lại cho tôi, tôi sẽ tìm ra nơi bạn sống ...

4
gbn
  • Pro: có vẻ tốt
  • Con: các ký tự unicode và do đó toàn bộ ý nghĩa có thể bị mất trong chuỗi công cụ (trình soạn thảo, trình định dạng mã, kiểm soát phiên bản, trình biên dịch cũ hơn)

Làm thế nào lớn là rủi ro cho bạn? Liệu lợi ích có cao hơn rủi ro?

3
LennyProgrammers

Thỉnh thoảng trong một tương lai không xa, tất cả chúng ta sẽ sử dụng các trình soạn thảo văn bản/IDE/trình duyệt web để dễ dàng viết văn bản chỉnh sửa bao gồm các ký tự Hy Lạp cổ điển, v.v. (Hoặc có thể tất cả chúng ta đã học cách sử dụng "ẩn" này "chức năng trong các công cụ chúng tôi hiện đang sử dụng ...)

Nhưng cho đến khi điều đó xảy ra, các ký tự không ASCII trong mã nguồn chương trình sẽ khó xử lý đối với nhiều lập trình viên, và do đó, là một ý tưởng tồi nếu bạn đang viết các ứng dụng có thể cần được duy trì bởi người khác .

(Vô tình lý do bạn có thể có các ký tự Hy Lạp nhưng không có dấu căn bậc hai trong Python rất đơn giản. Các ký tự Hy Lạp được phân loại là Chữ Unicode, nhưng dấu căn bậc hai là một chữ cái; http://www.python.org/dev/peps/pep-3131/ )

2
Stephen C

Bạn đã không nói ngôn ngữ/trình biên dịch nào bạn đang sử dụng, nhưng thông thường quy tắc cho các tên biến là chúng phải bắt đầu bằng một ký tự chữ cái hoặc dấu gạch dưới và chỉ chứa các chữ số và dấu gạch dưới. Unicode sẽ không được coi là chữ và số, vì nó là ký hiệu toán học thay vì chữ cái. Tuy nhiên σ có thể là (vì nó nằm trong bảng chữ cái Hy Lạp) và á có thể được coi là chữ và số.

2
tcrosley

Tôi đã đăng cùng loại câu hỏi trên StackOverflow

Tôi chắc chắn nghĩ rằng nó đáng để sử dụng unicode trong các bài toán nặng liên quan đến toán học, bởi vì nó có thể đọc công thức trực tiếp, điều này là không thể với ASCII đơn giản.

Hãy tưởng tượng một phiên gỡ lỗi: tất nhiên bạn luôn có thể viết tay công thức mã được cho là để tính toán xem nó có đúng không. Nhưng chín mươi phần trăm thời gian, bạn sẽ không bận tâm và lỗi có thể ẩn trong một thời gian dài. Và không ai sẵn sàng nhìn vào công thức tóm tắt 7 dòng, đơn giản ASCII này. Tất nhiên, sử dụng unicode không tốt bằng công thức kết xuất tex, nhưng cách này tốt hơn .

Việc thay thế sử dụng tên mô tả dài là không khả thi vì trong toán học, nếu định danh không ngắn, công thức sẽ còn phức tạp hơn (tại sao bạn nghĩ rằng mọi người, vào khoảng thế kỷ XVIII, đã bắt đầu thay thế "cộng" bằng "+" và "trừ" bởi "-"?).

Cá nhân, tôi cũng sẽ sử dụng một số đăng ký và siêu ký tự (tôi chỉ sao chép-dán chúng từ trang này ). Ví dụ: (had python được phép làm định danh)

√ = math.sqrt #function alias
c² = c**2
σʷ² = σʷ**2
γ² = γ**2
σ′ʷ = √(σʷ² * (1 - (σʷ²/c²)*Wʷⁱⁿ(t, e)) + γ²)

Nơi tôi đã sử dụng các siêu ký tự vì không có chỉ số tương đương trong unicode. (Thật không may, bộ ký tự đăng ký unicode rất hạn chế. Tôi hy vọng rằng một ngày nào đó, việc đăng ký trong unicode sẽ được coi là dấu phụ, tức là sự kết hợp của một char cho đăng ký và một char khác cho chữ cái được đăng ký)

Một điều cuối cùng, tôi nghĩ cuộc trò chuyện này về việc sử dụng ký tự không phải ASCII chủ yếu là sai lệch, bởi vì nhiều lập trình viên không bao giờ xử lý "các ký hiệu toán học chuyên sâu về công thức". Vì vậy, họ nghĩ rằng câu hỏi này không quan trọng, bởi vì họ chưa bao giờ trải qua một phần mã đáng kể sẽ yêu cầu sử dụng các mã định danh không phải ASCII. Nếu bạn là một trong số họ (và tôi cho đến gần đây), hãy xem xét điều này: giả sử rằng chữ "a" không phải là một phần của ASCII. Sau đó, bạn sẽ có một ý tưởng khá hay về vấn đề không có chữ cái Hy Lạp, bảng con, siêu ký tự khi tính toán các công thức toán học không tầm thường.

1
Bérenger

cá nhân tôi có động lực để coi các ngôn ngữ lập trình là một công cụ cho các nhà toán học trong bối cảnh này, vì tôi không thực sự sử dụng toán học trông giống như trong cuộc sống của tôi. : D Và chắc chắn, tại sao không sử dụng ɛ hoặc hoặc bất cứ điều gì - trong bối cảnh đó, nó thực sự là more rõ ràng.

(Mặc dù, tôi phải nói rằng, sở thích của tôi sẽ là hỗ trợ các số siêu ký tự như các cuộc gọi phương thức trực tiếp, không phải tên biến. Ví dụ: 2² = 2 ** 2 = 4, v.v.)

0
roberto

Có phải mã này chỉ dành cho dự án cá nhân của bạn? Nếu vậy, đi hạt, sử dụng bất cứ điều gì bạn muốn.

Là mã này có nghĩa là cho người khác sử dụng? tức là và ứng dụng nguồn mở nào đó? Nếu vậy, bạn có thể chỉ yêu cầu sự cố vì các lập trình viên khác nhau sử dụng các trình soạn thảo khác nhau và bạn không thể chắc chắn tất cả các trình soạn thảo sẽ hỗ trợ unicode chính xác. Thêm vào đó, không phải tất cả các shell lệnh sẽ hiển thị chính xác khi tệp mã nguồn là type'd/cat'd và bạn có thể gặp sự cố nếu bạn cần hiển thị nó trong html.

0
GrandmasterB