Có bao nhiêu byte là một chuỗi trong python?

“Chuỗi” trong Python? . Tuy nhiên, bạn có biết có ít nhất bốn loại chuỗi trong Python nguyên thủy không?

Ở đây, hãy để tôi cố gắng giải tỏa một số nhầm lẫn của bạn dựa trên kinh nghiệm học tập của riêng tôi. Chúng tôi sẽ đề cập đến những chủ đề này

  1. Khái niệm “Mã hóa” và “Giải mã” là gì?
  2. Chuỗi thô (r) hoặc chuỗi định dạng (f) là gì và khi nào tôi nên sử dụng chúng?
  3. Sự khác biệt giữa chuỗi Numpy/Pandas và chuỗi Python nguyên thủy là gì?

Chuỗi byte và Chuỗi Unicode (chuỗi Python3 mặc định) — Đó là tất cả về Mã hóa

Để hiểu sự khác biệt giữa chuỗi byte và chuỗi Unicode, trước tiên chúng ta cần biết “Mã hóa” và “Giải mã” là gì

Mã hóa và giải mã (Hình ảnh của tác giả)

Để lưu trữ các ký tự mà con người có thể đọc được trên máy tính, chúng ta cần mã hóa chúng thành byte. Ngược lại, chúng ta cần giải mã các byte thành các ký tự mà con người có thể đọc được để biểu diễn. Byte, trong khoa học máy tính, biểu thị đơn vị 0/1, thường có độ dài 8. Vì vậy, các ký tự “Xin chào” thực sự được lưu trữ dưới dạng “01001000 01101001” trên máy tính, tiêu tốn 2 byte (16 bit)

Quy tắc xác định quy trình mã hóa được gọi là lược đồ mã hóa, những quy tắc thường được sử dụng bao gồm “ASCII”, “UTF-8”, v.v. Bây giờ, câu hỏi là các lược đồ mã hóa này trông như thế nào?

“ASCII” chuyển đổi từng ký tự thành một byte. Vì một byte bao gồm 8 bit và mỗi bit chứa 0/1. Tổng số ký tự “ASCII” có thể đại diện là 2⁸=256. Nó là quá đủ cho 26 chữ cái tiếng Anh cộng với một số ký tự thường dùng. Xem bảng “ASCII” để biết thông tin đầy đủ

Tuy nhiên, 256 ký tự rõ ràng là không đủ để lưu trữ tất cả các ký tự trên thế giới. Trước tình hình đó, người ta đã thiết kế Unicode trong đó mỗi ký tự sẽ được mã hóa thành một “điểm mã”. Chẳng hạn, “H” sẽ được biểu thị dưới dạng điểm mã “U+0048”. Theo Wikipedia, Unicode có thể bao gồm 144.697 ký tự. Nhưng một lần nữa, máy tính vẫn không thể nhận ra điểm mã, vì vậy chúng tôi có lược đồ mã hóa “UTF-8” hoặc các biến thể khác để chuyển đổi điểm mã thành byte. “UTF-8” có nghĩa là độ dài bit tối thiểu để biểu thị một ký tự là 8, vì vậy bạn có thể đoán, “UTF-16” có nghĩa là độ dài tối thiểu của bit là 16. UTF-8 phổ biến hơn nhiều so với UTF-16, vì vậy trong bài viết này và đối với hầu hết công việc của bạn vì chúng tương thích với tiêu chuẩn ASCII gốc cũ (một ký tự có thể được biểu thị bằng một byte), hiểu UTF-8 là đủ. Xem bảng “UTF-8” để biết thông tin đầy đủ

Với các khái niệm cơ bản đã hiểu, hãy cùng tìm hiểu một số mẹo mã hóa thực tế trong Python. Trong Python3, chuỗi mặc định được gọi là chuỗi Unicode (u string), bạn có thể hiểu chúng là những ký tự mà con người có thể đọc được. Như đã giải thích ở trên, bạn có thể mã hóa chúng thành chuỗi byte (chuỗi b) và chuỗi byte có thể được giải mã trở lại chuỗi Unicode

u'Hi'.encode('ASCII')
> b'Hi'
b'\x48\x69'.decode('ASCII')
> 'Hi'

Trong Python IDE, thông thường, chuỗi byte sẽ được giải mã tự động bằng cách sử dụng “ASCII” khi được in ra, vì vậy đó là lý do tại sao kết quả đầu tiên có thể đọc được bằng con người (b’Hi'). Thường xuyên hơn, chuỗi Byte phải được biểu diễn dưới dạng mã hex (b’\x48\x69'), mã này có thể tìm thấy trong bất kỳ bảng “ASCII” nào

Để kết thúc phần này, chúng ta hãy xem một ví dụ “UTF-8”, một lần nữa mã hex cho mọi ký tự có thể được tìm thấy trong bảng UTF-8

b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
Chuỗi thô

Để bắt đầu với loại chuỗi này, chúng ta chỉ cần biết một điều về chuỗi Unicode mặc định (chuỗi u) — dấu gạch chéo ngược (“\”) là một ký tự đặc biệt trong chuỗi Unicode sao cho ký tự theo sau sẽ có ý nghĩa đặc biệt (i. e. \t, \n, v.v.). Vì vậy, để bỏ qua ý nghĩa đặc biệt của dấu gạch chéo ngược, chúng ta có chuỗi Nguyên (chuỗi r) trong đó dấu gạch chéo ngược chỉ là dấu gạch chéo ngược và nó sẽ không có tác dụng thay đổi ý nghĩa của các ký tự theo sau nó

Chuỗi Unicode và Nguyên (Hình ảnh của Tác giả)

Đây là đề xuất cá nhân của tôi, trừ khi trong trường hợp bạn cần xác định mẫu đối sánh biểu thức chính quy (Xem ví dụ bên dưới), tôi khuyên bạn nên sử dụng chuỗi Unicode có thoát (sử dụng dấu gạch chéo ngược để bỏ qua ký tự đặc biệt). Như được hiển thị trong ví dụ thứ ba, chúng tôi đã sử dụng dấu gạch chéo ngược để đảm bảo rằng chúng tôi xuất ra một chữ “\” thay vì một tab mới “\t”

Tại sao tôi muốn giới thiệu điều đó?

r'ttt'g''File "", line 1
r'ttt'g''
^
SyntaxError: invalid syntax

Tuy nhiên, sử dụng ý tưởng thoát cùng với chuỗi Unicode dường như là một cách tiếp cận tổng quát hơn

u'ttt\'g\''> "ttt'g'"

Nơi duy nhất mà Chuỗi thô (chuỗi r) có thể hữu ích là khi bạn đang xử lý biểu thức chính quy. Biểu thức chính quy là cả một hộp sâu và tôi không có ý định đề cập đến điều đó trong bài viết này. Nhưng khi sử dụng biểu thức chính quy, trước tiên chúng ta cần xác định một mẫu phù hợp trong đó chuỗi Nguyên sẽ được đề xuất

import re
pat = re.compile(r'ENSG\d+$')
string = 'ENSG00000555'
re.search(pat,string)
<_sre.SRE_Match object; span=(0, 12), match='ENSG00000555'>
Định dạng chuỗi

Đối với các lập trình viên Python có kinh nghiệm, chuỗi định dạng không phải là một khái niệm xa lạ, nó cho phép bạn định cấu hình động chuỗi mà chúng ta muốn in. Trước phiên bản Python 3. 5, cách tiếp cận được đề xuất để tạo chuỗi định dạng là như vậy

var = 'hello'
print('{} world'.format(var))
> hello world

Kể từ Python 3. 5 trở lên, có một “chuỗi f” mới để giúp chúng tôi đạt được mục tiêu tương tự

var = 'hello'
print(f'{var} world')
> hello world

Điều quan trọng mà tôi muốn lưu ý ở đây là, khi sử dụng chuỗi định dạng, dấu ngoặc nhọn “{}” trở thành một ký tự rất đặc biệt và chứa đựng ý nghĩa riêng của nó. Do đó, nếu chúng ta vẫn muốn xuất ra chữ “{}”, thì chúng ta cần thoát nó bằng cách sử dụng dấu ngoặc nhọn kép “{{}}”

'{{}}{}'.format(5)> '{}5'

Ngoài ra, hãy cẩn thận với cả

b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
3 trong chuỗi định dạng (hoặc các số khác sau dấu gạch chéo ngược)

# Make sure to write the command in a python file and execute the python file
'ttt {} \1'.format('rr')
> ttt rr
'ttt {} \\1'.format('rr')
> ttt rr \1

Xin lưu ý rằng trong đoạn mã trên nơi đầu ra được tạo bằng cách chạy tệp python, nếu bạn sử dụng bảng điều khiển Python tương tác, nó sẽ gây nhầm lẫn vì đầu ra thực sự được mã hóa tự động thành byte

# if using interactive python console
'ttt {} \1'.format('rr')
> 'ttt rr \x01'
'ttt {} \\1'.format('rr')
> 'ttt rr \\1'

Cuối cùng nhưng không kém phần quan trọng, có thể thực hiện chuỗi

b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
4, trong đó chúng tôi muốn xây dựng một chuỗi thô cho biểu thức chính quy nhưng chúng tôi muốn bọc một số biến trong đó

b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
0Chuỗi trong Numpy và Pandas

Những gì chúng tôi đã trình bày cho đến nay là tất cả về các kiểu chuỗi nguyên thủy trong Python, chúng tôi chưa đề cập đến cách xử lý chuỗi trong các gói Python phổ biến khác. Ở đây tôi sẽ chia sẻ một chút về các loại chuỗi trong Numpy và Pandas

Trong Numpy, thông thường, String có thể được chỉ định trong ba "dtypes" khác nhau

  1. Unicode có độ dài thay đổi (U)
  2. Byte có độ dài cố định (S)
  3. Đối tượng Python (O)
b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
1

b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
5 có nghĩa là chuỗi dài nhất là chuỗi có độ dài 5, tuy nhiên, một cách tiết kiệm bộ nhớ hơn là sử dụng
b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
6 có độ dài cố định, về cơ bản chuyển đổi chúng thành chuỗi byte. Đây là cách ưa thích nếu bạn đang cố gắng chuyển đổi nó sang cấu trúc dữ liệu kiểu mạnh (tôi. e. lưu trữ dưới dạng tệp h5). Ngoài ra, chúng ta có thể coi các chuỗi là các đối tượng Python và lưu trữ chúng trong mảng Numpy, vì mọi đối tượng Python đều có thể được lưu trữ trong mảng Numpy bằng cách sử dụng kiểu “đối tượng”.

Chuỗi trong gấu trúc có thể được biểu diễn theo hai cách

  1. đối tượng dtype (hầu hết thời gian sẽ ổn thôi)
  2. chuỗi dtype
b'\xe0\xb0\x86'.decode('utf-8')
> 'ఆ'
2

Hai loại này nói chung là tương tự nhau, sự khác biệt tinh tế được nêu trong

Phần kết luận

Tóm lại, chúng ta đã nói về các cách biểu diễn khác nhau của “chuỗi” trong Python. Bắt đầu với chuỗi Unicode mặc định (chuỗi u), chúng tôi đã chạm vào cách nó liên quan đến chuỗi Byte (chuỗi b). Hiểu chuyển đổi là rất quan trọng vì đôi khi đầu ra tiêu chuẩn từ các chương trình khác sẽ ở định dạng byte và trước tiên chúng ta cần giải mã chúng thành chuỗi Unicode để tiếp tục hoạt động Truyền phát. Sau đó chúng ta nói về Chuỗi thô (chuỗi r) và Chuỗi định dạng (chuỗi f) và những lưu ý chúng ta cần chú ý khi sử dụng chúng. Cuối cùng, chúng tôi đã tóm tắt các cách biểu diễn chuỗi khác nhau trong Numpy và Pandas, và cần đặc biệt cẩn thận khi khởi tạo các đối tượng Numpy hoặc Pandas bằng chuỗi vì các hành vi sẽ khác nhiều so với các chuỗi Python nguyên thủy

Đó là về nó. Tôi hy vọng bạn thấy bài viết này thú vị và hữu ích, cảm ơn vì đã đọc. Nếu bạn thích bài viết này, hãy theo dõi tôi trên phương tiện, cảm ơn bạn rất nhiều vì sự ủng hộ của bạn. Kết nối với tôi trên Twitter hoặc LinkedIn của tôi, đồng thời vui lòng cho tôi biết nếu bạn có bất kỳ câu hỏi nào hoặc loại hướng dẫn nào bạn muốn xem trong tương lai

Có bao nhiêu byte là một chuỗi?

Nhưng còn chuỗi thì sao? . Một tiêu đề đối tượng 8-byte (4-byte SyncBlock và một bộ mô tả loại 4-byte)

Kích thước của chuỗi trong Python là gì?

Để tính độ dài của một chuỗi trong Python, bạn có thể sử dụng phương thức len() tích hợp sẵn . Nó nhận một chuỗi làm tham số và trả về một số nguyên là độ dài của chuỗi đó. Ví dụ: len(“education”) sẽ trả về 9 vì có 9 ký tự trong “education”.

Có bao nhiêu bit là một chuỗi?

Thuật ngữ chuỗi bit . Một cách nhỏ gọn hơn để con người chúng ta viết ra các chuỗi bit dài là sử dụng dạng hex (hex chỉ là ký hiệu; chuỗi bit vẫn bao gồm các số 0 và 1 bên trong máy). Chuỗi bit được chia thành các nhóm 4 bit mỗi nhóm. 8 bits. A more compact way for us humans to write down long bit strings is to use hex form (hex is just notation; the bit string still consists of 0s and 1s inside the machine). The bit string is partitioned into groups of 4 bits each.

Là chuỗi hoặc byte trong Python?

Đối tượng Byte là chuỗi Byte, trong khi Chuỗi là chuỗi ký tự . Các đối tượng byte ở dạng có thể đọc được bằng máy bên trong, Chuỗi chỉ ở dạng có thể đọc được của con người. Vì các đối tượng Byte có thể đọc được bằng máy nên chúng có thể được lưu trữ trực tiếp trên đĩa.