python 生成器的唯一缺点 & enumerate被遗忘的start & 突然好奇in
2017-09-28 15:33
691 查看
1、
啊,在逛知乎的时候,遇到帖子(python生成器到底有什么优点?):https://www.zhihu.com/question/24807364
之前倒是知道优点,1、惰性加载,消耗内存少,2、用yield写代码后精简。
但是缺点倒是毫无印象:只能遍历一次。
接下来就用demo来看看是不是只能遍历一次吧。
demo:计算一个string里面的单词出现位置。
结果:
2、
其实比起生成器,我更在乎这个:enumerate(text,1)
这个enumerate我也经常用于计算list中的index,但是还是第一次看到后来还能带个参数1。。
查看官方文档:
3、
突然想知道,in 配合生成器,到底做了什么鬼操作了。
文件名4.py
可惜看不出什么鬼:
文档找不到。其实这个应该要涉及比较底层的东东,估计要去看C语言中对于in的实现。
不过在Stack Overflow:https://stackoverflow.com/questions/19775692/use-and-meaning-of-in-in-an-if-statement
找到这么一段话:
不过自己做的测试是,它会遍历直到找到这个19为止,返回True。如果遍历完后依旧找不到19,就False。
有趣的in。
以上
啊,在逛知乎的时候,遇到帖子(python生成器到底有什么优点?):https://www.zhihu.com/question/24807364
之前倒是知道优点,1、惰性加载,消耗内存少,2、用yield写代码后精简。
但是缺点倒是毫无印象:只能遍历一次。
接下来就用demo来看看是不是只能遍历一次吧。
demo:计算一个string里面的单词出现位置。
# -*- coding:utf-8 -*- def index_words(text): result = [] if text: result.append(0) for index, letter in enumerate(text,1): # 表示从1开始计数 if letter == ' ': result.append(index) return result def index_words_with_generator(text): if text: yield 0 for index, letter in enumerate(text, 1): if letter == ' ': yield index text = "You are so nice... Hello world!" print "index_words =", index_words(text) print "index_words_with_generator =", [v for v in index_words_with_generator(text)] # 唯一的缺点:生成器只能遍历一次 a = index_words_with_generator(text) b = sum(a) print 'sum(a) == ', b print 'start!' for i in a: print 'can not see this print...' print 'end!’
结果:
index_words = [0, 4, 8, 11, 19, 25] index_words_with_generator = [0, 4, 8, 11, 19, 25] sum(a) == 67 start! end!
2、
其实比起生成器,我更在乎这个:enumerate(text,1)
这个enumerate我也经常用于计算list中的index,但是还是第一次看到后来还能带个参数1。。
查看官方文档:
class enumerate(object): """ enumerate(iterable[, start]) -> iterator for index, value of iterable Return an enumerate object. iterable must be another object that supports iteration. The enumerate object yields pairs containing a count (from start, which defaults to zero) and a value yielded by the iterable argument. enumerate is useful for obtaining an indexed list: (0, seq[0]), (1, seq[1]), (2, seq[2]), ... """start表示计数开始位置,可怕,被教育了。
3、
突然想知道,in 配合生成器,到底做了什么鬼操作了。
print 0 in index_words_with_generator(text)
文件名4.py
# -*- coding:utf-8 -*- def index_words_with_generator(text): if text: yield 0 for index, letter in enumerate(text, 1): if letter == ' ': yield index text = "You are so nice... Hello world!" a = 19 in index_words_with_generator(text) ## 12行 print a ## 13行然后python -m dis 4.py:
(myapp_venv) ➜ myApp git:(v1.7_dev) ✗ python -m dis 4.py 2 0 LOAD_CONST 0 (<code object index_words_with_generator at 0x108c6cd30, file "4.py", line 2>) 3 MAKE_FUNCTION 0 6 STORE_NAME 0 (index_words_with_generator) 10 9 LOAD_CONST 1 ('You are so nice... Hello world!') 12 STORE_NAME 1 (text) 12 15 LOAD_CONST 2 (19) 18 LOAD_NAME 0 (index_words_with_generator) 21 LOAD_NAME 1 (text) 24 CALL_FUNCTION 1 27 COMPARE_OP 6 (in) 30 STORE_NAME 2 (a) 13 33 LOAD_NAME 2 (a) 36 PRINT_ITEM 37 PRINT_NEWLINE 38 LOAD_CONST 3 (None) 41 RETURN_VALUE
可惜看不出什么鬼:
12 15 LOAD_CONST 2 (19) # 19进栈 18 LOAD_NAME 0 (index_words_with_generator) # 函数名进栈 21 LOAD_NAME 1 (text) #函数参数进栈 24 CALL_FUNCTION 1 #调用index_words_with_generator(text) 27 COMPARE_OP 6 (in) # 判读in不in 30 STORE_NAME 2 (a) # 结果保存到a
文档找不到。其实这个应该要涉及比较底层的东东,估计要去看C语言中对于in的实现。
不过在Stack Overflow:https://stackoverflow.com/questions/19775692/use-and-meaning-of-in-in-an-if-statement
找到这么一段话:
38down voteaccepted | It depends on what next is. If it's a string (as in your example), then in checks for substrings. >>> "in" in "indigo" True >>> "in" in "violet" False >>> "0" in "10" True >>> "1" in "10" True If it's a different kind of iterable (list, tuple, dictionary...), then in checks for membership. |
有趣的in。
以上
相关文章推荐
- 第三篇:python高级之生成器&迭代器
- python 处理中文时出现的错误'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)" 解决方法
- error LNK2005: "int dir" (?dir@@3HA) already defined in GameStart.obj
- 【leetcode】532. K-diff Pairs in an Array(Python & C++)
- python语言优点&缺点
- Shallow Copy & Deep Copy in Python list
- Python中遇到"UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequ
- python·用生成器和迭代器实现自己的xrange
- 171026 the order between idx and item in enumerate with python
- python基础6之迭代器&生成器、json&pickle数据序列化
- 【python】error: (-215) ssize.width > 0 && ssize.height > 0 in function cv::resize
- python笔记3 - 布尔运算,位运算,字符串 str,转义序列,ASCII编码,len函数,隐式字符串拼接,in & not in 运算符
- How to start&stop WMA MSCA(Mobile) port in R12/11i system
- /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start'问题解决
- error LNK2005: "class CPoint StartPt" (?StartPt@@3VCPoint@@A) already defined in mypicture.obj 解决
- Python语言在数据挖掘上非常有优势,但它唯一的缺点你知道吗?
- Python学习之路7 - 生成器&迭代器
- Python求索之路3——迭代器&装饰器&生成器&正则
- 【Python】 Missing parentheses in call to 'print'
- Python入门的36个例子 之 25 -> Console In File Out