python 面试

Posted 九友

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 面试相关的知识,希望对你有一定的参考价值。

# a = [‘him‘, 25, 100, ‘her‘, 100, 25]
# print(a)
# print(a[1:3])
# a[0]=9
# print(a)
# print(25 in a)
# print(set([2, 4]) <= set(a))
# print(set(a))


"""
a = set(‘abracadabra‘)
b = set(‘alacazam‘)
print(a)
print(b)
print(a-b)
print(a&b)
print(a^b)  #a和b中不同时存在的数据
a = [‘him‘, 25, 100, ‘her‘, 100, 25]

#判断多个值,那么就要用到set
print(set([25, 100]) <= set(a))
"""
"""
dic = {}
tel = {‘abc‘: 1320,‘tom‘: 1998}
print(tel)
print(tel[‘abc‘])  #查询键值
tel[‘name‘]= 1980  #添加键值
print(tel)
"""
# In[]
x = dict([(‘sape‘, 4139), (‘guido‘, 4127), (‘jack‘, 4098)])
print(x)

print(dict(abc=123,datoou=456,name=789))
# In[]

 
s = ""
for i in range(1):
     while True:
         v1 = input(‘用户名‘)
         v2 = input(‘密码‘)
         v3 = input(‘邮箱‘)
         template = "{0}	{1}	{2}
"
         v = template.format(v1,v2,v3)
         s = s + v
         break
print(s)

# expandtabs  意思为将字符串中的TAB符号(
)转换为空格,默认是8个空格
print(s.expandtabs(20))    


kvps = {‘1‘:1,‘2‘:2}
theCopy = kvps.copy()  # 相当于复制一份,而且原来的改变并不影响复制后的
kvps[‘1‘] = 5
sum = kvps[‘1‘]+theCopy[‘1‘]
print(sum)


import pylab as pl
import numpy as np

import pandas as pd
df = pd.read_csv(‘E://data//数据集 (2).csv‘)
df.describe()    # 数据的基本信息
df.std()   # 数据每一列的标准差

#  将分类变量进行整理
dummy_ranks=pd.get_dummies(df[‘Property_Area‘],prefix=‘Property_Area‘)
dummy_ranks.head()

dummy_ranks1 = pd.get_dummies(df[‘Dependents‘],prefix = ‘Dependents‘)
dummy_ranks1.head()

#  将分类好的数据进行合并
cols_to_keep = [‘Credit_History‘,‘Gender‘,‘Married‘,‘Education‘,‘Self_Employed‘,                ‘Loan_Amount_Term‘,‘LoanAmount‘,‘ApplicantIncome‘,‘CoapplicantIncome‘]
data = df[cols_to_keep].join(dummy_ranks.ix[:, ‘Property_Area_1‘:])


da = data.join(dummy_ranks1.ix[:, ‘Dependents_1‘:])


#  添加逻辑回归所需要的变量
data[‘intercept‘] = 1.0

# 指定作为训练变量的列,不含目标列`Credit_History` 
train_cols=da.columns[1:]

import statsmodels.api as sm
logit = sm.Logit(da[‘Credit_History‘],da[train_cols]) 

#拟合模型 
result=logit.fit()

result.summary()  # 模型系数的特征

result.conf_int()   # 查看每个系数的置信区间

np.exp(result.params) # 相对危险度( odds ratio),可知变量每单位的增加、减少对该客户违约几率影响。 ,


# 使用95%的置信区间来估算出一个系数变化对信用的影响程度
params = result.params 
conf = result.conf_int() 
conf[‘OR‘] = params 
conf.columns = [‘2.5%‘, ‘97.5%‘, ‘OR‘]  
np.exp(conf)

# In[]
df = pd.read_csv(‘E://data//数据集 (2).csv‘)

dummy_ranks=pd.get_dummies(df[‘Property_Area‘],prefix=‘Property_Area‘)
dummy_ranks.head()

dummy_ranks1 = pd.get_dummies(df[‘Dependents‘],prefix = ‘Dependents‘)
dummy_ranks1.head()

#  将分类好的数据进行合并
cols_to_keep = [‘Credit_History‘,‘Education‘,‘Self_Employed‘,                ‘Loan_Amount_Term‘,‘LoanAmount‘]
data = df[cols_to_keep].join(dummy_ranks.ix[:, ‘Property_Area_1‘:])

da = data.join(dummy_ranks1.ix[:, ‘Dependents_1‘:])


#  添加逻辑回归所需要的变量
data[‘intercept‘] = 1.0

# 指定作为训练变量的列,不含目标列`Credit_History` 
train_cols=da.columns[1:]

import statsmodels.api as sm
logit = sm.Logit(da[‘Credit_History‘],da[train_cols]) 

#拟合模型 
result=logit.fit()

result.summary()  # 模型系数的特征




# In[]
# 将列表的元素 按照首字母进行分类存储   格式为存储在列表中 每一类以元组的形式整合到列表中
"""
分析: 首先转换为字典格式 以首字母为键值存储一类的数据
        在将字典中的每一类的数据转换为元祖存储到列表当中
        元组的增加 ------ a+(i,)
"""

a = [‘a1‘,‘a2‘,‘b1‘,‘b2‘,‘c1‘]
s = {}

# 将相同的部分转换为列表
for i in  a:
    l = i[0]
    if l in s:
        s[l].append(i)
    else:
        s[l] = [i]
s

# 将相同的部分转换为元组
for i in a:
    if i[0] in s.keys():     # 提取首字母 查询首字母是否存在于集合的键值中
        # 如果存在 就在该键值的后面追加同一类的数据
        s[i[0]] = s[i[0]]+(i,)
    else:
        # 如果不存在  就以该键值创建 并且将对应的数据存储到该键值的后面
        s.update({i[0]:(i,)})
        
        
a = [‘a1‘,‘a2‘,‘a3‘,‘b1‘,‘b2‘,‘b3‘,‘c3‘,‘c4‘,‘c5‘,‘d2‘,‘f3‘]
s = {}
for i in a:
    # 和上面的区别在于判断如果不存在就创建
    if i[0] not in s.keys():
        s.update({i[0]:(i,)})
    else:
        s[i[0]] = s[i[0]]+(i,)
        print(s[i[0]])


a = [[None]*2]*3
a[0][0] = 3
# In[]
d1 = {‘k1‘: ‘v1‘, ‘k2‘: ‘v2‘, ‘k3‘: ‘v3‘}
d2 = {‘k1‘: ‘v1_1‘, ‘k3‘: ‘v3_3‘, ‘k4‘: ‘v4‘}
print(list(map(lambda k: (d1[k], d2[k]), {*d1} & {*d2})))


# 将集合中的键值按照从大到小的顺序排列
a={1:1,2:2,3:3}
sorted(a.keys(),reverse = True)
sorted(a.values(),reverse = True)
print(‘,‘.join(map(str,sorted(a.keys(),reverse = True))))



s = {x:x.strip() for x in (‘ he ‘,‘ she ‘,‘ i ‘)}
s


# In[]
"""
赋值  浅复制  深复制的区别:
    
"""
   
n = [4,5,6]
a = [1,2,3,n]
id(a)
id(n)
x = a

id(x)
id(x[3])


import copy
s = a.copy()
id(x)
id(s[3])


b = copy.deepcopy(a)
id(b)
id(b[3])

a = [1,2,3,4,3,3]

set(a)
b = list(set(a))   # 利用集合的不重复性进行去重
b



#集合的CRUD  --  create rund  update deleter
#这里需要注意的是,当用set() 函数声明一个多元素的集合时,必须用小括号括起来
my_set = set(("Neo","Fiarter","Haner"))		
print(my_set)

#添加元素
my_set.add("Tom")
print(my_set)

#移除元素
my_set.remove("Neo")
print(my_set)

#统计长度
print(len(my_set))

#清空
my_set.clear()
print(my_set)
# In[]

# 查看字典中常用的方法
dir(dict)

print("Hello‘GreedyAI") 	#输出一个实际的单引号 ‘
print("Hello"GreedyAI") 	#输出一个实际的双引号 “
print("Hello
GreedyAI") 	#输出一个实际的换行符/回车
print("Hello	GreedyAI") 	#输出一个实际的 tab 制表符
print("Hello\nGreedyAI") 	#输出原始的字符串
print(r"Hello
GreedyAI") 	#输出原始的字符串
print(R"Hello
GreedyAI") 	#输出原始的字符串

print("Hello World".find("Hello"))		#输出结果0
print("Hello World".find("e"))			#输出结果1
print("Hello World".find("W"))			#输出结果6


# 冒泡排序法
a = [5,3,15,18,68,1024]
for i in range(len(a)-1):				#外层循环控制循环次数
	for j in range(len(a)-1-i):			#内层循环,控制每循环一次,比较的次数逐次-1
		if a[j] > a[j+1]:				#比较两个数字的大小条件
		    a[j],a[j+1] = a[j+1],a[j]		#左右交换
print(a)								#输出 [3,5,15,18,68,1024]		



import heapq
p=[{‘name‘:‘ibm‘,‘shares‘:100,‘prices‘:91.11},
   {‘name‘:‘apple‘,‘shares‘:50,‘prices‘:543.31},
   {‘name‘:‘t‘,‘shares‘:150,‘prices‘:21.51},
   {‘name‘:‘mi‘,‘shares‘:30,‘prices‘:441.16},
   {‘name‘:‘360‘,‘shares‘:10,‘prices‘:61.81},
   {‘name‘:‘car‘,‘shares‘:80,‘prices‘:221.51}
]
#s:要排序的元素
#s[‘prices‘]以元素的key=[‘prices‘]进行排序
cheap=heapq.nsmallest(3,p,key=lambda s:s[‘prices‘])
expensive=heapq.nlargest(3,p,key=lambda s:s[‘prices‘])
print(cheap,‘
‘,expensive)

# In[]
# os模块的了解

import os
import time
os.path.basename(‘/root/abc.txt‘)  # 返回文件名
os.path.dirname(‘/root/abc.tst‘)   # 返回目录的路径
os.path.split(‘/root/abc.txt‘)   # 分割文件名与路径
os.path.join(‘root‘,‘abc‘,‘tst‘)   # 连接文件名和路径

file= r"D:python_pycharm代码国赛.py"
a = os.path.getatime(file)   # 获取当前文件夹的最近访问时间
time.gmtime(a)      # 将上面得到的时间转换为时间戳格式
time.strftime(‘%Y-%m-%d %H:%M:%S‘,time.gmtime(a))  
 # 将时间戳格式的转换为正常时间里形式

c = os.path.getctime(file)    # 获得该文件的创建时间
time.strftime(‘%Y-%m-%d %H:%M:%S‘, time.gmtime(c))

m = os.path.getmtime(file)   # 获得最近修改时间
time.strftime("%Y-%m-%d %H:%M:%S" , time.gmtime(m))


print(os.environ)

# In[]
# 字典的增加和删除
a = {‘name‘:‘abc‘,‘age‘:‘19‘}
del a[‘name‘]
b = {‘chengji‘:‘30‘}
a.update(b)
a

# In[]
"""
13、列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],
并使用列表推导式提取出大于10的数,最终输出[16,25]

map()函数第一个参数是fun,第二个参数是一般是list,
第三个参数可以写list,也可以不写,根据需求
"""
L = [1,2,3,4,5]

map(lambda x:x**2,L)  
# 在python3中返回的结果是迭代器 在python2 中返回的是列表
# 所以要想显示 转换为列表格式就可以
a  = list(map(lambda x:x**2 , [1,2,3,4,5]))

c = [i for i in a if i > 10]

c = []
for i in a:
    if i >10:
        c.append(i)

# 生成随机小数 随机整数  0--1之间的小数方法
"""
随机整数:np.random.randint(起始值,结束值,生成个数) 
随机小数:利用numpy  np.random.rand(5) 生成5个随机小数
0--1 之间小数: random.random() 括号中不传入参数
"""
import numpy as np
np.random.rand(3,2)
np.random.randint(2,10,10)
# In[]
# 正则表达式
import re
"""
<div class="nam">中国</div>,用正则匹配出标签里面的内容(“中国”)
,其中class的类名是不确定的
"""
str = "<div class=‘nam‘>中国</div>"
re.findall(r"<div class=‘.*‘>(.*?)</div>",str)
# 注意其中的标点符号  因为题目告知class的类名不确定 所以使用.*
#.代表可有可无;*代表任意字符,满足类名可有变化


# In[[]

# 数据库去重 select distinct name from student

# 如何实现对python列表去重 并且保持顺序不变
# 先利用集合的不重复性去重 然后再利用初始列表中的序号进行排序
L = [‘cc‘, ‘bbbb‘, ‘afa‘, ‘sss‘, ‘bbbb‘, ‘cc‘, ‘shafa‘]
a = list(set(L))
a.sort(key = L.index)
a
# In[]
# 现有两元组((‘a‘),(‘b‘)),((‘c‘),(‘d‘))
# ,请使用python中匿名函数生成列表
# [{‘a‘:‘c‘},{‘b‘:‘d‘}]

t1 = ((‘a‘),(‘b‘))
t2 = ((‘c‘),(‘d‘))

a = [*zip(t1,t2)]

list(map(lambda x:{x[0]:x[1]},[*zip(t1,t2)]))
# In[]
# 3.在python字符串格式化中,%和.format的主要区别是什么?
"""
% :
python中内置的%操作符可用于格式化字符串的操作
控制字符串的呈现格式,%操作符的使用是最方便的

format:
字符串的format()函数,该方法收集位置和关键字参数的任意集合
并使用他们的值来替换字符串中的占位符
"""
# In[]
# *args和kwargs在什么情况下会使用到?请给出使用kwargs的示例代码
# *args:表示将实参中按照位置传参,把多出来的值给args,且以元组的方式呈现

def foo(x,*args):
    print(x)
    print(args)
foo(1,2,3,4,5,6)
# 会将多余的值传递给*args 并以元组的形式展现出来

def foo1(x,**kwargs):
    print(x)
    print(kwargs)
foo1(1,a = 1, b = 2,c = 3)
# 此时会将多余的值传递给字典  但是传入的时候也需要以字典的形式传入

# In[]
# 字符串x = foo y = 2则x*y的结果为foofoo
x = ‘foo‘
y = 2
print(x*2)

# 赋值:只是调用了地址 其中一个发生变化 另外一个也会发生变化
a = {‘1‘:1,"2":2}
b = a
a[‘1‘] = 5
sum = a[‘1‘]+b[‘1‘]
sum
# 浅复制 : 会新生成一块内存地址 将父级的值copy到内部
# 但是子级只copy到地址,所以 当父级发生变化时不会影响到另一个 
# 子级变另外一个也会改变
import copy
a = [1,2,3,[3,4,5]]
b = a.copy()
# 父级
a[0]= 5
a
b
# 子级
a[3][1]=9
a
b
# 深复制
# 深复制父级和子集完全copy互不影响

import copy 
a = [1,2,3,[4,5,6]]
b = copy.deepcopy(a)
b
# In[]
# 添加一个新的搜索路径
# sys.path.append(‘/sds/sd/‘)

# 赋值和[:]不是一回事  在赋值中要注意这一点
names1 = [‘Amir‘,‘Barry‘,‘Chales‘,‘Dao‘]
names2 = names1
names3 = names1[:]    
# 这样的赋值 当改变其中的一个另一个并不会改变
names2[0] = ‘Alice‘
names3[1] = ‘Bob‘   # 
sum = 0
for ls in (names1,names2,names3):
    print(ls)
    if ls[0] == ‘Alice‘:
        sum += 1
    if ls[1] == ‘Bob‘:
        sum += 10
print(sum)

# In[]

# 优先级not>and>or
x = True
y = False
z = False
if x or y and z:
    print(‘yes‘)
else:
    print(‘no‘)

# In[]
# 请写出一段代码 得到列表中的交集和并集以及差集
a = [2,3,4,5]
b = [3,4,5,6]
# 交集
list(set(a).intersection(set(b)))
# 并集,并去重
list(set(a).union(set(b)))
# 差集 : b中有而a中没有的元素
list(set(a).difference(set(b)))
# In[]
# 写出九九表
for i in range(1,10):
    for j in range(1,10):
        if i>= j:
            print((‘%d*%d = %d‘%(j,i,i*j)),end = ‘ ‘)
    print()
    
# 求和1-100
sum(range(1,101))

# 数据类型是否为已知类型
a = [1,2,3,4]
isinstance(a,list)


[i**2 for i in range(1,11)]

# 请写循环 去除列表中的重复值
a = [12,3,4,5,3,4,6,4,2]
b = []
for i in a:
    if i not in b:
        b.append(i)
    else:
        continue
print(b)

c = list(set(a))
c.sort(key = a.index)
c

# In[]
# 输入字符串 输出倒序排列的结果
A = ‘1,2,3,4‘
b = A[::-1]
b

# 合并两个列表 并且去除重复的元素
list1 = [2,3,8,4,9,5,6]
list2 = [5,6,10,17,11,2]

set(list1).union(set(list2))
# In[]
# 斐波契纳数列 1,2,3,5,8,13,21......根据这样的规律,编程求出400万
# 以内最大的斐波契纳数,并求出他是第几个斐波契纳数.
li = [1,2]
while li[-1] < 4000000:
    li.append(li[-1] + li[-2])
del li[-1]
print(li[-1])
print(len(li))

# In[]
"""
dicta = {‘a‘:1,‘b‘:2,‘c‘:3,‘d‘:4,‘f‘:‘hello‘}
dictb = {‘b‘:3,‘d‘:5,‘e‘:7,‘m‘:9,‘k‘:‘world‘}
要求写一段代码,实现两个字典的相加,不同的key对应的值保留,
相同的key对应的值相加后保留,如果是字符串就拼接,最终得到如下结果:
dictc = {‘a‘:1,‘b‘:5,‘c‘:3,‘d‘:9,‘e‘:7,‘m‘:9,‘f‘:‘hello‘,‘k‘:‘world‘}
"""
dicta = {‘a‘:1,‘b‘:2,‘c‘:3,‘d‘:4,‘f‘:‘hello‘}
dictb = {‘b‘:3,‘d‘:5,‘e‘:7,‘m‘:9,‘k‘:‘world‘}
dic = {}
for key1 in dicta:
    for key2 in dictb:
        if key1 == key2:
            dic[key1] = dicta[key1]+dictb[key2]
for i in dicta:
    if i not in dic:
        dic[i] = dicta[i]
for j in dictb:
    if j not in dic:
        dic[j] = dictb[j]
print(dic)

# In[]
# .Python主要的内置数据类型都有哪些?哪些是可变的?哪些是不可变的?可变类型与不可变类型有什么区别?
"""
数字,字符串,列表,字典,布尔型
可变:裂变,字典
不可变:数字,字符串,布尔
可变数据类型:在id不变的情况下,数据类型的内部可以改变
不可变的数据类型: value值改变 id也跟着改变
"""
# In[]
# python是如何进行内存管理的?python的程序会内存泄漏吗?说说有没有什么方面防止或检测内存泄漏?
"""
 Python如何进行内存管理?
    Python 采用引用计数的方式来管理分配的内存。Python 的每个对象都有一个引用计数,这个引用计数表明了有多少对象在指向它。当这个引用计数为 0 时,释放该对象的内存。为了解决循环引用的问题,Python提供了“标记-清除”法,用于释放循环引用的对象。

    为了加速Python的执行效率,Python 同时使用了一个内存池机制,用于管理对小块内存的申请和释放。 Python 的垃圾收集并不会把不用的内存返回给操作系统,而是放到了内存池。对于 int, float, list 对象, Python 还提供了独立的私有内存池。

    Python垃圾回收机制,以及在何种情况下会发生内存泄漏
    Python 通过引用计数来确定当前变量是否需要释放。每个对象都有一个计数器,当一个对象的引用计数为0时,就会由 gc 模块来执行内存释放操作。假如这个对象在缓冲区内,那么它地址空间不会被释放,而是等待下一次被使用,而非缓冲区的该释放就释放。

    对于普通对象 gc 采取分代回收算法,对象根据存活的时间分为三“代”,所有新建的对象都是0代,当0代对象经过一次自动垃圾回收,没有被释放的对象会被归入1代,同理1代归入2代。

    对于因循环引用而无法释放的对象,Python 采用“标记-清除”法。

Python 下造成内存泄漏的原因大概有这几方面:

1. 对象一直被全局变量所引用, 全局变量生命周期长.
2. 垃圾回收机被禁用或者设置成debug状态, 垃圾回收的内存不会被释放.
3. 循环引用过多, gc 无法及时释放

"""
# In[]
import random
L = [1,2,3,5,6,9,8]
random.shuffle(L)
L
"""
1、堆和栈什么区别?
答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;
对于堆来说,释放工作由程序员控制,容易产生memory leak。

2、数组和链表什么区别?
答:数组是将元素在内存中连续存放,由于每个元素占用内存相同,
可以通过下标迅速访问数组中任何元素。
链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存
在元素中的指针联系到一起。

"""

 # In[]
 # 反转列表中的字符串
a = [12,3,4,5,6]
a.reverse()

# 现在有以列表 以及列表所对应的索引列表 根据索引列表删除列表中的所对应的元素
# 注意: 如果先删除前面的 则由于python的存储机制 后面的一次向前移动
# 所以需要将索引所对应的列表倒叙进行删除 或者排序在逆序(这样具有普遍性)

L = [1,2,3,4,5,6,7,8,9,10]
c = [2,6,4]
# c.reverse()   # 是将列表进行了反转  但是不具有普遍性 该反转直接作用于原始的列表
c.sort(reverse = True) # 将列表进行从大到小排列  确保是从后面删除的数据
for i in c:
    L.pop(i) 
L
# In[]
# 在numpy数组中获得N个最大值的索引
import numpy as np 
a = np.array([1,4,5,6,73,5,7,33,6,0,28,3])
a.argsort()   # 返回从小到大排序后得到的顺序在原来的索引
a.argsort()[-3:][::-1]  
# 返回最大三个值在初始序列中的索引 从值得大到小依次返回索引
# In[]
"""
22.在Python中命名与文件相关的模块?

Python为库/模块提供了一些函数,使您可以在文件系统上操作文本文件和
二进制文件。使用它们,您可以创建文件,更新其内容,复制和删除文件。
这些库是:os,os.path和shutil。
这里,os和os.path - 模块包括用于访问文件系统的函数
shutil - module使您可以复制和删除文件。
"""
"""
24.解释Python支持的所有文件处理模式?

Python允许您以三种模式之一打开文件。他们是:
通过分别指定标志“r”,“w”,“rw”,“a”,只读模式,只写模式,
读写模式和附加模式。
通过指定选项“t”,可以在上述任何一种模式中打开文本文件

“r”,“w”,“rw”和“a”,以便前面的模式变为“rt”,“wt”,
“rwt”和“at”。二进制文件可以在任何一个中打开上述模式通过指定选项
“b”以及“r”,“w”,“rw”和“a”使得前面的模式变为“rb”,“wb”,
“rwb”,“ab” 。

"""
abc = 1,000,000
a_b_c = 1,000,000
# abc = 1000 2000 3000  错误的形式
# In[]
"""
33.为统计,数值和科学计算命名一些Python模块?

numPy - 此模块提供数组/矩阵类型,它对在数组上进行计算很有用。
scipy - 这个模块提供了进行数值积分,求解微分方程等的方法
.pylab是一个用于生成和保存图的模块
"""
"""
Python面向对象吗?什么是面向对象编程?
是。Python是面向对象的编程语言。OOP是基于类和被称为对象的类的实例的编程范例。OOP的特点是:

封装,数据抽象,继承,多态。
"""
"""
36.什么是多线程?举个例子。

这意味着通过调用多个线程同时运行多个不同的程序。进程中的多个线程使
用主线程引用数据空间,并且它们可以相互通信以更容易地共享信息。
线程是轻量级进程并且具有较少的内存开销。线程可以仅用于快速任务,
如计算结果,也可以在主程序运行时在后台运行其他进程。
"""
# In[]
# 创建集合的正确方法
([[1,2],[3,4]])

([1,2,3,4])
# 条件过滤
list(filter (lambda s:s>5,range(8)))

# In[]
"""
45.解释Python Flask中的数据库连接?

Flask支持数据库驱动的应用程序(RDBS)。这样的系统需要创建一个模式,这需要将shema.sql文件传递给sqlite3命令。因此,您需要安装sqlite3命令才能在Flask中创建或启动数据库。

Flask允许以三种方式请求数据库

before_request():在请求之前调用它们并且不传递任何参数
after_request():在请求后调用它们并传递将发送到客户端的响应
teardown_request():在引发异常时调用它们,并且不保证响应。在构建响应之后调用它们。不允许它们修改请求,并忽略它们的值。
"""
# In[]
"""
48.如何通过Python代码从MySQL数据库中的表中检索数据?说明。

1. 将MySQLdb模块导入为:import MySQLdb
2. 建立与数据库的连接。
3. db = MySQLdb.connect(“host”=“local host”,“database-user”=“user-name”,“password”=“password”,“database-name”=“database”)
4. 在建立的连接上初始化游标变量:c1 = db.cursor()
5. 通过定义所需的查询字符串来检索信息。s =“选择*来自dept”
6. 使用fetch()方法获取数据并打印它。data = c1.fetch(s)
7. 关闭数据库连接。close()
"""

# In[]
"""
argsort  : 表示将数据从小到大排序之后 返回排序之前的数据的索引
sort     :表示将数据进行排序  直接作用于原始数据集
sorted   :将数据进行排序不会作用于原始数据 在字典中可以指定是按键值还是按值进行排序
"""
import numpy as np
a = np.array([2,0,4,1,2,4,5])
a.argsort()
list1 = [(‘david‘, 90), (‘mary‘,90), (‘sara‘,80),(‘lily‘,95)]

# 使用字典中的键进行排序   reverse 控制排序
sorted(list1,key = lambda list1: list1[0],reverse = True)

sorted(list1,key = lambda x : x[1])

students = [(‘john‘, ‘A‘, 15), (‘jane‘, ‘B‘, 12), (‘dave‘,‘B‘, 10)]
# 按照年龄将上面的数据进行排序
sorted(students, key = lambda x: x[2] ,reverse = False)

"""
x.isdigit()  表示其中只有字符时为True 否则为False
"""
# ‘asdf234GDSdsf23’这是一个字符串排序,排序规则:小写<大写<奇数<偶数
a = ‘asdf234GDSdsf23‘
# "".join(sorted(a, key = lambda x:(x.islower(),x.isupper(),x.isdigit() and int(x)%2 == 0,x)))
"".join(sorted(a, key = lambda x:(x.isdigit(),x.isupper(),
                                  x.isdigit() and int(x)%2 == 0,x)))

# =============================================================================
# b = []
# c = []
# d = []
# for i in a:
#     d.append(i.islower())  # 提取字符串中所有的小写字母
#     c.append(i.isdigit())  # 提取出字符串中所有的数字
#     b.append(i.isupper())  # 提取出字符串中所有的大写字母
#     
# =============================================================================

"".join(sorted(a, key=lambda x: (x.isdigit(),x.isdigit() and int(x) % 2 == 0,x.isupper(),x)))

# =============================================================================
# 解释:
# 
# Boolean 的排序会将 False 排在前,True排在后 . 
# 
# 1.x.isdigit()的作用是把数字放在后边,字母放在前边.
# 
# 2.x.isdigit() and int(x) % 2 == 0的作用是保证奇数在前,偶数在后。
# 
# 3.x.isupper()的作用是在前面基础上,保证字母小写在前大写在后.
# 
# 4.最后的x表示在前面基础上,对所有类别数字或字母排序。
# 
# 若不进行第四步,每个内部是未排序的,但是整体顺序是按照要求排序的
# 
# 
# =============================================================================

list1=[7, -8, 5, 4, 0, -2, -5]
# 要求1.正数在前负数在后 2.整数从小到大 3.负数从大到小
sorted(list1)        # 直接排序 得到的结果是 负数排在前面 此时手动加符号按照加入的负号规则进行排序
sorted (list1,key = lambda x:(x<0,abs(x)))   # 在取绝对值进行各自内部的排序

a = sorted(list1,key = lambda x:abs(x))
sorted(a,key = lambda x: x<0)
# In[]
s = ‘ABC\-001‘
b = ‘ABC-001‘

str = "Hello,Python";
suffix = "Python";
print (str.endswith(suffix,6));
# =============================================================================
# str.endswith(suffix[, start[, end]]) 用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。
# 可选参数"start"与"end"为检索字符串的开始与结束位置。
# 其中的6表示从第六位开始   
# =============================================================================

# expandtabs 表示进行断句遇到	就空格补充后面的数  	 表示制表符  
a = "username	pass	name"
test = a.expandtabs(20)
test

a = ‘alskdasdaxleadasd‘
a.find(‘axle‘)    # 寻找字符串中的, 字符串中的axle的位置
a.replace(‘axle‘,‘mn‘)  # 将第一个字符替换为 第二个字符

# In[]
import re
m = ‘asdd3sad44dadasd‘
re.findall(‘d+‘,m)   # 匹配出字符串中的数字

s=‘‘‘
ajhfa kasjf owolf english=chinese yes  no print
lafl int=456 yes float
int=789 yes
owolf english=france yes  aklfl‘‘‘

re.findall(‘english=.* yes‘,s)

# 匹配出1-100的数字
s = ‘asdas100dasdas‘
re.findall(‘d+‘,s)

# 匹配座机号码
s = ‘101-22323223‘
re.findall(‘^d{3,4}-d{7,8}‘,s)

# 查找字符串中有多少个af
s = "asdfjvjadsffvaadfkfasaffdsasdffadsafafsafdadsfaafd"

c = re.findall(‘af‘,s)
len(c)


s = "zhangsan   lisi  wangwu"
s.split()   # 按照空格进行字符串的分割



s = ‘sdd38sd77sd9sf‘
re.sub(r‘d+‘,‘*‘,s)

s = ‘acd123efg‘
re.findall(‘a‘,s)
re.findall(‘d+‘,s)

# In[]
import random
import requests
import re
from bs4 import BeautifulSoup
from pypinyin import pinyin
 
 
# 抓取城市数据  
headers={‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0‘,         ‘Connection‘:‘keep-alive‘}
s = requests.Session()
s.headers.update(headers)
# 百度百科里面的城市  
absolute_url = "https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E5%9F%8E%E5%B8%82%E6%96%B0%E5%88%86%E7%BA%A7%E5%90%8D%E5%8D%95/12702007?fr=aladdin"
html = s.get(absolute_url).content
soup = BeautifulSoup(html,"lxml")
citySoup = soup(text=re.compile("市、"))




citys = []
for i in citySoup:
    for city in i.split(‘、‘):
        citys.append(city.rstrip("自治州").rstrip("市"))
      
        
citys = [‘武威市‘,‘长春市‘,‘深圳‘,‘镇江‘,‘西安‘,‘安西‘]
# 运行城市接龙 

j = 1 
while j <= 6:
    city_input = input("请输入一个城市:
")
    if city_input == ‘q‘:
        break
    if city_input in citys:
        mcity = []
        for c in citys:
            if city_input.endswith(c[0]):
                mcity.append(c)
                # 兼容同音字    
            elif pinyin(city_input)[-1] == pinyin(c)[0]:    
                mcity.append(c)
        if mcity:
            city = random.choice(mcity)
            print(city)
        else:  
            print("没有匹配到城市") 
    else:
        
        print("您输入的不是中国的地级市")
    j += 1
    
    # In[]
import pandas as pd
import numpy as np
from scipy import stats
df = pd.read_csv(r"C:UsersAdministratorDesktopLoan Application Data.csv")

df.info()

mu = np.mean(df.fico_range_high)  # 均值
sigma = np.std(df.fico_range_high) # 方差
skew = stats.skew(df.fico_range_high)  # 偏度
kurtosis = stats.kurtosis(df.fico_range_high)  # 峰度

df.fico_range_high.groupby("review_author_id").mad().describe()

import pymysql

# =============================================================================
# import MySQLdb
# 
# # 打开数据库连接
# db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset=‘utf8‘ )
# 
# # 使用cursor()方法获取操作游标 
# cursor = db.cursor()
# 
# # 使用execute方法执行SQL语句
# cursor.execute("SELECT VERSION()")
# 
# # 使用 fetchone() 方法获取一条数据
# data = cursor.fetchone()
# 
# print "Database version : %s " % data
# 
# # 关闭数据库连接
# db.close()
# 
# =============================================================================
import pymysql
coon = pymysql.connect(
    host = ‘127.0.0.1‘,user = ‘root‘,passwd = ‘1234‘,
    db = ‘yinghang‘,charset = ‘utf8‘
    #port必须写int类型
    #charset必须写utf8,不能写utf-8
)
cur = coon.cursor()  #建立游标
cur.execute("select  addr_state ,fico_range_high from t3 left join t1 on t3.id4 = t1.id1 group by addr_state")  #查询数据
res = cur.fetchall()    #获取结果
print(res)
cur.close()     #关闭游标
coon.close()    #关闭连接
# ---------------------------------------------------------------------------
#如果是插入数据,则要commit一下,把第9行换成以下两行
cur.execute(‘insert into stu(name,sex) VALUE ("pzp","man");‘)
coon.commit()



# In[]

import pandas as pd
import numpy as np
from scipy import stats
df = pd.read_csv(r"C:UsersAdministratorDesktopLoan Application Data.csv")
df1=pd.read_csv(r"C:UsersAdministratorDesktopLoan Application Data2.csv")
df2 = pd.read_csv(r"C:UsersAdministratorDesktopLoan Status Data.csv")
df3 = pd.read_csv(r"C:UsersAdministratorDesktopBorrower Info Data.csv")
df4 = pd.read_csv(r"C:UsersAdministratorDesktopCredit Bureau Data.csv")
df_1 = pd.merge(df,df1,on = ‘id‘,how = ‘left‘)


## df_1: 贷款数据集
# 查看各个属性所含有的数据类型
print(df_1.select_dtypes(‘object‘).apply(pd.Series.nunique, axis = 0))
# 分组统计数据类型
df_1.dtypes.value_counts() 
df_1.head()

# 查看数据的具体情况  -----   df_1: 贷款数据集
check_null = df1.isnull().sum().sort_values(ascending=False)/float(len(data)) 
check_null
print(check_null[check_null > 0.2])
# 查找需要的数据
people = list(data.addr_state.value_counts(dropna = True))   # 查看各州的贷款人数
# 计算各个州的贷款金额.
data = pd.merge(df, df3, on=‘id‘, how=‘left‘)

# 查看数据的缺失值
check_null = data.isnull().sum().sort_values(ascending=False)/float(len(data)) 
check_null
# print(check_null[check_null > 0.2]) # 查看缺失比例大于20%的属性。

# 分组统计数据类型
data.dtypes.value_counts() 


zhou = list(set(data.addr_state))
x = []
for i in zhou:
    # print(i)
    a = data[data.addr_state == i]
    s = sum(a.loan_amnt)
    x.append(s) 

dic = dict(map(lambda x,y:[x,y],zhou,people))
dic1 = dict(map(lambda x,y:[x,y],zhou,x))

dict = pd.DataFrame.from_dict(dic,orient = ‘index‘,columns = [‘人数‘])
dict = dict.reset_index().rename(columns = {‘index‘:‘洲‘})
dict.head()

dict[‘金额‘] = x
dict    # 各个洲的贷款人数和金额数据表

# In[]
# 计算每个洲信用分数的偏度   --
data = pd.merge(df, df3, on=‘id‘, how=‘left‘)
zhou = list(set(data.addr_state))  # 对洲名进行去重

y = []
for i in zhou:
    # print(i)
    a = data[data.addr_state == i]
    skew = stats.skew(a.fico_range_high)  # 偏度
    y.append(skew)
    
y

dic2 = list(map(lambda m,n:[m,n],zhou,y))
dic2

df = pd.DataFrame(dic2,columns = (‘洲名‘,‘信用分数偏度系数‘))
df
# 偏度系数大于零表示右偏, 偏度系数小于零表示左偏 ,等于零时正态


# In[]

"""
编译器:使用spyder进行编写
时间: 2019.10.19
项目: 自编函数进行判别ip地址的合法性
"""
# IPv4的ip地址格式:(1~255).(0~255).(0~255).(0~255)
# 利用函数进行检测IP地址的合理性
def  is_ipv4(ip: str) -> bool:
    """
    检查ip是否合法
    :param: ip ip地址
    :return: True 合法 False 不合法
    """
    if [1] * 4 == [x.isdigit() and 0 <= int(x) <= 255 for x in ip.split(".")]:
        return True  
    else:
        return False


def fun1(x):
    for i in x.split("."):
        if [i.isdigit() and int(i)>=0 and int(i)<= 255] == [1]*4:
            return True
        else:
            return False

fun1("192.168.1.2a0")  # False
fun1(‘100.100.100.100‘)  # True
fun1("10.10.20.30")  # True
fun1("999.10.20.30")  # False
fun1("172.29.41")   # False

# In[]
"""
编译器: spyder
时间: 2019.10.19
项目:使用数据结构编写函数,找出字符串中第一个出现一次的字符
要求:时间复杂度为O(n)
"""

def fun(s):
    s_dic = {}  # 设置空字典, 键值存储字符, value 存储对应出现的次数
    s_ls = []   # 将字符串中的字符按照顺序存入列表
    for i in s :
        if i not in s_dic.keys():  # 判断该字符是否出现在字典的key中
            s_dic[i] = 1            # 没有出现则值为1
            s_ls.append(i)
        else:
            s_dic[i] += 1
    for j in s_ls:
        if s_dic[j] == 1:
            return j

# 测试部分
fun(‘abcd13faeb‘)  # 得到结果: c
fun(‘abcd13faebcd‘)  # 得到结果: 1
fun(‘abcd13faebcd13fe‘)  # 得到结果: 空,无唯一值出现
# In[]
         
dic = {‘a‘:1,‘b‘:2,‘c‘:3,‘d‘:4}
dic1 = {‘d‘:2222,‘p‘:111}
dic.update(dic1)
dic.keys()
dic.values()

m = {}

for key,value in zip(‘key_list‘,‘value_list‘):
    m[key] = value
m
# In[]
word = [‘apple‘,‘bat‘,‘bar‘,‘atom‘,‘book‘,‘abc‘]
by = {}

# 自编函数进行字典的合并和建立
for i in word:
    l = i[0]
    if l not in by:
        by[l] = [i]
    else:
        by[l].append(i)
by

# 利用内置的函数进行字典的建立
for i in word:
    l = i[0]
    by.setdefault(l,[]).append(i)

by
# In[]
# 如果一个字符串可以被哈希化则可以作为字典的健, 否则不可以
hash("ll")  # 可以
hash([1,2,3])  # 会因为是列表而不可以,但是元组可以被哈希化,只要其内部的元素被哈希化
hash(tuple([1,2,3]))

3 and 1 and 2
0 and 1 and 2 # 注意0表示假,and一假则全假

# In[]
# 递归函数
def fun(n):
    if n>0:
        print(‘抱着‘,end = ‘‘)
        fun(n-1)
        print(‘的我‘,end = ‘‘)
    else:
        print(‘我的小鲤鱼‘,end = ‘‘)
        
fun(4)

l = ‘asdasdasda‘
l.upper()  # 变小写为大写
l.find(‘s‘)  # 按照值寻找索引 
s = [‘ s‘,‘sd ‘]
s[0].strip()  # strip 去除字符串两端的空白

s = ‘18844501669‘
s.replace(‘4450‘,‘****‘,2) 
# 替换字符串,第一个参数表示要替换的字符串,第二个表示替换后的字符串,
# 第三个表示需要替换几次

# In[]
# is 和== 区别
# is表示两个实例之间是不是完全相同,他们是不是同一个对象,占用的内存空间是否相等
# == 表示两个对象的内容是否相等,,至于内存是否相等不重要

# 现有两个元组((‘a‘),(‘b‘)),((‘c‘),(‘d‘)),请使用python中匿名函数生成列表[{‘a‘:‘c‘},{‘b‘:‘d‘}]
t1 = ((‘a‘),(‘b‘))
t2 = ((‘c‘),(‘d‘))
# 使用匿名函数
[*zip(t1,t2)]
list(map(lambda x:{x[0]:x[1]},[*zip(t1,t2)]))
# 列表生成式
[{i[0]:i[1]} for i in [*zip(t1,t2)]]

# In[]
"""
lambda 函数的使用
filter : filter(lambda x: x%3 == 0,[1,2,3])  # 表示过滤列表中的元素
"""
# 排序
sorted([1, 2, 3, 4, 5, 6, 7, 8, 9],key=lambda x: abs(5-x))

def multipliers():
    return [lambda x:i*x for i in range(4)]
print([m(2) for m in multipliers()])
# [6,6,6,6]


print([m(1) for m in multipliers()])

print([lambda x:x*i for i in [1,2,3]])


def multipliers():
    return (lambda x:i*x for i in range(4))
print([m(2) for m in multipliers()])


sorted([1, 2, 3, 4, 5, 6, 7, 8, 9],key=lambda x: abs(5-x))  
# 排序结果表示 距离数字5的距离远近

# ‘asdf234GDSdsf23’这是一个字符串排序,排序规则:小写<大写<奇数<偶数
a = ‘asdf234GDSdsf23‘
"".join(sorted(a, key = lambda x:(x.isdigit(),x.isupper(),
                                  x.isdigit() and int(x)%2 == 0,x)))

# In[]
# 字典中的fromkeys函数是用来创建字典的
v = dict.fromkeys([‘k1‘, ‘k2‘], [])
v[‘k1‘].append(666)  # append函数拼接数据进行是将所有空的都进行填充
print(v)
v[‘k1‘] = 777  # 赋值是仅仅将值赋给对应的键值
print(v)

  

以上是关于python 面试的主要内容,如果未能解决你的问题,请参考以下文章

前端面试题之手写promise

2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试

常用python日期日志获取内容循环的代码片段

python 有用的Python代码片段

Python 向 Postman 请求代码片段

python [代码片段]一些有趣的代码#sort