python
1、python是强类型还是弱类型的语言?
强类型
【评析】这种问题其实面试出来很没意思,因为太过理论,而且业界对于这个东西的定义没有一个统一的说法。所以这个题问出来挺无语的。记住,python是动态强类型语言。其中动态静态是针对变量的绑定方式,静态是指在编译的时候绑定变量,而动态是指在运行的时候可以绑定变量。
强弱类型是指变量的类型一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。而弱类型语言,一个数字类型的变量即可以是字符串也可以是数字类型,可以容忍隐式类型转换。 python是一个比较严谨的语言,所以它是强类型语言,而不是弱类型语言。
弱类型语言的话,“1”+2=12,而强类型的话,“1”+2=“大哥,你输入的语法有毛病,你知道不?”
补充一下,perl和php是弱类型动态语言,c和c++是弱类型静态语言。
2、python的动态性体现在哪?
python在运行的时候可以改变原来的函数定义,也可以引进新的代码和对象。
【评析】首先C和C++不是动态语言。然后,python是可以动态的给实例绑定属性,比如我们先class一个“不死族”
class undead():
def __init_(self,name=None,attitude=None): #设定一个类,这个类就是不死族的类.init是初始属性、默认属性
name=name #这里设定名字是名字,态度是态度
attitude=attitude
P=undead("食尸鬼","hostile") #将类实例化,食尸鬼是不死族的一员,他的态度是敌对的
但是这个时候已知设定了name和attitude这两个属性,但是我们可以后补新的属性。
P.attack="爪击" #设定食尸鬼的攻击方式
然后我们就可以访问attack这个属性了,虽然它并没有在最原始的时候被设定。
P.attack回车一下就可以看到结果。这就是可以动态的补充变量的属性,即一次没有整明白,可以后续补齐。
在实际生产的时候注意一下,在上面的例子里P.name回车的结果和print (P.name)的结果是有那么一点不同的,可以自己动手试试。
3、python的namespace:四种;len()等函数的命名空间
【评析】命名空间就是名字和对象的映射。也就是可以把一个namespace理解为一个字典,实际上很多当前的Python实现namespace就是用的字典。那么哪些可以是一个namespace呢,比如Python的built-in names(包括内置函数,内置常量,内置类型);一个模块的global names(这个模块定义的函数,类,变量);一个函数的所有local names;还有一个类对象的所有属性(数据成员,成员函数)都组成一个命名空间。
len()等函数的命名空间这玩意自己查一下就好。
4、range和xrange的区别
【评析】我找的这个面试题挺新的,但是不得不说搞python就是这一点不好,3.5的版本里xrange已经被枪毙了,range的功能就是xrange。所以在面试的时候大家要注意python2.7和3.5的差别,一旦面试官问你没听过的语句或者是命令,第一反应别说不知道,而是要说“这丫是2.7的吧”。
继续说,在python 2.7版本里:xrange能用就多用,这玩意比range更好,因为在生成一个大数字序列的时候,xrange的性能更优秀。虽然他俩在for in语句里的输出效果是一样的,但是主要区别是xrange会返回一个整体,这个比较类似于人类的思维,而range返回的是list。比如:
a=range(10)
type a 回车的结果是“list”,print a回车的结果是一个list,(1,2,3。。。9,10)。
a=xrange(10)
type (a)回车的结果是"xrange",print(a)回车的结果是一个xrange(10)
而且xrange的效率比range更快,用timeit一下效果更加明显,本机是3.5,range就是xrange,使用timeit.timeit('for i in range(100000000):pass',number=1),看一下消耗时间仅仅是5秒左右。如果在2.7的环境下,用真实的range试一下上面的命令,估计要20多秒。
5、于是问怎么实现迭代器,然后又问了生成器,yield语句