牛客笔试题之python
这几天做完了牛客网上的Python试题,下面是对一些错题的分析,并总结了一些python中应该注意的知识点。
字符串比较
解析:
a,b为字符串不可变类型,所以指向相同地址,所以 a is b
is
:指地址相同
==
: 内容相同
a+b
:字符串连接为’123123’
LEGB规则
解析:
Python一切皆对象,所以在Python中变量名是字符串对象。Python的命名空间是一个字典,字典内保存了变量名称与对象之间的映射关系,因此,查找变量名就是在命名空间字典中查找键-值对。LEGB就是用来规定命名空间查找顺序的规则。LEGB规定了查找一个名称的顺序为:
local–>enclosing function locals–>global–>builtin
Local
: 即函数内部命名空间;
Enclosing function locals
: 外部嵌套函数的名字空间
module(文件本身):Global(module)
: 函数定义所在模块(文件)的名字空间
Builtin
: Python内置模块的名字空间
Set
解析:
集合(set)是一个无序的不重复元素序列。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
本题中列表转集合,集合没有重复元素。
转义字符
解析:
python里面%d
表数字,%s
表示字符串,%%表示一个%;
单引号内嵌套单引号需要转义字符/;单引号内嵌套双引号不需要嵌套;
双引号内嵌套双引号需要转义字符/;双引号内引用单引号不需要转义字符;
类实例关系
解析:
isinstance(object,classinfo)
: 用于判断object是否是classinfo的一个实例,或者object是否是classinfo类的子类的一个实例,如果是返回True.
issubclass(class,classinfo)
: 用于判断class是否是classinfo类的子类,如果是返回True.
__new__和__init__的区别
解析:
- __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。
- __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。
- __new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。
字典
解析:
字典是python中唯一的映射类型,阐述了键与键值之间的对应关系。字典中键必须是唯一的。列表中的项目包括在方括号中。列表是可变的数据类型(可以增加或删除项目)。所以,列表中的项目不能用来作为字典的键。
浅拷贝和深拷贝
解析见上图中注释
try else finally
解析:
try的语句出现异常才会执行except后的语句,如果正常,则执行完try后执行else。另外,finally语句不管有无异常都会执行。所以上图中答案为4。
name
解析:
- __name__定义在一个模块中,当解释器执行这个py文件时,name__的值就为__main;
- 当这个模块被引用即被其他模块import时,__name__的值就是模块名,也就是运行的py文件名。
闭包
解析:
在函数中可以定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭包。所以若a=2,b=3,则程序运行值为8。
装饰器
解析见上图
大小比较
类似元组、字符串、列表这类格式,在进行两者之间的比较时,先从第一个元素开始比较 ASCII 码值大小,如果相等,则依次向后比较,如果全部相等,则比较数量大小。
ASCII 码值大小:
数字: 0-9: 48-57
字母:A-Z:65-90.
a-z: 97-122
布尔值
所有标准对象均可以用于布尔测试,下列对象的布尔值是False:
• None
• False
• 所有值为零的数:0(整型),(浮点型),0L(长整型),0.0+0.0j(复数)
• “”(空字符串),[ ] (空列表), ()(空元祖),{} (空字典)
语言类型
语言特性
解释性语言的特性是非独立和效率低。
Python是解释性语言,在此以Python举例。
非独立性: Python代码解释执行结果依赖于IDLE的版本,其中大版本有Python2和Python3之分,Python2最经典的版本为Python2.7,Python3有Python3.4,Python3.6等等。
效率低: 由于Python是解释性语言,动态编译,直到代码执行时,才加以解释,相比于编译型语言,可以生成编译代码,执行效率低。
三元运算符
max=x>y?x:y Java和 C中正确,
在Python中的三元运算符不是这样的,是 max=x if x>y else y
标识符
python标识符可以使用下划线 字母 数字组成,但是数字不允许作为标识符的开头出现。
线程协程
线程由操作系统控制,协程由程序自身控制。
编译及解码
- Python中字符串编译的过程:gbk=>unicode=>utf16=>url 解码
- 字符串解码顺序为:url解码=>utf16=>unicode=>gbk
map函数
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。例如:
>>>def square(x) : # 计算平方数
... return x ** 2
...
>>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]
# 提供了两个列表,对相同位置的列表数据进行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]
逻辑运算符
数据类型
结束符
C语言中字符串使用**’\0’作为结束符以防止越界,但python中字符串其实是一个固定长度的字符数组,并不需要结束符**。
math.floor函数及除法
- Python3 中math.floor() 函数的返回值应为整型,而Python2 的 math.floor() 函数返回值是浮点型。
- Python2 中除法默认向下取整,为整型;Python3 中的除法为正常除***保留小数位,为浮点型。
Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量、可以作为元素添加到集合对象中、可作为参数值传递给其它函数,还可以当做函数的返回值。
变量
- Python 是弱类型脚本语言,变量就是变量,没有特定类型,因此不需要声明。
- 但每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
- 用 del 语句可以释放已创建的变量(已占用的资源)。
切片slice
Python 中 切片(Slice)功能的理解:L[start : stop [ : step]]
start
默认值是 0;stop
默认值为 L 的长度;step
默认值是 1。