美文网首页
面试题三(3)

面试题三(3)

作者: dongshangtong | 来源:发表于2019-05-13 13:33 被阅读0次

1.什么叫 迭代器?
(1)迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration。

(2)在for循环中,Python将自动调用工厂函数iter()获得迭代器,自动调用next()获取元素,还完成了检查StopIteration异常的工作。

(3)常用的几个内建数据结构tuple、list、set、dict都支持迭代器,字符串也可以使用迭代操作。

(4)你也可以自己实现一个迭代器,如上所述,只需要在类的iter方法中返回一个对象,这个对象拥有一个next()方法,这个方法能在恰当的时候抛出StopIteration异常即*。但是需要自己实现迭代器的时候不多,即使需要,使用生成器会更轻松。

class test:
    def __init__(self, input_list):
        self.list = input_list
        self.i = 0

    def __iter__(self):
        return self
    
    def next(self):
        if self.i == len(self.list):
            self.i = 0
            raise StopIteration
        self.i += 1
        return  self.list[self.i - 1]

2.什么叫生成器?
生成器的编写方法和函数定义类似,只是在return的地方改为yield。

生成器中可以有多个yield。当生成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。当再次调用生成器的时候,会从刚才暂停的地方继续运行,直到下一个yield。

生成器自身又构成一个迭代器,每次迭代时使用一个yield返回的值。

  1. 有没有自定义过数据类型?

有啊!比如我自定义一个只能放str 类型的数组。方便以后使用。

class List:
    def __init__(self,value):
        self.x=list(value)
    def append(self,value):
        if not isinstance(value,str):
            raise TypeError('append到列表的内的元素必须是str类型')
        self.x.append(value)
    def insert(self,index,value):
        self.x.insert(index,value)
    def __getattr__(self, item):
        return getattr(self.x,item)

    @property
    def type(self):
        print(self.x)
        t=int(len(self.x)/2)
        print(self.x[t],type(self.x[t]))


l=List([1,2,3])
l.append("egon")
l.append('hello')
l.append('alex')
l.insert(7,5)
l.pop()
l.type

3.谈谈你对restful 规范的理解?
- restful其实就是一套编写接口的协议,协议规定如何编写以及如何设置返回值、状态码等信息。
- 最显著的特点:
restful: 给用户一个url,根据method不同在后端做不同的处理,比如:post 创建数据、get获取数据、put和patch修改数据、delete删除数据。
no rest: 给调用者很多url,每个url代表一个功能,比如:add_user/delte_user/edit_user/
- 当然,还有协议其他的,比如:
- 版本,来控制让程序有多个版本共存的情况,版本可以放在 url、请求头(accept/自定义)、GET参数
- 状态码,200/300/400/500
- url中尽量使用名词,restful也可以称为“面向资源编程”
- api标示:
api.luffycity.com
www.luffycity.com/api/
...
.....
2. 你的restful是怎么学的?
- 因为之前公司要写这样项目
- 接口
- 公司要做前后端分离的项目
- 公司要做微信小程序的开发
- 所以就开始学习restful规范,看的技术文章 阮一峰的博客学到的规范。

    3. 状态码都有哪些?
    
    4. method都有哪些?
    
    5. 常见请求头有哪些?
    
    6. 你是用什么开发的restful接口?
        使用django rest framework框架。
        
    7. 为什么要使用django rest framework框架?
        在编写接口时可以不适用django rest framework框架,
        
        如果不使用:也可以做,那么就可以django的CBV来实现,开发者编写的代码会更多一些。
        如果  使用:内部帮助我们提供了很多方便的组件,我们通过配置就可以完成相应操作,如:
                    - 序列化,可以做用户请求数据校验+queryset对象的序列化称为json
                    - 解析器,获取用户请求数据request.data,会自动根据content-type请求头的不能对数据进行解析
                    - 分页,将从数据库获取到的数据在页面进行分页显示。
                    还有其他:
                        - 认证
                        - 权限
                        - 访问频率控制
                        - ... 
            
    8. rest framework 视图你都用过哪些基类?
        
        a. 继承 APIView
            这个类属于rest framework中顶层类,内部帮助我们实现了只是基本功能:认证、权限、频率控制,但凡是数据库、分页等操作都需要手动去完成,比较原始。
            
        
        
           class GenericAPIView(APIView)
                
                def post(...):
                    pass 
                
                
                
        b. 继承 GenericViewSet(ViewSetMixin, generics.GenericAPIView)
            如果继承它之后,路由中的as_view需要填写对应关系    .as_view({'get':'list','post':'create'})
            在内部也帮助我们提供了一些方便的方法:
                - get_queryset
                - get_object
                - get_serializer
            
            注意:要设置queryset字段,否则会跑出断言的异常。
            # 只提供增加功能
            class TestView(GenericViewSet):
                serializer_class = XXXXXXX

                def create(self,*args,**kwargs):
                    pass # 获取数据并对数据进行操作
    
            
        c. 继承 
                - ModelViewSet
                - mixins.CreateModelMixin,GenericViewSet
                - mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet
        
            对数据库和分页等操作不用我们在编写,只需要继承相关类即可。
            
            示例:只提供增加功能
            class TestView(mixins.CreateModelMixin,GenericViewSet):
                serializer_class = XXXXXXX
    
    
        类的继承关系
    
    
    9. 认证流程?
        - 如何编写?写类并实现authticate
        - 方法中可以定义三种返回值:
            - (user,auth),认证成功
            - None , 匿名用户
            - 异常 ,认证失败
        - 流程:
            - dispatch 
            - 再去request中进行认证处理
        
    10. 访问频率控制 
        - 匿名用户,根据用户IP或代理IP作为标识进行记录,为每一个用户在redis中创建一个列表
            {
                throttle_1.1.1.1:[1526868876.497521,152686885.497521...]
                throttle_1.1.1.2:[1526868876.497521,152686885.497521...]
                throttle_1.1.1.3:[1526868876.497521,152686885.497521...]
                throttle_1.1.1.4:[1526868876.497521,152686885.497521...]
                throttle_1.1.1.5:[1526868876.497521,152686885.497521...]
            }
            
            每个用户再来访问时,需要先去记录中剔除以及过期时间,再根据列表的长度判断是否可以继续访问。
            
            如何封IP:在防火墙中进行设置
        - 注册用户,根据用户名或邮箱进行判断。
            {
                throttle_xxxx1:[1526868876.497521,152686885.497521...]
                throttle_xxxx2:[1526868876.497521,152686885.497521...]
                throttle_xxxx3:[1526868876.497521,152686885.497521...]
                throttle_xxxx4:[1526868876.497521,152686885.497521...]
            
            }
            
            每个用户再来访问时,需要先去记录中剔除以及过期时间,再根据列表的长度判断是否可以继续访问。
    
        1分钟:40次

11. 接口的幂等性?(是否会造成2次伤害)
一个接口通过1次相同的访问,再对该接口进行N次相同的访问时候,对资源不造影响,那么就认为接口具有幂等性。
比如:
GET, 第一次获取结果、第二次也是获取结果对资源都不会造成影响,幂等。
POST,第一次新增数据,第二次也会再次新增,非幂等。
PUT, 第一次更新数据,第二次不会再次更新,幂等。
PATCH,第一次更新数据,第二次不会再次更新,非幂等。
DELTE,第一次删除数据,第二次不在再删除,幂等。

       12. Https和Http区别?
        端口:
        http:80
        https: 443 
        流程:
        - 自定义证书
        - 认证机构

相关文章

  • 前端面试题2022年前端面试题

    一、HTML面试题 二、CSS面试题 三、JavaScript面试题 四、H5/C3面试题 五、ES6面试题 六、...

  • this的指向的面试题

    面试题1 面试题2 面试题3 面试题4

  • 面试所涉及的问题

    面试题参考1 : 面试题 面试题参考2 : 内存管理 面试题参考3 :面试题 ...

  • 面试材料

    面试经验 面试题1 面试题2 面试题3 面试题4 面试题5 面试题6――数据结构 面试题7――网络 面试题8――汇...

  • Android 面试BAT大厂

    主要分为以下几部分: (1)java面试题 (2)Android面试题 (3)混合开发面试题 (4)高端技术面试题...

  • Android 面试BAT大厂

    主要分为以下几部分: (1)java面试题(2)Android面试题(3)混合开发面试题(4)高端技术面试题(5)...

  • android面试题和答案1

    主要分为以下几部分: (1)java面试题(2)Android面试题(3)混合开发面试题(4)高端技术面试题(5)...

  • l 主要分为以下几部分: (1)java 面试题 (2)Android 面试题 (3)高级开发技术面试题 (...

  • 面试题三(3)

    1.什么叫 迭代器?(1)迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会...

  • IOS面试(2018)

    经典面试题 非技术面试题 C面试题1 C面试题2 C面试题3 iOS笔试题01 iOS笔试题02 iOS笔试题03...

网友评论

      本文标题:面试题三(3)

      本文链接:https://www.haomeiwen.com/subject/yaulaqtx.html