列举至少5个python内置函数和使用方法_Python面试必刷题系列(5)

本篇是【Python面试必刷题系列】的第5篇文章。通过收集、整理Python真实面试题,给大家讲解面试中的python高频考察点,希望能够引起读者的足够重视。

Python中 is 和 == 有什么区别?

(1)==是比较运算符,用来比较两个对象的value(值)是否相等。

(2)is也叫做同一性运算符,用来比较对象间的唯一身份标识(id)是否一致。

请看示例:a = b = "abc"

X = "abc"

print a == b # True

print a == X # True

print a is b # True

print a is X # True

a = b = [1, 2, 3]

X = [1, 2, 3]

print a == b # True

print a == X # True

print a is b # True

print a is X # False

结论:只有数值型和字符串型比较,a is X才为True,当是tuple,list,dict或set型时,a is X为False。

原因:id(a) != id(X),感兴趣的同学可以试一下。

列举sort 和 sorted 的区别sort 只是应用在 list 上的方法,就地排序,无返回值。

sorted 是内建函数,对所有可迭代的对象都可进行排序,返回新的list。sorted 语法:

sorted(iterable, key=None, reverse=False)

参数说明:iterable -- 可迭代对象。

key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

什么是猴子补丁?在运行期间动态修改一个类或模块,叫做猴子补丁(Monkey Patch)。

用法一:运行时动态替换模块的方法class Person(object):

def speak(self):

print "oooooo"

def speak_patch(self):

print "eeeeee"

if __name__ == '__main__':

Person.speak = speak_patch

person = Person()

person.speak() # 输出是 “eeeee”,相当于临时替换了模块里的方法

用法二:运行时动态增加模块的方法

这种场景也比较多,比如我们引用团队通用库里的一个模块,又想丰富模块的功能,除了继承之外也可以考虑用Monkey Patch。

成员变量用单、双下划线修饰的区别?

(1)_xxx : 保护型成员变量,只允许该类及其子类访问;不能用于from module import * 。

(2)__xxx : 私有型成员变量,只允许该类本身进行访问,连子类也不允许。

(3)__xxx__ : python内置的专用特殊方法。像__init__()之类的。

说说lambda表达式的应用场景?lambda 表达式的本质就是匿名的、函数体仅有一行的函数。# lambda表达式

lambda x , y : x + y

# 改写成函数

def add(x, y):

return x+ y

虽然函数比 lambda 表达式的适应性更强,能够创建复杂的函数对象,但 lambda 表达式依然有如下两个优点:对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁。

对于不需要多次复用的函数,使用 lambda 表达式可以在用完之后立即释放,提高了性能。

例子如下:a = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]

a_1 = list(map(lambda x: x[0], a))

copy 和 deepcopy 的区别是什么?

结论:浅拷贝,只拷贝父对象,不会拷贝父对象内部的子对象。

深拷贝,既拷贝父对象,又拷贝各级子对象。

理解:import copy

origin = [1, 2, [3, 4]] # origin 里边有三个元素:1, 2,[3, 4]

cop1 = copy.copy(origin)

cop2 = copy.deepcopy(origin)

print cop1 == cop2 # True

print cop1 is cop2 # False

# 说明: cop1 和 cop2 目前看上去还相同,但已不再是同一个object

origin[2][0] = "hey!"

origin[0] = "a"

print origin # ['a', 2, ['hey!', 4]]

print cop1 # [1, 2, ['hey!', 4]]

print cop2 # [1, 2, [3, 4]]

# 说明: origin第一层元素改变,对深浅拷贝都不会有影响;

# 但是子对象(origin[2] = [3, 4])发生改变后,浅拷贝会跟着变,深拷贝却不受影响

也就是说,如果父元素的第一层中存在可变对象,如list、dict以及普通类的实例对象等,使用浅拷贝只是传递了可变对象的引用,而深拷贝才是通俗理解上的完全复制。

下面是在普通类实例上做的一组测试,感兴趣的同学可以继续看,结论与上面一致。import copy

class OBJ(object):

X = [1, 2, [1, 2]] # 类变量

def __init__(self):

self.x = [1, 2, [1, 2]] # 实例变量

# 深浅拷贝

origin = OBJ()

cop1 = copy.copy(origin)

cop2 = copy.deepcopy(origin)

# 改变实例对象的属性

origin.x[0] = "**"

origin.x[2][1] = "##"

print cop1.x # ['**', 2, [1, '##']]

print cop2.x # [1, 2, [1, 2]]

# 改变类变量的属性

origin.X[0] = "**"

origin.X[2][1] = "##"

print cop1.X # ['**', 2, [1, '##']]

print cop2.X # ['**', 2, [1, '##']]

什么是断言?应用场景?

python的assert是用来检查一个条件,如果它为真,继续往下执行。如果它为假,则会抛出AssertError 错误信息,并终止执行程序。

例如:x = 23

assert x > 0, "x is not positive"

assert x%2 == 0, "x is not an even number"

结果显示:Traceback (most recent call last):

File "/Users/arrnos/PycharmProjects/wechat/interface.py", line 3, in

assert x%2 == 0, "x is not an even number"

AssertionError: x is not an even number

断言是保证程序运行可靠性的一种方式,因为,在条件不符合我们预期时,程序会自动在断言处终止运行,同时会抛出错误所在的代码行和相关信息,也算是一种程序问题定位的手段。

具体应用场景:函数入参检查、运行时程序逻辑检查、约定检查、程序常量以及文档检查等。

详细可参考:https://www.cnblogs.com/zhuifeng-mayi/p/9248558.html

dir()是做什么的?

dir()是python的一种内置函数,dir(object)用于查看object内部的全部属性和方法。

比如查看list、字符串或者是os模块的全部内部函数和方法,可以这样:print dir(os)

print dir(list)

print dir("")

print dir(str) # 和上面运行结果一致

*args和 * *kwargs 的含义及用法。

在函数定义中使用 *args 和**kwargs传递可变长参数。 *args用来将参数打包成 tuple 给函数体调用。** kwargs用于将关键字参数打包成 dict 给函数体调用。

(1) *和**的用法:拆包def fun1(a, b):

print a, b

def fun2(b, a):

print a, b

fun1(*[1, 2]) # *用于拆解list或元组,拆解结果作为位置参数

fun2(**{"a": 1, "b": 3}) # **用于拆解字典,并将其作为关键字参数

结果:1 2

1 3

(2) *args 用法实例:

*args用于接收元组作为位置参数。def fun(a, *args):

print a

print "args:", args

print "type(args):", type(args)

for arg in args:

print arg

# 调用

fun(1, 2, 3)

结果:1

args: (2, 3)

type(args):

2

3

(3)**kwargs用于接收字典类型的参数def fun(a, **kwargs):

print "a is ", a

print "kwargs:", kwargs

print "type(kwargs):", type(kwargs)

print "b is ", kwargs.get("b", None)

print "c is ", kwargs.get("c", None)

print "d is ", kwargs.get("d", None)

# 调用

fun(1, b=3, c=5)

结果:a is 1

kwargs: {'c': 5, 'b': 3}

type(kwargs):

b is 3

c is 5

d is None

type、class和object之间的关系?

(1) type : 用来返回一个对象的类型

(2) object

由于Python中一切皆对象,也就是说Python中的任何变量类型都是可以被修改的,这也是Python等动态编程语言的特点。type的基类是object,但是object也是由type生成的,他们之间形成了一个环路,这样设计的目的也就是为了方便对这些数据结构进行修改。

(3) class

class是用来描述一个类对象的,通过class可以实例化出一个对象。

(4) type,class,object三者之间的关系:

使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其3.x是你希望使用Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值