Hướng dẫn dùng range from python



Các khóa học miễn phí qua video:
Lập trình C Java C# SQL Server PHP HTML5-CSS3-JavaScript

Mục lục bài viết:

  • Lịch sử của hàm range () của Python
  • Hãy lặp lại
    • Phạm vi Python () Khái niệm cơ bản
    • Tăng dần theo phạm vi ()
    • Đang giảm dần với phạm vi ()
    • Ví dụ về cách sử dụng nâng cao cho hàm range () của Python
  • Số nổi và phạm vi ()
    • A Word on Floats
    • Sử dụng phạm vi () Với NumPy
  • Tiến lên và lặp lại

Nội dung chính

  • Mục lục bài viết:
  • Lịch sử của range()hàm Python
  • Hãy lặp lại
  • Kiến thức range()cơ bản về Python
  • Tăng dần với range()
  • Đang giảm dần với range()
  • Ví dụ sử dụng nâng cao cho range()hàm của Python
  • Phao và range()
  • A Word on Floats
  • Sử dụng range()với NumPy
  • Tiến lên và lặp lại


rangeHàm tích hợp sẵn của Python rất hữu ích khi bạn cần thực hiện một hành động trong một số lần cụ thể. Là một Pythonista có kinh nghiệm, bạn rất có thể đã sử dụng nó trước đây. Nhưng nó làm được gì?

Đến cuối hướng dẫn này, bạn sẽ:

  • Hiểu cách rangehoạt động của hàm Python
  • Biết cách triển khai khác nhau trong Python 2 và Python 3
  • Đã xem một số range()ví dụ thực tế
  • Được trang bị để giải quyết một số hạn chế của nó

Chúng ta hãy bắt đầu nào!

Lịch sử của range()hàm Python

Mặc dù range()trong Python 2 và range()Python 3 có thể dùng chung một tên, nhưng chúng là những động vật hoàn toàn khác nhau. Trên thực tế, range()trong Python 3 chỉ là một phiên bản được đổi tên của một hàm được gọi xrangetrong Python 2.

Ban đầu, cả hai range()và xrange()tạo ra các số có thể được lặp lại bằng vòng lặp for, nhưng vòng lặp trước tạo danh sách các số đó cùng một lúc trong khi phần sau tạo ra các số một cách lười biếng , có nghĩa là các số được trả lại một cách lần lượt khi chúng cần thiết.

Có những danh sách khổng lồ xung quanh sẽ chiếm bộ nhớ, vì vậy không có gì ngạc nhiên khi xrange()thay thế range(), đặt tên và tất cả. Bạn có thể đọc thêm về quyết định này và nền tảng xrange()so với range()trong PEP 3100 .

Lưu ý: PEP là viết tắt của Python Enhancement Proposal. PEP là các tài liệu có thể bao gồm một loạt các chủ đề, bao gồm các tính năng, phong cách, quản trị và triết lý mới được đề xuất.

Có rất nhiều người trong số họ . PEP 1 giải thích cách chúng hoạt động và là một nơi tuyệt vời để bắt đầu.

Đối với phần còn lại của bài viết này, bạn sẽ sử dụng hàm như nó tồn tại trong Python 3.

Bắt đầu!

Hãy lặp lại

Trước khi đi sâu vào xem cách range()hoạt động, chúng ta cần xem xét cách hoạt động của vòng lặp. Vòng lặp là một khái niệm khoa học máy tính quan trọng . Nếu bạn muốn trở thành một lập trình viên giỏi, thành thạo các vòng lặp là một trong những bước đầu tiên bạn cần làm.

Đây là một ví dụ về vòng lặp for trong Python:

captains = ['Janeway', 'Picard', 'Sisko']

for captain in captains:
    print(captain)

Đầu ra trông như thế này:

Như bạn có thể thấy, vòng lặp for cho phép bạn thực thi một khối mã cụ thể bất kỳ lúc nào bạn muốn. Trong trường hợp này, chúng tôi lặp lại danh sách các đội trưởng và in tên từng người.

Mặc dù Star Trek là tuyệt vời và mọi thứ, bạn có thể muốn làm nhiều hơn là chỉ đơn giản lặp lại danh sách các đội trưởng. Đôi khi, bạn chỉ muốn thực thi một khối mã một số lần cụ thể. Vòng lặp có thể giúp bạn làm điều đó!

Hãy thử đoạn mã sau với các số chia hết cho ba:

numbers_divisible_by_three = [3, 6, 9, 12, 15]

for num in numbers_divisible_by_three:
    quotient = num / 3
    print(f"{num} divided by 3 is {int(quotient)}.")

Đầu ra của vòng lặp đó sẽ giống như sau:

3 divided by 3 is 1.
6 divided by 3 is 2.
9 divided by 3 is 3.
12 divided by 3 is 4.
15 divided by 3 is 5.

Đó là đầu ra chúng tôi muốn, vì vậy vòng lặp đã hoàn thành công việc một cách đầy đủ, nhưng có một cách khác để có được kết quả tương tự bằng cách sử dụng range().

Bây giờ bạn đã quen thuộc hơn với các vòng lặp, hãy xem cách bạn có thể sử dụng range()để đơn giản hóa cuộc sống của mình.

Kiến thức range()cơ bản về Python

Vậy rangehàm của Python hoạt động như thế nào? Nói một cách dễ hiểu, range()cho phép bạn tạo một chuỗi số trong một phạm vi nhất định. Tùy thuộc vào số lượng đối số bạn truyền vào hàm, bạn có thể quyết định nơi mà chuỗi số đó sẽ bắt đầu và kết thúc cũng như sự khác biệt giữa một số và số tiếp theo sẽ lớn như thế nào.

Đây là một cái nhìn trước về range()hoạt động:

for i in range(3, 16, 3):
    quotient = i / 3
    print(f"{i} divided by 3 is {int(quotient)}.")

Trong vòng lặp này, bạn có thể chỉ cần tạo một dải số chia hết 3, vì vậy bạn không cần phải tự cung cấp từng số đó.

Lưu ý: Mặc dù ví dụ này cho thấy cách sử dụng thích hợp range(), nhưng nó thường khiến bạn khó chịu khi sử dụng range()quá thường xuyên trong các vòng lặp.

Ví dụ, việc sử dụng sau đây range()thường được coi là không phải Pythonic:

captains = ['Janeway', 'Picard', 'Sisko']

for i in range(len(captains)):
    print(captains[i])

range()là lựa chọn tuyệt vời để tạo các dãy số lặp lại, nhưng nó không phải là lựa chọn tốt nhất khi bạn cần lặp lại dữ liệu có thể được lặp lại với intoán tử .

Nếu bạn muốn biết thêm, hãy xem Cách làm cho Python của bạn lặp lại nhiều hơn Pythonic .

Có ba cách bạn có thể gọi range():

  1. range(stop) lấy một đối số.
  2. range(start, stop) có hai đối số.
  3. range(start, stop, step) có ba đối số.

range(stop)

Khi bạn gọi range()với một đối số, bạn sẽ nhận được một chuỗi các số bắt đầu từ 0và bao gồm mọi số nguyên cho đến, nhưng không bao gồm, số bạn đã cung cấp dưới dạng stop.

Đây là những gì trông giống như trong thực tế:

for i in range(3):
    print(i)

Đầu ra của vòng lặp của bạn sẽ giống như sau:

Điều đó kiểm tra: chúng tôi có tất cả các số nguyên từ 0tối đa đến nhưng không bao gồm 3, số bạn đã cung cấp dưới dạng stop.

range(start, stop)

Khi bạn gọi range()với hai đối số, bạn không chỉ phải quyết định nơi chuỗi số dừng lại mà còn cả nơi nó bắt đầu, vì vậy bạn không phải bắt đầu 0mọi lúc. Bạn có thể sử dụng range()để tạo một chuỗi số từ A đến B bằng cách sử dụng a range(A, B). Hãy cùng tìm hiểu cách tạo một phạm vi bắt đầu từ 1.

Hãy thử gọi range()với hai đối số:

for i in range(1, 8):
    print(i)

Đầu ra của bạn sẽ giống như sau:

Cho đến nay, rất tốt: bạn có tất cả các số nguyên từ 1(số bạn đã cung cấp dưới dạng start) cho đến nhưng không bao gồm 8(số bạn đã cung cấp dưới dạng stop).

Nhưng nếu bạn thêm một đối số nữa, thì bạn sẽ có thể tạo lại kết quả mà bạn đã nhận trước đó khi bạn đang sử dụng danh sách được đặt tên numbers_divisible_by_three.

range(start, stop, step)

Khi bạn gọi range()với ba đối số, bạn không chỉ có thể chọn vị trí chuỗi số sẽ bắt đầu và dừng lại mà còn biết được sự khác biệt lớn như thế nào giữa một số và số tiếp theo. Nếu bạn không cung cấp một step, sau đó range()sẽ tự động cư xử như thể steplà 1.

Lưu ý: step có thể là số dương hoặc số âm, nhưng không được là 0:

>>>

>>> range(1, 4, 0)
Traceback (most recent call last):
  File "", line 1, in 
ValueError: range() arg 3 must not be zero

Nếu bạn cố gắng sử dụng 0làm bước của mình, thì bạn sẽ gặp lỗi.

Bây giờ bạn đã biết cách sử dụng step, cuối cùng bạn có thể truy cập lại vòng lặp mà chúng ta đã thấy trước đó với phép chia cho 3.

Hãy thử nó cho chính mình:

for i in range(3, 16, 3):
    quotient = i / 3
    print(f"{i} divided by 3 is {int(quotient)}.")

Đầu ra của bạn sẽ giống hệt như đầu ra của vòng lặp for mà bạn đã thấy trước đó trong bài viết này, khi bạn đang sử dụng danh sách có tên numbers_divisible_by_three:

3 divided by 3 is 1.
6 divided by 3 is 2.
9 divided by 3 is 3.
12 divided by 3 is 4.
15 divided by 3 is 5.

Như bạn thấy trong ví dụ này, bạn có thể sử dụng stepđối số để tăng theo một số cao hơn. Đó được gọi là tăng dần.

Tăng dần với range()

Nếu bạn muốn tăng, thì bạn cần stepphải là một số dương. Để hiểu ý nghĩa của điều này trong thực tế, hãy nhập mã sau:

for i in range(3, 100, 25):
    print(i)

Nếu steplà của bạn 25, thì đầu ra của vòng lặp của bạn sẽ giống như sau:

Bạn có một loạt các số mà mỗi số lớn hơn số trước đó 25stepmà bạn đã cung cấp.

Bây giờ bạn đã thấy cách bạn có thể tiến lên trong một phạm vi, đã đến lúc xem bạn có thể lùi lại như thế nào.

Đang giảm dần với range()

Nếu của bạn steplà số dương, thì bạn chuyển qua một loạt các số tăng dần và đang tăng dần. Nếu của bạn steplà số âm, thì bạn chuyển qua một loạt các số giảm dần và đang giảm dần. Điều này cho phép bạn xem qua các con số ngược lại.

Trong ví dụ sau, của bạn steplà -2. Điều đó có nghĩa là bạn sẽ giảm dần 2cho mỗi vòng lặp:

for i in range(10, -6, -2):
    print(i)

Đầu ra của vòng lặp giảm dần của bạn sẽ giống như sau:

Bạn nhận được một loạt các số mà mỗi số nhỏ hơn số trước đó 2, giá trị tuyệt đối của số stepbạn đã cung cấp.

Cách Pythonic nhất để tạo ra một phạm vi giảm dần là sử dụng range(start, stop, step). Nhưng Python có một reversedchức năng tích hợp sẵn. Nếu bạn bọc range()bên trong reversed(), thì bạn có thể in các số nguyên theo thứ tự ngược lại.

Hãy thử cái này:

for i in reversed(range(5)):
    print(i)

Bạn sẽ nhận được điều này:

range()làm cho nó có thể lặp qua một chuỗi số giảm dần, trong khi reversed()thường được sử dụng để lặp lại một chuỗi theo thứ tự ngược lại.

Lưu ý: reversed() cũng hoạt động với chuỗi. Bạn có thể tìm hiểu thêm về chức năng của reversed()chuỗi trong Cách đảo ngược chuỗi trong Python .

Ví dụ sử dụng nâng cao cho range()hàm của Python

Bây giờ bạn đã biết những điều cơ bản về cách sử dụng range(), đã đến lúc tìm hiểu sâu hơn một chút.

range() chủ yếu được sử dụng cho hai mục đích:

  1. Thực thi phần thân của vòng lặp for một số lần cụ thể
  2. Tạo các chuỗi số nguyên lặp lại hiệu quả hơn những gì có thể được thực hiện bằng cách sử dụng danh sách hoặc bộ giá trị

Cách sử dụng đầu tiên có lẽ là phổ biến nhất và bạn có thể đặt trường hợp rằng itertools cung cấp cho bạn một cách hiệu quả hơn để tạo các tệp lặp hơn là range()không.

Dưới đây là một số điểm cần lưu ý khi bạn sử dụng phạm vi.

range() là một loại trong Python:

>>>

>>> type(range(3))

Bạn có thể truy cập các mục trong một range()chỉ mục, giống như bạn làm với một danh sách:

>>>

>>> range(3)[1]
1
>>> range(3)[2]
2

Bạn thậm chí có thể sử dụng ký hiệu cắt trên a range(), nhưng đầu ra trong REPL thoạt đầu có vẻ hơi lạ:

>>>

>>> range(6)[2:5]
range(2, 5)

Mặc dù đầu ra đó có thể trông kỳ lạ, nhưng việc cắt một range()chỉ trả về một kết quả khác range().

Thực tế là bạn có thể truy cập các phần tử của một range()theo chỉ mục và cắt một phần range()làm nổi bật một thực tế quan trọng: range()lười biếng, không giống như một danh sách, nhưng không phải là một trình lặp .

Phao và range()

Bạn có thể nhận thấy rằng tất cả các số mà chúng ta đang xử lý cho đến nay đều là số nguyên, còn được gọi là số nguyên. Đó là bởi vì chỉ range()có thể lấy số nguyên làm đối số.

A Word on Floats

Trong Python, nếu một số không phải là số nguyên, thì nó là một số thực. Có một số khác biệt giữa số nguyên và số thực.

Một số nguyên ( intkiểu dữ liệu):

  • Là một số nguyên
  • Không bao gồm dấu thập phân
  • Có thể là tích cực, tiêu cực hoặc 0

Một số dấu phẩy động ( floatkiểu dữ liệu):

  • Có thể là bất kỳ số nào bao gồm dấu thập phân
  • Có thể tích cực hoặc tiêu cực

Hãy thử gọi range()bằng phao và xem điều gì sẽ xảy ra:

for i in range(3.3):
    print(i)

Bạn sẽ nhận được thông báo lỗi sau:

Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'float' object cannot be interpreted as an integer

Nếu bạn cần tìm một giải pháp cho phép bạn sử dụng phao, thì bạn có thể sử dụng NumPy.

Sử dụng range()với NumPy

NumPy là một thư viện Python của bên thứ ba. Nếu bạn định sử dụng NumPy, bước đầu tiên của bạn là kiểm tra xem bạn đã cài đặt nó chưa.

Đây là cách bạn có thể làm điều đó trong REPL của mình:

Nếu bạn nhận được một ModuleNotFoundError, thì bạn cần phải cài đặt nó. Để làm như vậy, hãy chuyển đến dòng lệnh của bạn và nhập pip install numpy.

Sau khi bạn đã cài đặt nó, hãy nhập những thứ sau:

import numpy as np

np.arange(0.3, 1.6, 0.3)

Nó sẽ trả về cái này:

array([0.3, 0.6, 0.9, 1.2, 1.5])

Nếu bạn muốn in từng số trên dòng riêng của nó, bạn có thể làm như sau:

import numpy as np

for i in np.arange(0.3, 1.6, 0.3):
    print(i)

Đây là đầu ra:

0.3
0.6
0.8999999999999999
1.2
1.5

Từ đâu 0.8999999999999999đến?

Máy tính gặp sự cố khi lưu số dấu phẩy động thập phân thành số dấu phẩy động nhị phân. Điều này dẫn đến tất cả các loại biểu diễn số không mong muốn.

Lưu ý: Để tìm hiểu thêm về lý do tại sao có sự cố khi biểu diễn số thập phân, bạn có thể xem bài viết này và tài liệu Python .

Bạn cũng có thể muốn xem thư viện thập phân , thư viện này hơi bị hạ cấp về mặt hiệu suất và khả năng đọc nhưng cho phép bạn biểu diễn các số thập phân một cách chính xác.

Một tùy chọn khác là sử dụng round(), bạn có thể đọc thêm về Cách làm tròn số bằng Python . Hãy nhớ rằng round()có những điều kỳ quặc riêng có thể tạo ra một số kết quả đáng ngạc nhiên!

Các lỗi dấu phẩy động này có phải là vấn đề đối với bạn hay không phụ thuộc vào vấn đề bạn đang giải quyết. Các lỗi sẽ nằm ở vị trí giống như chữ số thập phân thứ 16, phần lớn thời gian là không đáng kể. Chúng nhỏ đến mức, trừ khi bạn đang tính toán quỹ đạo vệ tinh hoặc thứ gì đó, bạn không cần phải lo lắng về điều đó.

Ngoài ra, bạn cũng có thể sử dụng np.linspace(). Về cơ bản, nó thực hiện cùng một thứ nhưng sử dụng các tham số khác nhau. Với np.linspace(), bạn chỉ định startvà end(cả hai) cũng như độ dài của mảng (thay vì step).

Ví dụ, np.linspace(1, 4, 20)cung cấp cho 20 số cách đều nhau: 1.0, ..., 4.0. Mặt khác, np.linspace(0, 0.5, 51)cho 0.00, 0.01, 0.02, 0.03, ..., 0.49, 0.50.

Tiến lên và lặp lại

Bây giờ bạn đã hiểu cách sử dụng range()và khắc phục những hạn chế của nó. Bạn cũng có ý tưởng về cách chức năng quan trọng này đã phát triển giữa Python 2 và Python 3.

Lần tới khi bạn cần phải thực hiện một hành động trong một số lần cụ thể, bạn sẽ sẵn sàng để trải lòng mình!

Hướng dẫn dùng range from python


Các khóa học miễn phí qua video:
Lập trình C Java C# SQL Server PHP HTML5-CSS3-JavaScript
« Prev: Python: Các kiểu dữ liệu cơ bản trong Python
» Next: Python: Bố cục PyQt: Tạo các ứng dụng GUI chuyên nghiệp