zoukankan      html  css  js  c++  java
  • 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'xe4xb8xadxe5x9bxbdxe4xbaxbaxe6xb0x91'
    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/
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    完整版:资深程序员都了解的代码复用法则
    Shiro学习总结(10)——Spring集成Shiro
    Shiro学习总结(2)——Apache Shiro快速入门教程
    Shiro学习总结(2)——Apache Shiro快速入门教程
    Mysql学习总结(15)——Mysql错误码大全
    Mysql学习总结(15)——Mysql错误码大全
    ActiveMQ学习总结(6)——ActiveMQ集成Spring和Log4j实现异步日志
    ActiveMQ学习总结(6)——ActiveMQ集成Spring和Log4j实现异步日志
    对话:一个工程师在蘑菇街4年的架构感悟
    这种反爬虫手段有点意思,看我破了它!
  • 原文地址:https://www.cnblogs.com/gaosai/p/9825035.html
Copyright © 2011-2022 走看看