Tôi có thể sử dụng cùng một tên biến trong các chức năng khác nhau của python không?

DCL01-C-EX2. Biến tạm thời trong phạm vi mới bên trong macro có thể ghi đè giá trị nhận dạng trong phạm vi chứa. Tuy nhiên, ngoại lệ này không áp dụng cho các đối số của chính macro

Nhớ lại rằng một biến là nhãn cho một vị trí trong bộ nhớ. Nó có thể được sử dụng để giữ một giá trị. Trong các ngôn ngữ được nhập tĩnh, các biến có các loại được xác định trước và một biến chỉ có thể được sử dụng để giữ các giá trị của loại đó. Trong Python, chúng ta có thể sử dụng lại cùng một biến để lưu trữ các giá trị thuộc bất kỳ loại nào

Một biến tương tự như chức năng bộ nhớ được tìm thấy trong hầu hết các máy tính, ở chỗ nó chứa một giá trị có thể được truy xuất nhiều lần và việc lưu trữ giá trị mới sẽ xóa giá trị cũ. Một biến khác với bộ nhớ của máy tính ở chỗ một biến có thể có nhiều biến lưu trữ các giá trị khác nhau và mỗi biến được gọi theo tên

Định nghĩa biến

Để xác định một biến mới trong Python, chúng ta chỉ cần gán một giá trị cho một nhãn. Ví dụ: đây là cách chúng tôi tạo một biến có tên count , chứa giá trị số nguyên bằng 0.

count = 0

Đây chính xác là cú pháp giống với việc gán một giá trị mới cho một biến hiện có có tên là count . Ở phần sau của chương này, chúng ta sẽ thảo luận trong trường hợp nào thì câu lệnh này sẽ tạo ra một biến mới.

Nếu chúng ta cố gắng truy cập giá trị của một biến chưa được xác định ở bất kỳ đâu, trình thông dịch sẽ thoát với lỗi tên

Chúng ta có thể định nghĩa một số biến trong một dòng, nhưng điều này thường được coi là phong cách xấu

# Define three variables at once:
count, result, total = 0, 0, 0

# This is equivalent to:
count = 0
result = 0
total = 0

Để phù hợp với phong cách lập trình tốt, chúng ta nên sử dụng các tên có ý nghĩa cho các biến

Phạm vi biến đổi và thời gian tồn tại

Không phải tất cả các biến đều có thể truy cập được từ tất cả các phần trong chương trình của chúng tôi và không phải tất cả các biến đều tồn tại trong cùng một khoảng thời gian. Trường hợp một biến có thể truy cập được và thời gian tồn tại của nó tùy thuộc vào cách nó được định nghĩa. Chúng tôi gọi phần của chương trình mà một biến có thể truy cập được là phạm vi của nó và thời lượng tồn tại của biến đó là thời gian tồn tại của nó

Một biến được định nghĩa trong phần thân chính của tệp được gọi là biến toàn cục. Nó sẽ hiển thị trong toàn bộ tệp và cả bên trong bất kỳ tệp nào nhập tệp đó. Các biến toàn cầu có thể gây ra những hậu quả không lường trước được do tác động trên phạm vi rộng của chúng – đó là lý do tại sao chúng ta hầu như không bao giờ nên sử dụng chúng. Chỉ những đối tượng được dự định sử dụng trên toàn cầu, như hàm và lớp, mới được đặt trong không gian tên chung

Một biến được định nghĩa bên trong một hàm là cục bộ của hàm đó. Nó có thể truy cập từ điểm mà nó được xác định cho đến khi kết thúc chức năng và tồn tại miễn là chức năng đang thực thi. Các tên tham số trong định nghĩa hàm hoạt động giống như các biến cục bộ, nhưng chúng chứa các giá trị mà chúng ta chuyển vào hàm khi chúng ta gọi nó. Khi chúng ta sử dụng toán tử gán ( = ) bên trong một hàm, hành vi mặc định của nó là tạo một biến cục bộ mới – trừ khi một biến có cùng tên là .

Dưới đây là một ví dụ về các biến trong các phạm vi khác nhau

# This is a global variable
a = 0

if a == 0:
    # This is still a global variable
    b = 1

def my_function(c):
    # this is a local variable
    d = 3
    print(c)
    print(d)

# Now we call the function, passing the value 7 as the first and only parameter
my_function(7)

# a and b still exist
print(a)
print(b)

# c and d don't exist anymore -- these statements will give us name errors!
print(c)
print(d)

Ghi chú

Phần bên trong của thân lớp cũng là một phạm vi biến cục bộ mới. Các biến được định nghĩa trong thân lớp (nhưng bên ngoài bất kỳ phương thức lớp nào) được gọi là thuộc tính lớp. Chúng có thể được tham chiếu bằng tên trần trong cùng một phạm vi, nhưng chúng cũng có thể được truy cập từ bên ngoài phạm vi này nếu chúng ta sử dụng toán tử truy cập thuộc tính ( . ) trên một lớp hoặc một thể hiện (một đối tượng sử dụng lớp đó làm kiểu của nó). Một thuộc tính cũng có thể được đặt rõ ràng trên một thể hiện hoặc lớp từ bên trong một phương thức. Các thuộc tính được đặt trên các thể hiện được gọi là các thuộc tính thể hiện. Các thuộc tính lớp được chia sẻ giữa tất cả các phiên bản của một lớp, nhưng mỗi phiên bản có các thuộc tính phiên bản riêng của nó. Chúng ta sẽ xem xét điều này chi tiết hơn trong chương về các lớp học.

Toán tử gán

Như chúng ta đã thấy trong các phần trước, toán tử gán trong Python là một dấu bằng ( = ). Toán tử này gán giá trị ở phía bên phải cho biến ở phía bên trái, đôi khi tạo biến trước. Nếu vế phải là một biểu thức (chẳng hạn như biểu thức số học), thì nó sẽ được đánh giá trước khi phép gán diễn ra. Đây là vài ví dụ.

a_number = 5              # a_number becomes 5
a_number = total          # a_number becomes the value of total
a_number = total + 5      # a_number becomes the value of total + 5
a_number = a_number + 1   # a_number becomes the value of a_number + 1

Câu lệnh cuối cùng có thể hơi lạ nếu chúng ta hiểu = dưới dạng dấu bằng toán học – rõ ràng một số không thể bằng . Hãy nhớ rằng = là một toán tử gán – câu lệnh này đang gán một giá trị mới cho biến a_number which is equal to the old value of a_number plus one.

Gán giá trị ban đầu cho biến gọi là khởi tạo biến. Trong một số ngôn ngữ, việc xác định một biến có thể được thực hiện trong một bước riêng biệt trước khi gán giá trị đầu tiên. Do đó, trong các ngôn ngữ đó, một biến có thể được xác định nhưng không có giá trị – điều này có thể dẫn đến lỗi hoặc hành vi không mong muốn nếu chúng ta cố gắng sử dụng giá trị trước khi nó được gán. Trong Python, một biến được định nghĩa và gán giá trị chỉ trong một bước, nên hầu như chúng ta sẽ không bao giờ gặp phải những tình huống như thế này

Phía bên trái của câu lệnh gán phải là một mục tiêu hợp lệ

# this is fine:
a = 3

# these are all illegal:
3 = 4
3 = a
a + b = 3

Một câu lệnh gán có thể có nhiều mục tiêu được phân tách bằng dấu bằng. Biểu thức ở phía bên phải của dấu bằng cuối cùng sẽ được gán cho tất cả các mục tiêu. Tất cả các mục tiêu phải hợp lệ

# both a and b will be set to zero:
a = b = 0

# this is illegal, because we can't set 0 to b:
a = 0 = b

Toán tử gán hợp chất

Chúng ta đã thấy rằng chúng ta có thể gán kết quả của một biểu thức số học cho một biến

total = a + b + c + 50

Đếm là thao tác được thực hiện thường xuyên trong chương trình. Ví dụ: chúng ta có thể muốn đếm số lần một sự kiện nhất định xảy ra bằng cách sử dụng một biến có tên count . Chúng tôi sẽ khởi tạo biến này thành 0 và thêm một biến vào mỗi khi sự kiện xảy ra. Chúng tôi sẽ thực hiện bổ sung với tuyên bố này.

count = count + 1

Đây thực tế là một thao tác rất phổ biến. Python có một toán tử tốc ký, += cho phép chúng ta diễn đạt nó rõ ràng hơn mà không cần phải viết tên biến hai lần.

________số 8

Có một toán tử tương tự, -= , cho phép chúng ta giảm các số.

# These statements mean exactly the same thing:
count = count - 3
count -= 3

Các toán tử gán phức hợp phổ biến khác được đưa ra trong bảng dưới đây

Toán tửVí dụTương đương với +=a += 5<a = a + 5-=a -= 5a = a - 5*=a *= 5a = a * 5/=a /= 5a = a / 5%=a %= 5a = a % 5

Tìm hiểu thêm về phạm vi. vượt qua ranh giới

Nếu chúng ta muốn truy cập một biến toàn cục từ bên trong một hàm thì sao?

# Define three variables at once:
count, result, total = 0, 0, 0

# This is equivalent to:
count = 0
result = 0
total = 0
0

Câu lệnh in sẽ xuất ra 0 , giá trị của biến toàn cục a, as you probably expected. But what about this program?

# Define three variables at once:
count, result, total = 0, 0, 0

# This is equivalent to:
count = 0
result = 0
total = 0
1

Khi chúng ta gọi hàm, câu lệnh in bên trong xuất ra 3 – nhưng tại sao câu lệnh in ở cuối chương trình lại xuất ra < 0?

Theo mặc định, câu lệnh gán tạo các biến trong phạm vi cục bộ. Vì vậy phép gán bên trong hàm không sửa đổi biến toàn cục a – nó tạo ra một biến cục bộ mới có tên là a< . Câu lệnh in đầu tiên xuất giá trị của biến cục bộ mới – bởi vì nếu biến cục bộ có cùng tên với biến toàn cục thì biến cục bộ sẽ luôn được ưu tiên. Câu lệnh in cuối cùng in ra biến toàn cục, biến này vẫn không thay đổi. , and assigns the value 3 to that variable. The first print statement outputs the value of the new local variable – because if a local variable has the same name as a global variable the local variable will always take precedence. The last print statement prints out the global variable, which has remained unchanged.

Nếu chúng ta thực sự muốn sửa đổi một biến toàn cục từ bên trong một hàm thì sao? . global keyword:

# Define three variables at once:
count, result, total = 0, 0, 0

# This is equivalent to:
count = 0
result = 0
total = 0
2

Chúng ta không được đề cập đến cả biến toàn cục và biến cục bộ có cùng tên bên trong cùng một hàm. Chương trình này sẽ báo lỗi cho chúng tôi

# Define three variables at once:
count, result, total = 0, 0, 0

# This is equivalent to:
count = 0
result = 0
total = 0
3

Vì chúng ta chưa khai báo a là toàn cục nên phép gán ở dòng thứ hai của hàm sẽ tạo ra một biến cục bộ a. This means that we can’t refer to the global variable a ở nơi khác trong hàm, ngay cả trước dòng này. Câu lệnh in đầu tiên bây giờ đề cập đến biến cục bộ a – nhưng biến này không có giá trị trong dòng đầu tiên, vì chúng ta chưa gán .

Lưu ý rằng việc truy cập các biến toàn cục từ các hàm bên trong thường rất tệ và thậm chí còn tệ hơn khi sửa đổi chúng. Điều này gây khó khăn cho việc sắp xếp chương trình của chúng ta thành các phần được gói gọn một cách hợp lý mà không ảnh hưởng đến nhau theo những cách không mong muốn. Nếu một hàm cần truy cập một số giá trị bên ngoài, chúng ta nên chuyển giá trị đó vào hàm dưới dạng tham số. Nếu hàm là một phương thức của một đối tượng, đôi khi nó thích hợp để biến giá trị thành một thuộc tính của cùng một đối tượng – chúng ta sẽ thảo luận điều này trong chương về hướng đối tượng

Ghi chú

Ngoài ra còn có một từ khóa nonlocal trong Python – khi chúng ta lồng một hàm bên trong một hàm khác, nó cho phép chúng ta sửa đổi một biến trong . Nếu chúng ta sử dụng từ khóa global , câu lệnh gán sẽ tạo biến trong phạm vi toàn cục nếu nó chưa tồn tại. Tuy nhiên, nếu chúng ta sử dụng từ khóa nonlocal thì biến đó phải được xác định, vì Python không thể xác định nó sẽ được tạo trong phạm vi nào.

bài tập 1

  1. Mô tả phạm vi của các biến a , b . c and d in this example:

    # Define three variables at once:
    count, result, total = 0, 0, 0
    
    # This is equivalent to:
    count = 0
    result = 0
    total = 0
    
    4

  2. Thời gian tồn tại của các biến này là gì?

  3. Bạn có thể đoán điều gì sẽ xảy ra nếu chúng ta chỉ định c giá trị của 1 instead?

  4. Tại sao điều này sẽ là một vấn đề?

Sửa đổi giá trị

hằng số

Trong một số ngôn ngữ, có thể xác định các biến đặc biệt chỉ có thể được gán giá trị một lần – một khi giá trị của chúng đã được đặt, chúng không thể thay đổi được. Chúng ta gọi những loại biến này là hằng số. Python không cho phép chúng tôi đặt giới hạn như vậy đối với các biến, nhưng có một quy ước được sử dụng rộng rãi để đánh dấu một số biến nhất định để chỉ ra rằng giá trị của chúng không có nghĩa là thay đổi. chúng tôi viết hoa tên của họ, với dấu gạch dưới ngăn cách các từ

# Define three variables at once:
count, result, total = 0, 0, 0

# This is equivalent to:
count = 0
result = 0
total = 0
5

Tại sao chúng ta bận tâm xác định các biến mà chúng ta không có ý định thay đổi?

# Define three variables at once:
count, result, total = 0, 0, 0

# This is equivalent to:
count = 0
result = 0
total = 0
6

Có một số lý do chính đáng để xác định MAXIMUM_MARK thay vì chỉ viết 80 inside the print statement. First, this gives the number a descriptive label which explains what it is – this makes the code more understandable. Second, we may eventually need to refer to this number in our program more than once. If we ever need to update our code with a new value for the maximum mark, we will only have to change it in one place, instead of finding every place where it is used – such replacements are often error-prone.

Các số chữ nằm rải rác trong một chương trình được gọi là "số ma thuật" - sử dụng chúng được coi là phong cách mã hóa kém. Điều này không áp dụng cho các số nhỏ được coi là dễ hiểu – thật dễ hiểu tại sao tổng được khởi tạo bằng 0 hoặc tăng thêm một

Đôi khi chúng tôi muốn sử dụng một biến để phân biệt giữa một số tùy chọn riêng biệt. Sẽ rất hữu ích khi tham khảo các giá trị tùy chọn bằng cách sử dụng các hằng số thay vì sử dụng chúng trực tiếp nếu bản thân các giá trị đó không có ý nghĩa nội tại

# Define three variables at once:
count, result, total = 0, 0, 0

# This is equivalent to:
count = 0
result = 0
total = 0
7

Trong ví dụ trên, các giá trị 1 , 2 < . Điều quan trọng duy nhất là ba giá trị phải khác nhau. Nếu chúng ta sử dụng các con số trực tiếp thay vì các hằng số, chương trình sẽ khó đọc hơn nhiều. Sử dụng các chuỗi có ý nghĩa sẽ làm cho mã dễ đọc hơn, nhưng chúng ta có thể vô tình mắc lỗi chính tả khi đặt một trong các giá trị và không nhận thấy – nếu chúng ta nhập sai tên của một trong các hằng số, chúng ta có nhiều khả năng gặp lỗi ngay lập tức. 3 are not important – they are completely meaningless. We could equally well use 4 , 56 or the strings 'lower', 'upper' and 'capital'. The only important thing is that the three values must be different. If we used the numbers directly instead of the constants the program would be much more confusing to read. Using meaningful strings would make the code more readable, but we could accidentally make a spelling mistake while setting one of the values and not notice – if we mistype the name of one of the constants we are more likely to get an error straight away.

Ví dụ, một số thư viện Python định nghĩa các hằng chung để thuận tiện cho chúng ta

# Define three variables at once:
count, result, total = 0, 0, 0

# This is equivalent to:
count = 0
result = 0
total = 0
8

Lưu ý rằng nhiều hằng số tích hợp sẵn không tuân theo quy ước đặt tên toàn chữ hoa

Các loại có thể thay đổi và không thay đổi

Một số giá trị trong python có thể được sửa đổi và một số thì không thể. Điều này không có nghĩa là chúng ta không thể thay đổi giá trị của một biến – nhưng nếu một biến chứa giá trị thuộc loại bất biến, chúng ta chỉ có thể gán cho nó một giá trị mới. Chúng tôi không thể thay đổi giá trị hiện tại theo bất kỳ cách nào

Số nguyên, số dấu phẩy động và chuỗi đều là các loại bất biến – trong tất cả các ví dụ trước, khi chúng ta thay đổi giá trị của các biến hiện có, chúng ta đã sử dụng toán tử gán để gán cho chúng các giá trị mới

# Define three variables at once:
count, result, total = 0, 0, 0

# This is equivalent to:
count = 0
result = 0
total = 0
9

Ngay cả toán tử này cũng không sửa đổi giá trị của total tại chỗ – nó cũng gán một giá trị mới.

# This is a global variable
a = 0

if a == 0:
    # This is still a global variable
    b = 1

def my_function(c):
    # this is a local variable
    d = 3
    print(c)
    print(d)

# Now we call the function, passing the value 7 as the first and only parameter
my_function(7)

# a and b still exist
print(a)
print(b)

# c and d don't exist anymore -- these statements will give us name errors!
print(c)
print(d)
0

Chúng tôi chưa gặp bất kỳ loại có thể thay đổi nào, nhưng chúng tôi sẽ sử dụng chúng rộng rãi trong các chương sau. Danh sách và từ điển có thể thay đổi, và hầu hết các đối tượng mà chúng ta có khả năng tự viết cũng vậy.

# This is a global variable
a = 0

if a == 0:
    # This is still a global variable
    b = 1

def my_function(c):
    # this is a local variable
    d = 3
    print(c)
    print(d)

# Now we call the function, passing the value 7 as the first and only parameter
my_function(7)

# a and b still exist
print(a)
print(b)

# c and d don't exist anymore -- these statements will give us name errors!
print(c)
print(d)
1

Tìm hiểu thêm về đầu vào

Trong các phần trước của bài học này, chúng ta đã học cách làm cho chương trình hiển thị thông báo bằng hàm print hoặc đọc giá trị chuỗi từ . Nếu chúng ta muốn người dùng nhập số hoặc các loại biến khác thì sao? . Đây là một ví dụ đơn giản. input function. What if we want the user to input numbers or other types of variables? We still use the input function, but we must convert the string values returned by input to the types that we want. Here is a simple example:

# This is a global variable
a = 0

if a == 0:
    # This is still a global variable
    b = 1

def my_function(c):
    # this is a local variable
    d = 3
    print(c)
    print(d)

# Now we call the function, passing the value 7 as the first and only parameter
my_function(7)

# a and b still exist
print(a)
print(b)

# c and d don't exist anymore -- these statements will give us name errors!
print(c)
print(d)
2

int là một hàm chuyển đổi các giá trị thuộc nhiều loại khác nhau thành kiểu int. Chúng ta sẽ thảo luận về chuyển đổi loại chi tiết hơn trong phần tiếp theo, nhưng hiện tại, điều quan trọng cần biết là int sẽ không thể chuyển đổi một chuỗi thành . Chương trình trên sẽ thoát với lỗi nếu người dùng nhập "aaa" , "zzz10" or even "7.5" . Khi chúng tôi viết một chương trình dựa trên đầu vào của người dùng, có thể không chính xác, chúng tôi cần thêm một số biện pháp bảo vệ để chúng tôi có thể khôi phục nếu người dùng mắc lỗi. Ví dụ: chúng tôi có thể phát hiện xem người dùng đã nhập sai đầu vào và thoát ra với thông báo lỗi đẹp hơn.

# This is a global variable
a = 0

if a == 0:
    # This is still a global variable
    b = 1

def my_function(c):
    # this is a local variable
    d = 3
    print(c)
    print(d)

# Now we call the function, passing the value 7 as the first and only parameter
my_function(7)

# a and b still exist
print(a)
print(b)

# c and d don't exist anymore -- these statements will give us name errors!
print(c)
print(d)
3

Chương trình này vẫn sẽ chỉ cố gắng đọc đầu vào một lần và thoát nếu nó không chính xác. Nếu chúng tôi muốn tiếp tục yêu cầu người dùng nhập liệu cho đến khi nó đúng, chúng tôi có thể làm điều gì đó như thế này

# This is a global variable
a = 0

if a == 0:
    # This is still a global variable
    b = 1

def my_function(c):
    # this is a local variable
    d = 3
    print(c)
    print(d)

# Now we call the function, passing the value 7 as the first and only parameter
my_function(7)

# a and b still exist
print(a)
print(b)

# c and d don't exist anymore -- these statements will give us name errors!
print(c)
print(d)
4

Chúng ta sẽ tìm hiểu thêm về giá trị boolean, vòng lặp và ngoại lệ sau

Ví dụ. tính mức tiêu hao xăng của ô tô

Trong ví dụ này, chúng ta sẽ viết một chương trình đơn giản hỏi người dùng về quãng đường ô tô đã đi và giá trị tiền tệ của loại xăng đã được sử dụng để đi quãng đường đó. Từ thông tin này, cùng với giá mỗi lít xăng, chương trình sẽ tính toán hiệu suất của xe, cả bằng lít trên 100 km và km trên lít

Đầu tiên, chúng tôi sẽ xác định giá xăng dầu là một hằng số ở trên cùng. Điều này sẽ giúp chúng tôi dễ dàng cập nhật giá khi giá thay đổi vào Thứ Tư đầu tiên của mỗi tháng

# This is a global variable
a = 0

if a == 0:
    # This is still a global variable
    b = 1

def my_function(c):
    # this is a local variable
    d = 3
    print(c)
    print(d)

# Now we call the function, passing the value 7 as the first and only parameter
my_function(7)

# a and b still exist
print(a)
print(b)

# c and d don't exist anymore -- these statements will give us name errors!
print(c)
print(d)
5

Khi chương trình bắt đầu, chúng tôi muốn in ra một thông báo chào mừng

# This is a global variable
a = 0

if a == 0:
    # This is still a global variable
    b = 1

def my_function(c):
    # this is a local variable
    d = 3
    print(c)
    print(d)

# Now we call the function, passing the value 7 as the first and only parameter
my_function(7)

# a and b still exist
print(a)
print(b)

# c and d don't exist anymore -- these statements will give us name errors!
print(c)
print(d)
6

Hỏi tên người dùng

# This is a global variable
a = 0

if a == 0:
    # This is still a global variable
    b = 1

def my_function(c):
    # this is a local variable
    d = 3
    print(c)
    print(d)

# Now we call the function, passing the value 7 as the first and only parameter
my_function(7)

# a and b still exist
print(a)
print(b)

# c and d don't exist anymore -- these statements will give us name errors!
print(c)
print(d)
7

Hỏi người dùng về quãng đường đã đi

# This is a global variable
a = 0

if a == 0:
    # This is still a global variable
    b = 1

def my_function(c):
    # this is a local variable
    d = 3
    print(c)
    print(d)

# Now we call the function, passing the value 7 as the first and only parameter
my_function(7)

# a and b still exist
print(a)
print(b)

# c and d don't exist anymore -- these statements will give us name errors!
print(c)
print(d)
8

Sau đó hỏi người dùng về số tiền đã thanh toán

# This is a global variable
a = 0

if a == 0:
    # This is still a global variable
    b = 1

def my_function(c):
    # this is a local variable
    d = 3
    print(c)
    print(d)

# Now we call the function, passing the value 7 as the first and only parameter
my_function(7)

# a and b still exist
print(a)
print(b)

# c and d don't exist anymore -- these statements will give us name errors!
print(c)
print(d)
9

Bây giờ chúng ta sẽ tính toán

a_number = 5              # a_number becomes 5
a_number = total          # a_number becomes the value of total
a_number = total + 5      # a_number becomes the value of total + 5
a_number = a_number + 1   # a_number becomes the value of a_number + 1
0

Cuối cùng, chúng tôi xuất kết quả

a_number = 5              # a_number becomes 5
a_number = total          # a_number becomes the value of total
a_number = total + 5      # a_number becomes the value of total + 5
a_number = a_number + 1   # a_number becomes the value of a_number + 1
1

Bài tập 2

  1. Viết chương trình Python để chuyển đổi nhiệt độ đã cho theo độ F sang độ C tương đương. Bạn có thể giả định rằng T_c = (5/9) x (T_f - 32), trong đó T_c là nhiệt độ tính bằng °C và T_f là nhiệt độ tính bằng °F. Chương trình của bạn sẽ yêu cầu người dùng nhập giá trị và in kết quả đầu ra. Các giá trị đầu vào và đầu ra phải là số dấu phẩy động
  2. Điều gì có thể làm cho chương trình này sụp đổ?

loại chuyển đổi

Khi chúng ta viết nhiều chương trình hơn, chúng ta sẽ thường thấy rằng chúng ta cần chuyển đổi dữ liệu từ kiểu này sang kiểu khác, ví dụ: chuỗi thành số nguyên hoặc từ số nguyên thành số dấu phẩy động. Có hai loại chuyển đổi kiểu trong Python. chuyển đổi ngầm định và rõ ràng

chuyển đổi ngầm định

Nhớ lại từ phần về toán tử dấu phẩy động mà chúng ta có thể kết hợp tùy ý các số nguyên và số dấu phẩy động trong một biểu thức số học – và kết quả của bất kỳ biểu thức nào như vậy sẽ luôn là một số dấu phẩy động. Điều này là do Python sẽ chuyển đổi số nguyên thành số dấu phẩy động trước khi đánh giá biểu thức. Đây là một chuyển đổi ngầm – chúng tôi không phải tự chuyển đổi bất cứ thứ gì. Thường không mất độ chính xác khi một số nguyên được chuyển đổi thành số dấu phẩy động

Ví dụ: số nguyên 2 sẽ tự động được chuyển thành số dấu phẩy động trong ví dụ sau.

a_number = 5              # a_number becomes 5
a_number = total          # a_number becomes the value of total
a_number = total + 5      # a_number becomes the value of total + 5
a_number = a_number + 1   # a_number becomes the value of a_number + 1
2

8. 5thả nổi trong khi 2 is an int. Python will automatically convert operands so that they are of the same type. In this case this is achieved if the integer 2 được chuyển đổi thành số thập phân tương đương 2. 0 . Sau đó, hai số dấu phẩy động có thể được nhân.

Hãy xem một ví dụ phức tạp hơn

a_number = 5              # a_number becomes 5
a_number = total          # a_number becomes the value of total
a_number = total + 5      # a_number becomes the value of total + 5
a_number = a_number + 1   # a_number becomes the value of a_number + 1
3

Python thực hiện các thao tác theo thứ tự ưu tiên và quyết định xem có cần chuyển đổi hay không trên cơ sở mỗi thao tác. Trong ví dụ của chúng tôi // có mức độ ưu tiên cao nhất, vì vậy nó sẽ được xử lý trước. 73 đều là số nguyên và // is the integer division operator – the result of this operation is the integer 2. Now we are left with 8. 5 + 2 - 2. 5 . Phép cộng và phép trừ có cùng mức độ ưu tiên, vì vậy chúng được đánh giá từ trái sang phải, bắt đầu bằng phép cộng. Đầu tiên 2 được chuyển thành số dấu phẩy động 2. 0 và hai số dấu phẩy động được thêm vào, khiến chúng ta có 10. 5 - 2. 5 . Kết quả của phép trừ dấu phẩy động này là 2. 0 , được gán cho kết quả .

chuyển đổi rõ ràng

Chuyển đổi số từ float thành int sẽ dẫn đến . Ví dụ: thử chuyển đổi 5. 834 thành int – không thể thực hiện việc này mà không làm giảm độ chính xác. Để điều này xảy ra, chúng ta phải thông báo rõ ràng với Python rằng chúng ta biết rằng độ chính xác sẽ bị mất. Ví dụ: chúng ta cần yêu cầu trình biên dịch chuyển đổi float thành int like this:

a_number = 5              # a_number becomes 5
a_number = total          # a_number becomes the value of total
a_number = total + 5      # a_number becomes the value of total + 5
a_number = a_number + 1   # a_number becomes the value of a_number + 1
4

Hàm int chuyển đổi float thành < . Nếu chúng ta muốn kiểm soát nhiều hơn cách làm tròn số, chúng ta sẽ cần sử dụng một hàm khác. int by discarding the fractional part – it will always round down! If we want more control over the way in which the number is rounded, we will need to use a different function:

a_number = 5              # a_number becomes 5
a_number = total          # a_number becomes the value of total
a_number = total + 5      # a_number becomes the value of total + 5
a_number = a_number + 1   # a_number becomes the value of a_number + 1
5

Chuyển đổi rõ ràng đôi khi còn được gọi là truyền – chúng ta có thể đọc về một float được chuyển thành int . or vice-versa.

Chuyển đổi sang và từ chuỗi

Như chúng ta đã thấy trong các phần trước, Python hiếm khi thực hiện các chuyển đổi ngầm đến và từ str – chúng ta thường phải chuyển đổi các giá trị một cách rõ ràng. Nếu chúng ta chuyển một số (hoặc bất kỳ giá trị nào khác) cho hàm print , thì nó sẽ tự động được chuyển đổi thành một chuỗi – nhưng nếu chúng ta cố gắng thêm .

a_number = 5              # a_number becomes 5
a_number = total          # a_number becomes the value of total
a_number = total + 5      # a_number becomes the value of total + 5
a_number = a_number + 1   # a_number becomes the value of a_number + 1
6

Để chuyển đổi số thành chuỗi, chúng ta có thể sử dụng định dạng chuỗi – đây thường là cách rõ ràng và dễ đọc nhất để chèn nhiều giá trị vào một thông báo. Nếu chúng ta muốn chuyển đổi một số thành một chuỗi, chúng ta cũng có thể sử dụng hàm str một cách rõ ràng.

a_number = 5              # a_number becomes 5
a_number = total          # a_number becomes the value of total
a_number = total + 5      # a_number becomes the value of total + 5
a_number = a_number + 1   # a_number becomes the value of a_number + 1
7

Tìm hiểu thêm về chuyển đổi

Trong Python, các hàm như str , int và . Lưu ý rằng mặc dù float will try to convert anything to their respective types – for example, we can use the int function to convert strings to integers or to convert floating-point numbers to integers. Note that although int có thể chuyển đổi số float thành số nguyên nhưng không thể chuyển đổi trực tiếp chuỗi chứa số float thành số nguyên.

a_number = 5              # a_number becomes 5
a_number = total          # a_number becomes the value of total
a_number = total + 5      # a_number becomes the value of total + 5
a_number = a_number + 1   # a_number becomes the value of a_number + 1
8

Các giá trị thuộc loại bool có thể chứa giá trị True . Các giá trị này được sử dụng rộng rãi trong các câu lệnh có điều kiện, thực thi hoặc không thực thi các phần của chương trình của chúng tôi tùy thuộc vào một số điều kiện nhị phân. False. These values are used extensively in conditional statements, which execute or do not execute parts of our program depending on some binary condition:

a_number = 5              # a_number becomes 5
a_number = total          # a_number becomes the value of total
a_number = total + 5      # a_number becomes the value of total + 5
a_number = a_number + 1   # a_number becomes the value of a_number + 1
9

Điều kiện thường là một biểu thức đánh giá một giá trị boolean

# this is fine:
a = 3

# these are all illegal:
3 = 4
3 = a
a + b = 3
0

Tuy nhiên, hầu hết mọi giá trị đều có thể được chuyển đổi hoàn toàn thành boolean nếu nó được sử dụng trong một câu lệnh như thế này

# this is fine:
a = 3

# these are all illegal:
3 = 4
3 = a
a + b = 3
1

Điều này thường hoạt động theo cách mà bạn mong đợi. các số khác không là giá trị True và số không là Sai . Tuy nhiên, chúng ta cần cẩn thận khi sử dụng chuỗi – chuỗi trống được coi là Sai , nhưng bất kỳ chuỗi nào khác là True – even "0" and "False"!

# this is fine:
a = 3

# these are all illegal:
3 = 4
3 = a
a + b = 3
2

bài tập 3

  1. Chuyển đổi "8. 8" lên phao.
  2. Chuyển đổi 8. 8 thành số nguyên (có làm tròn).
  3. Chuyển đổi "8. 8" thành số nguyên (có làm tròn).
  4. Chuyển đổi 8. 8 thành một chuỗi.
  5. Chuyển 8 thành chuỗi.
  6. Chuyển 8 thành float.
  7. Chuyển đổi 8 sang boolean.

Đáp án bài tập

Đáp án bài tập 1

  1. a là biến cục bộ trong phạm vi của my_function vì nó là tên đối số. b cũng là một biến cục bộ bên trong my_function , bởi vì nó được gán một . my_function. cd đều là biến toàn cục. Việc d được tạo bên trong khối if không thành vấn đề, . Chỉ định nghĩa hàm (bắt đầu bằng if block is not a new scope – everything inside the block is part of the same scope as the outside (in this case the global scope). Only function definitions (which start with def ) và định nghĩa lớp (bắt đầu bằng class) indicate the start of a new level of scope.
  2. Cả ab sẽ được tạo mỗi lần . my_function is called and destroyed when my_function has finished executing. c được tạo khi được gán giá trị 3 và tồn tại cho . d được tạo bên trong khối if (khi nó được gán giá trị .
  3. Như chúng ta sẽ tìm hiểu trong chương tiếp theo, các khối if được thực thi có điều kiện. Nếu c không lớn hơn 3 trong chương trình này, thì if block would not be executed, and if that were to happen the variable d would never be created.
  4. Chúng tôi có thể sử dụng biến sau này trong mã, giả sử rằng nó luôn tồn tại và chương trình của chúng tôi sẽ gặp sự cố bất ngờ nếu không. Việc cho phép một biến được xác định hoặc không xác định tùy thuộc vào kết quả của một câu lệnh có điều kiện được coi là thực hành viết mã kém. Tốt hơn là đảm bảo rằng nó luôn được xác định, bất kể điều gì - ví dụ: bằng cách gán cho nó một số giá trị mặc định khi bắt đầu. Việc kiểm tra xem một biến có giá trị mặc định sẽ dễ dàng và sạch sẽ hơn nhiều so với việc kiểm tra xem nó có tồn tại hay không

Đáp án bài tập 2

  1. Đây là một chương trình ví dụ

    # this is fine:
    a = 3
    
    # these are all illegal:
    3 = 4
    3 = a
    a + b = 3
    
    3

    Ghi chú

    Ký hiệu định dạng %g được sử dụng với số float và hướng dẫn Python chọn một cách hợp lý mà con người có thể đọc được để hiển thị số float.

  2. Chương trình có thể bị lỗi nếu người dùng nhập một giá trị không thể chuyển đổi thành số dấu phẩy động. Chúng tôi sẽ cần thêm một số loại kiểm tra lỗi để đảm bảo rằng điều này không xảy ra – ví dụ: bằng cách lưu trữ giá trị chuỗi và kiểm tra nội dung của nó. Nếu chúng tôi thấy rằng giá trị đã nhập không hợp lệ, chúng tôi có thể in thông báo lỗi và thoát hoặc tiếp tục nhắc người dùng nhập cho đến khi nhập giá trị hợp lệ

    Bạn có thể sử dụng cùng một tên biến trong các hàm Python khác nhau không?

    Có, các biến thuộc hàm khác nhau có thể có cùng tên vì phạm vi của chúng bị giới hạn trong khối mà chúng được xác định. Các biến thuộc các chức năng khác nhau trong một mã có thể có cùng tên nếu chúng ta khai báo biến đó trên toàn cục như trong đoạn mã sau bên dưới.

    Tôi có thể sử dụng cùng một tên biến trong các chức năng khác nhau không?

    Đặt tên biến . another function can have a variable or argument of the same name, and there is no confusion.

    Bạn có thể có hai hàm có cùng tên trong Python không?

    Python không hỗ trợ nạp chồng hàm . Khi chúng ta định nghĩa nhiều hàm có cùng tên, hàm sau luôn ghi đè lên hàm trước và do đó, trong không gian tên, sẽ luôn có một mục duy nhất đối với mỗi tên hàm.

    Hai hàm có thể có cùng một biến không?

    Được, không sao đâu , mọi biến đều có phạm vi. Phạm vi của một tham số chức năng là chức năng đó. Vì vậy, hai biến int n được giới hạn trong các chức năng tương ứng của chúng.