for x in y(): how does this work?
我在寻找代码来在终端中旋转光标,找到了这个。我想知道密码里发生了什么。尤其是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import sys import time def spinning_cursor(): cursor='/-\|' i = 0 while 1: yield cursor[i] i = (i + 1) % len(cursor) for c in spinning_cursor(): sys.stdout.write(c) sys.stdout.flush() time.sleep(0.1) sys.stdout.write('\b') |
使用
通过在python提示符中创建上的生成器,可以看到这一点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | >>> def spinning_cursor(): ... cursor='/-\|' ... i = 0 ... while 1: ... yield cursor[i] ... i = (i + 1) % len(cursor) ... >>> sc = spinning_cursor() >>> sc <generator object spinning_cursor at 0x107a55eb0> >>> next(sc) '/' >>> next(sc) '-' >>> next(sc) '\' >>> next(sc) '|' |
这个特定的生成器永远不会返回,所以
在Python中,for语句允许您迭代元素。
根据文件:
Python’s for statement iterates over the items of any sequence (a list or a string), in the order that they appear in the sequence
这里,元素将是
循环内部将:
所以,最终输出将是一个ASCII微调器。您将看到这些字符(在同一个位置)重复,直到您杀死脚本。
1 2 3 4 | / - \ | |
马蒂金·彼得斯的解释很好。下面是问题中相同代码的另一个实现。它使用itertools.cycle生成与
1 2 3 4 5 6 7 | import sys, time, itertools for c in itertools.cycle('/-\|'): sys.stdout.write(c) sys.stdout.flush() time.sleep(0.1) sys.stdout.write('\b') |
spinning_cursor函数返回一个iterable(yield中的生成器)。
1 | for c in spinning_cursor(): |
会和
1 | for i in [1, 2, 3, 4]: |