Các khái niệm chính trong Python là gì?

Cập nhật ngày 18 tháng 5 năm 2017. Đã gần bốn năm kể từ khi tôi viết bài đăng gốc trên blog này. Theo Google Analytics, nó đã trở thành bài đăng blog phổ biến nhất mà tôi từng viết. Ngoài ra, trong khoảng thời gian bốn năm đó, tôi đã có nhiều kinh nghiệm lập trình hơn bằng Python như một phần của chuyên ngành đại học khoa học máy tính của tôi sau bằng Tiến sĩ của tôi. D. nghiên cứu, vì vậy tôi nghĩ đã đến lúc tôi cung cấp thông tin cập nhật sớm. Hãy theo dõi một bài viết blog mới. [Bài đăng này sẽ vẫn được lưu trữ vì lý do lịch sử và vì tôi muốn nhìn lại bài viết trước đây của mình. ]

Tôi đã từng lập trình bằng Java trước khi chuyển đổi sang Python. Và bây giờ tôi đã trở thành một người hâm mộ cuồng nhiệt của Python, tôi nghĩ mình sẽ cung cấp 10 sự thật hoặc khái niệm cơ bản nhưng quan trọng về Python. Tất cả những thứ này đều hữu ích với tôi trong năm qua khi tôi chọn Python làm ngôn ngữ lập trình chính của mình. Nếu bạn mới bắt đầu làm quen với Python hoặc quan tâm đến những gì ngôn ngữ này cung cấp, bạn có thể thấy phần tổng quan này hữu ích. Mục nhập này giả định rằng bạn cảm thấy thoải mái với thuật ngữ lập trình cơ bản và cú pháp Python, chẳng hạn như hiểu vai trò của khoảng trắng trong Python

Tôi cũng sử dụng mã một cách đáng kể trong suốt bài đăng này, vì vậy hãy lưu ý rằng các nhận xét một dòng trong Python được đặt trước thẻ bắt đầu bằng #

import sys

# If number of parameters is incorrect, terminate.  
if [len[sys.argv] != 3]:  
  print["USAGE: kmeans_clustering.py [file] [clusters]"]  
  sys.exit[]  
num_clusters = int[sys.argv[2]]

with open[sys.argv[1], 'r'] as feature_file:  
  # Do stuff with the file  
9. Để nhận xét một khối văn bản trong Python, chúng ta có thể bao quanh văn bản bằng ba dấu ngoặc kép
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
0 ở đầu và cuối. Phương pháp này giúp việc nhận xét nhiều dòng trở nên dễ dàng hơn vì chúng ta không phải đặt dấu gạch chéo ở đầu mỗi dòng

Cuối cùng, trước khi chúng ta đi vào nội dung chính của bài đăng, nếu một người có kế hoạch sử dụng Python một cách nghiêm túc, thì điều cần thiết là phải tự làm quen với các trang web sau

  1. Trang web Python chính thức
  2. Tài liệu Python 2 [Bỏ qua phần này nếu chỉ sử dụng Python 3]
  3. Tài liệu Python 3
  4. tràn ngăn xếp

Tôi bao gồm cả Stack Overflow vì kể từ khi nó mở ra, mọi người đã hỏi vô số câu hỏi về lập trình Python ở đó. Nếu bạn gặp lỗi cú pháp cơ bản, hãy cố gắng tránh đặt câu hỏi trên Stack Overflow vì có thể ai đó đã làm rồi. Trên thực tế, trong nhiều trường hợp, Stack Overflow đã trở thành tài liệu. [Nhưng đó là một câu chuyện cho một ngày khác. ]

Điều đó nói rằng, hãy thảo luận về mười trong số một số khái niệm quan trọng mà các lập trình viên Python nên biết

1. Số phiên bản Python

Mặc dù về mặt kỹ thuật, đây không phải là một tính năng lập trình, nhưng điều quan trọng là phải biết các phiên bản hiện tại của Python để tất cả chúng ta đều ở trên cùng một trang. Các phiên bản Python được đánh số là A. B. C. , trong đó ba chữ cái biểu thị [theo thứ tự giảm dần] những thay đổi quan trọng trong ngôn ngữ. Vì vậy, ví dụ, đi từ 2. 7. 3 đến 2. 7. 4 có nghĩa là bản dựng Python đã thực hiện một số sửa lỗi nhỏ, trong khi chuyển từ 2. xx đến 3. xx đại diện cho một sự thay đổi lớn. Lưu ý 'x' ở đây, đây là cố ý; . 7. C cho bất kỳ giá trị 'C' hợp lệ nào, sau đó chúng tôi nhập 'x' và tham khảo Python 2. 7. x. Chúng ta cũng có thể bỏ hoàn toàn chữ 'x' và chỉ sử dụng 2. 7

Tính đến thời điểm viết bài này [tháng 7 năm 2013], Python có hai phiên bản ổn định thường được sử dụng. 2. 7 và 3. 3. Ít quan trọng hơn là nhân vật thứ ba, nhưng ngay bây giờ 2. 7. 5 và 3. 3. 2 là phiên bản hiện tại, cả hai đều được phát hành vào ngày 15 tháng 5 năm 2013. Câu trả lời ngắn gọn là, trong khi cả 2. 7 và 3. 3 là hoàn toàn tốt để sử dụng, 3. 3 là tương lai của ngôn ngữ này và ai đó mới bắt đầu học Python hôm nay có lẽ nên sử dụng Python 3. 3 trên 2. 7. Tất nhiên, nếu một người đang ở giữa một dự án nghiên cứu sâu rộng sử dụng nhiều 2. 7, thì việc nâng cấp lên 3 có thể không hợp lý. 3 ngay. Điều này thực sự khá giống với tình huống hiện tại của tôi, vì tôi đang sử dụng khá nhiều Python 2 của riêng mình. 7 script giúp tôi phân tích thuật toán tổ hợp trên word. Khi tháng 8 đến, tôi sẽ chuyển đổi hoàn toàn sang Python 3. 3. Tuy nhiên, trong thời gian chờ đợi, tôi đã đọc khá nhiều về các phiên bản mới của Python 3 và tôi có 3. 3. 2 đã cài đặt [ngoài 2. 7. 4] trên máy tính xách tay của tôi, vì vậy bài đăng này và cú pháp mã của nó sẽ cho rằng chúng tôi đang sử dụng Python 3

Tuy nhiên, một điều quan trọng cần lưu ý là Python 3 cố tình không tương thích ngược. Khả năng tương thích ngược thường là một tính năng mong muốn của các ngôn ngữ lập trình và phần mềm thường xuyên trải qua các phiên bản, vì điều đó có nghĩa là đầu vào từ các phiên bản cũ hơn [e. g. các chương trình Python cũ hơn] vẫn có thể chạy trong các bản dựng mới nhất. Trong trường hợp này, mã Python 2 sẽ không được đảm bảo chạy thành công nếu sử dụng Python 3, vì vậy có thể cần một số chuyển đổi để cho phép mã chạy đúng cách. Tính không tương thích ngược là cần thiết để cho phép Python 3 rõ ràng hơn, ngắn gọn hơn và sử dụng các tính năng bổ sung

Trong khi chờ đợi, sự khác biệt giữa Python 2 và 3 là gì, dù sao thì Điều đó nằm ngoài phạm vi của bài đăng này, nhưng tôi đã thêm vào các tài liệu tham khảo ở cuối phần dựa trên tài liệu chính thức của Python. Tôi cho rằng cải tiến chính là hỗ trợ Unicode tốt hơn, nhưng cũng có một số sửa lỗi nhỏ ở đây và ở đó, cải thiện một số tính năng khó chịu của 2. 7. Tuy nhiên, trong khi có đủ thay đổi để đảm bảo 2. x đến 3. x thay đổi, Guido van Rossum nói trong phần tổng quan của mình rằng

Tuy nhiên, sau khi tiêu hóa các thay đổi, bạn sẽ thấy rằng Python thực sự không thay đổi nhiều đến thế - nói chung, chúng tôi chủ yếu sửa các phiền toái và mụn cóc nổi tiếng, đồng thời loại bỏ rất nhiều hành trình cũ.

Một lưu ý. Guido van Rossum là người tạo ra Python và vẫn duy trì vai trò lãnh đạo của mình đối với sự phát triển của ngôn ngữ lập trình, vì vậy nếu có điều gì đó ông ấy nói về Python, thì điều đó thường có thể được coi là đúng

Nhân tiện, nếu bạn tò mò muốn xem phiên bản Python của mình, bạn chỉ cần dán đoạn mã sau vào chương trình

import sys
print["My version Number: {}".format[sys.version]]  

Ở đây, văn bản bên trong dấu ngoặc kép được in như vốn có, ngoại trừ dấu ngoặc kép

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
1 và
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
2, biến thành
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
3 hay nói cách khác, phiên bản Python. Đây là định dạng chuỗi cổ điển

Ngoài ra, nếu bạn đang sử dụng máy tính Linux hoặc Mac, bạn có thể thực hiện trực tiếp công việc tương tự trong trình thông dịch Python trên trình thông dịch dòng lệnh [i. e. Unix Shell] hoặc Mac OS X Terminal. Người dùng Windows sẽ cần cài đặt phần mềm của bên thứ ba, chẳng hạn như Cygwin, vì không có giao diện dòng lệnh tích hợp. Nhưng trong khi chờ đợi, Terminal cực kỳ hữu ích này đưa chúng ta đến điểm tiếp theo…

2. Sử dụng vỏ Python

Không còn nghi ngờ gì nữa, một trong những khía cạnh hữu ích nhất của Python là nó được cài đặt tự động với shell của chính nó. Python Shell có thể được thực thi bằng cách nhập

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
4 từ dòng lệnh [trong Windows, sẽ có một ứng dụng mà bạn chỉ cần nhấp đúp vào]. Bằng cách đó, bạn sẽ thấy số phiên bản mặc định, thông báo bản quyền và ba mũi tên [hoặc “r-angles” trong LaTeX-speak]
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
5 yêu cầu bạn cung cấp thông tin đầu vào. Nếu bạn đã cài đặt nhiều phiên bản Python, bạn có thể cần thêm số phiên bản
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
6 để có phiên bản chính xác

Vậy tại sao trình bao Python lại hữu ích như vậy? . Trong nhiều trường hợp, bạn sẽ có thể phát hiện liệu có lỗi cú pháp hoặc lỗi logic trong một số lệnh mà bạn muốn sử dụng hay không trước khi lệnh đó được kiểm tra trong một số tập lệnh khổng lồ có thể tiêu tốn bộ nhớ hoặc tốn nhiều thời gian

Dưới đây, tôi đã đính kèm một ảnh chụp màn hình về việc tôi thực hiện một số lệnh trên Terminal của Macbook Pro, sử dụng 3. 3 vỏ trăn

Nhóm lệnh này thiết lập một danh sách trống [

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
7] và thêm vào đó tất cả các số nguyên chẵn trong phạm vi \[[2, 16]\]

Để cho thấy lý do tại sao trình bao này có thể hữu ích, giả sử tôi đã quên nhập tham số cuối cùng của

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
8 nên tôi đã nhập vào
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
9 thay thế. Sau đó, khi tôi in nội dung của danh sách sau vòng lặp for, tôi sẽ thấy tất cả các số từ 2 đến 15, thay vì chỉ các số chẵn. Nhưng vì tôi chỉ muốn các số chẵn trong chương trình “thực” mà tôi đang làm việc, điều này sẽ nhắc tôi thêm vào tham số cuối cùng đó. Đó là một ví dụ ngớ ngẩn, nhưng nó thực sự cho thấy việc kiểm tra những gì bạn làm trong trình bao trước khi bạn chèn nó vào một chương trình thực có thể mang lại lợi ích như thế nào. Tôi sẽ sử dụng trình bao trong một số bit mã khác trong bài đăng này, mà bạn có thể nhận ra bằng ba “r-angle”
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
5

Các ngôn ngữ phổ biến khác như C++ và Java có phiên bản trình bao Python của riêng chúng, nhưng tôi tin rằng bạn sẽ cần phải cài đặt một cái gì đó. Và việc cài đặt các chương trình kiểu Linux có thể không hề đơn giản vì thường không có GUI đẹp mắt có thể nhấp được để có thể thực hiện cài đặt ngay lập tức

3. Sử dụng 'os' và 'sys'

Tôi thấy cả hai mô-đun os và sys đều cực kỳ hữu ích đối với tôi vì mục đích tiện lợi và tổng quát

Trước tiên, hãy xem qua mô-đun

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
31. Có thể lợi thế lớn nhất mà nó mang lại cho lập trình viên là việc sử dụng các đầu vào dòng lệnh cho chương trình. Giả sử bạn đã xây dựng một chương trình lớn sẽ thực hiện một số tác vụ phụ thuộc vào đầu vào từ người dùng. Chẳng hạn, trong lớp học máy của tôi vào học kỳ trước, tôi đã triển khai thuật toán phân cụm k-means. Đây là một thuật toán học tập được cung cấp dữ liệu và có thể phân loại nó thành các nhóm tùy thuộc vào số lượng cụm được cung cấp làm đầu vào. Rõ ràng là điều này có thể hữu ích trong nhiều ứng dụng cuộc sống. Một người có dữ liệu chuẩn hóa về hồ sơ bệnh nhân y tế [e. g. lượng đường trong máu, chiều cao, cân nặng, v.v. ] có thể muốn phân loại bệnh nhân thành hai "nhóm", có thể là [1] khỏe mạnh hoặc [2] ốm yếu. Hoặc có lẽ có thể có n cụm, trong đó bệnh nhân được phân loại vào các cụm có số lượng thấp hơn có triển vọng tốt hơn so với những cụm có số lượng cao

Sau đó, để thực hiện phân cụm k-means, về mặt logic, chúng ta cần hai đầu vào. [1] bản thân dữ liệu và [2] số lượng cụm. Một ý tưởng là đưa những thứ này trực tiếp vào chương trình, rồi chạy nó. Nhưng điều gì sẽ xảy ra nếu chúng tôi muốn tiếp tục thay đổi tệp dữ liệu mà chúng tôi đang sử dụng hoặc số lượng cụm?

Một cách tốt hơn là sử dụng các đối số dòng lệnh. Thay đổi đầu vào trên dòng lệnh thường nhanh hơn mở trình soạn thảo văn bản và nhập lại các biến. Chúng ta có thể làm điều này với sys. argv, nhận đầu vào từ dòng lệnh. Là một biện pháp bảo vệ bổ sung, người ta cũng có thể đảm bảo rằng người dùng nhập đúng số tham số. Tôi đã thực hiện việc này trong đoạn mã sau từ thuật toán phân cụm k-means của mình

import sys

# If number of parameters is incorrect, terminate.  
if [len[sys.argv] != 3]:  
  print["USAGE: kmeans_clustering.py [file] [clusters]"]  
  sys.exit[]  
num_clusters = int[sys.argv[2]]

with open[sys.argv[1], 'r'] as feature_file:  
  # Do stuff with the file  

Ở đây,

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
32 đại diện cho danh sách các đối số dòng lệnh, với tên của mã là phần tử đầu tiên. Nếu tôi đã nhập các tham số chính xác, thì chương trình sẽ diễn ra suôn sẻ, với
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
33 và
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
34 được kết hợp liền mạch

Ngoài tốc độ, một ưu điểm khác của đối số dòng lệnh là chúng có thể được sử dụng như một phần của quy trình để tự động hóa lặp đi lặp lại cùng một tập lệnh. Giả sử tôi muốn chạy đi chạy lại tập lệnh

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
35 của mình với giá trị cụm nằm trong khoảng từ 2 đến 100. Một cách là gọi một cách tẻ nhạt
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
35 trên dòng lệnh với tham số cuối cùng là '2', sau đó thực hiện tương tự với '3' sau khi lần chạy đầu tiên kết thúc, sau đó thực hiện '4', v.v. Nói cách khác, tôi phải gọi chương trình 99 lần

Cách tốt hơn là tạo một tập lệnh Python khác và sử dụng os. hệ thống gọi

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
35 bao nhiêu lần tôi muốn. Và điều này dễ như thay đổi đầu vào thành
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
38. Nó nhận vào một chuỗi, vì vậy tôi sẽ đặt một vòng lặp for sẽ tạo ra chuỗi duy nhất của nó, chuỗi này sau đó sẽ đóng vai trò là đầu vào cho dòng lệnh. Xem mã sau để biết ví dụ, trong đó
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
39 là tệp tạo sẵn mà tôi đang sử dụng làm ví dụ

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  

Vì vậy, bây giờ chương trình này sẽ tự động gọi kmeans_clustering 99 lần, mỗi lần có một tham số khác nhau cho số lượng cụm. Khá hữu ích phải không? . Chỉ cần cảnh giác rằng nếu bạn thực hiện thay đổi đối với một chương trình trong khi một tập lệnh khác đang gọi nó, thì những thay đổi đó sẽ được phản ánh vào lần tiếp theo khi chương trình được gọi

4. Danh sách hiểu

Theo tôi, việc hiểu danh sách hoặc quá trình hình thành danh sách từ các danh sách hoặc cấu trúc khác là thứ thể hiện vẻ đẹp và sự đơn giản của lập trình Python. Hãy nhớ mã tôi đã viết trước đó để thiết lập một danh sách chứa tất cả các số nguyên chẵn trong \[[2,16]\]?

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
3

Để hiểu cú pháp, thật hữu ích khi tham khảo Python 2 [cũ]. 7. 5, trong đó có một lời giải thích hay [nhấn mạnh của tôi]

Hiển thị danh sách mang lại một đối tượng danh sách mới. Nội dung của nó được chỉ định bằng cách cung cấp danh sách biểu thức hoặc cách hiểu danh sách. Khi một danh sách các biểu thức được phân tách bằng dấu phẩy được cung cấp, các phần tử của nó được đánh giá từ trái sang phải và được đặt vào đối tượng danh sách theo thứ tự đó. Khi khả năng hiểu danh sách được cung cấp, nó bao gồm một biểu thức duy nhất theo sau bởi ít nhất một mệnh đề for và 0 hoặc nhiều mệnh đề for hoặc if. Trong trường hợp này, các phần tử của danh sách mới là những phần tử sẽ được tạo ra bằng cách xem xét từng mệnh đề if hoặc if một khối, lồng từ trái sang phải và đánh giá biểu thức để tạo phần tử danh sách mỗi khi đạt đến khối trong cùng

Nói cách khác, chúng tôi sẽ cung cấp một số biểu thức trở thành một phần tử của danh sách và nó sẽ phải chịu một số hạn chế dựa trên chuỗi nguyên nhân for hoặc if của chúng tôi. Đôi khi, nếu có nhiều vòng lặp và điều kiện để đánh giá, nó có thể dễ dàng xem hơn nếu được chia thành nhiều phần. Tôi làm điều này trong phần nhận xét trong ví dụ mã bên dưới. [Nếu thực sự cần thiết phải giới thiệu ngắt dòng để hiểu rõ hơn về cách hiểu danh sách, thì mã có thể hơi phức tạp, nhưng tôi tin rằng hoàn toàn ổn khi sử dụng tính năng hiểu danh sách trong ví dụ mà tôi cung cấp này. ]

import sys
print["My version Number: {}".format[sys.version]]  
5

Như tài liệu nêu rõ, bạn cũng có thể tạo danh sách lồng nhau thông qua khả năng hiểu danh sách. Điều này có thể hữu ích nếu một người muốn khởi tạo thứ gì đó như bảng hoặc ma trận. Khi tôi viết chương trình Python đầu tiên của mình một năm trước, tôi thực sự đã sử dụng khả năng hiểu danh sách để xây dựng một bảng các phần tử mà tôi sẽ cập nhật như một phần của thuật toán lập trình động.

import sys
print["My version Number: {}".format[sys.version]]  
6

5. cắt lát

Cắt lát là quá trình lấy một tập hợp con của một số dữ liệu. Nó được áp dụng phổ biến nhất cho chuỗi và danh sách. Câu chuyện cơ bản của tôi về lần đầu tiên tôi học về cắt lát là khi tôi phải lặp lại nhiều lần qua một danh sách và áp dụng một hàm cho tất cả trừ phần tử cuối cùng của nó. Tôi tiếp tục sử dụng một vòng lặp xấu lặp đi lặp lại qua các chỉ số của danh sách và thực hiện kiểm tra mỗi lần để đảm bảo rằng tôi không ở phần tử cuối cùng đó

Cuối cùng tôi nhận ra rằng đây là một trong những điều ngu ngốc nhất mà tôi đang làm, vì vậy tôi đã tìm kiếm cách lấy mọi thứ trừ nguyên tố cuối cùng. Và đó là lúc tôi bắt đầu hành trình cắt lát của mình. Đối với ví dụ cụ thể này, chúng tôi chỉ có thể sử dụng

import sys
print["My version Number: {}".format[sys.version]]  
50 để lấy mọi thứ trừ phần tử có chỉ số âm, đây sẽ là phần tử cuối cùng. [Nếu một người tạo một danh sách có \[N\] phần tử, thì phần tử nằm ở chỉ mục \[N-1\] cũng có chỉ số tương đương là \[-1\], và tương tự đối với các chỉ số \[N-2 . ]

import sys
print["My version Number: {}".format[sys.version]]  
8

May mắn thay, việc cắt lát không chỉ giới hạn ở việc loại bỏ một yếu tố. Đặt

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
7 là một danh sách tùy ý, chúng ta có thể biến
import sys
print["My version Number: {}".format[sys.version]]  
52 thành một danh sách mới lấy một tập hợp con cụ thể các giá trị của
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
7 bằng cách sử dụng cú pháp chung sau

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
2

Ở đây,

import sys
print["My version Number: {}".format[sys.version]]  
54 là chỉ mục của phần tử đầu tiên mà chúng ta muốn,
import sys
print["My version Number: {}".format[sys.version]]  
55 là chỉ mục của phần tử đầu tiên mà chúng ta không muốn [hãy nhớ rằng trong Python, các chỉ số kết thúc thường là loại trừ hơn là bao gồm] và
import sys
print["My version Number: {}".format[sys.version]]  
56 đại diện cho số \[k . Nó cũng có thể là số âm, điều này cho thấy rằng chúng ta đang đi ngược lại danh sách. Không phải tất cả các giá trị này đều cần thiết; . Và như ví dụ trước đó sẽ làm rõ, nếu một trong hai
import sys
print["My version Number: {}".format[sys.version]]  
54 hoặc
import sys
print["My version Number: {}".format[sys.version]]  
55 bị bỏ qua, thì chúng nên mặc định là 0 và độ dài của danh sách, tương ứng

Để có được trực giác tốt hơn về việc cắt lát, nó cũng giúp biết cách thức hoạt động của quy trình lập chỉ mục đối với các số âm. Trong tài liệu chính thức, có một sơ đồ kiểu ASCII đẹp mắt [có dòng chữ “Python” trong đó] trong phần Chuỗi gợi ý bạn nghĩ về các chỉ số Python khi trỏ giữa các phần tử dữ liệu

Điều quan trọng là phải hiểu vai trò của dấu hai chấm trong cú pháp nối. Trong đoạn mã trên, tôi đã sử dụng

import sys
print["My version Number: {}".format[sys.version]]  
50 để chỉ tất cả trừ phần tử cuối cùng trong danh sách. Nếu tôi đã bỏ qua dấu hai chấm trước đó, điều đó sẽ dẫn đến việc chỉ nhận được phần tử cuối cùng của danh sách. Nếu tôi đặt dấu hai chấm ở bên phải của -1, thì tôi vẫn chỉ nhận được phần tử cuối cùng, vì phần tử đó bắt đầu từ phần tử được lập chỉ mục cuối cùng và nhận tất cả các giá trị ngoài phần tử đó [không có phần tử nào]. Đoạn mã sau cho thấy sự khác biệt về vị trí đặt dấu hai chấm và số lượng tham số hiện tại ảnh hưởng đến việc ghép nối. Một cách dễ dàng để hiểu vị trí nên đặt dấu hai chấm là chỉ cần đặt cả ba giá trị bắt đầu, dừng và bước và xóa những giá trị được đặt ở giá trị mặc định của chúng [tương ứng là 0, độ dài danh sách và +1]. Điều còn lại là cách định dạng dấu hai chấm, mặc dù nếu 'bước' ở giá trị mặc định của nó, thì chúng ta không cần dấu hai chấm trước nó ở cuối. Chẳng hạn,
import sys
print["My version Number: {}".format[sys.version]]  
61 giống với
import sys
print["My version Number: {}".format[sys.version]]  
62 và
import sys
print["My version Number: {}".format[sys.version]]  
63 giống với
import sys
print["My version Number: {}".format[sys.version]]  
64

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
4

[Vâng, thật thú vị khi

import sys
print["My version Number: {}".format[sys.version]]  
65 đảo ngược một danh sách. ]

Tôi khuyên mọi người nên chơi với kỹ thuật cắt lát bán phức tạp trước khi sử dụng nó trong mã. Đây là nơi trình bao Python trở nên cực kỳ hữu ích. [Xem #2 trên bài đăng này. ]

6. Từ điển và Bộ

Cho đến nay, danh sách là cấu trúc dữ liệu phổ biến nhất mà tôi sử dụng khi lập trình Python, nhưng tôi vẫn sử dụng rộng rãi từ điển, bộ và các cấu trúc dữ liệu khác vì chúng có những ưu điểm riêng

Bộ chỉ đơn giản là một vùng chứa chứa các mục, như danh sách, nhưng chỉ chứa các phần tử riêng biệt. Nghĩa là, nếu bạn thêm phần tử

import sys
print["My version Number: {}".format[sys.version]]  
66 vào một tập hợp đã chứa sẵn
import sys
print["My version Number: {}".format[sys.version]]  
66, thì tập hợp đó không thay đổi. Đây có thể là một lợi thế của bộ so với danh sách, vì tôi thường cần bỏ qua các mục trùng lặp khi quản lý danh sách và việc tạo một bộ dựa trên danh sách có sẵn dễ dàng như gõ vào
import sys
print["My version Number: {}".format[sys.version]]  
68

Nhưng có thể một lợi thế thậm chí còn lớn hơn với các bộ là tra cứu siêu nhanh của chúng. Kiểm tra xem một phần tử có trong danh sách hay không mất thời gian \[O[n]\]. Tuy nhiên, với các bộ, kiểm tra tư cách thành viên là không đổi, \[O[1]\]-thời gian. Tất nhiên, điều này yêu cầu các phần tử tập hợp phải có thể băm được, có nghĩa là các mục cần được liên kết với một số hằng số [i. e. “giá trị băm”] để có thể tra cứu chúng trong bảng một cách nhanh chóng

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
9

Tất nhiên, nhược điểm của tập hợp trên danh sách là chúng không hỗ trợ lập chỉ mục các phần tử, vì vậy không có thứ tự. Đây là một nhược điểm khá lớn, nhưng dù sao đi nữa, nếu bạn không quan tâm đến thứ tự và trùng lặp, đồng thời muốn thử nghiệm thành viên nhanh chóng, thì các bộ là cách tốt nhất

Ngoài các bộ, tôi thấy từ điển là một cấu trúc dữ liệu cực kỳ hữu ích. Từ điển là thứ liên kết với mỗi khóa một giá trị, do đó, về cơ bản, nó là một chức năng ghép các phần tử lại với nhau

import sys

# If number of parameters is incorrect, terminate.  
if [len[sys.argv] != 3]:  
  print["USAGE: kmeans_clustering.py [file] [clusters]"]  
  sys.exit[]  
num_clusters = int[sys.argv[2]]

with open[sys.argv[1], 'r'] as feature_file:  
  # Do stuff with the file  
0

Có nhiều tình huống mà từ điển hữu ích. Là một lợi ích bổ sung, việc tìm kiếm các giá trị theo khóa được thực hiện hiệu quả trong thời gian cố định, giống như trong các bộ. Do được sử dụng rộng rãi, từ điển là một trong những cấu trúc dữ liệu được tối ưu hóa nhiều nhất trong Python cơ bản

7. Sao chép cấu trúc [và Quản lý bộ nhớ cơ bản]

Vì rất dễ tạo một danh sách trong Python, người ta có thể nghĩ rằng việc sao chép nó cũng đơn giản. Khi tôi lần đầu tiên bắt đầu với ngôn ngữ này, tôi thường cố gắng tạo các bản sao danh sách riêng biệt bằng cách sử dụng các toán tử gán đơn giản

import sys

# If number of parameters is incorrect, terminate.  
if [len[sys.argv] != 3]:  
  print["USAGE: kmeans_clustering.py [file] [clusters]"]  
  sys.exit[]  
num_clusters = int[sys.argv[2]]

with open[sys.argv[1], 'r'] as feature_file:  
  # Do stuff with the file  
1

Chú ý những gì xảy ra? . Nhưng nếu tôi sửa đổi

import sys
print["My version Number: {}".format[sys.version]]  
52, chẳng hạn như bằng cách thêm vào số 6, thì nó cũng sửa đổi
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
7. Đây là một điểm lừa dối nhưng quan trọng. Tạo danh sách bằng danh sách khác về cơ bản sẽ tạo hai tên biến trỏ đến cùng một danh sách trong bộ nhớ. Điều này sẽ áp dụng cho bất kỳ mục 'vùng chứa' nào, chẳng hạn như từ điển

Vì phép gán đơn giản không tạo ra các bản sao riêng biệt, nên Python có một câu lệnh danh sách tích hợp, cũng như các thao tác sao chép chung. Cũng có thể thực hiện các bản sao bằng cách cắt. Một số giải pháp được hiển thị dưới đây

import sys

# If number of parameters is incorrect, terminate.  
if [len[sys.argv] != 3]:  
  print["USAGE: kmeans_clustering.py [file] [clusters]"]  
  sys.exit[]  
num_clusters = int[sys.argv[2]]

with open[sys.argv[1], 'r'] as feature_file:  
  # Do stuff with the file  
2

Ngoài ra còn có một điều khác cần lo lắng — nếu bạn có các thùng chứa bên trong các thùng chứa thì sao? . Tôi nghĩ rằng tôi ổn khi sử dụng thao tác đọc chính tả đơn giản, nhưng tôi nhận ra rằng nếu tôi thay đổi một từ điển trong một trong những từ điển đó, sự thay đổi đó sẽ được phản ánh trong cả hai từ điển lớn hơn

Một ví dụ về lỗi này được hiển thị bên dưới, trong đó tôi sửa đổi từ điển đầu tiên của

import sys
print["My version Number: {}".format[sys.version]]  
83 bằng cách thêm vào ánh xạ
import sys
print["My version Number: {}".format[sys.version]]  
84. Cặp khóa-giá trị đó cũng sẽ được phản ánh trong từ điển đầu tiên của
import sys
print["My version Number: {}".format[sys.version]]  
85

import sys

# If number of parameters is incorrect, terminate.  
if [len[sys.argv] != 3]:  
  print["USAGE: kmeans_clustering.py [file] [clusters]"]  
  sys.exit[]  
num_clusters = int[sys.argv[2]]

with open[sys.argv[1], 'r'] as feature_file:  
  # Do stuff with the file  
3

Giải pháp cho vấn đề này là sử dụng phương pháp deepcopy, phương pháp này sẽ sao chép mọi thứ. Đây là thao tác sử dụng nhiều bộ nhớ nhất trong các giải pháp sao chép mà tôi đã thảo luận ở đây, vì vậy chỉ sử dụng nó nếu các phương pháp khác không hoạt động

8. máy phát điện

Bạn có nhớ tất cả những thứ về danh sách mà tôi đã nói không? . Đây là nơi máy phát điện phát huy tác dụng

Các trình tạo trong Python cung cấp cho chúng ta khái niệm thuận lợi về đánh giá lười biếng, vì vậy khi chúng ta “xây dựng” các trình tạo, chúng ta không thực sự đánh giá một số giá trị bên trong nó trừ khi nó thực sự cần thiết. Một trong những lợi ích lớn nhất của đánh giá lười biếng là trong dung lượng bộ nhớ. Nếu chúng ta xây dựng một trình tạo bao gồm các số từ 1 đến N cho N lớn và mã của chúng ta chỉ cần ba số đầu tiên, thì Python không cần phải xây dựng và lưu trữ các số còn lại trong bộ nhớ như đối với một danh sách. [Tình huống giả định này có thể xảy ra vì có thể có một hàm với các giá trị N khác nhau cho mỗi lệnh gọi sử dụng trình tạo. ] Nếu bạn tò mò, trang Wikipedia có thêm thông tin về đánh giá lười biếng

Lần đầu tiên tôi được giới thiệu về máy phát điện là khi tôi đọc một bài đăng trên Stack Overflow có nội dung là Python 2. các lập trình viên x nên luôn sử dụng

import sys
print["My version Number: {}".format[sys.version]]  
86 thay vì
import sys
print["My version Number: {}".format[sys.version]]  
87, bởi vì
import sys
print["My version Number: {}".format[sys.version]]  
86 là một trình tạo, hoặc ít nhất, có chất lượng đánh giá lười biếng giống như trình tạo. Đối với bản ghi, mặc dù tôi hầu như luôn sử dụng
import sys
print["My version Number: {}".format[sys.version]]  
86 trên
import sys
print["My version Number: {}".format[sys.version]]  
87 trong Python 2. 7, phạm vi [] có công dụng của nó, chẳng hạn như nếu một người cần một danh sách thực tế

Về cơ bản,

import sys
print["My version Number: {}".format[sys.version]]  
87 và
import sys
print["My version Number: {}".format[sys.version]]  
86 thực hiện cùng một nhiệm vụ, nhưng điểm khác biệt là
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
23 sẽ xây dựng một danh sách bao gồm các số từ 0 đến n-1 theo nghĩa đen, trong khi
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
24 chỉ cung cấp cho chúng tôi những số đó khi chúng tôi cần.

Như một minh chứng cho tính hữu ích của trình tạo, Python 3 đã thay đổi

import sys
print["My version Number: {}".format[sys.version]]  
87 để giờ đây nó sở hữu phẩm chất
import sys
print["My version Number: {}".format[sys.version]]  
86. Hàm
import sys
print["My version Number: {}".format[sys.version]]  
86 đã bị bỏ qua, vì trình bao Python 3 chỉ ra

import sys

# If number of parameters is incorrect, terminate.  
if [len[sys.argv] != 3]:  
  print["USAGE: kmeans_clustering.py [file] [clusters]"]  
  sys.exit[]  
num_clusters = int[sys.argv[2]]

with open[sys.argv[1], 'r'] as feature_file:  
  # Do stuff with the file  
4

Có những trang web khác có thể giải thích trình tạo tốt hơn tôi có thể, chẳng hạn như trang Python Wiki về trình tạo. Một điều cần lưu ý là nếu chúng ta cần một danh sách từ một trình tạo, thì chúng ta có thể gọi phương thức

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
28 mà tôi đã sử dụng trước đó [trong #7, về nội dung sao chép]. Trình tạo cũng có phiên bản hiểu danh sách của riêng họ, được gọi là hiểu trình tạo

Vậy tại sao chúng ta thậm chí sử dụng danh sách?

import sys

# If number of parameters is incorrect, terminate.  
if [len[sys.argv] != 3]:  
  print["USAGE: kmeans_clustering.py [file] [clusters]"]  
  sys.exit[]  
num_clusters = int[sys.argv[2]]

with open[sys.argv[1], 'r'] as feature_file:  
  # Do stuff with the file  
5

Tôi đã tạo một trình tạo,

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
29, từ danh sách chứa bốn tên tiếng Anh phổ biến, nhưng nếu tôi cố gắng in trình tạo, thay vào đó, tôi nhận được biểu thức "đối tượng trình tạo". Các giá trị trong trình tạo không “tồn tại” cho đến khi chúng cần thiết theo yêu cầu

Một điểm khó khăn thứ hai về trình tạo là nếu chúng ta lặp qua nó, chúng ta không thể lặp lại nó như lần đầu tiên. Vòng lặp thứ hai không in được gì

Vì vậy, các trình tạo có vị trí của chúng trong Python, nhưng các danh sách và các trình tạo khác cũng vậy. Để hiểu rõ hơn về trình tạo, có thể hữu ích khi kết hợp từ khóa suất trong Python. Câu hỏi và câu trả lời về Stack Overflow [tuyệt vời] này giải thích nó tốt hơn tôi có thể và tôi đã học được rất nhiều về trình tạo chỉ bằng cách đọc trang đó

9. Quản lý tập tin

Với nhiều tập lệnh Python sử dụng tệp làm đầu vào, chẳng hạn như mã

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
35 của tôi mà tôi đã đăng trước đó, điều quan trọng là phải biết các cách chính xác để kết hợp tệp trong mã của một người. Tài liệu chính thức giải thích rằng từ khóa mở được sử dụng cho mục đích này. Nó khá đơn giản và chúng ta có thể lặp qua tệp để phân tích từng dòng một. Ngoài ra, chúng ta có thể sử dụng phương pháp
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
41 để tạo danh sách bao gồm từng dòng trong tệp, nhưng hãy cảnh giác nếu tệp lớn

import sys

# If number of parameters is incorrect, terminate.  
if [len[sys.argv] != 3]:  
  print["USAGE: kmeans_clustering.py [file] [clusters]"]  
  sys.exit[]  
num_clusters = int[sys.argv[2]]

with open[sys.argv[1], 'r'] as feature_file:  
  # Do stuff with the file  
6

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
42 rất quan trọng, vì nó được thực hiện để giải phóng bộ nhớ. Từ tài liệu chính thức

Khi bạn làm xong một tệp, hãy gọi f. close[] để đóng nó và giải phóng mọi tài nguyên hệ thống do tệp đang mở sử dụng. Sau khi gọi f. close[], cố gắng sử dụng đối tượng tệp sẽ tự động thất bại

Tuy nhiên, tôi gần như không bao giờ sử dụng

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
42, vì tôi có thể sử dụng từ khóa
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
44, từ khóa này sẽ tự động đóng tệp cho tôi sau khi mã thoát khỏi khối của nó. Trên thực tế, tôi đã đăng một ví dụ về điều này trước đó khi tôi nói về mã kmeans_clustering của mình. Đây là những phần có liên quan của nó được sao chép bên dưới

import sys

# If number of parameters is incorrect, terminate.  
if [len[sys.argv] != 3]:  
  print["USAGE: kmeans_clustering.py [file] [clusters]"]  
  sys.exit[]  
num_clusters = int[sys.argv[2]]

with open[sys.argv[1], 'r'] as feature_file:  
  # Do stuff with the file  
7

Bây giờ, trong hầu hết các trường hợp, tôi tin rằng bạn không nhất thiết phải tận dụng lợi thế của

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
42, vì nếu tập lệnh đang đọc trong tệp văn bản cơ bản [nhưng không đóng nó] kết thúc chạy, thì tệp văn bản đó sẽ tự động . Tôi có thể tưởng tượng rằng mọi thứ có thể trở nên phức tạp hơn khi nhiều tệp và tập lệnh chạy cùng nhau, vì vậy tôi có thói quen sử dụng
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
44 để đọc trong tệp

Nếu bạn quan tâm đến việc ghi tệp, bạn có thể thay đổi tham số

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
47 thành
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
48 [hoặc
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
49 sẽ cho phép cả đọc và ghi] và sử dụng phương thức
import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
90. Điều này phổ biến trong cài đặt nghiên cứu, nơi bạn có thể phải sửa đổi tệp văn bản theo một số thử nghiệm

10. Các lớp và chức năng

Khá dễ dàng để xác định một hàm trong Python, sử dụng

import os

for i in range[2,101]:  
  input_string = "python kmeans_clustering file1.arff " + str[i]  
  os.system[input_string]  
91, chẳng hạn như ví dụ nhỏ sau đây, đếm số lượng số 0 trong đầu vào, sẽ là một chuỗi

import sys

# If number of parameters is incorrect, terminate.  
if [len[sys.argv] != 3]:  
  print["USAGE: kmeans_clustering.py [file] [clusters]"]  
  sys.exit[]  
num_clusters = int[sys.argv[2]]

with open[sys.argv[1], 'r'] as feature_file:  
  # Do stuff with the file  
8

Các hàm đệ quy cũng đơn giản và hoạt động như trong hầu hết các ngôn ngữ lập trình hướng đối tượng chính

So với Java, tôi chưa sử dụng quá nhiều lớp trong Chương trình Python của mình, vì vậy chuyên môn của tôi trong lĩnh vực này khá hạn chế. Tuy nhiên, các lớp là một phần quan trọng của các ngôn ngữ hướng đối tượng và Python [trái ngược với ý kiến ​​của một số người] hướng đối tượng, vì vậy bạn nên đọc tài liệu về Lớp nếu có thời gian. Tuy nhiên, trang tài liệu tôi vừa liên kết khẳng định rằng

Các lớp Python cung cấp tất cả các tính năng tiêu chuẩn của Lập trình hướng đối tượng. cơ chế kế thừa lớp cho phép nhiều lớp cơ sở, một lớp dẫn xuất có thể ghi đè bất kỳ phương thức nào của lớp cơ sở hoặc các lớp của nó và một phương thức có thể gọi phương thức của lớp cơ sở có cùng tên. Các đối tượng có thể chứa số lượng và loại dữ liệu tùy ý. Điều này đúng với các mô-đun, các lớp tham gia vào bản chất động của Python. chúng được tạo trong thời gian chạy và có thể được sửa đổi thêm sau khi tạo

Một ví dụ thực sự đơn giản về lớp Python [với Python 2. 7 cú pháp] được hiển thị ở đây

Phần kết luận

Tôi hy vọng bạn tìm thấy tổng quan này toàn diện nhưng ngắn gọn. Rõ ràng, điều này sẽ phụ thuộc vào trình độ kỹ năng và kinh nghiệm lập trình trước đó của bạn. Tuy nhiên, để thực sự hiểu những khái niệm này, tôi khuyên bạn nên viết một số chương trình. Bạn không cần phải tạo mô-đun toàn diện của riêng mình; . Ngoài ra còn có một số khái niệm quan trọng mà tôi đã bỏ qua với mục đích giữ cho bài đăng này nhắm mục tiêu đến đối tượng hướng đến người mới bắt đầu hơn. Ví dụ, trình trang trí Python là thứ mà một lập trình viên nghiêm túc chắc chắn phải hiểu. Nếu có tham vọng, bạn cũng có thể xem câu hỏi Stack Overflow này và cố gắng làm theo một cách lỏng lẻo các đề xuất của câu trả lời được bình chọn nhiều nhất về cách chuyển từ người mới bắt đầu sang trung cấp/chuyên gia

Nếu bạn có thêm bất kỳ câu hỏi hoặc nhận xét nào, vui lòng trả lời bài đăng này hoặc Google xung quanh. Chúc bạn vui vẻ khi lập trình bằng Python

Chủ Đề