牛客笔试题之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.

newinit的区别


解析:

  1. init是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。
  2. new是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。
  3. newinit之前被调用,new的返回值(实例)将传递给init方法的第一个参数,然后init给这个实例设置一些参数。

字典


解析:
字典是python中唯一的映射类型,阐述了键与键值之间的对应关系。字典中键必须是唯一的。列表中的项目包括在方括号中。列表是可变的数据类型(可以增加或删除项目)。所以,列表中的项目不能用来作为字典的键。

浅拷贝和深拷贝


解析见上图中注释

try else finally


解析:
try的语句出现异常才会执行except后的语句,如果正常,则执行完try后执行else。另外,finally语句不管有无异常都会执行。所以上图中答案为4。

name


解析:

  1. name定义在一个模块中,当解释器执行这个py文件时,name的值就为main
  2. 当这个模块被引用即被其他模块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标识符可以使用下划线 字母 数字组成,但是数字不允许作为标识符的开头出现。

线程协程

线程由操作系统控制,协程由程序自身控制。

编译及解码

  1. Python中字符串编译的过程:gbk=>unicode=>utf16=>url 解码
  2. 字符串解码顺序为:url解码=>utf16=>unicode=>gbk

map函数

map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。例如:

1
2
3
4
5
6
7
8
9
10
11
>>>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函数及除法

  1. Python3 中math.floor() 函数的返回值应为整型,而Python2 的 math.floor() 函数返回值是浮点型。
  2. Python2 中除法默认向下取整,为整型;Python3 中的除法为正常除法,会保留小数位,为浮点型。

Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量、可以作为元素添加到集合对象中、可作为参数值传递给其它函数,还可以当做函数的返回值。

变量

  1. Python 是弱类型脚本语言,变量就是变量,没有特定类型,因此不需要声明。
  2. 但每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
  3. 用 del 语句可以释放已创建的变量(已占用的资源)。

切片slice

Python 中 切片(Slice)功能的理解:L[start : stop [ : step]]
start 默认值是 0;stop 默认值为 L 的长度;step 默认值是 1。

命名方式

------ 本文结束------
bluesliuf wechat
坚持技术分享,欢迎大家扫码交流!