python 的面试题总汇

函数作用域;

LEGB : L>E>G>B
L : local函数内部作用域
E : enclosing函数内部与内嵌函数之间
G : global全局作用域
B : build-in内置作用域

python中encode与decode(先加码,再解码)

str1 = '中国人民'
str2 = str1.encode('utf-8')  #将str1转换成utf-8的格式
#用dir()测试该字符串有什么方法
str3 = str2.decode('utf-8')  #将str2解码为一般字符串类型
print(str2)   #b'\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba\xe6\xb0\x91'
print(str3)   #中国人民

深入理解Python生成器(Generator)

在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

>>> mylist = [ x for x in range(1, 10)]
>>> mylist
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> gen = (x for x in range(1,10))
>>> gen
<generator object <genexpr> at 0x7f1d7fd0f5a0>

创建mylist和gen的区别仅在于最外层的[]和(),mylist是一个list,而gen是一个generator(生成器)。 我们可以直接打印出list的每一个元素,但我们怎么打印出generator的每一个元素呢? 如果要一个一个打印出来,可以通过generator的next()方法:

gen = (x for x in range(1,10))
print(type(gen))                       #<class 'generator'>
print(gen.__next__())           #1
print(gen.__next__())           #2

generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

其实我们可以使用for循环来代替next()方式, 这样才更符合高效的编程思路:

    >>> gen = ( x for x in range(1, 10))
    >>> for num in gen:
    ...     print num
    ... 
    1
    2
    3
    4
    5
    6
    7
    8
    9

yield的功能类似于return,但是不同之处在于它返回的是生成器

通常的for…in…循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。 它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存。下面我们看看yield的功能

yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码开始执行。 简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后开始。

除了next函数,生成器还支持send函数。该函数可以向生成器传递参数。 send可以强行修改上一个yield表达式值。比如函数中有一个yield赋值,

def func():
for i in range(1,10):
   n = yield i
   print(n)

f = func()
print(f.__next__())
f.send(666)
print(f.__next__())
print(f.__next__())

Python 中 Iterator和Iterable的区别
(转载:http://blog.csdn.net/passionkk/article/details/49929887)

Python中 list,truple,str,dict这些都可以被迭代,但他们并不是迭代器。为什么?

因为和迭代器相比有一个很大的不同,list/truple/map/dict这些数据的大小是确定的,也就是说有多少事可知的。但迭代器不是,迭代器不知道要执行多少次,所以可以理解为不知道有多少个元素,每调用一次next(),就会往下走一步,是惰性的。

判断是不是可以迭代,用Iterable

 from collections import Iterable  

isinstance({}, Iterable) --> True  

isinstance((), Iterable) --> True  

isinstance(100, Iterable) --> False  

判断是不是迭代器,用Iterator

from collections import Iterator  
isinstance({}, Iterator)  --> False  

isinstance((), Iterator) --> False  

isinstance( (x for x in range(10)), Iterator)  --> True  

所以, 
凡是可以for循环的,都是Iterable

凡是可以next()的,都是Iterator

集合数据类型如list,truple,dict,str,都是Itrable不是Iterator,但可以通过iter()函数获得一个Iterator对象

Python中的for循环就是通过next实现的

--------------------- 
作者:诸葛亮
来源:博客园
原文:https://www.cnblogs.com/gaosai/
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2018-10-21 14:51  今天的诸葛亮  阅读(102)  评论(0编辑  收藏  举报