Hướng dẫn how do you append a character in python? - làm thế nào để bạn thêm một ký tự trong python?

Đối tượng chuỗi Python là bất biến. Vì vậy, mỗi khi chúng tôi sử dụng toán tử + để kết hợp hai chuỗi, một chuỗi mới được tạo. Nếu chúng ta phải nối nhiều chuỗi, sử dụng toán tử + sẽ tạo ra nhiều chuỗi tạm thời trước khi chúng ta có kết quả cuối cùng.

Chuỗi python nối

Chúng ta hãy nhìn vào một chức năng để kết hợp một chuỗi ’n lần.

def str_append(s, n):
    output = ''
    i = 0
    while i < n:
        output += s
        i = i + 1
    return output

Lưu ý rằng tôi đang xác định chức năng này để giới thiệu việc sử dụng toán tử +. Sau này tôi sẽ sử dụng mô -đun thời gian để kiểm tra hiệu suất. Nếu bạn chỉ đơn giản muốn kết hợp một chuỗi ’n lần, bạn có thể làm điều đó dễ dàng bằng cách sử dụng

def str_append_list_join(s, n):
    l1 = []
    i = 0
    while i < n:
        l1.append(s)
        i += 1
    return ''.join(l1)
0.

Một cách khác để thực hiện hoạt động chuỗi nối là bằng cách tạo một danh sách và nối các chuỗi vào danh sách. Sau đó, sử dụng hàm nối chuỗi () để hợp nhất chúng lại với nhau để lấy chuỗi kết quả.

def str_append_list_join(s, n):
    l1 = []
    i = 0
    while i < n:
        l1.append(s)
        i += 1
    return ''.join(l1)

Hãy để thử nghiệm các phương pháp này để đảm bảo rằng chúng đang hoạt động như mong đợi.

if __name__ == "__main__":
    print('Append using + operator:', str_append('Hi', 10))
    print('Append using list and join():', str_append_list_join('Hi', 10))
    # use below for this case, above methods are created so that we can
    # check performance using timeit module
    print('Append using * operator:', 'Hi' * 10)

Output:

Append using + operator: HiHiHiHiHiHiHiHiHiHi
Append using list and join(): HiHiHiHiHiHiHiHiHiHi
Append using * operator: HiHiHiHiHiHiHiHiHiHi

Cách tốt nhất để nối các chuỗi trong Python

Tôi có cả hai phương thức được xác định trong tệp

def str_append_list_join(s, n):
    l1 = []
    i = 0
    while i < n:
        l1.append(s)
        i += 1
    return ''.join(l1)
1. Hãy để sử dụng mô -đun thời gian để kiểm tra hiệu suất của họ.

$ python3.7 -m timeit --number 1000 --unit usec 'import string_append' 'string_append.str_append("Hello", 1000)' 
1000 loops, best of 5: 174 usec per loop
$ python3.7 -m timeit --number 1000 --unit usec 'import string_append' 'string_append.str_append_list_join("Hello", 1000)'
1000 loops, best of 5: 140 usec per loop

$ python3.7 -m timeit --number 1000 --unit usec 'import string_append' 'string_append.str_append("Hi", 1000)' 
1000 loops, best of 5: 165 usec per loop
$ python3.7 -m timeit --number 1000 --unit usec 'import string_append' 'string_append.str_append_list_join("Hi", 1000)'
1000 loops, best of 5: 139 usec per loop

Hướng dẫn how do you append a character in python? - làm thế nào để bạn thêm một ký tự trong python?

Bản tóm tắt

Nếu có một vài chuỗi, thì bạn có thể sử dụng bất kỳ phương pháp nào để nối chúng. Từ góc độ dễ đọc, sử dụng toán tử + có vẻ tốt hơn đối với một vài chuỗi. Tuy nhiên, nếu bạn phải nối nhiều chuỗi, thì bạn nên sử dụng hàm danh sách và tham gia ().

Bạn có thể kiểm tra toàn bộ tập lệnh Python và nhiều ví dụ về Python từ Kho lưu trữ GitHub của chúng tôi.

Nếu bạn chỉ có một tham chiếu đến một chuỗi và bạn kết hợp một chuỗi khác vào cuối, thì CPython hiện các trường hợp đặc biệt này và cố gắng mở rộng chuỗi tại chỗ.

Kết quả cuối cùng là hoạt động được khấu hao o (n).

e.g.

s = ""
for i in range(n):
    s+=str(i)

Đã từng là o (n^2), nhưng bây giờ nó là o (n).

Từ nguồn (byteObject.c):

void
PyBytes_ConcatAndDel(register PyObject **pv, register PyObject *w)
{
    PyBytes_Concat(pv, w);
    Py_XDECREF(w);
}


/* The following function breaks the notion that strings are immutable:
   it changes the size of a string.  We get away with this only if there
   is only one module referencing the object.  You can also think of it
   as creating a new string object and destroying the old one, only
   more efficiently.  In any case, don't use this if the string may
   already be known to some other part of the code...
   Note that if there's not enough memory to resize the string, the original
   string object at *pv is deallocated, *pv is set to NULL, an "out of
   memory" exception is set, and -1 is returned.  Else (on success) 0 is
   returned, and the value in *pv may or may not be the same as on input.
   As always, an extra byte is allocated for a trailing \0 byte (newsize
   does *not* include that), and a trailing \0 byte is stored.
*/

int
_PyBytes_Resize(PyObject **pv, Py_ssize_t newsize)
{
    register PyObject *v;
    register PyBytesObject *sv;
    v = *pv;
    if (!PyBytes_Check(v) || Py_REFCNT(v) != 1 || newsize < 0) {
        *pv = 0;
        Py_DECREF(v);
        PyErr_BadInternalCall();
        return -1;
    }
    /* XXX UNREF/NEWREF interface should be more symmetrical */
    _Py_DEC_REFTOTAL;
    _Py_ForgetReference(v);
    *pv = (PyObject *)
        PyObject_REALLOC((char *)v, PyBytesObject_SIZE + newsize);
    if (*pv == NULL) {
        PyObject_Del(v);
        PyErr_NoMemory();
        return -1;
    }
    _Py_NewReference(*pv);
    sv = (PyBytesObject *) *pv;
    Py_SIZE(sv) = newsize;
    sv->ob_sval[newsize] = '\0';
    sv->ob_shash = -1;          /* invalidate cached hash value */
    return 0;
}

Nó đủ dễ dàng để xác minh theo kinh nghiệm.

$ python -m timeit -s"s=''" "for i in xrange(10):s+='a'"
1000000 loops, best of 3: 1.85 usec per loop
$ python -m timeit -s"s=''" "for i in xrange(100):s+='a'"
10000 loops, best of 3: 16.8 usec per loop
$ python -m timeit -s"s=''" "for i in xrange(1000):s+='a'"
10000 loops, best of 3: 158 usec per loop
$ python -m timeit -s"s=''" "for i in xrange(10000):s+='a'"
1000 loops, best of 3: 1.71 msec per loop
$ python -m timeit -s"s=''" "for i in xrange(100000):s+='a'"
10 loops, best of 3: 14.6 msec per loop
$ python -m timeit -s"s=''" "for i in xrange(1000000):s+='a'"
10 loops, best of 3: 173 msec per loop

Tuy nhiên, điều quan trọng cần lưu ý là tối ưu hóa này không phải là một phần của thông số Python. Nó chỉ trong việc triển khai Cpython theo như tôi biết. Ví dụ, cùng một thử nghiệm thực nghiệm trên Pypy hoặc Jython có thể hiển thị hiệu suất O (N ** 2) cũ hơn. however to note that this optimisation isn't part of the Python spec. It's only in the cPython implementation as far as I know. The same empirical testing on pypy or jython for example might show the older O(n**2) performance .

$ pypy -m timeit -s"s=''" "for i in xrange(10):s+='a'"
10000 loops, best of 3: 90.8 usec per loop
$ pypy -m timeit -s"s=''" "for i in xrange(100):s+='a'"
1000 loops, best of 3: 896 usec per loop
$ pypy -m timeit -s"s=''" "for i in xrange(1000):s+='a'"
100 loops, best of 3: 9.03 msec per loop
$ pypy -m timeit -s"s=''" "for i in xrange(10000):s+='a'"
10 loops, best of 3: 89.5 msec per loop

Cho đến nay rất tốt, nhưng sau đó,

$ pypy -m timeit -s"s=''" "for i in xrange(100000):s+='a'"
10 loops, best of 3: 12.8 sec per loop

ouch thậm chí còn tồi tệ hơn bậc hai. Vì vậy, Pypy đang làm một cái gì đó hoạt động tốt với các chuỗi ngắn, nhưng hoạt động kém cho các chuỗi lớn hơn.

Tôi có thể nối một char vào một chuỗi không?

Sử dụng hàm strncat () để nối các ký tự CH ở cuối str. strncat () là một hàm được xác định trước được sử dụng để xử lý chuỗi. sợi dây.. strncat() is a predefined function used for string handling. string.

Nhân vật phụ lục là gì?

Phương thức nối (char c) nối thêm biểu diễn chuỗi của đối số char vào chuỗi này.Đối số được nối liền với nội dung của chuỗi này.Độ dài của chuỗi này tăng thêm 1.appends the string representation of the char argument to this sequence. The argument is appended to the contents of this sequence. The length of this sequence increases by 1.