Python cho phép các nhà phát triển sử dụng các toán tử số học phổ biến trên các chuỗi. Thao tác dữ liệu văn bản ở mức độ cao này là một trong nhiều lý do khiến Python trở nên phổ biến. Một ví dụ về điều này là khả năng sử dụng các toán tử số học để thao tác các chuỗi trong Python
Mục lục
Mặc dù thuận tiện nhưng có một số hạn chế khi sử dụng các toán tử số học như toán tử cộng, trừ, cộng-bằng và thậm chí là phép nhân trên các chuỗi. Ví dụ: nhân một chuỗi với một số float sẽ dẫn đến TypeError. không thể nhân chuỗi với ngoại lệ không thuộc loại 'float'
Điểm nổi bật
Trong bài viết này, chúng ta xem xét một số trường hợp sử dụng để áp dụng toán tử số học cho chuỗi Python. Cuộc thảo luận sẽ bao gồm một số trường hợp phổ biến, trường hợp nâng cao và cả các vấn đề phổ biến. Cuối cùng, chúng tôi sẽ đề cập đến những điều sau đây
- Nối chuỗi cơ bản với các toán tử số học
- Những toán tử nào không thể được sử dụng trong các hoạt động chuỗi
- Phương tiện mới để áp dụng toán tử nhân để tạo các bản sao của chuỗi
- Cách ưu tiên toán tử vẫn áp dụng cho các hoạt động chuỗi
- Mẹo sử dụng toán tử số học trên đầu vào của người dùng
- Làm thế nào các đối tượng
# Create an example string s1 = "alpharithms" print[s1] # concatenate some text s1 += " is cool." print[s1] # output alpharithms alpharithms is cool.
4 có thể thay đổi chuỗi
Trước khi đi sâu vào, trước tiên chúng ta hãy xem xét bản chất của chuỗi Python. Cụ thể, chúng ta sẽ thảo luận ngắn gọn về cách các chuỗi Python là bất biến, điều đó có nghĩa là gì và tác động của điều này đối với việc thực hiện các phép toán số học dựa trên chuỗi
Giới thiệu nhanh. Hiểu chuỗi Python
Chuỗi Python khác với chuỗi trong nhiều ngôn ngữ khác. Không đi sâu vào chi tiết, điều quan trọng cần lưu ý là các điểm sau về chuỗi Python
- Chuỗi Python là bất biến. Thay đổi một chuỗi yêu cầu tạo một bản sao
- Các chuỗi là các đối tượng mảng [danh sách], theo đó mỗi ký tự riêng lẻ có thể được truy cập thông qua ký hiệu chỉ mục là
# Create an example string s1 = "alpharithms" print[s1] # concatenate some text s1 += " is cool." print[s1] # output alpharithms alpharithms is cool.
5 trong đó# Create an example string s1 = "alpharithms" print[s1] # concatenate some text s1 += " is cool." print[s1] # output alpharithms alpharithms is cool.
6 là một chỉ mục số trong mảng [danh sách. ] - Đầu vào số của người dùng được chuyển đổi thành một chuỗi và phải được đánh máy sang định dạng mong muốn trước khi có thể áp dụng chính xác các phép tính số học
ví dụ 0. Chuỗi là bất biến
Đây không phải là một ví dụ về nhân, cộng hoặc trừ các chuỗi. Tuy nhiên, điểm này rất cần thiết để hiểu cách các chuỗi được lưu trữ và truy cập trong Python nên nó phải được thảo luận. Xem xét ví dụ sau
# example of number mutability a = 5 print[a] a += 1 print[a] # output 5 6
Điều này cho thấy một biến
# Create an example string s1 = "alpharithms" print[s1] # concatenate some text s1 += " is cool." print[s1] # output alpharithms alpharithms is cool.7 được gán một giá trị nguyên là
# Create an example string s1 = "alpharithms" print[s1] # concatenate some text s1 += " is cool." print[s1] # output alpharithms alpharithms is cool.8, sau đó, thông qua toán tử
# Create an example string s1 = "alpharithms" print[s1] # concatenate some text s1 += " is cool." print[s1] # output alpharithms alpharithms is cool.9 [tương đương với
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment0], giá trị này được “tăng” thêm 1 dẫn đến giá trị cuối cùng là 6. Điều này được xác nhận thông qua đầu ra từ 2 câu lệnh
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment1. Trong hầu hết các ngôn ngữ lập trình khác, sẽ thật điên rồ nếu xem xét thực hiện một thao tác như vậy đối với một chuỗi. Hãy xem cách Python xử lý nó
# Create an example string s1 = "alpharithms" print[s1] # concatenate some text s1 += " is cool." print[s1] # output alpharithms alpharithms is cool.
Ở đây chúng ta thấy văn bản bổ sung được thêm vào biến
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment2. Có vẻ như chúng ta đang biến đổi một chuỗi nhưng thực ra không phải vậy. Thay vào đó, chúng tôi chỉ đơn giản là gán lại một giá trị mới cho các biến
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment2. Hãy xem điều gì sẽ xảy ra nếu chúng ta cố gắng thay đổi một chuỗi trực tiếp trong Python
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment
Ở đây chúng ta có cái nhìn đầu tiên về bản chất bất biến của các chuỗi Python. Một ngoại lệ
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment4 được đưa ra khi cố gắng thao tác trực tiếp một giá trị có trong một mảng chuỗi Python. Điều này hoàn toàn trái ngược với cách người ta có thể thao tác với các mảng giá trị số — hoặc thậm chí là các mảng ký tự. Hãy xem xét đoạn mã sau
# change single character a1 = ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', 's'] a1[-1] = "\0" print[a1] # change integer item a2 = [1, 2, 3, 4, 5] a2[0] = 6 print[a2] # Output ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', '\x00'] [6, 2, 3, 4, 5]
Ở đây, chúng tôi thấy đầu ra phản ánh những thay đổi của chúng tôi mà không có bất kỳ ngoại lệ nào được nêu ra. Kiểu này minh họa cách chuỗi Python là mảng "đặc biệt" ở chỗ dữ liệu chứa trong chuỗi không thể thao tác được. Để tìm hiểu sâu hơn, hãy đọc bài viết này. Công nhận đơn giản về tính bất biến của chuỗi Python là đủ cho cuộc thảo luận của chúng ta ở đây
ví dụ 1. Nối dựa trên toán tử số học
Python cho phép sử dụng các toán tử số học để thao tác với chuỗi. Điều này cho phép cộng, trừ và thậm chí nhân các chuỗi diễn ra thông qua các toán tử phổ biến như
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment5 và
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment6, cũng như toán tử gán, nhưng không phải là
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment7 hoặc
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment8. Chúng ta sẽ xem xét những trường hợp cuối cùng trong giây lát. Bây giờ, hãy xem xét những người khác
# creates a string a1 = "alpharithms" # create a new string with extra text a2 = a1 + " is cool" print[a2] # use assignment operator to do the same a1 += " is cool" print[a1] # output alpharithms is cool alpharithms is cool
Ở đây, chúng ta thấy đầu ra giống hệt nhau cho dù chúng ta thêm một chuỗi mới một cách rõ ràng thông qua phép gán cho một biến mới
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment9 hay hoàn toàn thông qua toán tử
# Create an example string s1 = "alpharithms" print[s1] # concatenate some text s1 += " is cool." print[s1] # output alpharithms alpharithms is cool.9 [gán một giá trị mới cho các biến ban đầu
# change single character a1 = ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', 's'] a1[-1] = "\0" print[a1] # change integer item a2 = [1, 2, 3, 4, 5] a2[0] = 6 print[a2] # Output ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', '\x00'] [6, 2, 3, 4, 5]1. ] Hãy xem một số toán tử số học khác theo cách tiếp cận này như thế nào
phép trừ
# Subtraction and multiplication don't always work b1 = "alpharithms" b2 = b1 - "s" print[b2] # Output TypeError: unsupported operand type[s] for -: 'str' and 'str' b1 = "alpharithms" b1 -= "s" print[b1] # Output TypeError: unsupported operand type[s] for -=: 'str' and 'str'
Ở đây chúng ta thấy cùng một ngoại lệ
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment4 được nêu ra. Rõ ràng, toán tử trừ không hoạt động tốt với các chuỗi. Phép chia và phép nhân tạo ra các ngoại lệ tương tự. Tuy nhiên, thao tác chuỗi dựa trên phép nhân có thể thực hiện theo cách khác
ví dụ 2. Thao tác chuỗi dựa trên phép nhân
Phép nhân là một trường hợp đặc biệt nhờ đó Python cung cấp một số tính năng mở rộng. Tương tự như phép trừ và phép chia, toán tử nhân không hoạt động trong thao tác trực tiếp của một chuỗi
# create the sample string s1 = "alpharithms" # attempt a direct multiplication operation s2 = s1 * " is cool" # output TypeError: can't multiply sequence by non-int of type 'str' # attempt an assignment operation s1 *= " is cool" # output TypeError: can't multiply sequence by non-int of type 'str'
Python không cho phép sử dụng toán tử nhân để tạo nhiều bản sao của một chuỗi. Xem xét ví dụ sau
# Create an example string s1 = "alpharithms" # Use multiplication modifier with an integer value # to create a new string made of duplicates of the # initial string s2 = s1 * 5 print[s2] # output alpharithmsalpharithmsalpharithmsalpharithmsalpharithms
Kết quả tương tự sẽ được tạo ra bằng cách sử dụng cú pháp
# change single character a1 = ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', 's'] a1[-1] = "\0" print[a1] # change integer item a2 = [1, 2, 3, 4, 5] a2[0] = 6 print[a2] # Output ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', '\x00'] [6, 2, 3, 4, 5]3. Ở cấp độ khái niệm, điều này có ý nghĩa — tương đương với việc đưa ra hướng dẫn “tạo 5 bản sao của
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment2“. Điều gì sẽ xảy ra nếu chúng ta sử dụng một giá trị phân số?
# Create an example string s1 = "alpharithms" # Create 5 and a half copies s2 = s1 * 5.5 TypeError: can't multiply sequence by non-int of type 'float'
Ở đây chúng ta thấy TypeError. không thể nhân chuỗi với ngoại lệ 'float' không thuộc loại int được nêu ra. Python 100% có thể đã chọn diễn giải các giá trị phân số, chẳng hạn như số float để trả về tỷ lệ phần trăm của tổng số ký tự bằng cách tạo các bản sao của chuỗi. Trong trường hợp này,
# change single character a1 = ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', 's'] a1[-1] = "\0" print[a1] # change integer item a2 = [1, 2, 3, 4, 5] a2[0] = 6 print[a2] # Output ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', '\x00'] [6, 2, 3, 4, 5]5 sẽ là 2/11 sẽ là 5. 5, làm tròn xuống 5 ký tự số nguyên gần nhất.
# change single character a1 = ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', 's'] a1[-1] = "\0" print[a1] # change integer item a2 = [1, 2, 3, 4, 5] a2[0] = 6 print[a2] # Output ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', '\x00'] [6, 2, 3, 4, 5]6. Tuy nhiên, đây không phải là trường hợp và không thể sử dụng phép nhân float với chuỗi
ví dụ 3. Người vận hành máy trộn
Ở điểm này, rõ ràng là các toán tử cộng và nhân rất hữu ích để thao tác với các chuỗi. Chúng tôi đã thấy ứng dụng của từng ứng dụng riêng lẻ nhưng chưa xem xét cách người ta có thể sử dụng chúng kết hợp với nhau. Hãy xem xét đoạn mã sau
# create a sample string s1 = "alpharithms" # Create 5 copies separated by a space s2 = s1 + " " * 5 # print result print[s2] # result alpharithms
Thay vì dự kiến 5 bản sao của
# change single character a1 = ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', 's'] a1[-1] = "\0" print[a1] # change integer item a2 = [1, 2, 3, 4, 5] a2[0] = 6 print[a2] # Output ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', '\x00'] [6, 2, 3, 4, 5]7, thay vào đó, chúng tôi thấy những gì có vẻ là một bản duy nhất. Trên thực tế, đây là một bản sao có thêm 5 ký tự khoảng trắng được thêm vào cuối. Nếu phần
# change single character a1 = ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', 's'] a1[-1] = "\0" print[a1] # change integer item a2 = [1, 2, 3, 4, 5] a2[0] = 6 print[a2] # Output ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', '\x00'] [6, 2, 3, 4, 5]8 được thay thế bằng
# change single character a1 = ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', 's'] a1[-1] = "\0" print[a1] # change integer item a2 = [1, 2, 3, 4, 5] a2[0] = 6 print[a2] # Output ['a', 'l', 'p', 'h', 'a', 'r', 'i', 't', 'h', 'm', '\x00'] [6, 2, 3, 4, 5]9 thì đầu ra sẽ là
# creates a string a1 = "alpharithms" # create a new string with extra text a2 = a1 + " is cool" print[a2] # use assignment operator to do the same a1 += " is cool" print[a1] # output alpharithms is cool alpharithms is cool0
Ví dụ này nhấn mạnh rằng quyền ưu tiên của toán tử hợp lệ ngay cả khi xử lý các chuỗi. Để thêm khoảng cách giữa 5 bản sao như dự định, chúng tôi cần thêm dấu ngoặc đơn để chỉ định một thứ tự hoạt động khác như vậy
# Create an example string s1 = "alpharithms" print[s1] # concatenate some text s1 += " is cool." print[s1] # output alpharithms alpharithms is cool.0
Ở đây chúng ta thấy đầu ra được trả lại như mong đợi. Bằng cách thêm các ký tự
# creates a string a1 = "alpharithms" # create a new string with extra text a2 = a1 + " is cool" print[a2] # use assignment operator to do the same a1 += " is cool" print[a1] # output alpharithms is cool alpharithms is cool1 và
# creates a string a1 = "alpharithms" # create a new string with extra text a2 = a1 + " is cool" print[a2] # use assignment operator to do the same a1 += " is cool" print[a1] # output alpharithms is cool alpharithms is cool2 xung quanh thao tác
# creates a string a1 = "alpharithms" # create a new string with extra text a2 = a1 + " is cool" print[a2] # use assignment operator to do the same a1 += " is cool" print[a1] # output alpharithms is cool alpharithms is cool3, chúng tôi thêm ký tự khoảng trắng trước khi tạo 5 bản sao của chuỗi
Ví dụ 4. Đầu vào của người dùng chuyển đổi thành chuỗi
Khi chấp nhận đầu vào của người dùng trong Python, mọi đầu vào do người dùng cung cấp sẽ được chuyển đổi thành một chuỗi. Ví dụ: đoạn mã sau nhắc người dùng nhập một số sẽ được nhân với giá trị
# creates a string a1 = "alpharithms" # create a new string with extra text a2 = a1 + " is cool" print[a2] # use assignment operator to do the same a1 += " is cool" print[a1] # output alpharithms is cool alpharithms is cool4
# Create an example string s1 = "alpharithms" print[s1] # concatenate some text s1 += " is cool." print[s1] # output alpharithms alpharithms is cool.1
Ở đây, chúng tôi đã nhập giá trị
# creates a string a1 = "alpharithms" # create a new string with extra text a2 = a1 + " is cool" print[a2] # use assignment operator to do the same a1 += " is cool" print[a1] # output alpharithms is cool alpharithms is cool4 tại dấu nhắc và nhận thấy giá trị trả về là
# creates a string a1 = "alpharithms" # create a new string with extra text a2 = a1 + " is cool" print[a2] # use assignment operator to do the same a1 += " is cool" print[a1] # output alpharithms is cool alpharithms is cool6 — rõ ràng không phải là phép tính chính xác của
# creates a string a1 = "alpharithms" # create a new string with extra text a2 = a1 + " is cool" print[a2] # use assignment operator to do the same a1 += " is cool" print[a1] # output alpharithms is cool alpharithms is cool7. Vấn đề là python diễn giải giá trị do người dùng nhập vào của
# creates a string a1 = "alpharithms" # create a new string with extra text a2 = a1 + " is cool" print[a2] # use assignment operator to do the same a1 += " is cool" print[a1] # output alpharithms is cool alpharithms is cool4 dưới dạng một chuỗi, dẫn đến một thao tác tương đương với
# creates a string a1 = "alpharithms" # create a new string with extra text a2 = a1 + " is cool" print[a2] # use assignment operator to do the same a1 += " is cool" print[a1] # output alpharithms is cool alpharithms is cool9, như được hiển thị ở trên, tạo ra 3 bản sao của chuỗi đầu vào
Vấn đề này có thể được giải quyết bằng cách chuyển đổi đầu vào của người dùng dự kiến là dữ liệu số thành dữ liệu số trước khi thực hiện các phép tính số học. Ví dụ: đoạn mã sau sẽ dẫn đến kết quả mong đợi
# Create an example string s1 = "alpharithms" print[s1] # concatenate some text s1 += " is cool." print[s1] # output alpharithms alpharithms is cool.2
Ví dụ x. Sử dụng các đối tượng mảng byte để thao tác chuỗi
Python tạo các bản sao mới của bất kỳ chuỗi nào trong đó các thao tác thay đổi được thực hiện. Là một mô tả ngụ ý rộng rãi - Python phân bổ bộ nhớ mới khi các chuỗi bị thay đổi. Như vậy, việc thực hiện một số lượng lớn thao tác chuỗi có thể trở thành gánh nặng cho bộ nhớ. Để giải quyết vấn đề này, các mảng byte có thể được tạo như vậy
# Create an example string s1 = "alpharithms" print[s1] # concatenate some text s1 += " is cool." print[s1] # output alpharithms alpharithms is cool.3
Chúng tôi có toàn bộ bài viết dành riêng cho chủ đề sử dụng các đối tượng byteary Python. Hãy xem nó để tìm hiểu thêm về chức năng tích hợp sẵn này của Python và cách nó liên quan đến thao tác chuỗi
Suy nghĩ cuối cùng
Chuỗi Python chỉ là một trong nhiều loại dữ liệu được cung cấp cho các nhà phát triển. Các quyết định được đưa ra trong quá trình phát triển của Python ưu tiên sự dễ dàng về cú pháp so với. ưu tiên khái niệm sao cho có thể sử dụng các cú pháp hơi kỳ quặc như sử dụng toán tử
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment6 để tạo các bản sao của chuỗi. Tuy nhiên, xa lạ so với các ngôn ngữ lập trình phổ biến khác, cách tiếp cận này chắc chắn là thuận tiện
Ở đây chúng ta đã thấy cách sử dụng các toán tử số học để thao tác các chuỗi Python. Lỗi phổ biến nhất là khi cố gắng nhân thông qua các giá trị dấu phẩy động hoặc tạo bản sao thay vì giá trị số từ đầu vào của người dùng. Ghi nhớ những điều này có thể giúp tận dụng sức mạnh của cú pháp thao tác chuỗi Python mà không tạo ra một
# create a string s1 = "alpharithms" # attempt to remove the s from the end s1[-1] = "" TypeError: 'str' object does not support item assignment4