Python:工作中常用的函数、方法(可作为python面试题)
1、python基础
- 对一个list,如何同时得到数据下标和该数据?
seq = ['one', 'two', 'three']
for i, element in enumerate(seq):
pass
- 对于一个字典dict,如何同时得到键和值?
for key,value in dict.items():
pass
- random的常见用法
# 如何生成一个0-1(0<=n<1)之间的随机小数?
random.random()
# 如何生成一个1-10(1<=n<10)之间的随机整数?
random.randint(1,10)
# 如何生成随机选取0到100间的偶数?
random.randrange(0, 101, 2)
- 如何判断一个list中是否有某个元素?
seq = ['one', 'two', 'three']
if 'one' in seq:
pass
if 'one' not in seq:
pass
- list按照元素删除或者按照位置删除
seq = ['one', 'two', 'three']
# 如何按元素来删除元素‘two’?
seq.remove('two') # 没有返回值但是会移除列表中的某个值的第一个匹配项
# 如何按位置来删除元素‘two’?
seq.pop(1) # 删除单个或多个元素,按位删除(根据索引删除)
del seq[1] # 根据索引(元素所在位置)来删除单个或多个元素
- 浅拷贝和深拷贝
# 浅拷贝
a = {1: [1,2,3]}
b = a.copy()
# 深拷贝
import copy
c = copy.deepcopy(a)
- 如何通过指定分隔符对字符串进行切片得到列表?
txt = "Google#Runoob#Taobao#Facebook"
x = txt.split("#")
- 如何删除字符串中的空字符或者说是字符序列?
# s为字符串,rm为要删除的字符序列
s.strip(rm) # 删除s字符串中开头、结尾处,位于 rm删除序列的字符
s.lstrip(rm) # 删除s字符串中开头处,位于 rm删除序列的字符
s.rstrip(rm) # 删除s字符串中结尾处,位于 rm删除序列的字符
a=' Hello World '
a.strip()
- is和==是一样的么?
1)is 比较两个对象的 id 值是否相等,是否指向同一个内存地址;
2)== 比较的是两个对象的内容是否相等,值是否相等;
3)小整数对象[-5,256]在全局解释器范围内被放入缓存供重复使用;
4)is 运算符比 == 效率高,在变量和None进行比较时,应该使用 is - 字符串和数字之间的转化?
int("100")
str(100)
- 如何获取一个变量的类型?以及如何判断一个变量是否是某一个已知类型?
# 获取变量的类型用type
# 一个参数实例
>>> type(1)
<type 'int'>
>>> type('runoob')
<type 'str'>
>>> type([2])
<type 'list'>
>>> type({0:'zero'})
<type 'dict'>
>>> x = 1
>>> type( x ) == int
# 判断是否是一个已知类型用instance
>>>a = 2
>>> isinstance (a,int)
True
>>> isinstance (a,str)
False
>>> isinstance (a,(str,int,list)) # 是元组中的一个返回 True
True
# 注意:isinstance() 与 type() 区别:
# type() 不会认为子类是一种父类类型,不考虑继承关系。
# isinstance() 会认为子类是一种父类类型,考虑继承关系。
- python的函数是按引用调用还是按值调用?
1)不可变对象(如字符串、数字或元组等)是按值调用的;
2)可变对象(如列表等)是通过引用调用的; - 如何删除一个list里面的重复元素,并用list得到结果?
L = ['d','a','f','d','b','c','d','b','c','a']
list(set(L))
- 如何创建一个文件夹?如何判断某个文件是否存在?如何删除一个文件?
os.makedirs(dir_path, exist_ok=True)
os.path.exists(file_path)
os.remove(file_path)
os.unlink(file_path)
- python中的异常处理是如何处理的?
try:
# 需要执行的代码块(可能报错)
except Exception as e:
# 如果代码报错,进行异常处理
print(traceback.format_exc())
print(e)
else:
# 如果没有报错会执行的内容
finally:
# 不管有没有报错,最终都会执行的内容
2、pandas相关
- 如何用函数func去处理dataframe中某一列(column_name)的每一个值?
df[column_name] = df[column_name].map(lambda x: func(x))
# 或者
df[column_name] = df[column_name].apply(func)
def func(x):
pass
- 如何保留dataframe中某一列(column_name)中值等于指定值(constant_value)的所有数据
df = df[df[column_name] == constant_value]
- 如何删除dataframe中指定的某几列
df = df.drop(columns=[name1, name2, name3])
- 如何将dataframe按照name1列升序排列,按照name2列降序排列?
df = df.sort_values(by=[name1, name2], ascentding=[True, False])
- 如何将dataframe保存到路径path.csv中,且不保留索引?
df.to_csv(path.csv, index=False)
- 如何读取一个excel文件,且将第一列作为索引,并且跳过第一行?
data = pd.read_excel(excel_path, index_col=0, skiprows=1)
- 如何取dataframe中的某一个具体的值?
data = np.DataFrame(np.range(25), reshape(-1,5), index = ["A", "B", "C", "D", "E"], columns=list('qwert'))
print(data)
q w e r t
A 0 1 2 3 4
B 5 6 7 8 9
C 10 11 12 13 14
# 用loc
print(data.loc[["A","C"],["w","r"]])
w r
A 1 3
C 11 13
# 用iloc
print(data.iloc[1:3,1:3])
print(data.iloc[[1,3],1:5])
print(data.iloc[1,1])
w e
B 6 7
C 11 12
w e r t
B 6 7 8 9
D 16 17 18 19
6
- 如何获取dataframe的列名或者索引的列表形式的结果?
columns = df.columns.tolist()
indexs = df.index.tolist()
- 如何把dataframe中的某一列column_name设置为索引?
df = df.set_index([column_name])
- 如何把2个dataframe进行串联?
# 其中axis=0,合并的轴是行;1表示合并的轴是列
result = pd.concat([df1, df4], axis=1)
3、python中级及以上
- python中类的基本知识点。实例方法、静态方法、类方法的区别?如何初始化父类的函数?
1)实例可以调用实例方法(因为实例传递了自己的地址给到了this指针);实例和类对象可以调用静态方法;实例和类对象可以调用类方法;
2)super用来执行父类中的函数(因为super指向了父类的地址);也可以用来初始化父类的方法。 - python里面 的生成器(generator)有什么作用?
generator和函数的执行流程不一样。变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
生成器的作用:
1)可以对大数据文件进行读取
# 方法一:直接使用 with open
with open("test.txt") as f:
for line in f:
#do something with data
# 方法二:使用yield构造一个生成器函数。每次读取4k大小的数据,将所有文件读取完
def readInChunks(fileObj, chunkSize=4096):
"""
Lazy function to read a file piece by piece.
Default chunk size: 4kB.
"""
while 1:
data = fileObj.read(chunkSize)
if not data:
break
yield data
f = open('bigFile')
for chuck in readInChunks(f):
#do_something(chunk)
f.close()
- 如果目前有一个函数可以处理一个文件,但是目前磁盘上有10万个文件,可以怎么办?
1)可以使用多进程进行处理;
2)python的多线程由于使用了global interpreter lock,仅有一个线程可以工作,因此python的多进程比较鸡肋,仅在io密集型的工作时适合使用,cpu计算密集型的时候则不适合,还是需要 使用多进程。 - python文件下面的__main__的作用是什么?
- 模块a要导入模块b,此时模块b也需要导入模块a,请问会报错么?如果报错的话,应该怎么解决?
- python里面的for循环的底层原理和实现?
首先要明白什么是可迭代对象,什么是迭代器对象?
1)可迭代对象(iterable):很多python的数据类型都是可迭代对象:列表、字典、元组、字符串等
a = [1, 2, 3]
isinstance(a, Iterable) # True
2)迭代器对象(iterator):迭代器对象依赖 iter(args) 方法来实现,参数args必须是一个可迭代对象。
a = [1, 2, 3]
b = iter(a)
isinstance(b, Iterator) # True
isinstance(b, Iterable) # True
然后就可以理解for循环的底层原理了
1)迭代器对象,实现了__next__()方法,可以不断调用该方法,返回迭代器对象的每个元素;
2)for循环的对象,必须是可迭代对象。而在底层,所有的可迭代对象均内置了__iter__()方法,返回值为迭代器对象;
3)所以for循环本质上调用了可迭代对象的__iter__()方法,得到了该对象对应的迭代器对象,然后无限调用__next__()方法,得到对象中的每一个元素。直到StopIteration异常,代表迭代器中已无下一个元素,for循环自动处理该异常,跳出循环
# 1.获取可迭代对象的迭代器
# iterator = tuple01.__iter__()
iterator = dict01.__iter__()
while True:
try:
# 2.使用迭代器取所有的下一个元素并显示
item = iterator.__next__()
# print(item)
print(item+":",dict01[item])
# 3.遇到异常停止迭代
except StopIteration:
break
- 如果有一个同时交付的某一块代码里面,有4个for循环,你觉得合适么?不合适的话,应该怎么处理呢?
- python代码开发好了以后,除了交付代码,还需要交付其他什么文件么?