Vòng lặp For trong Python - Phần 2

Lập trình Python cơ bản

5.0 (14 đánh giá)
Tạo bởi Kteam Cập nhật lần cuối 5 năm trước 82.113 lượt xem 51 bình luận
Tác giả/Dịch giả: Kteam
Học nhanh

Danh sách bài học

01. Giới thiệu ngôn ngữ lập trình Python 02. Cài đặt môi trường Python 03. Cách chạy chương trình Python 04. Cách ghi chú trong Python 05. Biến trong Python 06. Kiểu dữ liệu số trong Python 07. Kiểu dữ liệu chuỗi trong Python - Phần 1 08. Kiểu dữ liệu chuỗi trong Python - Phần 2 09. Kiểu dữ liệu chuỗi trong Python - Phần 3 10. Kiểu dữ liệu chuỗi trong Python - Phần 4 11. Kiểu dữ liệu chuỗi trong Python - Phần 5 12. Kiểu dữ liệu List trong Python - Phần 1 13. Kiểu dữ liệu List trong Python - Phần 2 14. Kiểu dữ liệu Tuple trong Python 15. Sự khác nhau về toán tử của Hashable object và Unhashable object trong Python 16. Kiểu dữ liệu Set trong Python 16. Kiểu dữ liệu Set trong Python – Phần 2 17. Kiểu dữ liệu Dict trong Python - Phần 1 18. Kiểu dữ liệu Dict trong Python - Phần 2 19. Xử lý file trong Python 20. Iteration và một số hàm hỗ trợ cho iteration object trong Python 21. Nhập xuất trong Python - Hàm xuất 22. Nhập xuất trong Python - Hàm nhập 23. Kiểu dữ liệu Boolean trong Python 24. Cấu trúc rẽ nhánh trong Python 25. Vòng lặp While trong Python 26. Vòng lặp For trong Python - Phần 1 27. Vòng lặp For trong Python - Phần 2 28. Kiểu dữ liệu Function trong Python - Sơ lược về hàm 29. Kiểu dữ liệu Function trong Python - Positional và keyword argument 30. Kiểu dữ liệu Function trong Python - Packing và unpacking arguments 31. Kiểu dữ liệu Function trong Python - Biến locals và globals 32. Kiểu dữ liệu Function trong Python - Return 33. Kiểu dữ liệu function trong Python – Yield 34. Kiểu dữ liệu function trong Python – Lambda 35. Kiểu dữ liệu Function trong Python - Functional tools 36. Kiểu dữ liệu Function trong Python - Đệ quy (recursion) 37. Giới thiệu module trong Python 38. Package trong python

Vòng lặp For trong Python - Phần 2

Dẫn nhập

Trong bài trước, Kteam đã giới thiệu đến bạn VÒNG LẶP FOR TRONG PYTHON.

Và ở bài này Kteam sẽ tiếp tục tìm hiểu với các bạn VÒNG LẶP FOR TRONG PYTHON.


Nội dung

Để đọc hiểu bài này tốt nhất bạn cần:

Bạn và Kteam sẽ cùng tìm hiểu những nội dung sau đây

  • Kiểu dữ liệu range (dãy số)
  • Sự khác nhau giữa sequence scan và indexing scan
  • Comprehension
  • Giới thiệu hàm enumerate

Kiểu dữ liệu range (dãy số)

Bạn gặp kiểu dữ liệu này suốt các phần liên quan đến comprehension hoặc là liên quan đến iterator object.

Đây là một kiểu dữ liệu rất đặc biệt vì ta có thể lấy nhiều giá trị từ nó nhưng bản chất thì nó không lưu giữ những giá trị mà chúng ta lấy. Trước khi đến với điều thú vị này, chúng ta cùng ngó tổng quát về kiểu dữ liệu này.

Chúng ta có hai cách khởi tạo.

Cách khởi tạo thứ nhất

Cú pháp:  

range(stop)

Với cách này, ta sẽ tạo một dãy số bắt đầu bằng số 0 và kết thúc là stop – 1. Dãy số này là một cấp số cộng với công sai là 1.


Cách khởi tạo thứ hai

Cú pháp:

range(start, stop[, step])

Với cú pháp này, ta sẽ tạo một dãy số bắt đầu bằng start và kết thúc là stop – 1. Dãy số này là một cấp số cộng với công sai là 1.

Trong trường hợp step (buộc phải khác 0) được đưa vào thì công sai sẽ là step.

Và đây là điều thú vị của hàm range. Hãy tạo một List chứa một dãy số cộng từ 0 tới một số kha khá lớn. Đương nhiên là cũng sẽ có một Range có một dãy số tương tự.

Tiếp đến, hãy dùng toán tử in

Nếu bạn chưa thấy gì thì hãy thử số nào to hơn chút. Còn nếu thấy rồi, thì đó chính là tốc độ. Chệnh nhau vài mili giây. Đối với máy tính hiện đại, một vài mili giây là đủ để làm rất nhiều thứ. Vậy điều gì làm nên khác biệt đó?

Range là một lớp được thiết kế riêng để lưu giữ những dãy số. Vậy nên nó đã được những kĩ sư Python sử dụng các thuật toán để có thể có được sự linh hoạt này.

Mỗi lần bạn lấy một giá trị trong một đối tượng thuộc hàm range thì đối tượng này sẽ lấy các giá trị của start, stop, step và một vài thứ khác để tính toán và sinh ra một con số.

Để hiểu rõ hơn bạn tham khảo câu hỏi này trên Stack Overflow

Why is “1000000000000000 in range(1000000000000001)” so fast in Python 3?


Sử dụng range để duyệt một List, Tuple, Chuỗi

Chúng ta sử dụng một dãy số để dùng indexing lấy các giá trị trong một List, Tuple hoặc Chuỗi.

Chúng ta có hàm range sinh ra một dãy số.

Kết hợp chúng lại, ta có thể duyệt một List, Tuple hoặc Chuỗi:


Sự khác nhau giữa sequence scan và indexing scan

Trong bài trước, bạn thấy rằng ta không cần dùng tới hàm range vẫn có thể duyệt hết các phần tử của một List. Vậy điều gì khiến chúng ta đôi lúc phải dùng tới hàm range để xử lí một List?

Đó là khi ta cần update (cập nhật) List. Hãy xem hai ví dụ sau đây:

Đầu tiên là sequence scan

Biến variable là một biến riêng lẻ, nên không thể cập nhật được List ban đầu.

Còn đối với indexing scan

Hãy lựa chọn cách sử dụng vòng lặp một cách thông minh phù hợp với mục đích của mình.


Comprehension

Có lẽ bây giờ những comprehension không còn phức tạp với các bạn nữa.

Comprehension là một công cụ rất hiệu quả của Python để xử lí rất nhiều việc mà chỉ cần một dòng.

Bên cạnh đó. Người ta còn so sánh những comprehension và những đoạn code với chức năng tương tự thì comprehension có tốc độ nhanh hơn.

Lời tác giả:

  • Mọi người sẽ phải Ồ lên khi thấy bạn có một comprehension chỉ tốn một dòng thời gian thực thi nhanh hơn. Thế nên bạn nên luyện tập sử dụng comprehension thường xuyên.
  • Sau này khi kết hợp với anonymous function là lambda bạn sẽ tạo ra được những thứ mang đậm thương hiệu one-liner.
  • Python không khó. Quan trọng là bạn phải nằm lòng các API của Python (các chức năng mà ngôn ngữ hỗ trợ) là một trong những thứ đó

Ta có thể tổng quát đơn giản cú pháp của một comprehension như sau

Cú pháp:

[ output-expression for-statement optional-predicate ]

Ở đây Kteam sử dụng [ cho List, các bạn có thể sử dụng các cặp ngoặc khác nhưng phải để output-expression phù hợp với kiểu dữ liệu. Như dict thì bạn phải để output-expression là một cặp key-value.

Một số ví dụ

Nếu không sử dụng comprehension thì sẽ như sau:

Khi không sử dụng comprehension


Giới thiệu hàm enumerate

Giả sử bạn có một danh sách học sinh.

Việc in ra danh sách này thì rất đơn giản.

Nhưng như vậy thì không rõ ràng cho lắm vì danh sách này không hề có số thứ tự. Bạn nghĩ đến việc sử dụng hàm range.

Đó cũng là một cách, nhưng Python có hỗ trợ cho bạn một hàm hay hơn đó chính là enumerate. Hàm có cú pháp như sau:

Cú pháp:

enumerate(iterable[, start])

Nếu start không được gửi vào thì mặc định là 0

Hàm này là một generator nhờ câu lệnh yield trong hàm. Nó sẽ tạo ra mỗi giá trị là một cặp gồm số thứ tự và giá trị có cấu trúc như sau

(start + 0, seq[0]), (start + 1, seq[1]), (start + 2, seq[2]), ...

Ví dụ:

Và khi đó, ta có thể sử dụng vòng for như sau

Nếu bạn không thích bắt đầu từ số 0 thì ta cũng có thể thay đổi


Củng cố bài học

Đáp án bài trước

Bạn có thể tìm thấy câu hỏi của phần này tại CÂU HỎI CỦNG CỐ trong bài VÒNG LẶP FOR TRONG PYTHON

  1. Kết quả là 1. Chính xác là giá trị thứ hai của biến iter_

Python là ngôn ngữ thông dịch. Vậy nên nó sẽ đọc từng câu lệnh. Và như đã đề cập trong cách làm việc của vòng lặp này. Nó sẽ lấy giá trị từ sequence gán cho biến rồi mới vào trong for-block. Vậy nên sau khi có giá trị, vòng trong for-block mới có lỗi phát sinh. Khi đó, chúng ta đã vừa lấy mất đi một giá trị của biến iter_. Vậy nên khi dùng hàm next thì kết quả sẽ là kết quả thứ hai.


Câu hỏi củng cố

  1. Sử dụng sequence scan để thay đổi phần tử đầu tiên của mỗi phần tử trong List dưới đây thành None
  1. Một spiral matrix là một ma trận vuông nxn (n cột, n hàng) gồm N2 số tự nhiên đầu tiên. Trong đó số tăng tuần tự đi xung quanh các mép của mảng xoắn bên trong nó.

Ví dụ với một spiral matrix 5x5 thì sẽ như sau:

Viết một đoạn script yêu cầu nhập số n (chính là số cột - hàng) của một spiral matrix. Sau đó dùng vòng lặp tạo một spiral matrix in ra shell (Nếu in ra số có một chữ số như 0, 1, 2,.. thì thêm trước đó là chữ số 0 -> 00, 01, 02,…)

Với spiral matrix như trên sẽ được in ra như sau:

Đáp án của phần này sẽ được trình bày ở bài tiếp theo. Tuy nhiên, Kteam khuyến khích bạn tự trả lời các câu hỏi để củng cố kiến thức cũng như thực hành một cách tốt nhất! 


Kết luận

Qua bài viết này, Bạn đã biết nhiều hơn về VÒNG LẶP FOR TRONG PYTHON.

Ở bài viết sau. Kteam sẽ giới thiệu với các bạn HÀM TRONG PYTHON.

Cảm ơn bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.


Tải xuống

Tài liệu

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Vòng lặp For trong Python - Phần 2 dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên likeshare để ủng hộ Kteam và tác giả nhé!


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.

Tác giả/Dịch giả

Khóa học

Lập trình Python cơ bản

Lập trình Python cơ bản

Đánh giá

5.0
14 đánh giá
Đánh giá
5
14
4
3
2
1
Midir reynard đã đánh giá 2 năm trước

thinhthorken đã đánh giá 2 năm trước

tranquanglinh2102 đã đánh giá 3 năm trước

linhhng đã đánh giá 3 năm trước

sgddt_thptcduoc đã đánh giá 3 năm trước

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
Bikeys đã bình luận khoảng 1 năm trước

n=int(input())

A=[[None]*n for j in range(n)]

d3=0

d1=0

while True:

    for i in range(d1,n-d1):

        A[d1][i]=d3

        d3=d3+1

    if d3>(n*n-1):

        break

    for i in range(d1+1,n-d1-1):

        A[i][n-d1-1]=d3

        d3=d3+1

    for i in range(n-d1-1,d1-1,-1):

        A[n-d1-1][i]=d3

        d3=d3+1

    if d3>(n*n-1):

        break

    for i in range(n-d1-2,d1,-1):

        A[i][d1]=d3

        d3=d3+1

    d1=d1+1

for i in A:

    for k in range(n):

        if i[k]<10:

            i[k]="0"+str(i[k])

for i in A:

    print(" ".join(map(str,i)))

hungphu đã bình luận khoảng 1 năm trước

Câu 2

n=int(input())

A=[[None]*n for j in range(n)]

d3=0

d1=0

while True:

    for i in range(d1,n-d1):

        A[d1][i]=d3

        d3=d3+1

    if d3>(n*n-1):

        break

    for i in range(d1+1,n-d1-1):

        A[i][n-d1-1]=d3

        d3=d3+1

    for i in range(n-d1-1,d1-1,-1):

        A[n-d1-1][i]=d3

        d3=d3+1

    if d3>(n*n-1):

        break

    for i in range(n-d1-2,d1,-1):

        A[i][d1]=d3

        d3=d3+1

    d1=d1+1

for i in A:

    for k in range(n):

        if i[k]<10:

            i[k]="0"+str(i[k])

for i in A:

    print(" ".join(map(str,i)))

chithien2112 đã bình luận 2 năm trước

Câu 2 

i=0
def numberingout(variable,limit,start,stop,step,lst):
    global i
    if (variable=='X'):
        Y=limit
        for X in range(start,stop,step):
            try:
                if (lst[X][Y]==''):
                    lst[X][Y]=i
                    i=i+1
            except:
                pass
    elif (variable=='Y'):
        X=limit
        for Y in range(start,stop,step):
            try:
                if (lst[X][Y]==''):
                    lst[X][Y]=i
                    i=i+1
            except:
                pass
n=int(input('Nhap vao so n: '))
lst=list()
ox=list()
for x in range(n):
    ox=list()
    for y in range(n):
        ox.append('')
    lst.append(ox) 
for k in range(n):
    numberingout('Y',k,0,n,1,lst)
    numberingout('X',n-1-k,0,n,1,lst)
    numberingout('Y',n-1-k,n,-1,-1,lst)
    numberingout('X',k,n,-1,-1,lst)
    numberingout('Y',k,0,n,1,lst)
    numberingout('X',n-1-k,0,n,1,lst)
    numberingout('Y',n-1-k,n,-1,-1,lst)
    numberingout('X',k,n,1,-1,lst)
for a in range(n):
    for b in range(n):
        print('%02d'%(lst[a][b]),end=' ') 
    print('\n')

 

thangnv2605 đã bình luận 2 năm trước

mik có câu 2 siêu ngắn lun:

set_ = {5,8,1,9,4}
for x in set_ :
    print(sum(set_))
    break

Boima12 đã bình luận 2 năm trước

câu 2(tự làm): có thể nhập n trong khoảng (0<n<11)

n,ox,oy,vl,tt = int(input()),0,0,0,0
ch = n-1
spiral_matrix = list([None]*n for x in range(n))

for i in range(n**2):
    spiral_matrix[oy][ox] = i
    if ox != ch and oy != ch and vl == 0:
        ox+=1
    elif ox == ch and oy != ch and vl == 0:
        oy+=1
    elif ox == ch and oy == ch and vl == 0:
        ox-=1        
    elif ox != ch and ox != tt and oy == ch and vl == 0:
        ox-=1
    elif ox != ch and oy != tt+1:
        oy-=1
        vl+=1
    else:
        tt+=1
        vl,ox,oy = 0,tt,tt
        ch-=1

for y in range(n):
    for x in range(n):
        print("%02i" % spiral_matrix[y][x], end=" ")
    print()

-nhức đầu, đau não là những triệu chứng sau khi khô máu với bài 2

Không có video.