Câu trả lời:
Như Julian đã chỉ ra,
for c in "string":
#do something with c
Bạn có thể lặp lại khá nhiều thứ trong python bằng cách sử dụng for loop
cấu trúc,
ví dụ, open("file.txt")
trả về một đối tượng tệp (và mở tệp), lặp lại qua nó lặp lại qua các dòng trong tệp đó
with open(filename) as f:
for line in f:
# do something with line
Nếu điều đó có vẻ giống như phép thuật, thì cũng tốt, nhưng ý tưởng đằng sau nó thực sự đơn giản.
Có một giao thức lặp đơn giản có thể được áp dụng cho bất kỳ loại đối tượng nào để làm cho for
vòng lặp hoạt động trên nó.
Đơn giản chỉ cần thực hiện một trình vòng lặp xác định một next()
phương thức và thực hiện một __iter__
phương thức trên một lớp để làm cho nó có thể lặp lại được. ( __iter__
tất nhiên, sẽ trả về một đối tượng iterator, nghĩa là một đối tượng xác định next()
)
Nếu bạn cần truy cập vào chỉ mục khi bạn lặp qua chuỗi, hãy sử dụng enumerate()
:
>>> for i, c in enumerate('test'):
... print i, c
...
0 t
1 e
2 s
3 t
1 t
, 2 e
, 3 s
, 4 t
sử dụng tham số "bắt đầu":for i, c in enumerate('test', start=1)
Thậm chí dễ dàng hơn:
for c in "test":
print c
for c in "test": print (c)
Tại sao?
Chỉ cần đưa ra một câu trả lời toàn diện hơn, cách lặp C trên một chuỗi có thể áp dụng trong Python, nếu bạn thực sự muốn buộc một chốt vuông vào một lỗ tròn.
i = 0
while i < len(str):
print str[i]
i += 1
Nhưng một lần nữa, tại sao lại làm như vậy khi các chuỗi vốn đã lặp lại?
for i in str:
print i
for i in range(len(...))
là xấu xa Trong python 2.x, range()
tạo một danh sách, vì vậy trong một thời gian rất dài, bạn có thể sẽ phân bổ một khối bộ nhớ rất lớn. Ít nhất là sử dụng xrange()
trong những trường hợp đó. Ngoài ra, việc lập chỉ mục lặp lại của cùng một chuỗi chậm hơn nhiều so với việc lặp trực tiếp qua chuỗi. Nếu bạn cần chỉ mục, sử dụng enumerate()
.
Vâng, bạn cũng có thể làm một cái gì đó thú vị như thế này và thực hiện công việc của mình bằng cách sử dụng vòng lặp
#suppose you have variable name
name = "Mr.Suryaa"
for index in range ( len ( name ) ):
print ( name[index] ) #just like c and c++
Câu trả lời là
Ông . S uryaa
Tuy nhiên, vì phạm vi () tạo danh sách các giá trị theo thứ tự, do đó bạn có thể trực tiếp sử dụng tên
for e in name:
print(e)
Điều này cũng tạo ra kết quả tương tự và cũng có vẻ tốt hơn và hoạt động với bất kỳ chuỗi nào như danh sách, bộ dữ liệu và từ điển.
Chúng tôi đã sử dụng chức năng kéo được xây dựng (BIFs trong cộng đồng Python)
1) phạm vi () - phạm vi () BIF được sử dụng để tạo chỉ mục Ví dụ
for i in range ( 5 ) :
can produce 0 , 1 , 2 , 3 , 4
2) len () - len () BIF được sử dụng để tìm ra độ dài của chuỗi đã cho
Nếu bạn muốn sử dụng một cách tiếp cận chức năng hơn để lặp qua một chuỗi (có lẽ để chuyển đổi nó bằng cách nào đó), bạn có thể chia chuỗi thành các ký tự, áp dụng một hàm cho từng chuỗi, sau đó nối danh sách kết quả của các ký tự thành một chuỗi.
Một chuỗi vốn là một danh sách các ký tự, do đó 'map' sẽ lặp lại chuỗi đó - như là đối số thứ hai - áp dụng hàm - đối số thứ nhất - cho mỗi ký tự.
Ví dụ, ở đây tôi sử dụng cách tiếp cận lambda đơn giản vì tất cả những gì tôi muốn làm là một sửa đổi nhỏ cho ký tự: ở đây, để tăng từng giá trị ký tự:
>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'
hay nói chung hơn:
>>> ''.join(map(my_function, my_string))
trong đó my_function lấy giá trị char và trả về giá trị char.
Một số câu trả lời ở đây sử dụng range
. xrange
nói chung là tốt hơn vì nó trả về một trình tạo, thay vì một danh sách được khởi tạo đầy đủ. Trong đó bộ nhớ và hoặc các vòng lặp có độ dài khác nhau có thể là một vấn đề, xrange
là ưu việt.
Nếu bạn từng chạy trong một tình huống mà bạn cần get the next char of the word using __next__()
, hãy nhớ tạo string_iterator
và lặp lại nó chứ không phảioriginal string (it does not have the __next__() method)
Trong ví dụ này, khi tôi tìm thấy char = [
Tôi tiếp tục tìm từ tiếp theo trong khi tôi không tìm thấy ]
, vì vậy tôi cần sử dụng __next__
đây là một vòng lặp cho chuỗi sẽ không giúp
myString = "'string' 4 '['RP0', 'LC0']' '[3, 4]' '[3, '4']'"
processedInput = ""
word_iterator = myString.__iter__()
for idx, char in enumerate(word_iterator):
if char == "'":
continue
processedInput+=char
if char == '[':
next_char=word_iterator.__next__()
while(next_char != "]"):
processedInput+=next_char
next_char=word_iterator.__next__()
else:
processedInput+=next_char