Hướng dẫn xrange in python3

Đăng ký nhận cảnh báo về những video tiên tiến nhất

Danh sách nội dung:

  • Lịch sử của hàm range () của Python
  • Hãy lặp lại
    • Phạm vi Python () Định nghĩa căn bản
    • Tăng dần theo phạm vi ()
    • Đang giảm dần với phạm vi ()
    • Chẳng hạn về cách sử dụng chuyên sâu cho hàm range () của Python
  • Số nổi & phạm vi ()
    • Α Word on Floats
    • Sử dụng phạm vi () Với NumPy
  • Tiến lên & lặp lại

rangeHàm tích hợp sẵn của Python rất hữu hiệu khi bạn cần thực hiện một hành động trong một số lần rõ ràng. Là một Pythonista có kinh nghiệm, bạn rất có thể đã sử dụng nó trước đó. 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 & Python 3
  • Đã xem một số range()chẳng hạn thực tiễn
  • Được trang bị để khắc phục một số giới hạn của nó

Tất cả chúng ta hãy khởi đầu nào!

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

Dù rằng range()trong Python 2 & 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 tiễn, 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()xrange()tạo nên 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 mục các số đó cùng một lúc trong khi phần sau tạo nên các số một cách chây lười , có nghĩa là các số được trả lại một cách lần lượt khi chúng thiết yếu.

Có những danh mục đồ sộ chung quanh sẽ chiếm bộ nhớ lưu trữ, chính vì vậy không có gì bất ngờ khi xrange()thay thế range(), đặt tên & toàn bộ. Bạn có thể tham khảo thêm về quyết định này & nền móng xrange()đối với range()trong PEP 3100 .

Note: PEP là viết tắt của Python Enhancement Proposal. PEP là các ebook có thể bao gồm một loạt các đề tài, bao gồm các chức năng, phong thái, quản trị & triết lý mới được đề nghị.

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

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

Khởi đầu!

Hãy lặp lại

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

Đây là một chẳng hạn về vòng lặp for trong Python:

captains

=

[

'Janeway'

,

'Picard'

,

'Sisko'

]

for

captain

in

captains

:

print

(

captain

)

Đầu ra trông như vậy này:

Janeway

Picard

Sisko

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ã rõ ràng bất kỳ bao giờ bạn mong muốn. Trong trường hợp này, http://phptravels.vn/ lặp lại danh mục các đội trưởng & in tên từng người.

Dù rằng Star Trek là tuyệt vời & mọi thứ, bạn có thể mong muốn làm nhiều hơn là chỉ dễ dàng lặp lại danh mục các đội trưởng. Đôi lúc, bạn chỉ mong muốn thực thi một khối mã một số lần rõ ràng. 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

(

ƒ

"

{

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.

Này là đầu ra http://phptravels.vn/ mong muốn, chính vì vậy vòng lặp đã giải quyết 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 đương bằng cách sử dụng range().

Giờ đây bạn đã thân 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()để dễ dàng hóa cuộc đời của mình.

Học thức range()căn bản về Python

Vậy rangehàm của Python hoạt động như vậy 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 khẳng định. Tùy thuộc vào 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ẽ khởi đầu & chấm dứt cũng như sự độc đáo giữa một số & số kế đến sẽ lớn như vậy nào.

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

for

ι

in

range

(

3

,

16

,

3

):

quotient

=

ι

/

3

print

(

ƒ

"

{

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, chính vì vậy bạn không cần phải tự phân phối từng số đó.

Note: Dù rằng chẳng hạn này cho thấy cách sử dụng phù 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.

Chẳng hạn, việc sử dụng sau đây range()thường được xem là không phải Pythonic:

captains

=

[

'Janeway'

,

'Picard'

,

'Sisko'

]

for

ι

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 mong muốn biết thêm, hãy xem Cách khiến cho Python của các 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ẽ thu được một chuỗi các số bắt nguồn từ & bao gồm mọi số nguyên cho đến, nhưng không bao gồm, số bạn đã phân phối dưới dạng stop.

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

for

ι

in

range

(

3

):

print

(

ι

)

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

0
1
2

Điều đó kiểm soát: http://phptravels.vn/ có toàn bộ các số nguyên từ tối đa đến nhưng không bao gồm 3, số bạn đã phân phối dưới dạng stop.

range(start, stop)

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

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

for

ι

in

range

(

1

,

8

):

print

(

ι

)

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

1
2
3
4
5
6
7

Cho đến nay, rất tốt: bạn có toàn bộ các số nguyên từ 1(số bạn đã phân phối dưới dạng start) cho đến nhưng không bao gồm 8(số bạn đã phân phối 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 đây khi bạn đang sử dụng danh mục đượ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 những có thể chọn địa điểm chuỗi số sẽ khởi đầu & dừng lại mà còn hiểu rằng sự độc đáo lớn như vậy nào giữa một số & số kế đến. Nếu bạn không phân phối một step, sau đó range()sẽ auto ứng xử như thể steplà 1.

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

>>>

>>>

range

(

1

,

4

,

)

Traceback (most recent call last):

File

"<stdin>"

, line

1

, in

<modulevàgt;

ValueError

:

range() arg 3 must not be zero

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

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

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

for

ι

in

range

(

3

,

16

,

3

):

quotient

=

ι

/

3

print

(

ƒ

"

{

i

}

divided by 3 is

{

int

(

quotient

)

}

."

)

Đầu ra của các bạn sẽ giống hệt như đầu ra của vòng lặp for mà bạn đã thấy trước đây trong nội dung này, khi bạn đang sử dụng danh mục 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 chẳng hạn 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 mong 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 tiễn, hãy nhập mã sau:

for

ι

in

range

(

3

,

100

,

25

):

print

(

ι

)

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

3
28
53
78

Bạn có một loạt các số mà mỗi số to hơn số trước đây 25stepmà bạn đã phân phối.

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

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

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

Trong chẳng hạn sau, của các 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

ι

in

range

(

10

,

-

6

,

-

2

):

print

(

ι

)

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

10
8
6
4
2
0
-2
-4

Bạn thu được một loạt các số mà mỗi số bé hơn số trước đây 2giá trị tuyệt đối của số stepbạn đã phân phối.

Cách Pythonic nhất để tạo nên một phạm vi giảm dần là sử dụng range(start, stop, step). Nhưng Python có một reversedtính 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ự trái lại.

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

for

ι

in

reversed

(

range

(

5

)):

print

(

ι

)

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

4
3
2
1
0

range()khiến 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ự trái lại.

Note: reversed() cũng hoạt động với chuỗi. Bạn có thể đọc thêm về tính năng của reversed()chuỗi trong Cách đảo ngược chuỗi trong Python .

Chẳng hạn sử dụng chuyên sâu cho range()hàm của Python

Giờ đây bạn đã biết những điều căn bản về cách sử dụng range(), đã tới lúc khám phá sâu hơn một tí.

range() chính 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 rõ ràng
  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 mục hoặc bộ giá trị

Cách sử dụng trước hết có vẻ là thông dụng nhất & 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 chú ý khi bạn sử dụng phạm vi.

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

>>>

>>>

type

(

range

(

3

))

<class 'range'>

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 mục:

>>>

>>>

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 α range(), nhưng đầu ra trong REPL thoạt đầu có lẽ hơi lạ:

>>>

>>>

range

(

6

)[

2

:

5

]

range(2, 5)

Dù rằng đầ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 tiễn là bạn có thể truy cập các phần tử của một range()theo chỉ mục & cắt một phần range()làm nổi trội một thực tiễn trọng yếu: range()chây lười, không giống như một danh mục, nhưng không phải là một trình lặp .

Phao & range()

Bạn có thể nhận ra rằng toàn bộ các số mà tất cả chúng ta đang giải quyết cho đến nay đều là số nguyên, nói một cách khác là số nguyên. Này là bởi vì chỉ range()có thể lấy số nguyên làm đối số.

Α 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ố độc đáo giữa số nguyên & 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 

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 & xem điều gì sẽ xảy ra:

for

ι

in

range

(

3.3

):

print

(

ι

)

Bạn sẽ thu được cảnh báo lỗi sau:

Traceback (most recent call last):

File

"<stdin>"

, line

1

, in

<modulevàgt;

TypeError

:

'float' object cannot be interpreted as an integer

Nếu bạn cần tìm một bí quyết 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 trước hết của các bạn là kiểm soát xem bạn đã thiết lập nó chưa.

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

>>>

>>>

import

numpy

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

Sau thời điểm bạn đã thiết lập 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 mong 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

ι

in

np

.

arange

(

0.3

,

1.6

,

0.3

):

print

(

ι

)

Đây là đầu ra:

0.3
0.6
0.8999999999999999
1.2
1.5

Từ đâu 0.8999999999999999đến?

Laptop 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 toàn bộ các loại trình diễn số không mong chờ.

Note: Để đọc thêm về nguyên nhân vì sao có sự cố khi trình diễn số thập phân, bạn có thể xem nội dung này & ebook Python .

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

Một tùy chọn khác là sử dụng round(), bạn có thể tham khảo 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 nên một số kết quả đáng bất ngờ!

Các lỗi dấu phẩy động này có phải là vấn đề so với bạn hay không lệ thuộc vào vấn đề bạn đang khắc phục. Các lỗi sẽ nằm ở địa điểm giống như chữ số thập phân thứ 16, phần đông 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 ngại về điều đó.

không dừng lại ở đó, bạn cũng có thể sử dụng np.linspace(). Về căn 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 startend(cả hai) cũng như độ dài của mảng (thay vì step).

Chẳng hạn, np.linspace(1, 4, 20)phân phối 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 & lặp lại

Giờ đây bạn đã hiểu cách sử dụng range()& giải quyết những giới hạn của nó. Bạn cũng có sáng tạo về miễn nhiệm năng trọng yếu này đã tiến triển giữa Python 2 & 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 rõ ràng, bạn sẽ sẵn sàng để trải lòng mình!