Chương 1 – Python cơ bản P10

 Python Basic  Chức năng bình luận bị tắt ở Chương 1 – Python cơ bản P10
Th4 192020
 

Chúng ta lại tiếp tục phần nói đến hàm trong python.
Quản lý các ngoại lệ (Exception handling)
Ngay bây giờ, gặp lỗi hoặc ngoại lệ, trong chương trình Python của bạn có nghĩa là toàn bộ chương trình sẽ bị sập. Bạn không muốn điều này xảy ra trong các chương trình thực tế.
Thay vào đó, bạn muốn chương trình phát hiện lỗi, xử lý chúng và rồi tiếp tục chạy.
Ví dụ, hãy xem xét chương trình sau, có lỗi chia cho số 0. Mở cửa sổ soạn thảo văn bản và nhập mã sau đây, lưu nó dưới dạng zeroDivide.py:

def spam(divideBy):
    return 42 / divideBy
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

Chúng tôi đã xác định một hàm gọi là spam, cung cấp cho nó một tham số và sau đó in giá trị của hàm đó với các tham số khác nhau để xem điều gì sẽ xảy ra.
Đây là đầu ra bạn nhận được khi chạy mã trước đó:

Traceback (most recent call last):
	File "C:/zeroDivide.py", line 6, in <module>
		print(spam(0))
	File "C:/zeroDivide.py", line 2, in spam
		return 42 / divideBy
ZeroDivisionError: division by zero

Một thông báo ZeroDivisionError xảy ra bất cứ khi nào bạn cố chia số cho 0. Từ số dòng được đưa ra trong thông báo lỗi, bạn biết rằng câu lệnh return trong spam() đang gây ra lỗi.
Lỗi có thể được xử lý với try và except trừ báo cáo. Mã mà có khả năng có một lỗi được đặt trong một mệnh đề try. Việc thực hiện chương trình di chuyển đến điểm bắt đầu của mệnh đề sau trừ khi xảy ra lỗi.
Bạn có thể đặt mã chia cho 0 trước đó trong mệnh đề try và có mệnh đề except chứa mã để xử lý những gì xảy ra khi lỗi này xảy ra.

def spam(divideBy):
	try:
		return 42 / divideBy
	except ZeroDivisionError:
		print('Error: Invalid argument.')
print(spam(2))
print(spam(12))
print(spam(0))
print(spam(1))

Khi mã trong mệnh đề try gây ra lỗi, việc thực thi chương trình ngay lập tức chuyển sang mã trong mệnh đề except. Sau khi chạy mã đó, việc thực thi tiếp tục như bình thường. Đầu ra của chương trình trước như sau:

21.0
3.5
Error: Invalid argument.
None
42.0

Lưu ý rằng bất kỳ lỗi nào xảy ra trong các lệnh gọi hàm trong khối try cũng sẽ bị bắt. Hãy xem xét chương trình sau, thay vào đó có các cuộc gọi spam() trong khối try:

def spam(divideBy):
	return 42 / divideBy
try:
	print(spam(2))
	print(spam(12))
	print(spam(0))
	print(spam(1))
except ZeroDivisionError:
	print('Error: Invalid argument.')

Khi chương trình này được chạy, đầu ra trông như thế này:

21.0
3.5
Error: Invalid argument.

Lý do print(spam (1)) không bao giờ được thực thi là vì một lần thực thi nhảy đến mã trong mệnh đề except, nó không trở về mệnh đề try. Thay vào đó, nó chỉ tiếp tục di chuyển xuống chương trình như bình thường.
Một chương trình ngắn: Zigzag
Cho phép sử dụng các khái niệm lập trình mà bạn đã học từ trước đến nay để tạo ra một chương trình hoạt hình nhỏ. Chương trình này sẽ tạo ra một mô hình ngoằn ngoèo, ngoằn ngoèo cho đến khi người dùng dừng nó bằng cách nhấn ctrl-C. Khi bạn chạy chương trình này, đầu ra sẽ trông giống như thế này:

>     ********
>    ********
>   ********
>  ********
> ********
>  ********
>   ********
>    ********
>     ********

Nhập đoạn code sau vào trình soạn thảo và lưu nó dưới dạng zigzag.py.

import time, sys
indent = 0 # How many spaces to indent.
indentIncreasing = True # Whether the indentation is increasing or not.
try:
	while True: # The main program loop.
		print(' ' * indent, end='')
		print('********')
		time.sleep(0.1) # Pause for 1/10 of a second.
		if indentIncreasing:
			# Increase the number of spaces:
			indent = indent + 1
		    if indent == 20:
			    # Change direction:
			    indentIncreasing = False
		else:
			# Decrease the number of spaces:
			indent = indent - 1
		    if indent == 0:
			    # Change direction:
			    indentIncreasing = True
			
except KeyboardInterrupt:
    sys.exit()

Chúng ta sẽ phân tích từng phần của chương trình này, đầu tiên

import time, sys
indent = 0 # How many spaces to indent.
indentIncreasing = True # Whether the indentation is increasing or not.

Đầu tiên, chúng tôi sẽ nhập các mô-đun time và sys. Chương trình của chúng tôi sử dụng hai biến: biến indent theo dõi xem có bao nhiêu khoảng cách thụt đầu dòng trước dải tám dấu sao và indentIncreasing có chứa giá trị Boolean để xác định xem lượng thụt đầu tăng hay giảm.

try:
	while True: # The main program loop.
		print(' ' * indent, end='')
		print('********')
		time.sleep(0.1) # Pause for 1/10 of a second.

Tiếp theo, chúng tôi đặt phần còn lại của chương trình trong một lệnh try. Khi người dùng nhấn Ctrl-C trong khi chương trình Python đang chạy, Python sẽ tạo ra exception KeyboardInterrupt. Nếu không có câu lệnh ngoại trừ try để bắt exception này, chương trình gặp sự cố với thông báo lỗi xấu. Tuy nhiên, đối với chương trình của chúng tôi, chúng tôi muốn nó xử lý sạch ngoại lệ KeyboardInterrupt bằng cách gọi sys.exit(). (Mã cho điều này nằm trong câu lệnh except ở cuối chương trình.)
Vòng lặp while: vòng lặp vô hạn sẽ lặp lại các hướng dẫn trong chương trình của chúng tôi mãi mãi. Điều này liên quan đến việc sử dụng ‘’ * thụt lề để in đúng số lượng không gian thụt lề. Chúng tôi không muốn tự động in một dòng mới sau các khoảng trắng này, vì vậy chúng tôi cũng chuyển end = ‘’ cho lệnh print() đầu tiên. Một cuộc gọi print() thứ hai ra các dấu hoa thị. Hàm time.sleep() chưa được bao phủ, nhưng đủ để nói rằng nó giới thiệu tạm dừng một phần mười giây trong chương trình của chúng ta tại thời điểm này.

if indentIncreasing:
			# Increase the number of spaces:
			indent = indent + 1
			if indent == 20:
				# Change direction:
				indentIncreasing = False

Tiếp theo, chúng tôi muốn điều chỉnh lượng thụt đầu dòng cho lần tiếp theo chúng tôi in dấu sao. Nếu indentIncreasing là True, thì chúng tôi muốn thêm một vào indent. Nhưng một khi thụt lề đạt 20, chúng tôi muốn indent giảm.

else:
			# Decrease the number of spaces:
			indent = indent - 1
			if indent == 0:
				# Change direction:
				indentIncreasing = True

Trong khi đó, nếu indentIncreasing là Sai, chúng tôi muốn trừ một từ indent. Khi indent đạt 0, chúng tôi muốn indent tăng một lần nữa. Dù bằng cách nào, việc thực hiện chương trình sẽ quay trở lại điểm bắt đầu của vòng lặp chương trình chính để in lại các dấu sao.

except KeyboardInterrupt:
	sys.exit()

Nếu người dùng nhấn Ctrl-C tại bất kỳ điểm nào mà chương trình thực thi nằm trong khối try, except KeyboardInterrrupt được đưa ra và xử lý bằng cách này ngoại trừ câu lệnh. Việc thực thi chương trình di chuyển bên trong khối except, chạy sys.exit() và thoát khỏi chương trình. Bằng cách này, mặc dù vòng lặp chương trình chính là vòng lặp vô hạn, người dùng có cách tắt chương trình.
Tổng kết phần hàm trong python
Các hàm là cách chính để sắp xếp mã của bạn thành các nhóm logic. Do các biến trong các hàm tồn tại trong phạm vi cục bộ của riêng chúng, mã trong một hàm không thể ảnh hưởng trực tiếp đến các giá trị của các biến trong các hàm khác. Điều này giới hạn mã nào có thể thay đổi giá trị của các biến của bạn, điều này có thể hữu ích khi gỡ lỗi mã của bạn. Các hàm là một công cụ tuyệt vời để giúp bạn tổ chức mã của mình. Bạn có thể nghĩ về chúng như các hộp đen: chúng có đầu vào ở dạng tham số và đầu ra ở dạng giá trị trả về và mã trong chúng không ảnh hưởng đến các biến trong các hàm khác.
Trong các chương trước, một lỗi duy nhất có thể khiến chương trình của bạn bị sập.
Trong chương này, bạn đã tìm hiểu về try và except các câu lệnh, có thể chạy mã khi phát hiện lỗi. Điều này có thể làm cho chương trình của bạn trở nên linh hoạt hơn đối với các trường hợp lỗi phổ biến.
Câu hỏi thực hành

  1. Tại sao các hàm có lợi trong các chương trình của bạn?
  2. Khi nào mã trong hàm thực thi: khi hàm được định nghĩa hoặc khi hàm được gọi?
  3. Lệnh để tạo ra hàm là gì?
  4. Điều gì là khác nhau giữa một hàm và lời gọi một hàm?
  5. Có bao nhiêu phạm vi toàn cục trong chương trình python? Và bao nhiêu phạm vi cục bộ?
  6. Điều gì xảy ra với biến cục bộ trong hàm python khi hàm được gọi?
  7. Điều gì là return giá trị? Có thể giá trị return là một phần của biểu thức?
  8. Nếu một hàm không có câu lệnh return. Giá trị nào được trả về khi hàm được gọi.
  9. Làm thế nào bạn có thể buộc một biến trong một hàm tham chiếu đến biến toàn cục?
  10. Dạng dữ liệu của None là gì?
  11. Điều gì sẽ được thực hiện khi chúng ta dùng lệnh import areallyourpetsnamederic?
  12. Nếu bạn có một hàm bacon() trong module spam bạn sẽ gọi hàm bacon() như thế nào sau khi đã import spam?
  13. Làm thế nào bạn có thể ngăn chương trình bị sập khi nó gặp lỗi?
  14. Điều gì là mệnh đề try? Điều gì là mệnh đề except?

Bài tập thực hành
Để thực hành, viết chương trình theo những nhiệm vụ sau.
Dãy Collatz
Viết hàm có tên collatz () có một tham số có tên là number. Nếu number là số chẵn thì collatz () sẽ in number // 2 và trả về giá trị này. Nếu number là số lẻ, thì collatz () sẽ in và trả về 3 * number + 1. Sau đó viết chương trình cho phép người dùng nhập số nguyên và tiếp tục gọi collatz () trên số đó cho đến khi hàm trả về giá trị 1.
(Thật đáng ngạc nhiên, chuỗi này thực sự hoạt động cho bất kỳ số nguyên nào sớm hay muộn, sử dụng chuỗi này, bạn sẽ đến 1! Ngay cả các nhà toán học cũng không chắc tại sao. Chương trình của bạn đang khám phá cái gọi là chuỗi Collatz, đôi khi được gọi là đơn giản nhất vấn đề toán học không thể.)
Nhớ chuyển đổi giá trị trả về từ input () thành một số nguyên với hàm int (); nếu không, nó sẽ là một giá trị chuỗi.
Gợi ý: Số nguyên là số chẵn nếu số% 2 == 0 và số lẻ lẻ nếu số% 2 == 1.
Đầu ra của chương trình này có thể trông giống như thế này:

Enter number:
3
10
5
16
8
4
2
1

Kiểm tra đầu vào
Thêm try và except các câu lệnh cho dự án trước đó để phát hiện xem người dùng có nhập chuỗi không liên kết hay không. Thông thường, hàm int () sẽ đưa ra lỗi ValueError nếu nó được truyền qua một chuỗi không phân phối, như trong int (‘puppy’). Trong mệnh đề except, in một thông báo cho người dùng nói rằng họ phải nhập một số nguyên.

Chương 1 – Python cơ bản P9

 Python Basic  Chức năng bình luận bị tắt ở Chương 1 – Python cơ bản P9
Th4 192020
 

Chúng ta lại tiếp tục trong phần nói về hàm trong python.
Gọi các thành phần trong ngăn xếp (The call stack)
Hãy tưởng tượng rằng bạn có một cuộc trò chuyện quanh co với ai đó. Bạn nói về người bạn Alice của mình, sau đó nhắc bạn về một câu chuyện về đồng nghiệp Bob, nhưng trước tiên bạn phải giải thích điều gì đó về anh em họ Carol của bạn. Bạn kết thúc câu chuyện về Carol và quay lại nói về Bob, và khi bạn kết thúc câu chuyện về Bob, bạn quay lại nói về Alice. Nhưng sau đó, bạn được nhắc về anh trai David của mình, vì vậy bạn kể một câu chuyện về anh ta, và sau đó quay lại để hoàn thành câu chuyện ban đầu của bạn về Alice. Cuộc hội thoại của bạn tuân theo cấu trúc giống như ngăn xếp, như trong hình dưới đây.
Cuộc hội thoại giống như ngăn xếp vì chủ đề hiện tại luôn ở đầu ngăn xếp.
b24893×164 7.05 KB
Tương tự như cuộc trò chuyện quanh co của chúng tôi, việc gọi một chức năng sẽ không gửi lệnh thực thi trong chuyến đi một chiều đến đỉnh của một chức năng. Python sẽ nhớ dòng mã nào được gọi là hàm để thực thi có thể quay lại đó khi nó gặp câu lệnh return. Nếu hàm ban đầu đó gọi các hàm khác, thì việc thực thi sẽ trở lại các lệnh gọi hàm đó trước, trước khi quay lại từ lệnh gọi hàm ban đầu.
Mở trình soạn thảo và copy dòng code bên dưới sau đấy lưu lại dưới tên abcdCallStack.py

def a():
    print('a() starts')
    b()
    d()
    print('a() returns')
def b():
    print('b() starts')
    c()
    print('b() returns')
def c():
    print('c() starts')
    print('c() returns')
def d():
    print('d() starts')
    print('d() returns')
a()

Khi chúng ta chạy chương trình này nó hiển thị ra như sau trên màn hình.

a() starts
b() starts
c() starts
c() returns
b() returns
d() starts
d() returns
a() returns

Khi a() được gọi, nó gọi b(), đến lượt nó gọi c(). Hàm c () không gọi bất cứ thứ gì; nó chỉ hiển thị c() bắt đầu và c() trả về trước khi quay lại dòng trong b() đã gọi nó. Khi thực thi trả về mã trong b() được gọi là c (), nó sẽ trả về dòng trong a() được gọi là b(). Việc thực thi tiếp tục đến dòng tiếp theo trong hàm b(), đó là một cuộc gọi đến d(). Giống như hàm c(), hàm d() cũng không gọi bất cứ thứ gì. Nó chỉ hiển thị d() starts và d() returns trước khi quay lại dòng trong b() đã gọi nó. Vì b() không chứa mã nào khác, nên việc thực thi trở về dòng trong a () được gọi là b(). Dòng cuối cùng trong a() hiển thị trả về () trước khi quay lại cuộc gọi a() ban đầu ở cuối chương trình.
Ngăn xếp cuộc gọi là cách Python ghi nhớ nơi trả về thực thi sau mỗi lần gọi hàm. Ngăn xếp cuộc gọi được lưu trữ trong một biến trong chương trình của bạn; đúng hơn, Python xử lý nó đằng sau hậu trường. Khi chương trình của bạn gọi một hàm, Python tạo một đối tượng khung trên đỉnh của ngăn xếp cuộc gọi. Các đối tượng khung lưu trữ số dòng của lệnh gọi hàm ban đầu để Python có thể nhớ nơi cần trả về. Nếu một cuộc gọi chức năng khác được thực hiện, Python sẽ đặt một đối tượng khung khác vào ngăn xếp cuộc gọi bên trên cuộc gọi khác.
Khi một lệnh gọi hàm trả về, Python sẽ xóa một đối tượng khung khỏi trên cùng của ngăn xếp và di chuyển thực thi đến số dòng được lưu trữ trong nó. Lưu ý rằng các đối tượng khung luôn được thêm và xóa khỏi đỉnh ngăn xếp chứ không phải từ bất kỳ nơi nào khác. Hình dưới đây minh họa trạng thái của ngăn xếp cuộc gọi trong abcdCallStack.py khi mỗi hàm được gọi và trả về.
b25895×153 6.09 KB
Phần đầu của ngăn xếp cuộc gọi là chức năng hiện đang thực hiện trong. Khi ngăn xếp cuộc gọi trống, việc thực thi nằm trên một dòng bên ngoài tất cả các chức năng. Ngăn xếp cuộc gọi là một chi tiết kỹ thuật mà bạn không cần phải biết để viết chương trình. Nó đủ để hiểu rằng các chức năng gọi trở về số dòng họ được gọi từ.
Tuy nhiên, việc hiểu các ngăn xếp cuộc gọi giúp dễ hiểu phạm vi địa phương và toàn cầu hơn, được mô tả trong phần tiếp theo.
Phạm vi cục bộ và toàn cầu
Các tham số và biến được gán trong một hàm được gọi là tồn tại trong phạm vi cục bộ của hàm đó. Các biến được gán bên ngoài tất cả các hàm được cho là tồn tại trong phạm vi toàn cầu. Một biến tồn tại trong phạm vi cục bộ được gọi là biến cục bộ, trong khi biến tồn tại trong phạm vi toàn cầu được gọi là biến toàn cục. Một biến phải là một cục bộ hoặc là toàn cục; nó không thể là cả địa phương và toàn cầu.
Hãy nghĩ về một phạm vi như một thùng chứa cho các biến. Khi một phạm vi bị phá hủy, tất cả các giá trị được lưu trữ trong phạm vi biến, biến sẽ bị lãng quên. Chỉ có một phạm vi toàn cầu và nó được tạo khi chương trình của bạn bắt đầu. Khi chương trình của bạn kết thúc, phạm vi toàn cầu sẽ bị hủy và tất cả các biến của nó bị lãng quên. Mặt khác, lần sau khi bạn chạy chương trình, các biến sẽ ghi nhớ giá trị của chúng từ lần cuối bạn chạy chương trình.
Một phạm vi cục bộ được tạo ra bất cứ khi nào một chức năng được gọi. Bất kỳ biến nào được gán trong hàm đều tồn tại trong phạm vi hàm cục bộ. Khi hàm trả về, phạm vi cục bộ bị hủy và các biến này bị quên. Lần sau khi bạn gọi hàm, các biến cục bộ sẽ không nhớ các giá trị được lưu trong chúng từ lần cuối cùng hàm được gọi. Các biến cục bộ cũng được lưu trữ trong các đối tượng khung trên ngăn xếp cuộc gọi.
Vấn đề phạm vi của biến có vài lưu ý

  • Mã trong phạm vi toàn cầu, bên ngoài tất cả các chức năng, không thể sử dụng bất kỳ biến cục bộ nào.
  • Tuy nhiên, mã trong phạm vi cục bộ có thể truy cập các biến toàn cục.
  • Mã trong một hàm phạm vi cục bộ không thể sử dụng các biến trong bất kỳ phạm vi cục bộ nào khác.
  • Bạn có thể sử dụng cùng tên cho các biến khác nhau nếu chúng ở các phạm vi khác nhau. Đó là, có thể có một biến cục bộ có tên là spam và một biến toàn cục cũng có tên là spam
    Lý do Python có phạm vi khác nhau thay vì chỉ biến mọi thứ thành biến toàn cục là để khi các biến được sửa đổi bởi mã trong một lệnh gọi cụ thể, hàm chỉ tương tác với phần còn lại của chương trình thông qua các tham số và giá trị trả về. Điều này thu hẹp số lượng dòng mã có thể gây ra lỗi. Nếu chương trình của bạn không chứa gì ngoài các biến toàn cục và có lỗi do biến được đặt thành giá trị xấu, thì thật khó để theo dõi nơi đặt giá trị xấu này. Nó có thể đã được đặt từ bất cứ nơi nào trong chương trình và chương trình của bạn có thể dài hàng trăm hoặc hàng ngàn dòng! Nhưng nếu lỗi được gây ra bởi một biến cục bộ có giá trị xấu, bạn biết rằng chỉ có mã trong một hàm đó có thể đặt nó không chính xác.
    Mặc dù sử dụng các biến toàn cục trong các chương trình nhỏ là tốt, nhưng việc dựa vào các biến toàn cầu là một thói quen xấu khi các chương trình của bạn ngày càng lớn hơn…
    Những biến cục bộ không thể sử dụng trong phạm vi toàn cục
    Chúng ta xem xét chương trình sau và lí do xảy ra lỗi của chương trình
def spam():
    eggs = 31337
spam()
print(eggs)

Khi bạn chạy chương trình sẽ hiển thị lỗi như sau

Traceback (most recent call last):
    File "C:/test1.py", line 4, in <module>
        print(eggs)
NameError: name 'eggs' is not defined

Lỗi xảy ra do biến eggs chỉ tồn tại trong phạm vi cục bộ được tạo khi spam() được gọi là. Khi thực thi chương trình trả về từ spam, phạm vi cục bộ đó sẽ bị hủy và không còn biến số có tên là eggs. Vì vậy, khi chương trình của bạn cố chạy print(eggs), Python sẽ báo lỗi cho bạn rằng eggs không được xác định. Điều này có ý nghĩa nếu bạn nghĩ về nó; khi thực hiện chương trình trong phạm vi toàn cầu, không có phạm vi cục bộ nào tồn tại, do đó, có thể có bất kỳ biến cục bộ nào. Đây là lý do tại sao chỉ các biến toàn cục có thể được sử dụng trong phạm vi toàn cầu.
Phạm vi cục bộ không thể sử dụng những biến trong phạm vi cục bộ khác
Một phạm vi cục bộ mới được tạo bất cứ khi nào một chức năng được gọi, bao gồm cả khi một chức năng được gọi từ một chức năng khác. Hãy xem xét chương trình này:

def spam():
    eggs = 99
    bacon()
    print(eggs)
def bacon():
    ham = 101
    eggs = 0
spam()

Khi chương trình khởi động, hàm spam() được gọi và phạm vi cục bộ được tạo. eggs biến cục bộ được đặt thành 99. Sau đó, hàm bacon() được gọi và phạm vi cục bộ thứ hai được tạo. Nhiều phạm vi địa phương có thể tồn tại cùng một lúc. Trong phạm vi cục bộ mới này, ham biến cục bộ được đặt thành 101 và một biến eggs cục bộ trứng khác với phạm vi trong spam() phạm vi cục bộ của hàm cũng được tạo và đặt thành 0.
Khi bacon() trả về, phạm vi cục bộ của lệnh gọi đó sẽ bị hủy, bao gồm cả biến eggs của nó. Việc thực hiện chương trình tiếp tục trong hàm spam() để in giá trị của eggs. Do phạm vi cục bộ của lệnh gọi spam() vẫn tồn tại, nên biến số eggs duy nhất là hàm spam() biến eggs, được đặt thành 99. Đây là những gì chương trình in ra màn hình.
Kết quả cuối cùng là các biến cục bộ trong một hàm hoàn toàn tách biệt với các biến cục bộ trong một hàm khác.
Biến toàn cục có thể được đọc từ phạm vi cục bộ
Xem xét chương trình sau

def spam():
     print(eggs)
eggs = 42
spam()
print(eggs)

Vì không có tham số có tên là eggs hoặc bất kỳ mã nào gán cho eggs một giá trị trong hàm spam(), khi trứng được sử dụng trong spam(), Python coi đó là một tham chiếu đến eggs biến toàn cục. Đây là lý do tại sao 42 được in khi chương trình trước được chạy.
Biến cục bộ và toàn cục cùng tên
Về mặt kỹ thuật, hoàn toàn có thể chấp nhận sử dụng cùng một tên biến cho biến toàn cục và biến cục bộ trong các phạm vi khác nhau trong Python.Nhưng, để đơn giản hóa cuộc sống của bạn, tránh làm điều này. Để xem điều gì xảy ra, hãy nhập mã sau vào trình soạn thảo và lưu nó dưới dạng localGlobalSameName.py:

def spam():
    eggs = 'spam local'
    print(eggs) # prints 'spam local'
def bacon():
    eggs = 'bacon local'
    print(eggs) # prints 'bacon local'
spam()
print(eggs) # prints 'bacon local'
eggs = 'global'
bacon()
print(eggs) # prints 'global'

Khi bạn chạy chương trình, sẽ hiện thị ra màn hình như sau

bacon local
spam local
bacon local
global

Thực tế, có ba biến khác nhau trong chương trình này, nhưng điều khó hiểu là tất cả chúng đều được đặt tên là eggs. Các biến này được mô tả như sau:

  • Một biến có tên eggs tồn tại trong phạm vi cục bộ khi spam() được gọi.
  • Một biến có tên eggs tồn tại trong phạm vi cục bộ khi bacon() được gọi.
  • Một biến có tên eggs tồn tại trong phạm vi toàn cục.

Vì ba biến riêng biệt này đều có cùng tên, nên nó có thể là khó hiểu để theo dõi cái nào đang được sử dụng tại bất kỳ thời điểm nào. Đây là tại sao bạn nên tránh sử dụng cùng một tên biến trong các phạm vi khác nhau.
Lệnh global
Nếu bạn cần sửa đổi từ bên trong một hàm, hãy sử dụng câu lệnh gloabal. Nếu bạn có một dòng như global eggs ở đầu hàm, nó sẽ báo cho Python, trong hàm này, eggs đề cập đến biến toàn cục, vì vậy, đừng tạo một biến cục bộ có tên này. Ví dụ, nhập mã sau vào trình soạn thảo và lưu nó dưới dạng globalStatement.py:

def spam():
    global eggs
    eggs = 'spam'
eggs = 'global'
spam()
print(eggs)

Khi chạy chương trình hàm print() cuối sẽ in ra màn hình là:
`

spam

Vì eggs được khai báo toàn cục ở đầu spam(), khi eggs được đặt thành ‘spam’, việc gán này được thực hiện cho eggs có phạm vi toàn cục. Không có biến eggs cục bộ nào được tạo.
Có bốn quy tắc để cho biết một biến nằm trong phạm vi cục bộ hay phạm vi toàn cầu:

  • Nếu một biến đang được sử dụng trong phạm vi toàn cục (nghĩa là bên ngoài tất cả các hàm), thì đó luôn là biến toàn cục.
  • Nếu có một câu lệnh global cho biến đó trong một hàm, thì đó là biến toàn cục.
  • Mặt khác, nếu biến được sử dụng trong câu lệnh gán trong hàm, thì đó là biến cục bộ.
  • Nhưng biến không được sử dụng trong câu lệnh gán, nó là biến toàn cục.
    Để hiểu rõ hơn về các quy tắc này, đây là một chương trình ví dụ. Nhập mã sau vào trình soạn thảo và lưu dưới dạng sameNameLocalGlobal.py:
def spam():
    global eggs
    eggs = 'spam' # this is the global
def bacon():
    eggs = 'bacon' # this is a local
def ham():
    print(eggs) # this is the global
eggs = 42 # this is the global
spam()
print(eggs)

Trong hàm spam(), eggs là biến số toàn cục vì có câu lệnh global về eggs ở đầu hàm. Trong bacon(), eggs là biến cục bộ vì có câu lệnh gán cho hàm đó trong hàm đó. Trong hàm ham(), eggs là biến toàn cục vì không có câu lệnh gán hoặc câu lệnh chung cho hàm đó. Nếu bạn chạy sameNameLocalGlobal.py, đầu ra sẽ như thế này:
`

spam

Trong một hàm, một biến sẽ luôn là toàn cục hoặc luôn luôn là cục bộ. Mã trong hàm không thể sử dụng một biến cục bộ có tên là eggs và sau đó sử dụng biến eggs toàn cục sau đó trong cùng hàm đó.
Chú ý: Nếu bạn muốn sửa đổi giá trị được lưu trữ trong một biến toàn cục từ trong một hàm, bạn phải sử dụng một câu lệnh global trên biến đó.
Nếu bạn cố gắng sử dụng biến cục bộ trong hàm trước khi gán giá trị với nó, như trong chương trình sau, Python sẽ báo lỗi cho bạn. Để thấy điều này, hãy nhập phần sau vào trình soạn thảo và lưu dưới dạng sameNameError.py:

def spam():
    print(eggs) # ERROR!
    eggs = 'spam local'
eggs = 'global'
spam()

Khi bạn chạy chương trình này sẽ có lỗi như sau:

Traceback (most recent call last):
    File "C:/sameNameError.py", line 6, in <module>
        spam()
    File "C:/sameNameError.py", line 2, in spam
        print(eggs) # ERROR!
UnboundLocalError: local variable 'eggs' referenced before assignment

Lỗi này xảy ra do Python thấy rằng có một câu lệnh gán cho eggs trong hàm spam() và do đó, coi eggs là cục bộ. Nhưng vì print(eggs) được thực thi trước khi eggs được gán bất cứ thứ gì, nên biến eggs cục bộ không ‘tồn tại’.Python sẽ không quay lại sử dụng biến số eggs toàn cục.
Hàm như hộp đen
Thông thường, tất cả những gì bạn cần biết về một hàm là đầu vào (tham số) và giá trị đầu ra của nó, bạn không phải luôn tự đặt gánh nặng cho cách mã của hàm thực sự hoạt động. Khi bạn nghĩ về các hàm theo cách cấp cao này, người ta thường nói rằng bạn đang đối xử với một chức năng như một hộp đen.
Ý tưởng này là nền tảng cho lập trình hiện đại. Các chương sau trong cuốn sách này sẽ cho bạn thấy một số mô-đun với các chức năng được viết bởi người khác. Khi bạn có thể xem qua mã nguồn nếu bạn tò mò, bạn không cần biết làm thế nào các hàm này hoạt động để sử dụng chúng. Và vì các hàm viết không có biến toàn cục được khuyến khích, bạn thường không phải lo lắng về mã của hàm tương tác với phần còn lại của chương trình.

Chương 1 – Python cơ bản P8

 Python Basic  Chức năng bình luận bị tắt ở Chương 1 – Python cơ bản P8
Th4 192020
 

Chúng ta đã giới thiệu sơ qua về khái niệm điều khiển luồng (control follow) trong python. Những phần tiếp theo này chúng ta sẽ đi đến một khái niệm mới trong python đấy là hàm (function) trong python.
Bạn đã quen thuộc với các hàm print (), input () và len () từ các chương trước. Python cung cấp một số hàm dựng sẵn(builtin functions) như thế này, nhưng bạn cũng có thể viết các hàm của riêng mình. Một chức năng giống như một chương trình nhỏ trong một chương trình.
Để hiểu rõ hơn về các hàm trong python, tạo một tập helloFunc.py với nội dung sau.

def hello():
    print('Howdy!')
    print('Howdy!!!')
    print('Hello there.')
hello()
hello()
hello()

Dòng đầu tiên là một câu lệnh def, định nghĩa một hàm có tên hello (). Mã trong khối theo sau câu lệnh def là phần thân của hàm. Mã này được thực thi khi hàm được gọi, không phải khi hàm được xác định lần đầu.
Các dòng hello () sau hàm là các lệnh gọi hàm. Trong mã, một hàm gọi chỉ là tên hàm theo sau là dấu ngoặc đơn, có thể có một số đối số ở giữa dấu ngoặc đơn. Khi thực hiện chương trình đạt được các cuộc gọi này, nó sẽ nhảy đến dòng trên cùng trong hàm và bắt đầu thực thi mã ở đó. Khi đến cuối hàm, thực thi sẽ trở về dòng được gọi là hàm và tiếp tục di chuyển qua mã như trước.
Vì chương trình này gọi hello() ba lần, mã trong hello() chức năng được thực hiện ba lần. Khi bạn chạy chương trình này, đầu ra trông như thế này:

Howdy!
Howdy!!!
Hello there.
Howdy!
Howdy!!!
Hello there.
Howdy!
Howdy!!!
Hello there.

Một mục đích chính của các hàm là nhóm mã được thực thi nhiều lần. Nếu không có chức năng được xác định, bạn sẽ phải sao chép và dán mã này mỗi lần và chương trình sẽ như thế này:

print('Howdy!')
print('Howdy!!!')
print('Hello there.')
print('Howdy!')
print('Howdy!!!')
print('Hello there.')
print('Howdy!')
print('Howdy!!!')
print('Hello there.')

Nói chung, bạn luôn muốn tránh trùng lặp mã bởi vì nếu bạn Bao giờ quyết định cập nhật mã, ví dụ, nếu bạn tìm thấy một lỗi bạn cần sửa lỗi, bạn phải nhớ thay đổi mã ở mọi nơi bạn đã sao chép mã.
Khi bạn có thêm kinh nghiệm lập trình, bạn sẽ thường thấy mã trùng lặp, có nghĩa là loại bỏ mã trùng lặp hoặc sao chép. Sự trùng lặp làm cho chương trình của bạn ngắn hơn, dễ đọc hơn và dễ cập nhật hơn.
Câu lệnh def và các thông số
Khi bạn gọi hàm print () hoặc len (), bạn truyền cho chúng các giá trị, được gọi là đối số, bằng cách nhập chúng giữa các dấu ngoặc đơn. Bạn cũng có thể xác định các hàm riêng của mình chấp nhận đối số. Nhập ví dụ sau vào trình chỉnh sửa tệp và lưu nó dưới dạng helloFunc2.py:

hello(name):
    print('Hello, ' + name)
hello('Alice')
hello('Bob')

Khi bạn chạy chương trình này nó sẽ hiển thị ra màn hình như sau

Hello, Alice
Hello, Bob

Định nghĩa của hàm hello () trong chương trình này có một tham số gọi là name. Các tham số là các biến có chứa các đối số. Khi một hàm được gọi với các đối số, các đối số được lưu trữ trong các tham số. Lần đầu tiên hàm hello() được gọi, nó được truyền đối số ‘Alice’. Việc thực thi chương trình nhập vào hàm và tên tham số được tự động đặt thành ‘Alice’, đây là tên được in bởi câu lệnh print ().
Một điều đặc biệt cần lưu ý về các tham số là giá trị được lưu trữ trong một tham số bị xóa khi hàm trả về. Ví dụ, nếu bạn đã thêm print(name) sau hello(‘Bob’) trong chương trình trước đó, chương trình sẽ cung cấp cho bạn một NameError vì không có tên biến.
Biến này bị hủy sau khi hàm gọi hello (‘Bob’) trả về, vì vậy print (name) sẽ chỉ một biến tên không tồn tại.
Điều này tương tự như cách một biến chương trình bị lãng quên khi chương trình kết thúc. Tôi sẽ nói nhiều hơn về lý do tại sao điều đó xảy ra sau chương này, khi tôi thảo luận về chức năng phạm vi địa phương là gì.
Định nghĩa, gọi, truyền, đối số, thông số(Define, Call, Pass, Argument, Parameter)
Những khái niệm này lúc đầu có thể gây cho bạn một chút rắc rối, chúng ta nhìn vào ví dụ sau

def sayHello(name):
    print('Hello, ' + name)
sayHello('Al')

Để xác định một hàm là tạo ra nó, giống như một câu lệnh gán như spam = 42 tạo biến spam. Câu lệnh def định nghĩa hàm sayHello (). Dòng sayHello (‘Al’) gọi hàm được tạo bây giờ, gửi thực thi đến đầu mã của hàm. Lệnh gọi hàm này còn được gọi là truyền giá trị chuỗi ‘Al’ cho hàm. Một giá trị được truyền cho một hàm trong lệnh gọi hàm là một đối số. Đối số ‘Al’ được gán cho một biến name cục bộ có tên. Các biến có đối số được gán cho chúng là các tham số.
Thật dễ dàng để trộn lẫn các thuật ngữ này, nhưng giữ chúng riêng biệt sẽ đảm bảo rằng bạn biết chính xác văn bản trong chương này có nghĩa gì.
Return giá trị và return biến
Khi bạn gọi hàm len() và truyền cho nó một đối số, chẳng hạn như ‘Xin chào’, lệnh gọi hàm sẽ ước tính giá trị nguyên 5, là độ dài của chuỗi bạn đã truyền. Nói chung, giá trị mà một lệnh gọi hàm ước tính được gọi là giá trị trả về của hàm.
Khi tạo một hàm bằng cách sử dụng câu lệnh def, bạn có thể chỉ định giá trị trả về sẽ là bao nhiêu với câu lệnh return. Một câu lệnh return bao gồm những điều sau đây:

  • Một từ khóa return
  • Một giá trị hoặc biểu thức mà hàm trả về.
    Khi một biểu thức được sử dụng với câu lệnh return, giá trị trả về là những gì biểu thức này đánh giá. Ví dụ, chương trình sau định nghĩa một hàm trả về một chuỗi khác nhau tùy thuộc vào số nào nó được truyền dưới dạng đối số. Nhập mã sau vào trình chỉnh soạn và lưu nó dưới dạng magic8Ball.py:
import random
def getAnswer(answerNumber):
	if answerNumber == 1:
		return 'It is certain'
	elif answerNumber == 2:
		return 'It is decidedly so'
	elif answerNumber == 3:
		return 'Yes'
	elif answerNumber == 4:
		return 'Reply hazy try again'
	elif answerNumber == 5:
		return 'Ask again later'
	elif answerNumber == 6:
		return 'Concentrate and ask again'
	elif answerNumber == 7:
		return 'My reply is no'
	elif answerNumber == 8:
		return 'Outlook not so good'
	elif answerNumber == 9:
		return 'Very doubtful'
r = random.randint(1, 9)
fortune = getAnswer(r)
print(fortune)

Chúng ta có thể rút gọn đoạn mã cuối trong chỉ một dòng

r = random.randint(1, 9)
fortune = getAnswer(r)
print(fortune)

thành
`

print(getAnswer(random.randint(1, 9)))

Giá trị None
Trong Python, có một giá trị gọi là None, đại diện cho sự vắng mặt của một giá trị. Giá trị None là giá trị duy nhất của kiểu dữ liệu noneType. (Các ngôn ngữ lập trình khác có thể gọi giá trị này là null, nil hoặc không xác định.) Giống như các giá trị Boolean True và false, giá trị None nào phải được nhập bằng chữ N.
Giá trị không có giá trị này có thể hữu ích khi bạn cần lưu trữ một cái gì đó đã không thể được nhầm lẫn cho một giá trị thực trong một biến. Một nơi không sử dụng là giá trị trả về của print(). Hàm print() hiển thị văn bản trên màn hình, nhưng nó không cần phải trả lại bất cứ thứ gì theo cùng một cách len() hoặc input(). Nhưng vì tất cả các lệnh gọi hàm cần ước tính thành giá trị trả về, print() trả về None. Để thấy điều này trong thực tế, nhập thông tin sau vào command line:

>>> spam = print('Hello!')
Hello!
>>> None == spam
True

Đằng sau hậu trường, Python thêm return vào cuối bất kỳ định nghĩa hàm nào mà không có câu lệnh return. Điều này tương tự như cách một vòng lặp for hoặc for ngầm kết thúc bằng câu lệnh continue. Ngoài ra, nếu bạn sử dụng câu lệnh return mà không có giá trị (nghĩa là chỉ từ khóa return), thì None được trả về.
Từ khóa đối số và hàm print()
Hầu hết các đối số được xác định bởi vị trí của chúng trong lệnh gọi hàm. Ví dụ: random.randint (1, 10) khác với random.randint (10, 1). Hàm gọi random.randint (1, 10) sẽ trả về một số nguyên ngẫu nhiên trong khoảng từ 1 đến 10 vì đối số thứ nhất là đầu thấp của phạm vi và đối số thứ hai là cao cấp (trong khi random.randint (10, 1) gây ra một lỗi).
Tuy nhiên, thay vì thông qua vị trí của họ, các đối số từ khóa là được xác định bởi từ khóa đặt trước chúng trong lệnh gọi hàm. Đối số từ khóa thường được sử dụng cho các tham số tùy chọn. Ví dụ, hàm print() có các tham số tùy chọn end và sep để chỉ định những gì sẽ được in ở cuối các đối số của nó và giữa các đối số của nó (tách chúng), tương ứng.
Nếu bạn đã chạy một chương trình với mã sau đây:

print('Hello')
print('World')

sẽ hiển thị ra màn hình như thế này

Hello
World

Hai chuỗi xuất ra xuất hiện trên các dòng riêng biệt vì hàm print () tự động thêm một ký tự dòng mới vào cuối chuỗi mà nó được truyền. Tuy nhiên, bạn có thể đặt đối số từ khóa end để thay đổi ký tự dòng mới thành một chuỗi khác. Ví dụ: nếu mã là thế này:

print('Hello', end='')
print('World')

sẽ hiển thị trên màn hình như thế này

HelloWorld

Đầu ra được in trên một dòng vì không còn dòng mới được in sau ‘Hello’. Thay vào đó, chuỗi trống được in. Điều này rất hữu ích nếu bạn cần vô hiệu hóa dòng mới được thêm vào cuối mỗi lệnh gọi hàm print().
Tương tự, khi bạn chuyển nhiều giá trị chuỗi cho print(), hàm sẽ tự động phân tách chúng với một không gian duy nhất. Nhập thông tin sau vào command line:

>>> print('cats', 'dogs', 'mice')
cats dogs mice

Nhưng bạn có thể thay thế chuỗi phân tách mặc định bằng cách chuyển đối số từ khóa sep thành một chuỗi khác. Nhập thông tin sau vào command line:

>>> print('cats', 'dogs', 'mice', sep=',')
cats,dogs,mice

Bạn cũng có thể thêm các đối số từ khóa vào các chức năng bạn viết, nhưng trước tiên, bạn sẽ phải tìm hiểu về danh sách và các loại dữ liệu từ điển trong hai chương tiếp theo. Bây giờ, chỉ cần biết rằng một số hàm có các đối số từ khóa tùy chọn có thể được chỉ định khi hàm được gọi.

Chương 1 – Python cơ bản P7

 Python Basic  Chức năng bình luận bị tắt ở Chương 1 – Python cơ bản P7
Th4 192020
 

Bài viết tiếp theo sẽ là vài ví dụ khi bạn sử dụng điều khiển luồng trong chương trình.
Một chương trình ngắn: Guess the Number
Các ví dụ mà tôi đã chỉ ra cho bạn cho đến nay rất hữu ích cho việc giới thiệu các khái niệm cơ bản, nhưng bây giờ hãy để cho tôi thấy mọi thứ bạn đã học được kết hợp với nhau như thế nào trong một chương trình hoàn chỉnh hơn. Trong phần này, tôi sẽ cho bạn thấy một trò chơi đơn giản, trò chơi đoán số. Khi bạn chạy chương trình này, đầu ra sẽ trông giống như thế này:

I am thinking of a number between 1 and 20.
Take a guess.
10
Your guess is too low.
Take a guess.
15
Your guess is too low.
Take a guess.
17
Your guess is too high.
Take a guess.
16
Good job! You guessed my number in 4 guesses!

Nhập source code phía dưới và lưu dưới tên guessTheNumber.py.

# This is a guess the number game.
import random
secretNumber = random.randint(1, 20)
print('I am thinking of a number between 1 and 20.')
# Ask the player to guess 6 times.
for guessesTaken in range(1, 7):
	print('Take a guess.')
	guess = int(input())
	if guess < secretNumber:
		print('Your guess is too low.')
	elif guess > secretNumber:
		print('Your guess is too high.')
	else:
		break # This condition is the correct guess!
if guess == secretNumber:
	print('Good job! You guessed my number in ' + str(guessesTaken) + 'guesses!')
else:
    print('Nope. The number I was thinking of was ' + str(secretNumber))

Cách chương trình thực hiện bạn sẽ thấy như đoạn trên, bây giờ chúng ta sẽ phân tích những đoạn nhỏ trong chương trình này.

# This is a guess the number game.
import random
secretNumber = random.randint(1, 20)

Đầu tiên, một nhận xét ở đầu mã giải thích chương trình là làm gì. Sau đó, chương trình nhập mô-đun random để có thể sử dụng hàm random.randint() để tạo số cho người dùng đoán.
Giá trị trả về, một số nguyên ngẫu nhiên trong khoảng từ 1 đến 20, được lưu trữ trong biến SecretNumber.

print('I am thinking of a number between 1 and 20.')
# Ask the player to guess 6 times.
for guessesTaken in range(1, 7):
	print('Take a guess.')
	guess = int(input())

Chương trình nói với người chơi rằng nó đã đưa ra một con số bí mật và sẽ cho người chơi sáu cơ hội để đoán nó. Mã cho phép người chơi nhập dự đoán và kiểm tra dự đoán đó là trong một vòng lặp for sẽ lặp lại nhiều nhất sáu lần. Điều đầu tiên xảy ra trong vòng lặp là người chơi gõ vào một phỏng đoán. Vì input () trả về một chuỗi, giá trị trả về của nó được truyền thẳng vào int (), giúp dịch chuỗi thành giá trị số nguyên. Điều này được lưu trữ trong một biến có tên là guess.

if guess < secretNumber:
	print('Your guess is too low.')
elif guess > secretNumber:
	print('Your guess is too high.')

Một vài dòng mã kiểm tra để xem liệu đoán có nhỏ hơn hoặc lớn hơn số bí mật hay không. Trong cả hai trường hợp, một gợi ý được in ra màn hình.

else:
	break # This condition is the correct guess!

Nếu số đoán không cao hơn hoặc thấp hơn số bí mật, thì nó phải bằng số bí mật, trong trường hợp này, bạn muốn thực thi chương trình thoát ra khỏi vòng lặp for.

if guess == secretNumber:
	print('Good job! You guessed my number in ' + str(guessesTaken) + 'guesses!')
else:
    print('Nope. The number I was thinking of was ' + str(secretNumber))

Sau vòng lặp for, câu lệnh if … other kiểm tra xem người chơi đã đoán đúng số chưa và sau đó in một thông báo phù hợp lên màn hình. Trong cả hai trường hợp, chương trình sẽ hiển thị một biến chứa giá trị nguyên (guessesTaken và secretNumber). Vì nó phải nối các giá trị số nguyên này thành các chuỗi, nên nó chuyển các biến này cho hàm str (), trả về dạng giá trị chuỗi của các số nguyên này. Bây giờ các chuỗi này có thể được nối với các toán tử + trước khi cuối cùng được chuyển đến lệnh gọi hàm print ().
Một chương trình ngắn: Kéo, búa, giấy.
Cho phép sử dụng các khái niệm lập trình mà chúng tôi đã học được từ trước đến nay để tạo ra một trò chơi đơn giản kéo búa giấy. Đầu ra sẽ như thế này:

ROCK, PAPER, SCISSORS
0 Wins, 0 Losses, 0 Ties
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
p
PAPER versus...
PAPER
It is a tie!
0 Wins, 1 Losses, 1 Ties
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
s
SCISSORS versus...
PAPER
You win!
1 Wins, 1 Losses, 1 Ties
Enter your move: (r)ock (p)aper (s)cissors or (q)uit
q

Nhập đoạn code phía dưới và lưu dưới tên rpsGame.py

import random, sys
print('ROCK, PAPER, SCISSORS')
# These variables keep track of the number of wins, losses, and ties.
wins = 0
losses = 0
ties = 0
while True: # The main game loop.
	print('%s Wins, %s Losses, %s Ties' % (wins, losses, ties))
	while True: # The player input loop.
		print('Enter your move: (r)ock (p)aper (s)cissors or (q)uit')
		playerMove = input()
		if playerMove == 'q':
			sys.exit() # Quit the program.
		if playerMove == 'r' or playerMove == 'p' or playerMove == 's':
			break # Break out of the player input loop.
		print('Type one of r, p, s, or q.')
	# Display what the player chose:
	if playerMove == 'r':
		print('ROCK versus...')
	elif playerMove == 'p':
		print('PAPER versus...')
	elif playerMove == 's':
		print('SCISSORS versus...')
	# Display what the computer chose:
	randomNumber = random.randint(1, 3)
	if randomNumber == 1:
		computerMove = 'r'
		print('ROCK')
	elif randomNumber == 2:
		computerMove = 'p'
		print('PAPER')
	elif randomNumber == 3:
		computerMove = 's'
		print('SCISSORS')
	# Display and record the win/loss/tie:
	if playerMove == computerMove:
		print('It is a tie!')
		ties = ties + 1
	elif playerMove == 'r' and computerMove == 's':
		print('You win!')
		wins = wins + 1
	elif playerMove == 'p' and computerMove == 'r':
		print('You win!')
		wins = wins + 1
	elif playerMove == 's' and computerMove == 'p':
		print('You win!')
		wins = wins + 1
	elif playerMove == 'r' and computerMove == 'p':
		print('You lose!')
		losses = losses + 1
	elif playerMove == 'p' and computerMove == 's':
		print('You lose!')
		losses = losses + 1
	elif playerMove == 's' and computerMove == 'r':
		print('You lose!')
		losses = losses + 1

Bây giờ chúng ta sẽ bóc tách từng đoạn code nhỏ để hiểu rõ hơn.

import random, sys
print('ROCK, PAPER, SCISSORS')
# These variables keep track of the number of wins, losses, and ties.
wins = 0
losses = 0
ties = 0

Đầu tiên, chúng ta nhập mô-đun random và sys để chương trình của chúng ta có thể gọi các hàm random.randint() và sys.exit(). Chúng tôi cũng thiết lập ba biến để theo dõi xem có bao nhiêu chiến thắng, thua và hòa mà người chơi đã có.

while True: # The main game loop.
	print('%s Wins, %s Losses, %s Ties' % (wins, losses, ties))
	while True: # The player input loop.
		print('Enter your move: (r)ock (p)aper (s)cissors or (q)uit')
		playerMove = input()
		if playerMove == 'q':
			sys.exit() # Quit the program.
		if playerMove == 'r' or playerMove == 'p' or playerMove == 's':
			break # Break out of the player input loop.
		print('Type one of r, p, s, or q.')

Chương trình này sử dụng một vòng lặp while bên trong một vòng lặp while khác. Vòng lặp đầu tiên là vòng lặp trò chơi chính, và một trò chơi duy nhất là kéo, búa, giấy là người chơi trên mỗi lần lặp qua vòng lặp này. Vòng lặp thứ hai yêu cầu đầu vào từ người chơi và tiếp tục lặp cho đến khi người chơi đã nhập r, p, s hoặc q cho di chuyển của họ. Các r, p và s tương ứng với búa, giấy và kéo, trong khi q có nghĩa là người chơi có ý định bỏ. Trong trường hợp đó, sys.exit() được gọi và chương trình thoát. Nếu người chơi đã nhập r, p hoặc s, việc thực thi sẽ thoát ra khỏi vòng lặp. Mặt khác, chương trình nhắc nhở người chơi nhập r, p, s hoặc q và quay lại điểm bắt đầu của vòng lặp.

# Display what the player chose:
	if playerMove == 'r':
		print('ROCK versus...')
	elif playerMove == 'p':
		print('PAPER versus...')
	elif playerMove == 's':
		print('SCISSORS versus...')

Người chơi lựa chọn và hiển thị trên màn hình

# Display what the computer chose:
	randomNumber = random.randint(1, 3)
	if randomNumber == 1:
		computerMove = 'r'
		print('ROCK')
	elif randomNumber == 2:
		computerMove = 'p'
		print('PAPER')
	elif randomNumber == 3:
		computerMove = 's'
		print('SCISSORS')

Tiếp theo, di chuyển trên máy tính được chọn ngẫu nhiên. Vì random.randint () chỉ có thể trả về một số ngẫu nhiên, giá trị số nguyên 1, 2 hoặc 3 mà nó trả về được lưu trữ trong một biến có tên randomNumber. Chương trình lưu trữ một chuỗi ‘r’, ‘p’ hoặc ‘s’ trong computerMove dựa trên số nguyên trong randomNumber, cũng như hiển thị di chuyển máy tính.

# Display and record the win/loss/tie:
	if playerMove == computerMove:
		print('It is a tie!')
		ties = ties + 1
	elif playerMove == 'r' and computerMove == 's':
		print('You win!')
		wins = wins + 1
	elif playerMove == 'p' and computerMove == 'r':
		print('You win!')
		wins = wins + 1
	elif playerMove == 's' and computerMove == 'p':
		print('You win!')
		wins = wins + 1
	elif playerMove == 'r' and computerMove == 'p':
		print('You lose!')
		losses = losses + 1
	elif playerMove == 'p' and computerMove == 's':
		print('You lose!')
		losses = losses + 1
	elif playerMove == 's' and computerMove == 'r':
		print('You lose!')
		losses = losses + 1

Cuối cùng, chương trình so sánh các chuỗi trong playerMove và computerMove và hiển thị kết quả trên màn hình. Nó cũng làm tăng các chiến thắng, thua lỗ hoặc các biến quan hệ một cách thích hợp. Khi việc thực thi kết thúc, nó sẽ quay trở lại điểm bắt đầu của vòng lặp chương trình chính để bắt đầu một trò chơi khác.
Tổng kết
Bằng cách sử dụng các biểu thức đánh giá thành True hoặc False (còn gọi là điều kiện), bạn có thể viết các chương trình đưa ra quyết định về việc thực thi mã nào và mã nào cần bỏ qua. Bạn cũng có thể thực thi mã nhiều lần trong một vòng lặp trong khi một điều kiện nhất định ước tính là True. Các câu lệnh break and continue rất hữu ích nếu bạn cần thoát khỏi một vòng lặp hoặc nhảy trở lại vòng lặp khởi động.
Những tuyên bố kiểm soát luồng này sẽ cho phép bạn viết các chương trình thông minh hơn. Bạn cũng có thể sử dụng một loại điều khiển luồng khác bằng cách viết các hàm của riêng bạn, đó là chủ đề của chương tiếp theo.
Bài tập thực hành

  1. Hai dạng dữ liệu của Boolean là gì? Bạn viết chúng như thế nào?
  2. Ba toán tử của Boolean?
  3. Viết bảng sự thật của 3 toán tử Boolean.
  4. Những biểu thức sau thực hiện sẽ cho ra kết quả như thế nào
(5 > 4) and (3 == 5)
not (5 > 4)
(5 > 4) or (3 == 5)
not ((5 > 4) or (3 == 5))
(True and True) and (True == False)
(not False) or (not True)
  1. Sáu toán tử so sánh là như thế nào?
  2. Sự khác nhau giữa toán tử == và toán tử =
  3. Giải thích ý nghĩa của toán tử and khi bạn sử dụng nó
  4. Phân biệt 3 khối lệnh trong đoạn mã dưới đây
spam = 0
if spam == 10:
    print('eggs')
    if spam > 5:
        print('bacon')
    else:
        print('ham')
    print('spam')
print('spam')
  1. Viết mã in Hello nếu 1 được lưu trong spam, in Howdy nếu 2 là được lưu trữ trong spam và in Greetings! nếu bất cứ điều gì khác được lưu trữ trong spam.
  2. Bạn cần nhấn những phím nào để kết thúc vòng lặp vô tận.
  3. Sự khác nhau giữa break và continue là như thế nào?
  4. Sự khác nhau giữa range(10)range(0, 10) và range(0, 10, 1) trong vòng lặp for là như thế nào?
  5. Viết một chương trình in các số từ 1 đến 10 bằng vòng lặp for, và một chương trình như vậy bằng vòng lặp while.
  6. Nếu bạn có một hàm bacon() trong một module tên là spam. Có cách nào để bạn sử dụng hàm bacon() bằng cách import spam.
    Phần thêm: Tìm hiểu hàm round() và abs() trên internet. Và các ứng dụng của chúng, sau đấy thử sử dụng chúng trong command line

Chương 1 – Python cơ bản P6

 Python Basic  Chức năng bình luận bị tắt ở Chương 1 – Python cơ bản P6
Th4 192020
 

Chúng ta tiếp tục với những kiến thức cơ bản trong luồng điều khiển.
Những vòng làm for và hàm range()
Vòng lặp while tiếp tục lặp trong khi điều kiện của nó là True (đó là lý do cho tên của nó), nhưng nếu bạn muốn thực thi một khối mã chỉ một số lần nhất định thì sao? Bạn có thể làm điều này với một câu lệnh for và hàm Range ().
Trong mã, một câu lệnh for trông giống for i in range(5): và bao gồm các phần sau:

  • Từ khóa for
  • Một tên biến
  • Từ khóa in
  • Gọi hàm range() có thể có đến 3 đối số.
  • Một dấu hai chấm :
  • Hàng tiếp theo lùi vào 4 khoảng trống gọi là mệnh đề for.
    Bây giờ bạn tạo ra fiveTimes.py chứa đoạn code sau đây.
print('My name is')
for i in range(5):
    print('Jimmy Five Times (' + str(i) + ')')

Mã trong mệnh đề for được chạy năm lần. Lần đầu tiên được chạy, biến i được đặt thành 0. Cuộc gọi print () trong mệnh đề sẽ in Jimmy Five Times (0). Sau khi Python hoàn thành một lần lặp thông qua tất cả các mã bên trong mệnh đề for, việc thực thi quay trở lại đỉnh của vòng lặp và câu lệnh for tăng i lên một. Đây là lý do tại sao range(5) dẫn đến năm lần lặp qua mệnh đề, với i được đặt thành 0, rồi 1, rồi 2, rồi 3, và 4. Biến i sẽ đi lên, nhưng sẽ không bao gồm, số nguyên truyền vào range (). Hình dưới đây hiển thị sơ đồ cho chương trình fiveTimes.py.
b23799×614 19.3 KB
Khi bạn chạy chương trình này, nó sẽ in Jimmy Five Times theo sau là giá trị của i năm lần trước khi rời khỏi vòng lặp for.

My name is
Jimmy Five Times (0)
Jimmy Five Times (1)
Jimmy Five Times (2)
Jimmy Five Times (3)
Jimmy Five Times (4)

Hãy xem một ví dụ khác của vòng lặp for, hãy xem xét câu chuyện này về nhà toán học Carl Friedrich Gauss. Khi Gauss còn là một cậu bé, một giáo viên muốn cho cả lớp một số công việc bận rộn. Giáo viên bảo họ cộng tất cả các số từ 0 đến 100. Gauss đã đưa ra một mẹo thông minh để tìm ra câu trả lời trong vài giây, nhưng bạn có thể viết chương trình Python với vòng lặp for để thực hiện phép tính này cho bạn.

total = 0
for num in range(101):
    total = total + num
print(total)

Kết quả phải là 5.050. Khi chương trình lần đầu tiên bắt đầu, biến total được đặt thành 0. Vòng lặp for sau đó thực hiện total = total + num 100 lần. Vào thời điểm vòng lặp đã hoàn thành tất cả 100 lần lặp của nó, mọi số nguyên từ 0 đến 100 sẽ được thêm vào tổng số. Tại thời điểm này, tổng số được in ra màn hình. Ngay cả trên các máy tính chậm nhất, chương trình này chỉ mất chưa đến một giây để hoàn thành.
(Gauss đã tìm ra cách giải quyết vấn đề trong vài giây. Có 50 cặp số cộng với 101: 1 + 100, 2 + 99, 3 + 98, v.v., cho đến 50 + 51. Kể từ 50 × 101 là 5.050, tổng của tất cả các số từ 0 đến 100 là 5.050. Đứa trẻ thông minh!)
Sử dụng vòng lặp while cho chương trình trên
Chúng ta hoàn toàn có thể sử dụng vòng lặp while để viết lại chương trình fiveTimes.py như sau.

print('My name is')
i = 0
while i < 5:
    print('Jimmy Five Times (' + str(i) + ')')
    i = i + 1

Chương trình này sẽ chạy tương tự như khi được viết bằng for và range().
Điểm bắt đầu, điểm cuối, bước trong hàm range()
Một số hàm có thể được gọi với nhiều đối số được phân tách bằng dấu phẩy và phạm vi () là một trong số đó. Điều này cho phép bạn thay đổi số nguyên được truyền sang range() để theo bất kỳ chuỗi số nguyên nào, bao gồm bắt đầu từ một số khác không.

for i in range(12, 16):
    print(i)

Đối số đầu tiên sẽ là nơi bắt đầu của biến for và đối số thứ hai sẽ lên đến, nhưng không bao gồm.

12
13
14
15

Hàm range() cũng có thể được gọi với ba đối số. Hai đối số đầu tiên sẽ là giá trị bắt đầu và dừng và thứ ba sẽ là đối số bước. Bước là số lượng mà biến được tăng lên sau mỗi lần lặp.

for i in range(0, 10, 2):
    print(i)

Vì vậy, gọi range(0, 10, 2) sẽ được tính từ 0 đến 8 theo các khoảng của 2.

0
2
4
6
8

Hàm range() linh hoạt trong chuỗi số mà nó tạo ra cho các vòng lặp. Ví dụ: (tôi không bao giờ xin lỗi vì chơi chữ của mình), bạn thậm chí có thể sử dụng số âm cho đối số bước để làm cho vòng lặp for đếm ngược thay vì đếm xuôi.

for i in range(5, -1, -1):
    print(i)

Vòng lặp for sẽ hiển thị như sau

5
4
3
2
1
0

Vòng lặp for i in range(5, -1, -1) phải hiển thị từ 5 đến 0.
importing modules
Tất cả các chương trình Python có thể gọi một tập hợp các hàm cơ bản được gọi là các hàm dựng sẵn(built-in functions), bao gồm các hàm print(), input() và len() mà bạn đã thấy trước đó. Python cũng đi kèm với một tập hợp các mô-đun gọi là thư viện chuẩn. Mỗi mô-đun là một chương trình Python chứa một nhóm các hàm liên quan có thể được nhúng trong các chương trình của bạn. Ví dụ, mô-đun math có các hàm liên quan đến toán học, mô-đun random có các hàm liên quan đến số ngẫu nhiên, v.v.
Trước khi bạn có thể sử dụng các chức năng trong một mô-đun, bạn phải nhập mô-đun bằng một câu lệnh import. Trong mã, một câu lệnh import bao gồm:

  • Từ khóa import
  • Tên của module
  • Tùy chọn, có thể thêm nhiều tên module bằng cách cách nhau một dấu phẩy.
    Khi bạn nhập một mô-đun, bạn có thể sử dụng tất cả các chức năng tuyệt vời của mô-đun đó. Hãy để thử một lần với mô-đun random, nó sẽ cho phép chúng ta truy cập vào hàm random.randint ().
    Nhập mã này vào trình chỉnh sửa tệp và lưu nó dưới dạng printRandom.py:
import random
for i in range(5):
    print(random.randint(1, 10))

Khi bạn chạy chương trình trên nó sẽ in ra tương tự(không chính xác) như thế này

4
1
8
4
1

Lệnh gọi hàm random.randint () ước tính giá trị nguyên ngẫu nhiên giữa hai số nguyên mà bạn truyền vào. Vì randint () nằm trong mô-đun random, trước tiên bạn phải nhập random. ở phía trước tên hàm để báo cho Python tìm hàm này bên trong mô-đun random.
Dưới đây, một ví dụ về một import nhập bốn khác nhau mô-đun:
`

import random, sys, os, math

Bây giờ chúng ta có thể sử dụng bất kỳ chức năng nào trong bốn mô-đun này. Chúng ta sẽ tìm hiểu thêm về chúng sau này trong cuốn sách.
Đừng đặt tên file .py trùng với tên module
Khi bạn lưu tập lệnh Python của mình dưới dạng .py file, chú ý không đặt cho chúng một tên được sử dụng bởi một trong các mô-đun Python, chẳng hạn như random.py, sys.py, os.py hoặc math.py.
Nếu bạn vô tình đặt tên cho một trong các chương trình của mình, giả sử là random.py và sử dụng câu lệnh import random, trong một chương trình khác, chương trình của bạn sẽ nhập tệp random của bạn thay vì mô-đun random của Python. Điều này có thể dẫn đến các lỗi như AttributionError: mô-đun ‘random’ không có thuộc tính ‘randint’, vì random.py của bạn không có các chức năng mà mô-đun random thực sự có.
Đừng sử dụng tên của bất kỳ hàm Python dựng sẵn nào, chẳng hạn như print() hoặc input().
Những vấn đề như thế này là không phổ biến, nhưng có thể khó giải quyết. Khi bạn có được nhiều kinh nghiệm lập trình hơn, bạn sẽ nhận thức rõ hơn về các tên tiêu chuẩn được sử dụng bởi các mô-đun và các hàm trong Python và sẽ ít gặp phải các vấn đề này.
Các lệnh from import
Một hình thức thay thế của câu lệnh import bao gồm từ khóa, theo sau là tên mô-đun, từ khóa import và dấu sao (*); ví dụ: from random import *
Với dạng câu lệnh nhập này, các lệnh gọi đến các hàm random sẽ không cần random tiếp đầu ngữ. Tuy nhiên, việc sử dụng tên đầy đủ làm cho mã dễ đọc hơn, vì vậy tốt hơn là sử dụng hình thức import random của câu lệnh.
Kết thúc sớm chương trình với hàm sys.exit()
Khái niệm điều khiển luồng cuối cùng để trình bày là làm thế nào để chấm dứt chương trình sớm.
Các chương trình luôn chấm dứt nếu việc thực hiện chương trình đạt đến cuối hướng dẫn. Tuy nhiên, bạn có thể khiến chương trình chấm dứt hoặc thoát ra trước lệnh cuối cùng bằng cách gọi hàm sys.exit (). Vì chức năng này nằm trong mô-đun sys, bạn phải import sys trước khi chương trình của bạn có thể sử dụng nó.

import sys
while True:
    print('Type exit to exit.')
    response = input()
    if response == 'exit':
        sys.exit()
    print('You typed ' + response + '.')

Chương trình này có một vòng lặp vô hạn không có câu lệnh break bên trong. Cách duy nhất mà chương trình này sẽ kết thúc là nếu việc thực thi đạt đến lệnh gọi sys.exit (). Khi phản hồi bằng với thoát, dòng chứa lệnh gọi sys.exit() được thực thi. Vì biến trả lời được đặt bởi hàm input (), người dùng phải nhập exit để dừng chương trình.

Chương 1 – Python cơ bản P5

 Python Basic  Chức năng bình luận bị tắt ở Chương 1 – Python cơ bản P5
Th4 132020
 

Lệnh while
Bạn có thể thiết lập một vòng lặp liên tục với lệnh while, mệnh đề kiểm tra trong lệnh while được thực hiện khi điều kiện của mệnh đề là True, trong khối code thực hiện while luôn bao gồm

  • Từ khóa while
  • Một điều kiện là một biểu thức có giá trị rút gọn là True hoặc False.
  • Một dấu hai chấm :
  • Dòng tiếp theo sẽ lùi vào 4 khoảng trống gọi là mệnh đề của while.

Bạn có thể thấy rằng một câu lệnh while trông tương tự như một câu lệnh if. Sự khác biệt là cách chúng xử lý. Khi kết thúc mệnh đề if, việc thực hiện chương trình tiếp tục sau câu lệnh if kết thúc. Nhưng ở cuối mệnh đề while, việc thực thi chương trình nhảy trở lại bắt đầu câu lệnh while. Mệnh đề while thường được gọi là vòng lặp while hoặc chỉ vòng lặp.
Chúng ta hãy xem một câu lệnh if và một vòng lặp while sử dụng cùng một điều kiện và thực hiện các hành động tương tự dựa trên điều kiện đó. Đây là đoạn mã với câu lệnh if:

spam = 0
if spam < 5:
    print('Hello, world.')
    spam = spam + 1

Đoạn mã với câu lệnh while

spam = 0
while spam < 5:
    print('Hello, world.')
    spam = spam + 1

Các báo cáo này tương tự với nhau cả if và while khi kiểm tra giá trị của spam và nếu nó nhỏ hơn 5, chúng sẽ in một tin nhắn. Nhưng khi bạn chạy hai đoạn mã này, một cái gì đó rất khác nhau sẽ xảy ra cho mỗi đoạn mã. Đối với câu lệnh if, đầu ra chỉ đơn giản là “Xin chào, thế giới.”. Nhưng while khi tuyên bố, nó HỎI “Hello, world.” lặp lại năm lần! Hãy xem sơ đồ quy trình cho hai đoạn mã này, hai biểu đồ dưới đây, để xem tại sao điều này xảy ra.


Mã với câu lệnh if kiểm tra điều kiện và nó in Hello, world. chỉ một lần nếu điều kiện đó là đúng Mã với vòng lặp while, mặt khác, sẽ in nó năm lần. Vòng lặp dừng sau năm lần in vì số nguyên trong spam tăng thêm một lần vào cuối mỗi lần lặp của vòng lặp, điều đó có nghĩa là vòng lặp sẽ thực thi năm lần trước khi spam <5 là False.
Trong vòng lặp while, điều kiện luôn được kiểm tra ở đầu mỗi phép lặp (nghĩa là mỗi lần vòng lặp được thực thi). Nếu điều kiện là True, thì mệnh đề được thực thi và sau đó, điều kiện được kiểm tra lại.
Lần đầu tiên điều kiện được tìm thấy là False, mệnh đề while bị bỏ qua.
Một vòng lặp while kỳ lạ
Đây là một ví dụ nhỏ về vòng lặp while, bạn hãy mở editor và lưu dưới dạng yourName.py.

name = ''
while name != 'your name':
    print('Please type your name.')
    name = input()
print('Thank you!')

Bạn sẽ thấy chương trình thực hiện theo biểu đồ ở phía dưới.

Bây giờ bạn hãy thực hiện chương trình yourName.py đưa vào vài giá trị khác nhau của biến name chúng ta sẽ thấy cách chương trình chạy.

Please type your name.
Al
Please type your name.
Albert
Please type your name.
%#@#%*(^&!!!
Please type your name.
your name
Thank you!

Nếu bạn không bao giờ nhập vào your name chương trình sẽ không bao giờ dừng lại. Chương trình với hàm input() sẽ liên tục đợi bạn nhập vào và kiểm tra cho đến khi bạn nhập your name.
Lệnh break
Có một lối tắt để sớm thực hiện chương trình thoát khỏi mệnh đề vòng lặp while. Nếu việc thực thi đạt đến một câu lệnh break, nó sẽ ngay lập tức thoát khỏi mệnh đề vòng lặp while. Trong mã, một câu lệnh break chỉ đơn giản chứa từ khóa break.
Khá đơn giản phải không? Ở đây, một chương trình thực hiện tương tự như chương trình trước, nhưng nó sử dụng câu lệnh break để thoát khỏi vòng lặp. Nhập mã sau đây và lưu tệp dưới dạng yourName2.py:

while True:
    print('Please type your name.')
    name = input()
    if name == 'your name':
        break
print('Thank you!')

Khi bạn chạy chương trình yourName2.py và nhập vào tương tự như chương trình yourName.py bạn sẽ nhận được kết quả tương tự, chương trình yourName2.py sẽ chạy theo biểu đồ sau.

Giống như các câu lệnh break, các câu lệnh continue được sử dụng bên trong các vòng lặp. Khi thực hiện chương trình đạt đến một câu lệnh continue, việc thực hiện chương trình ngay lập tức nhảy trở lại điểm bắt đầu của vòng lặp và đánh giá lại điều kiện vòng lặp. (Đây cũng là điều xảy ra khi việc thực thi đến cuối vòng lặp.)
Hãy sử dụng continue viết một chương trình yêu cầu tên và mật khẩu.
Nhập mã sau vào cửa sổ soạn thảo tệp mới và lưu chương trình dưới dạng Swordfish.py.

while True:
    print('Who are you?')
    name = input()
    if name != 'Joe':
         continue
    print('Hello, Joe. What is the password? (It is a fish.)')
    password = input()
    if password == 'swordfish':
        break
print('Access granted.')

Chương trình trên sẽ được mô tả qua biểu đồ sau.

Chạy chương trình Swordfish.py và nhập các giá trị như phía bên dưới.

Who are you?
I'm fine, thanks. Who are you?
Who are you?
Joe
Hello, Joe. What is the password? (It is a fish.)
Mary
Who are you?
Joe
Hello, Joe. What is the password? (It is a fish.)
swordfish
Access granted.

Chương 1 – Python cơ bản P4

 Python Basic  Chức năng bình luận bị tắt ở Chương 1 – Python cơ bản P4
Th4 122020
 

Các thành phần cơ bản của luồng điều khiển
Các câu lệnh điều khiển luồng thường bắt đầu bằng một phần gọi là điều kiện và luôn được theo sau bởi một khối mã được gọi là mệnh đề. Trước khi bạn tìm hiểu về các câu lệnh điều khiển luồng cụ thể của Python, tôi sẽ trình bày về điều kiện và khối là gì.
Điều kiện
Các biểu thức Boolean mà bạn đã thấy cho đến nay đều có thể được coi là điều kiện, giống như các biểu thức; điều kiện chỉ là một tên cụ thể hơn trong bối cảnh của các câu lệnh kiểm soát luồng. Các điều kiện luôn đánh giá xuống giá trị Boolean, True hoặc False. Một câu lệnh điều khiển luồng quyết định những việc cần làm dựa trên việc điều kiện của nó là True hay False và hầu như mọi câu lệnh điều khiển luồng đều sử dụng một điều kiện.
Khối mã lệnh
Các dòng mã Python có thể được nhóm lại với nhau theo khối. Bạn có thể biết khi nào một khối bắt đầu và kết thúc từ sự thụt dòng của các dòng mã. Có ba quy tắc cho các khối.

  • Khối bắt đầu khi thụt đầu dòng tăng.
  • Khối có thể chứa các khối khác.
  • Khối kết thúc khi thụt đầu dòng giảm xuống 0 hoặc đến thụt đầu dòng khối chứa.
    Các khối dễ hiểu hơn bằng cách xem một số mã thụt lề, vì vậy hãy tìm các khối trong một phần của chương trình trò chơi nhỏ, được hiển thị ở đây:
name = 'Mary'
password = 'swordfish'
if name == 'Mary':
    print('Hello, Mary')
if password == 'swordfish':
    print('Access granted.')
else:
    print('Wrong password.')

Chương trình thực thi
Trong chương trước, chương trình hello.py, Python bắt đầu thực hiện các hướng dẫn ở đầu chương trình đi xuống, từng cái một. Việc thực hiện chương trình (hoặc đơn giản là thực thi) là một thuật ngữ cho lệnh hiện tại đang được thực thi.
Nếu bạn in mã nguồn trên giấy và đặt ngón tay lên từng dòng khi nó được thực thi, bạn có thể nghĩ ngón tay của mình là chương trình thực thi.
Tuy nhiên, không phải tất cả các chương trình thực hiện bằng cách đi thẳng xuống. Nếu bạn sử dụng ngón tay của mình để theo dõi một chương trình với các câu lệnh kiểm soát luồng, bạn có thể thấy mình nhảy xung quanh mã nguồn dựa trên các điều kiện và bạn có thể bỏ qua toàn bộ mệnh đề.
Các câu lệnh điều khiển luồng
Bây giờ, hãy cùng khám phá phần điều khiển luồng quan trọng nhất: chính là các câu lệnh. Các báo cáo đại diện cho những viên kim cương bạn đã thấy trong sơ đồ trong phần trước và chúng là những quyết định thực tế mà các chương trình của bạn sẽ đưa ra.
Lệnh if
Loại phổ biến nhất của câu lệnh điều khiển luồng là câu lệnh if. Mệnh đề if (nghĩa là khối theo sau câu lệnh if) sẽ thực thi nếu điều kiện câu lệnh là True. Mệnh đề được bỏ qua nếu điều kiện là False.
Nói một cách dễ hiểu, một câu lệnh if có thể được đọc là, nếu Nếu điều kiện này là đúng, hãy thực thi mã trong mệnh đề. Trong Python, một câu lệnh if bao gồm:

  • Từ khóa if
  • Một điều kiện (Đây là biểu thức để tính toán True hay False).
  • Một dấu hai chấm :
  • Dòng tiếp theo sẽ thụt vào 4 dòng(được gọi là mệnh đề điều kiện của lệnh if).

Đoạn code dưới đây sẽ kiểm tra nếu tên ai là Alice, biến name được gán giá trị nào trước đó.

if name == 'Alice':
    print('Hi, Alice.')

Tất cả luồng điều khiển điều kiện sẽ được kết thúc và theo sau là khối mã lệnh. Chúng ta sẽ mô tả khối lệnh trên bằng biểu đồ hình dưới.

Lệnh else
Một mệnh đề if có thể tùy ý được theo sau bởi một câu lệnh khác. Mệnh đề else chỉ được thực thi khi điều kiện if câu lệnh if là False. Nói một cách dễ hiểu, một câu lệnh else có thể được đọc là, nếu điều kiện này là đúng, hãy thực thi mã này. Hoặc nếu không, thực thi mã kia. Một câu lệnh else không có điều kiện và trong mã, một câu lệnh else luôn bao gồm các điều sau đây:

  • Câu lệnh else.
  • Một dấu hai chấm :
  • Khối lệnh sau thụt và bốn khoảng trống được gọi là biểu thức của mệnh đề else.
    Quay trở lại với ví dụ Alice ở trên chúng ta sẽ thêm câu lệnh else nếu người nào đấy không phải tên là Alice.
if name == 'Alice':
    print('Hi, Alice.')
else:
    print('Hello, stranger.')

Hình dưới đây sẽ mô tả biểu đồ khối lệnh trên được thực hiện.

Mặc dù chỉ có một trong các mệnh đề if hoặc else sẽ thực thi, bạn có thể gặp trường hợp bạn muốn một trong nhiều mệnh đề có thể thực thi. Câu lệnh elif là một câu lệnh khác nếu một câu lệnh elif luôn tuân theo câu lệnh if hoặc câu lệnh elif khác. Nó cung cấp một điều kiện khác chỉ được kiểm tra nếu tất cả các điều kiện trước đó là Sai. Trong mã, một câu lệnh elif luôn bao gồm:

  • Từ khóa elif.
  • Một điều kiện là biểu thức có thể tính toán là True hay False.
  • Một dấu hai chấm :
  • Dòng tiếp theo sẽ được lùi vào 4 khoảng trống gọi là mệnh đề elif.
    Để thêm câu lệnh elif vào phần kiểm tra tên Alice ở trên ta làm như sau.
if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')

Lần này bạn có thể kiểm tra thêm tuổi, bạn có thể nhìn thấy biểu đồ mô tả ở phía dưới.


Mệnh đề elif thực thi nếu age <12 là True và name == ‘Alice’ là False. Tuy nhiên, nếu cả hai điều kiện đều False, thì cả hai mệnh đề đều bị bỏ qua. Không đảm bảo rằng ít nhất một trong các mệnh đề sẽ được thực thi.
Khi có một chuỗi các câu lệnh elif, chỉ một hoặc không một trong các mệnh đề sẽ được thực thi. Khi một trong các câu điều kiện được tìm thấy là True, phần còn lại của các mệnh đề elif sẽ tự động bị bỏ qua. Ví dụ: mở một cửa sổ soạn thảo tệp mới và nhập mã sau đây, lưu nó dưới dạng vampire.py:

name = 'Carol'
age = 3000
if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')
elif age > 2000:
    print('Unlike you, Alice is not an undead, immortal vampire.')
elif age > 100:
    print('You are not Alice, grannie.')

Ở đây chương trình đã được thêm nhiều điều kiện elif, chúng ta sẽ tìm hiểu kĩ hơn ở biểu đồ dưới đây.

Tùy chọn, bạn có thể có một câu lệnh else sau câu lệnh elif cuối cùng.
Trong trường hợp đó, đảm bảo rằng ít nhất một (và chỉ một) mệnh đề sẽ được thực thi. Nếu các điều kiện trong mọi câu lệnh if và elif là False, thì mệnh đề else được thực thi. Ví dụ: hãy để lại chương trình Alice để sử dụng các mệnh đề if, elif và mệnh đề else.

name = 'Carol'
age = 3000
if name == 'Alice':
    print('Hi, Alice.')
elif age < 12:
    print('You are not Alice, kiddo.')
else:
    print('You are neither Alice nor a little kid.')

Biểu đồ phía dưới sẽ mô tả cách thực hiện của đoạn mã trên.

Chúc các bạn thành công!

Chương 1 – Python cơ bản P3

 Python Basic  Chức năng bình luận bị tắt ở Chương 1 – Python cơ bản P3
Th4 112020
 

Ở hai phần trước chúng ta đã biết đến những khái niệm cơ bản nhất của số nguyên (int), số thập phân(float), chuỗi(str) các hàm ép kiểu dữ liệu int(), float(), str().
Ở phần này chúng ta cùng tìm hiểu luồng điều khiển(flow control) của chương trình. Nhưng trước khi tìm hiểu luồng điều khiển chúng ta sẽ tìm hiểu về đại số Boolean.
Sức mạnh thực sự trong lập trình không chỉ là chạy một chuỗi câu lệnh hay thực hiện danh sách việc vặt cuối tuần. Dựa trên cách đánh giá biểu thức, một chương trình có thể quyết định bỏ qua các lệnh, lặp lại chúng hoặc chọn một trong một số lệnh để chạy. Trong thực tế, bạn gần như không bao giờ muốn các chương trình của mình bắt đầu từ dòng mã đầu tiên và chỉ cần thực thi mọi dòng, thẳng đến cuối. Các câu lệnh điều khiển luồng có thể quyết định các lệnh Python nào được thực thi trong các điều kiện nào.
Các báo cáo kiểm soát luồng tương ứng trực tiếp với các biểu tượng trong một sơ đồ, vì vậy tôi sẽ cung cấp các phiên bản sơ đồ của mã được thảo luận trong chương này. Hình dưới đây cho thấy một sơ đồ cho những việc cần làm nếu trời mưa. Theo con đường được tạo bởi các mũi tên từ Start đến End.

Trong một sơ đồ, thường có nhiều hơn một cách để đi từ đầu đến cuối cùng. Điều này cũng đúng với các dòng mã trong một chương trình máy tính.
Lưu đồ biểu diễn các điểm phân nhánh này bằng kim cương, trong khi các bước khác được biểu thị bằng hình chữ nhật. Các bước bắt đầu và kết thúc được thể hiện bằng các hình chữ nhật có viền tròn.
Nhưng trước khi bạn tìm hiểu về các câu lệnh kiểm soát luồng, trước tiên bạn cần phải tìm hiểu cách biểu diễn các tùy chọn có và không, và bạn cần hiểu cách viết các điểm phân nhánh đó dưới dạng mã Python. Cuối cùng, hãy cùng khám phá các giá trị Boolean, toán tử so sánh và toán tử Boolean.
Giá trị Boolean
Trong khi các kiểu dữ liệu số nguyên, số thập phân và chuỗi có số lượng giá trị có thể không giới hạn, kiểu dữ liệu Boolean chỉ có hai giá trị: True và False. (Boolean được viết hoa vì kiểu dữ liệu được đặt theo tên nhà toán học George Boole.) Khi được nhập dưới dạng mã Python, các giá trị Boolean True và False thiếu các trích dẫn bạn đặt xung quanh các chuỗi và chúng luôn bắt đầu bằng chữ T hoặc F, với phần còn lại của từ viết thường.
Nhập nội dung sau vào command line. (Một số trong những hướng dẫn này là cố ý không chính xác và chúng sẽ khiến thông báo lỗi xuất hiện.)

>>> spam = True
>>> spam
True
>>> true
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
true
NameError: name 'true' is not defined
>>> True = 2 + 2
SyntaxError: can't assign to keyword

Toán tử so sánh trong Boolean
Toán tử so sánh cũng chính là toán tử quan hệ được sử dụng để tạo ra một biểu thức duy nhất trong Boolean. Hình dưới mô tả các toán tử.
b8
Những toán tử tính toán để đưa về True hay False tùy thuộc vào giá trị mà bạn đưa vào cho chúng. Sau đây chúng ta sẽ thử với hai toán tử == và !=.

>>> 42 == 42
True
>>> 42 == 99
False
>>> 2 != 3
True
>>> 2 != 2
False

Như bạn có thể mong đợi, == (bằng) đánh giá là True khi các giá trị ở cả hai phía đều giống nhau và
! = (không bằng) đánh giá là True khi hai giá trị khác nhau. Các toán tử == và ! = Thực sự có thể hoạt động với các giá trị của bất kỳ loại dữ liệu nào.

>>> 'hello' == 'hello'
True
>>> 'hello' == 'Hello'
False
>>> 'dog' != 'cat'
True
>>> True == True
True
>>> True != False
True
>>> 42 == 42.0
True
 >>> 42 == '42'
False

Lưu ý rằng giá trị số nguyên hoặc số thập phân sẽ luôn không bằng giá trị chuỗi. Biểu thức 42 == ‘42’ ước tính thành False vì Python coi số nguyên 42 khác với chuỗi ‘42’.
Mặt khác, các toán tử <,>, <= và> = chỉ hoạt động đúng với các giá trị nguyên và số thập phân.

>>> 42 < 100
True
>>> 42 > 100
False
>>> 42 < 42
False
>>> eggCount = 42
>>> eggCount <= 42
True
>>> myAge = 29
>>> myAge >= 10
True

Bạn sẽ thường sử dụng các toán tử so sánh để so sánh một giá trị của biến với một số giá trị khác, như trong ví dụ eggCount <= 42 và myAge> = 10.
Bạn sẽ thấy nhiều ví dụ về điều này sau khi bạn tìm hiểu về các câu lệnh kiểm soát luồng.
Sự khác biệt giữa hai toán tử == và =.
Bạn có thể nhận thấy rằng toán tử == (bằng) có hai dấu bằng nhau, trong khi toán tử = (gán) chỉ có một dấu bằng. Nó rất dễ nhầm lẫn giữa hai toán tử này với nhau. Chỉ cần nhớ những điểm sau:

  • Toán tử == (bằng) hỏi xem hai giá trị có giống lẫn nhau hay không.
  • Toán tử = (gán) đặt giá trị ở bên phải vào biến bên trái.

Để giúp nhớ đó là toán tử nào, hãy lưu ý rằng toán tử == (bằng) bao gồm hai ký tự, giống như toán tử! = (không bằng) bao gồm hai kí tự.
Toán tử Boolean
Ba toán tử Boolean (and , ornot) được sử dụng để so sánh các giá trị Boolean. Giống như các toán tử so sánh, chúng đánh giá các biểu thức này xuống một giá trị Boolean. Hãy cùng khám phá các toán tử này một cách chi tiết, bắt đầu với toán tử and.
Toán tử nhị phân Boolean
Các toán tử and và or luôn lấy hai giá trị Boolean (hoặc biểu thức), do đó, chúng được coi là toán tử nhị phân. Toán tử and đánh giá một biểu thức thành True nếu cả hai giá trị Boolean là True; mặt khác, nó đánh giá là False. Nhập một số biểu thức bằng cách sử dụng và vào command line để xem nó hoạt động.

>>> True and True
True
>>> True and False
False

Bản sự thật sẽ mô tả chi tiết về toán tử Boolean. Bảng sự thật dưới đây mô tả toán tử and.
b9
Ở một mặt khác toán tử or sẽ trả về kết quả True nếu 1 trong hai vế là True và trả về False nếu cả hai toán hạng là False.

>>> False or True
True
>>> False or False
False

Bạn có thể nhìn thấy bảng sự thật của toán tử or ở hình dưới.
b10
Toán tử not
Không như toán tử and và or, toán tử not chỉ có một giá trị. Toán tử not tạo thành một toán tử Boolean đơn.

>>> not True
False
>>> not not not not True
True

Bạn có thể tổ hợp nhiều toán tử not với nhau nhưng chúng ta thường không làm vậy trong khi source code. Dưới đấy là bảng sự thật của not.
b11
Tổ hợp giữa toán tử Boolean và toán tử so sánh
Vì các toán tử so sánh được tính bằng các giá trị Boolean, bạn có thể sử dụng chúng trong các biểu thức với các toán tử Boolean.
Hãy nhớ lại rằng các toán tử andornot gọi là toán tử Boolean vì chúng luôn hoạt động trên các giá trị Boolean True và False. Trong khi các biểu thức như 4 <5 không phải là giá trị Boolean, chúng là các biểu thức đánh giá xuống giá trị Boolean. Hãy thử nhập một số biểu thức Boolean sử dụng toán tử so sánh command line.

>>> (4 < 5) and (5 < 6)
True
>>> (4 < 5) and (9 < 6)
False
>>> (1 == 2) or (2 == 2)
True

Máy tính sẽ đánh giá biểu thức bên trái trước, và sau đó nó sẽ đánh giá biểu thức đúng. Khi nó biết giá trị Boolean cho từng giá trị, nó sẽ đánh giá toàn bộ biểu thức xuống một giá trị Boolean.
Bạn có thể nghĩ về quy trình đánh giá trên máy tính cho (4 <5) và (5 <6) như sau:
b12
Bạn cũng có thể sử dụng tổ hợp toán tử Boolean trong một biểu thức, kết hợp với những toán tử so sánh.

>>> 2 + 2 == 4 and not 2 + 2 == 5 and 2 * 2 == 2 + 2
True

Các toán tử Boolean có một thứ tự độ ưu tiên giống như toán tử toán học làm. Sau khi bất kỳ toán tử toán học và so sánh nào đánh giá, Python đánh giá các toán tử not phải trước, sau đó là toán tử and toán tử  sau đó là toán tử or.

Chương 1 – Python cơ bản P2

 Python Basic  Chức năng bình luận bị tắt ở Chương 1 – Python cơ bản P2
Th4 112020
 

Chương trình python đầu tiên
Những đoạn code ngắn trước đây bạn có thể type trực tiếp bằng command line những lệnh của python.
Đến chương trình đầu tiên này bạn nên dùng một text editor nào đấy hoặc 1 IDE chúng tôi giới thiệu với các bạn VSCode.
Khác với command line chạy trực tiếp những dòng lệnh riêng rẽ, khi bạn viết code vào edior đấy là tập hợp những lệnh được thực thi khi bạn nhấn Run. Cách hiển thị khác nhau khi viết bằng command line và viết bằng editor.

  • Trong command line có dấu nhắc >>> khi đánh lệnh.
  • Trong editor khi biên soạn không có dấu nhắc lệnh >>>.

Nào bây giờ hãy tạo một file .py của bạn lấy tên là firstProgram.py và lưu vào đâu đó trong thư mục của bạn.

# This program says hello and asks for my name.
print('Hello, world!')
print('What is your name?') # ask for their name
myName = input()
print('It is good to meet you, ' + myName)
print('The length of your name is:')
print(len(myName))
print('What is your age?') # ask for their age
myAge = input()
print('You will be ' + str(int(myAge) + 1) + ' in a year.')

Sau khi Save file và nhấn dấu màu xanh hoặc F5 chương trình của bạn sẽ hiện ra như sau
Copyright © Microsoft Corporation. All rights reserved.

Try the new cross-platform PowerShell https://aka.ms/pscore6

PS D:\WORKS\PROJECTS\ATBS> & C:/Users/User/AppData/Local/Programs/Python/Python38/python.exe d:/WORKS/EDU/SOURCECODE/Python/firstProgram.py
Hello, world!
What is your name?
AI
It is good to meet you, AI
The length of your name is:
2
What is your age?
16
You will be 17 in a year.

Khi không có thêm lệnh nào được thực hiện, chương trình của bạn sẽ kết thúc.
Phân tích chương trình đầu tiên
Comments
Dòng dưới đây được gọi là comment của chương trình.
# This program says hello and asks for my name.
Python bỏ qua comments và bạn có thể sử dụng chúng để viết ghi chú hoặc nhắc nhở bản thân những gì mã đang cố gắng làm. Bất kỳ văn bản nào cho phần còn lại của dòng sau dấu thăng (#) là một phần của nhận xét.
Đôi khi, các lập trình viên sẽ đặt # trước một dòng mã để tạm thời xóa nó trong khi kiểm tra chương trình. Điều này được gọi là nhận xét mã, và nó có thể hữu ích khi tôi cố gắng tìm hiểu tại sao một chương trình không hoạt động. Bạn có thể xóa # sau khi bạn sẵn sàng đặt lại dòng.
Hàm print()
Hàm print () hiển thị giá trị chuỗi bên trong dấu ngoặc đơn trên màn hình.

print('Hello, world!')
print('What is your name?') # ask for their name

Dòng print (‘Hello, World!’) Có nghĩa là In ra văn bản trong chuỗi ‘Hello, World!’.” Khi Python thực thi dòng này, bạn nói với trình thông dịch Python gọi hàm print () và giá trị chuỗi đang được truyền cho hàm.
Một giá trị được truyền cho một lệnh gọi hàm là một đối số. Lưu ý rằng các dấu trích dẫn (’) không được in ra màn hình. Chúng chỉ đánh dấu nơi chuỗi bắt đầu và kết thúc; chúng không phải là một phần của giá trị chuỗi.
Chú ý: Bạn cũng có thể sử dụng chức năng này để đặt một dòng trống trên màn hình; chỉ cần gọi print () không có gì ở giữa các dấu ngoặc đơn.
Khi bạn viết tên hàm, dấu ngoặc mở và đóng ở cuối xác định nó là tên của hàm. Đây là lý do tại sao trong cuốn sách này, bạn sẽ thấy print () chứ không phải print.
Hàm input()
Hàm input () chờ người dùng nhập một số văn bản trên bàn phím và nhấn Enter.
myName = input()
Cuộc gọi hàm này ước tính thành một chuỗi bằng văn bản của người dùng và dòng mã gán biến myName cho giá trị chuỗi này.
Bạn có thể nghĩ lệnh gọi hàm input () là một biểu thức ước lượng cho bất kỳ chuỗi nào mà người dùng đã nhập. Nếu người dùng nhập ‘Al’, thì biểu thức sẽ ước tính thành myName = ‘Al’.
Nếu bạn gọi input () và thấy thông báo lỗi, như NameError: name ‘Al’ is not defined, vấn đề là bạn có thể chạy mã bằng Python 2 thay vì Python 3.(Trong cuốn sách này chúng tôi sử dụng Python 3)
In ra user’s name
Dòng code dưới đây in ra user’s name bao gồm trong biểu thức It is good to meet you, ’ + myName giữa hai dấu ngoặc đơn.
print('It is good to meet you, ' + myName)
Nên nhớ rằng biểu thức luôn tiến về về một giá trị duy nhất vì vậy khi myName có giá trị là ‘AI’ thì biểu thức cuối cùng là It is good to meet you, Al.
Hàm len()
Bạn có thể truyền hàm len() một giá trị chuỗi (hoặc biến chứa chuỗi) và hàm sẽ tính giá trị số nguyên của số lượng ký tự trong chuỗi đó.

print('The length of your name is:')
print(len(myName))

Enter những dòng lệnh sau vào command line của bạn để hiểu rõ hơn về hàm len().

>>> len('hello')
5
>>> len('My very energetic monster just scarfed nachos.')
46
>>> len('')
0

Cũng giống như những ví dụ đó, len(myName) ước tính thành một số nguyên. Sau đó, nó được chuyển đến print() để hiển thị trên màn hình. Hàm print () cho phép bạn truyền vào nó các giá trị nguyên hoặc giá trị chuỗi, nhưng chú ý lỗi xuất hiện khi bạn nhập nội dung sau vào command line:

>>> print('I am ' + 29 + ' years old.')
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
print('I am ' + 29 + ' years old.')
TypeError: can only concatenate str (not "int") to str

Hàm print() không phải là nguyên nhân gây ra lỗi đó, nhưng thay vào đó, nó là biểu thức mà bạn đã cố gắng chuyển sang print (). Bạn nhận được thông báo lỗi tương tự nếu bạn tự nhập biểu thức vào command line trực tiếp không có hàm print().

>>> 'I am ' + 29 + ' years old.'
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
'I am ' + 29 + ' years old.'
TypeError: can only concatenate str (not "int") to str

Python báo lỗi vì toán tử + chỉ có thể được sử dụng để thêm hai số nguyên với nhau hoặc nối hai chuỗi. Bạn không thể thêm một số nguyên vào một chuỗi, bởi vì điều này là không theo quy tắc trong Python. Thay vào đó, bạn có thể khắc phục điều này bằng cách sử dụng phiên bản chuỗi của số nguyên, như được giải thích trong phần tiếp theo.
Các hàm ép kiểu str(), int() và float()
Nếu bạn muốn nối một số nguyên như 29 với một chuỗi cần truyền vào hàm print(), bạn sẽ cần lấy giá trị ‘29’, đó là dạng chuỗi của 29. Hàm str () có thể được truyền qua một số nguyên giá trị và sẽ ước tính thành phiên bản giá trị chuỗi của số nguyên, như sau:

>>> str(29)
'29'
>>> print('I am ' + str(29) + ' years old.')
I am 29 years old.

Vì str (29) được tính là ‘29’, biểu thức ‘I am ’ + str (29) + ’ years old.’ ước tính ‘I am ’ + ‘29’ + ’ years old.’, lần lượt ước tính ‘I am 29 years old.’. Đây là giá trị được truyền cho hàm print().
Các hàm str(), int() và float() sẽ đánh giá chuỗi, số nguyên và dạng thập phân của giá trị bạn chuyển tương ứng. Hãy thử chuyển đổi một số giá trị trong commmand line với các chức năng này và xem điều gì xảy ra.

>>> str(0)
'0'
>>> str(-3.14)
'-3.14'
>>> int('42')
42
>>> int('-99')
-99
>>> int(1.25)
1
>>> int(1.99)
1
>>> float('3.14')
3.14
>>> float(10)
10.0

Các ví dụ trên gọi các hàm str(), int() và float() và truyền cho chúng các giá trị của các loại dữ liệu khác để có được dạng chuỗi, số nguyên hoặc số thập phân của các giá trị đó.
Hàm str() tiện dụng khi bạn có một số nguyên hoặc số thập phân mà bạn muốn nối thành một chuỗi. Hàm int () cũng hữu ích nếu bạn có một số dưới dạng giá trị chuỗi mà bạn muốn sử dụng trong một số toán học.
Ví dụ, hàm input () luôn trả về một chuỗi, ngay cả khi người dùng nhập số. Nhập spam = input () vào comman line và nhập 101 khi nó chờ văn bản của bạn.

>>> spam = input()
101
>>> spam
'101'

Giá trị được lưu trữ bên trong spam không phải là số nguyên 101 mà là chuỗi ‘101’.
Nếu bạn muốn làm toán bằng cách sử dụng giá trị trong spam, hãy sử dụng hàm int () để lấy dạng số nguyên của spam và sau đó lưu trữ dưới dạng giá trị mới trong spam.

>>> spam = int(spam)
>>> spam
101

Bây giờ bạn sẽ có thể coi biến spam là số nguyên thay vì chuỗi.

>>> spam * 10 / 5
202.0

Lưu ý rằng nếu bạn chuyển một giá trị cho int() mà nó không thể đánh giá là số nguyên, Python sẽ hiển thị thông báo lỗi.

>>> int('99.99')
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
int('99.99')
ValueError: invalid literal for int() with base 10: '99.99'
>>> int('twelve')
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
int('twelve')
ValueError: invalid literal for int() with base 10: 'twelve'

Hàm int() cũng hữu ích khi bạn làm tròn số thập phân.

>>> int(7.7)
7
>>> int(7.7) + 1
8

Quay trở lại chương trình đầu tiên của chúng ta ban đã sử dụng int() và str() để lấy đúng giá trị dữ liệu cần thiết.

print('What is your age?') # ask for their age
myAge = input()
print('You will be ' + str(int(myAge) + 1) + ' in a year.')

Những câu lệnh này được giải thích từng bước trong hình dưới đây
b6
Chuỗi và số có bằng nhau?
Mặc dù giá trị chuỗi của một số nguyên được coi là một giá trị hoàn toàn khác với phiên bản số nguyên hoặc số thập phân, một số nguyên có thể bằng một số thập phân.

>>> 42 == '42'
False
>>> 42 == 42.0
True
>>> 42.0 == 0042.000
True

Python tạo ra sự khác biệt này bởi vì các chuỗi là văn bản, trong khi số nguyên và số thập phân đều là số.
Tóm lược những khái niệm cơ bản nhất
Bạn có thể tính toán biểu thức bằng máy tính hoặc nhập nối chuỗi bằng trình xử lý văn bản. Bạn thậm chí có thể thực hiện sao chép chuỗi dễ dàng bằng cách sao chép và dán văn bản. Nhưng các biểu thức và các giá trị thành phần của chúng Các toán tử, biến và hàm gọi của chúng là các khối xây dựng cơ bản tạo ra các chương trình. Khi bạn biết cách xử lý các yếu tố này, bạn sẽ có thể hướng dẫn Python vận hành trên một lượng lớn dữ liệu cho bạn. Bạn nên nhớ các loại toán tử khác nhau (+, -, *, /, //,% và ** cho các phép toán và + và * cho các phép toán chuỗi) và ba kiểu dữ liệu (số nguyên, số thập phân và chuỗi) được giới thiệu trong chương này.
Tôi đã giới thiệu một vài hàm khác nhau là cơ bản. print() và input() các chức năng xử lý đầu ra văn bản đơn giản (đến màn hình) và đầu vào (từ bàn phím). Hàm len() nhận một chuỗi và ước lượng cho một số lượng ký tự trong chuỗi. Các hàm str(), int() và float() sẽ đánh giá dạng chuỗi số, số nguyên hoặc số thập của giá trị mà chúng được truyền vào.
Trong chương tiếp theo, bạn sẽ học cách nói với Python để đưa ra quyết định thông minh về mã nào sẽ chạy, mã nào cần bỏ qua và mã nào sẽ lặp lại dựa trên các giá trị mà nó có. Điều này được gọi là flow control và nó cho phép bạn viết các chương trình đưa ra quyết định thông minh.


Câu hỏi thực hành

  1. Đoạn sau đây dòng nào là toán tử dòng nào là giá trị?
*
'hello'
-88.8
-
/
+
5
  1. Đoạn sau đây đoạn nào là biến, đoạn nào là chuỗi?
spam
'spam'
  1. Ba dạng dữ liệu bạn được biết trong bài này?
  2. Điều gì tạo thành các biểu thức? Tất cả mọi thứ mà biểu thức có thể làm?
  3. Trong chương này đã giới thiệu về gán giá trị, ví dụ như spam = 10, điều gì khác nhau giữa việc gán giá trị và biểu thức?
  4. Giá trị nào được biến bacon lưu trữ sau khi những dòng lệnh dưới đây được thực thi?
bacon = 20
bacon + 1
  1. Điều gì sẽ xảy ra khi các dòng lệnh này được thực hiện?
'spam' + 'spamspam'
'spam' * 3
  1. Tại sao tên biến là eggs thì được chấp nhận còn 100 thì không?
  2. Ba hàm nào có thể ép kiểu dữ liệu thành số nguyên, số thập phân và chuỗi?
  3. Tại sao biểu thức sau lại lỗi? Và cách để sửa chúng thực thi đúng?
    'I have eaten ' + 99 + ' burritos.'

Phần mở rộng: Tìm kiếm trực tuyến tài liệu Python cho len() chức năng. Nó sẽ có trên một trang web có tiêu đề “Built-in Functions.”. Lướt qua danh sách các hàm khác Python có, tìm kiếm chức năng của hàm round(), và thử nghiệm với nó trong command line.

Chương 1- Python căn bản P1

 Python Basic  Chức năng bình luận bị tắt ở Chương 1- Python căn bản P1
Th4 112020
 

Chương đầu tiên này sẽ mô tả về những khái niệm cơ bản nhất các bạn có thể chạy những lời câu lệnh này trong command line sau khi set up môi trường như bài trước chúng tôi đã hướng dẫn. Bằng cách gõ cmd vào Start menu trong windows sau đấy gõ python để có thể chạy trực tiếp những dòng lệnh trong python.
Các bạn thử đánh dòng lệnh như trong hình.

Trong Python, 2+2 được gọi là biểu thức là khái khái niệm cơ bản nhất trong việc xây dựng ngôn ngữ lập trình nói chung. Biểu thức bao gồm những giá trị (là 2) và những toán tử (là +). Và sau đó chúng thường được lưu trữ dưới một giá trị duy nhất(là 4) một giá trị duy nhất không có toán tử nào.
Một giá trị duy nhất cũng được lưu thành chính nó trong biểu thức không có toán tử nào, ví dụ

>>> 2
2

Có lỗi là bình thường
Các chương trình sẽ bị crash nếu chúng chứa mã mà máy tính không thể hiểu được, điều này sẽ khiến Python hiển thị thông báo lỗi. Tuy nhiên, một thông báo lỗi không phá vỡ máy tính của bạn, vì vậy đừng sợ mắc lỗi. Một sự cố chỉ có nghĩa là chương trình ngừng chạy bất ngờ.
Nếu bạn muốn biết thêm về một lỗi, bạn có thể tìm kiếm văn bản thông báo lỗi chính xác trực tuyến để biết thêm thông tin.
Các bạn cũng có thể thấy các toán tử khác trong biểu thức Python, được giới thiệu với độ ưu tiên từ trên xuống dưới.

Độ ưu tiên của các toán tử trong python tương tự như trong môn toán học vậy, toán tử ** được ưu tiên nhất sau đấy đến các toán tử *,/, // và % được ưu tiên tiếp theo, sau đấy các toán tử +, – được ưu tiên từ trái sang phải trong biểu thức được ưu tiên cuối cùng. Các bạn có thể sử dụng dấu ngoặc đơn () để thay đổi sự ưu tiên của các toán tử. Khoảng trống không ảnh hưởng đến giá trị ưu tiên trong python(ngoại trừ phần khoảng trắng để đảm bảo chương trình dịch nhận ra đúng biểu thức trong chương trình). Đánh vào những biểu thức này trong command line của bạn.

>>> 2 + 3 * 6
20
>>> (2 + 3) * 6
30
>>> 48565878 * 578453
28093077826734
>>> 2 ** 8
256
>>> 23 / 7
3.2857142857142856
>>> 23 // 7
3
>>> 23 % 7
2
>>> 2 + 2
4
>>> (5 - 1) * ((7 + 1) / (3 - 1))
16.0

Trong mỗi trường hợp, bạn là lập trình viên phải nhập biểu thức, nhưng Python thực hiện phần khó để đưa nó xuống một giá trị duy nhất. Python sẽ tiếp tục đánh giá các phần của biểu thức cho đến khi nó trở thành một giá trị duy nhất, như được hiển thị ở đây:


b3
Các quy tắc này để đặt các toán tử và các giá trị lại với nhau để tạo thành các biểu thức là một phần cơ bản của Python như một ngôn ngữ lập trình, giống như các quy tắc ngữ pháp giúp chúng ta giao tiếp với nhau ở đây các biểu thức giao tiếp với trình biên dịch. Giống như câu ngữ pháp sau
Một tháng tới tôi sẽ không được ra ngoài đường.
Một tháng tới, tôi không sẽ được ngoài đường ra.
Lỗi ngữ pháp sẽ khiến cho người nghe không hiểu được. Tương tự như vậy lỗi ngữ pháp trong python được báo là Syntax Error các bạn thử đánh lệnh theo ví dụ sau.

>>> 5 +
File "<stdin>", line 1
5 +
^
SyntaxError: invalid syntax
>>> 42 + 5 + * 2
File "<stdin>", line 1
42 + 5 + * 2
^
SyntaxError: invalid syntax

Bạn luôn có thể kiểm tra xem liệu một lệnh có hoạt động hay không bằng cách nhập nó vào command line. Đừng lo lắng về việc phá vỡ máy tính: điều tồi tệ nhất có thể xảy ra là Python phản hồi với thông báo lỗi.
Các nhà phát triển phần mềm chuyên nghiệp nhận được thông báo lỗi trong khi viết mã mọi lúc. Nên bạn đừng lo lắng rằng chương trình của mình có lỗi.
Số nguyên, số thực và chuỗi trong python
Hãy nhớ rằng các biểu thức chỉ là các giá trị được kết hợp với các toán tử và chúng luôn đưa xuống một giá trị duy nhất. Kiểu dữ liệu(data types) là một danh mục cho các giá trị và mỗi giá trị thuộc về chính xác một loại dữ liệu. Các kiểu dữ liệu phổ biến nhất trong Python được liệt kê ở bảng dưới đây. Các giá trị -2 và 30, ví dụ, được gọi là các giá trị nguyên. Kiểu dữ liệu số nguyên (hoặc int) biểu thị các giá trị là số nguyên. Các số có dấu thập phân(float), chẳng hạn như 3.14. Lưu ý rằng mặc dù giá trị 42 là số nguyên, giá trị 42.0 sẽ là số thập phân.

Các chương trình Python cũng có thể có các giá trị văn bản được gọi là chuỗi(string). Luôn bao quanh chuỗi của bạn trong các ký tự trích dẫn (’’) hoặc (“”) (như trong’ Xin chào ‘hoặc’ Tạm biệt thế giới tàn khốc! ‘) Để Python biết chuỗi bắt đầu và kết thúc ở đâu. Bạn thậm chí có thể có một chuỗi không có ký tự trong đó, ‘’, được gọi là chuỗi trống.
Nếu bạn nhìn thấy lỗi SyntaxError: EOL while scanning string literal có thể bạn đã quên dấu nháy để đóng chuỗi.
>>> ‘Hello, world!
SyntaxError: EOL while scanning string literal

Nối chuỗi và lặp chuỗi
Ý nghĩa của toán tử có thể thay đổi dựa trên các kiểu dữ liệu của các giá trị bên cạnh nó. Ví dụ: + là toán tử cộng khi nó hoạt động trên hai số nguyên hoặc giá trị số thập phân. Tuy nhiên, khi + được sử dụng trên hai giá trị chuỗi, nó tham gia chuỗi dưới dạng toán tử nối chuỗi. Bạn có thể nhìn thấy vị dụ ở dưới

>>> 'Alice' + 'Bob'
'AliceBob' 

Biểu thức tính xuống một giá trị chuỗi đơn, mới kết hợp văn bản của hai chuỗi. Tuy nhiên, nếu bạn cố gắng sử dụng toán tử + trên một chuỗi và một giá trị số nguyên, Python sẽ không biết cách xử lý việc này và nó sẽ hiển thị thông báo lỗi.

>>> 'Alice' + 42
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'Alice' + 42
TypeError: can only concatenate str (not "int") to str

Thông báo lỗi can only concatenate str (not “int”) to str có nghĩa là Python nghĩ rằng bạn đang cố nối một số nguyên với chuỗi ‘Alice’. Code của bạn sẽ phải chuyển đổi rõ ràng số nguyên thành một chuỗi vì Python không thể tự động làm điều này.
Toán tử * nhân hai giá trị số nguyên hoặc số thập phân. Nhưng khi toán tử * được sử dụng trên một giá trị chuỗi và một giá trị số nguyên, nó sẽ trở thành toán tử sao chép chuỗi. Nhập một chuỗi nhân với một số vào command line để thấy điều này trong hành động.

>>> 'Alice' * 5
'AliceAliceAliceAliceAlice'

Biểu thức đưa xuống một giá trị chuỗi đơn lặp lại chuỗi gốc một số lần bằng giá trị số nguyên. Sao chép chuỗi là một thủ thuật hữu ích, nhưng nó không được sử dụng thường xuyên như nối chuỗi. Toán tử * có thể được sử dụng chỉ với hai giá trị số (để nhân) hoặc một giá trị chuỗi và một giá trị số nguyên (để sao chép chuỗi). Nếu không, Python sẽ chỉ hiển thị một thông báo lỗi, như sau:

>>> 'Alice' * 'Bob'
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
'Alice' * 'Bob'
TypeError: can't multiply sequence by non-int of type 'str'
>>> 'Alice' * 5.0
Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
'Alice' * 5.0
TypeError: can't multiply sequence by non-int of type 'float'

Thật ý nghĩa khi Python không hiểu các biểu thức này: bạn không thể nhân hai chuỗi và bạn khó có thể sao chép một chuỗi tùy ý một số lần.
Lưu trữ dữ liệu trong biến
Một biến giống như một hộp trong bộ nhớ máy tính, nơi bạn có thể lưu trữ một giá trị. Nếu bạn muốn sử dụng kết quả của một biểu thức được đánh giá sau này trong chương trình của mình, bạn có thể lưu nó trong một biến.
Bạn sẽ lưu trữ các giá trị trong các biến bằng một câu lệnh gán. Một câu lệnh gán bao gồm một tên biến, một dấu bằng (được gọi là toán tử gán) và giá trị sẽ được lưu trữ. Nếu bạn nhập câu lệnh gán spam = 42, thì một biến có tên là spam sẽ có giá trị nguyên 42 được lưu trong đó.
Hãy nghĩ về một biến như một hộp có nhãn mà một giá trị được đặt vào nó.

>>> spam = 40
>>> spam
40
>>> eggs = 2
>>> spam + eggs
42
>>> spam + eggs + spam
82
>>> spam = spam + 2
>>> spam
42

Các bạn cũng có thể lưu trữ string trong biến

>>> spam = 'Hello'
>>> spam
'Hello'
>>> spam = 'Goodbye'
>>> spam
'Goodbye'

Các cũng có thể thấy biến có thể thay thế bởi các giá trị khác nhau.
Tên biến
Một tên biến tốt mô tả dữ liệu nó chứa. Tưởng tượng rằng bạn chuyển đến một ngôi nhà mới và dán nhãn tất cả các hộp di chuyển của bạn là dễ vỡ. Bạn không bao giờ tìm thấy bất cứ điều gì! Hầu hết các ví dụ về cuốn sách này (và tài liệu Python) sử dụng các tên biến chung chung như spam, eggs và bacon, xuất phát từ bản phác thảo Monty Python. Nhưng trong các chương trình của bạn, một tên mô tả sẽ giúp làm cho code của bạn dễ đọc hơn.
Mặc dù bạn có thể đặt tên cho các biến của mình gần như mọi thứ, nhưng Python thì
có một số hạn chế đặt tên. Bảng dưới đây có các ví dụ về tên biến hợp pháp. Bạn có thể đặt tên cho một biến bất cứ thứ gì miễn là nó tuân theo ba quy tắc sau:
• Nó có thể chỉ là một từ không có khoảng trắng.
• Nó chỉ có thể sử dụng các chữ cái, số và ký tự gạch dưới (_).
• Nó không thể bắt đầu với một số.

Như vậy chúng ta đã tìm hiểu xong những khái niệm cơ bản nhất của python. Trong phần sau chúng ta sẽ viết một chương trình đầu tiên và phân tích nó.