网易游戏python游戏开发一面

前几天面试了网易的一个游戏开发岗位,面试官问了几个问题,简单整理一下。

先是对着简历简单的问了一下在校经历,接着对简历上的项目进行了一下提问,虽然发挥的不好,还是再总结一下吧

1.MySQL常用的有那些引擎,MyISAM和innodb区别

MyISAM,InooDB,Memory

myisaminnodb
不支持事务支持事务
插入为主频繁修改
不支持外键支持外键
支持全文检索不支持全文检索
保存行数不保存行数
支持表锁支持行锁
非聚集索引聚集索引
可以热备份
缓冲池,可缓存数据和索引,加快查询速度
为处理巨大数据量的最大性能设计
  • 对于自增长的字段,innodb中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引
  • 清空整个表时,innodb是一行一行的删除,效率非常慢。MyISAM则会重建表

2.如何选择数据库引擎

  1. 支持事务选innodb,否则选MyISAM
  2. 查询多为只读选择myisam,有读有写选择innodb
  3. 系统崩溃后myisam恢复困难
  4. MySQL5.5以后innodb已经成为默认引擎,不知道选啥就用它

3.爬虫爬取的目标网站,怎么实现的

先是爬取页面抓取数据,后来感觉效率太低于是分析页面结构,找到了他的数据接口,直接从接口爬取数据

如何找的数据接口呢?

打开网页之后,打开浏览器的开发者模式,在网络请求里过滤一下,XHR是网页的ajax请求,找一下请求头的链接,分析一下参数的构造就可以了

4.设计模式

1.单例模式:这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

2.工厂模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

让其子类实现工厂接口,返回的也是一个抽象的产品。

3.MVC模式:

Model-View-Controller模式

Model:模型代表一个存取数据的对象。(数据库对象)

View:视图代表模型包含的数据的可视化。(页面显示)

Controller:控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。(业务逻辑)

4.MTV模式:

同MVC模式,MTV是Django下的MVC设计模式,只是换了个叫法

前后端分离,松耦合

5.寻路算法

A*寻路算法,他可以认为是Dijkstra算法的拓展,由于借助启发函数的引导,A*算法通常有较好的性能。

原理较复杂,没答出来

6.unity状态机Animator

Unity可以用两种方式控制动画

  1. Animations,这种方式简单,直接 Play(“Idle”) 或者 CorssFade(“Idle”) 就可以播放动画

  2. Animator,5.x之后推荐使用这种方式,因为里面可以加上混合动画,让动画切换更加平滑

animator的使用
  1. 导入模型和动作,做成预制件perfab
  2. 将模型的骨骼结构转换成unity中的对应的结构,比如人型的转换成humanoid
  3. 添加状态机控制器
  4. 编辑状态机控制器,切换动画播放的顺序
  5. 代码中控制动画播放的状态

7.Python分割字符串:

给定“I love guangzhou”,要求return[‘guangzhou’,‘love’,‘I’]

str='I love guangzhou'
def reverse(str):
    return str.split(' ')[::-1];

然后面试官说不能使用函数。。。手写split函数

def split(str,cut):
    str=str+cut;
    l=len(str);
    p=0;
    res=[]
    for i in range(l):
        if str[i]==cut:
            res.append(str[p:i]);
            p=i+1;
    return res;
if __name__=='__main__':
    str='I love guangzhou'
    s=split(str,' ');
    print(s);
    print(s[::-1])

8.Python删除列表里>=2且<=4的元素

list=[1,2,3,4,5,6,7,8,9]
list=[1,5,6,7,8,9]

def deleteNum(list):
    for num in list:
        if num<2 or num>4:
            print(num);
if __name__=='__main__':
    list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    deleteNum(list);

然而面试官说不让使用第二个列表那就不会了。。。

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
l=list(filter(lambda x:x<2 or x>4,list1))
# python3.*之后filter函数返回的不再是列表而是迭代器,所以需要用list转换。
print(l);

然而回来一查,果然我是个菜狗
在这里插入图片描述

题目都很简单,回答的却很烂,我真是个辣鸡,散会


最后总结一下查资料时找到的知识点:

python中的filter、map、reduce用法总结:

  • filter

filter的功能是过滤掉序列中不符合函数条件的元素,当序列中要删减的元素可以用某些函数描述时,就应该想起filter函数。

x = [1,2,3,4,5]
list(filter(lambda x:x%2==0,x)) 
# 找出偶数。python3.*之后filter函数返回的不再是列表而是迭代器,所以需要用list转换。
# 输出:
[2, 4]
  • map

求一个序列或者多个序列进行函数映射之后的值,就该想到map这个函数,它是python自带的函数,在python3.*之后返回的是迭代器,同filter,需要进行列表转换

x = [1,2,3,4,5]
y = [2,3,4,5,6]
list(map(lambda x,y:(x*y)+2,x,y))
# 输出:
[4, 8, 14, 22, 32]
  • reduce

对一个序列进行压缩运算,得到一个值。但是reduce在python2的时候是内置函数,到了python3移到了functools模块,所以使用之前需要 from functools import reduce

from functools import reduce
y = [2,3,4,5,6]
reduce(lambda x,y: x + y,y) # 直接返回一个值

#输出:
20


from functools import reduce
y = [2,3,4,5,6]
a=reduce(lambda x,y: x + y,y) # 直接返回一个值
print(a)


def add(x,y):
    return x+y
sum1=reduce(add,[1,2,3,4,5]);
sum2=reduce(lambda x,y:x+y,[1,2,3,4,5])
print(sum2,sum1)
#输出:
15 15

感谢:python中的filter、map、reduce、apply用法总结

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值