python面试练习题
下面会输出什么
funcs = [lambda x:x*i for i in range(4)]
print([fun(2) for fun in funcs])
1、将1-2-3-4转换成2-1-4-3。
nums = [1, 2, 3, 4]
for num in nums:
if num % 2 == 0:
nums.insert(nums.index(num)-1, num)
nums.pop(num)
2 、有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
nums = []
for i in range(1, 5):
for j in range(1, 5):
for l in range(1, 5):
if i != j and j != l and i != l:
res = i * 100 + j * 10 + l
nums.append(res)
3、企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
money = int(input("请输入金额:"))
profits = [1000000, 600000, 400000, 200000, 100000, 0]
ts = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1]
r = 0
for i in range(6):
if money > profits[i]:
r += (money - profits[i]) * ts[i]
money = profits[i]
4、一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
import math
num = 1
while True:
if math.sqrt(num + 100)-int(math.sqrt(num + 100)) == 0 and math.sqrt(num + 268)-int(math.sqrt(num + 268)) == 0:
print(num)
break
num += 1
5、 输入某年某月某日,判断这一天是这一年的第几天?
import datetime
date = input("请输入时间, datetime:(20180812):")
dt = datetime.datetime.strptime(date, "%Y%m%d")
this_year = datetime.datetime.strptime(date[:4]+"0101", "%Y%m%d")
print((dt-this_year).days)
6、输出9*9口诀。
# for i in range(1, 10):
# for j in range(1, i+1):
# print("%d * %d = %02d " % (j, i, (i*j)), end="")
# print()
[print("%d * %d = %02d %s" % (j, i, (i*j), "\n" if i==j else ""), end="") for i in range(1, 10) for j in range(1, i+1)]
7、有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
a = 1
b = 1
for i in range(1, 21, 2):
print('%d %d' % (a, b),)
a += b
b += a
8、判断101-200之间有多少个素数,并输出所有素数。
for i in range(2, 100):
for j in range(2, i):
if i % j == 0:
break
else:
print(i)
9、打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
1、[print(n) for n in range(100, 1000) if n == (n // 100) ** 3 + (n // 10 % 10) ** 3 + (n % 10) ** 3]
2、for n in range(100, 1000):
if n == (n // 100) ** 3 + (n // 10 % 10) ** 3 + (n % 10) ** 3:
print(n)
10、输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
ss = input("请输入一串数字")
letter = 0 # 字符串
space = 0 # 空格
digit = 0 # 数字
other = 0 # 特殊字符
for s in ss:
if s.isalpha():
letter += 1
elif s.isspace():
space += 1
elif s.isdigit():
digit += 1
else:
other += 1
print(letter, space, digit, other)
11、一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
s = 100
num = 100
for _ in range(9):
s /= 2
num += s*2
print(num, s)
12、冒泡排序
nums = [1, 2, 3, 7, 9, 8]
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] > nums[j]:
time = nums[i]
nums[i] = nums[j]
nums[j] = time
print(nums)
13、a=”advajlsdga”, b=”gsadgj” 去除相同的
a, b = set("advajlsdga"), set("gsadgj") # {'v','l'}
print(a-b)
14、 输入字符串去除相邻重复的AAAABBBCCDAABBB = ABCDAB
def unique(test):
list = []
list.extend(test)
i = 0
while i < len(list):
if list[i] == list[i + 1]:
del list[i + 1]
i -= 1
i += 1
if i >= len(list) - 1:
break
return list
print(unique("AAAABBBCCDAABBB"))
16、求1到100的和
print(sum(range(101)))
17、输入一个数求是否是回文数(12321, 121, 45654)
b = a[int(len(a)/2)+1:len(a)]
a = a[0:int(len(a)/2)]
if a == b[::-1]:
print("是回文数")
else:
print("不是回文数")
python 知识点
你对Python这门语言的看法?
Python是一种编程语言,它有对象、模块、线程、异常处理和自动内存管理。
它简洁、简单、方便、容易扩展,有许多自带的数据结构,而且它开源。
1.什么是PEP8?
PEP8是一个编程规范,内容是一些关于如何让你的程序更具可读性的建议。
3.什么是pickling和unpickling?
Pickle模块读入任何Python对象,将它们转换成字符串,然后使用dump函数将其转储到一个文件中——这个过程叫做pickling。反之从存储的字符串文件中提取原始Python对象的过程,叫做unpickling。
5.Python是怎样管理内存的?
一、垃圾回收:
对Python语言来讲,对象的类型和内存都是在运行时确定的。这也是为什么我们称Python语言为动态类型的原因(这里我们把动态类型可以简单的归结为对变量内存地址的分配是在运行时自动判断变量类型并对变量进行赋值)。。
二、引用计数
python创建一个对象的时候,会在内存中开辟一个空间,这个对象指向这个空间,然后引用计数为1,再有一个对象指向这个空间那么引用计数为2,当对象被销毁的时候引用计数-1。当引用计数为0的时候此空间会被销毁
三、内存池机制
。。。。。。
7.什么是Python装饰器?
Python装饰器是Python中的特有变动,可以使修改函数变得更容易。它可以在不破坏函数的封装性去更加一些功能
8.数组和元组之间的区别是什么?
数组和元组之间的区别:数组内容是可以被修改的,而元组内容是只读的。另外,元组可以被哈希,比如作为字典的关键字。
9.参数按值传递和引用传递是怎样实现的?
这个问题在Python中可以理解为传入的参数是可变类型还是不可变类型,
可变类型:即便内容一模一样,python也会给它们分配新的不同的地址。
不可变类型:python中地址都是一样的,是可以共享的
在python中,不可变对象是共享的,创建可变对象永远是分配新地址
10.字典推导式和列表推导式是什么?
它们是可以轻松创建字典和列表的语法结构。可以简写代码
比如创建一个列表1到100就可以使用列表推导式一行代码搞定
11.Python都有哪些自带的数据结构?
Python自带的数据结构分为可变的和不可变的。可变的有:数组、集合、字典;不可变的有:字符串、元组、数。
在学习Python过程中有没有令你影响深刻的事
有,在自己学习python的过程中经常会让我有一种惊叹,还有这种骚操作~ 比如django开发的时候,python manage的各种命令 django的ORM,restframework都省去了很多复杂的工序,大大提高了开发效率。
12.什么是Python的命名空间?
在Python中,所有的名字都存在于一个空间中,它们在该空间中存在和被操作——这就是命名空间。它就好像一个盒子,每一个变量名字都对应装着一个对象。当查询变量的时候,会从该盒子里面寻找相应的对象。
13.Python中的lambda是什么?
这是一个常被用于代码中的单个表达式的匿名函数。
14.为什么lambda没有语句?
匿名函数lambda没有语句的原因,是它被用于在代码被执行的时候构建新的函数对象并且返回。
15.Python中的pass是什么?
Pass是一个在Python中不会被执行的语句。在复杂语句中,如果一个地方需要暂时被留白,它常常被用于占位符。
16.Python中什么是遍历器?
遍历器用于遍历一组元素,比如列表这样的容器。
17.Python中的unittest是什么?
在Python中,unittest是Python中的单元测试框架。它拥有支持共享搭建、自动测试、在测试中暂停代码、将不同测试迭代成一组,等等的功能。
18.在Python中什么是slicing?
Slicing是一种在有序的对象类型中(数组,元组,字符串)节选某一段的语法。
19.在Python中什么是生成器、迭代器?
迭代器:它是一个带状态的对象,任何实现了iter和next()。他能在你调用next()方法的时候返回容器中的下一个值。好处是不会向列表一样直接全部读取到内存上,而是用的时候返回一个值
生成器:生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要再像上面的类一样写iter()和next()方法了,只需要一个yiled关键字。 生成器一定是迭代器(反之不成立)
20.Python中的docstring是什么?
Python中文档字符串被称为docstring,它在Python中的作用是为函数、模块和类注释生成文档。
21.如何在Python中拷贝一个对象?
如果要在Python中拷贝一个对象,大多时候你可以用copy.copy()或者copy.deepcopy()。但并不是所有的对象都可以被拷贝。比如列表、字典、元组、字符串这些可以直接使用切片
22.Python中的负索引是什么?
Python中的序列索引可以是正也可以是负。如果是正索引,0是序列中的第一个索引,1是第二个索引。如果是负索引,(-1)是最后一个索引而(-2)是倒数第二个索引。
23.如何将一个数组转换成一个字符串、把字符串转成数组?
数组转字符串:可是使用字符串的join(数组)方法
字符串转数组:可以使用字符串的split(拆分字符)方法
24.Xrange和range的区别是什么?
Xrange用于返回一个可迭代对象,而range用于返回一个数组。不管那个范围多大,xrange是不会把全部数据加载到内存上,但是rangen会把数据先加载到内存上
25.Python中的模块和包是什么?
在Python中,模块是搭建程序的一种方式。每一个Python代码文件都是一个模块,并可以引用其他的模块,比如对象和属性。
一个包含许多Python代码的文件夹是一个包。一个包可以包含模块和子文件夹。
字符串、字典、元组、列表常用方法?
字符串常用的是split、replace、join、find、strip、just
列表常用 pop 、append、 remove、 insert 、clear 、len 、sort、 reverse
字典常用 get、 index、 keys、 values、 update
函数闭包的理解?
是指函数中嵌套函数 且外层函数的返回值也是函数 闭包中需要注意的是变量的作用域,内层函数使用外层函数的值需要加nolocal 使用全局变量的值需要加global
什么是装饰器?应用场景?
装饰器的特点是返回值和参数都是函数
装饰器的目的就是对已封装函数进行操作,为其加上新的功能或一系列运算 。 在django中有middleware中间件,它其实就是高级的装饰器用法,
Python中的作用域
Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的。
当 Python 遇到一个变量的话他会按照这样的顺序进行搜索:
本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)
网络
GIL线程全局锁
线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务,python的多线程起到作用,但对于cpu密集型任务,python的多线程几乎占不到任何优势,还有可能因为争夺资源而变慢。
**解决方案:
1、python是胶水语言可以嵌入c语言来执行。
2、可以采用多进程**
同步和异步
同步:我们运行程序的时候都是单进程、单线程,当程序执行耗时操作时(网络请求,操作文件)会造成主线程阻塞
异步:我们开辟一个线程或者进程来执行耗时操作,这个时候就叫异步。不会阻塞主线程
什么是多线程、多进程、协程
- 线程:线程是属于进程的,一个进程可以开辟多条线程,占用资源小,同一个进程多个线程之间的内存是共享的,多个线程可以直接对它们所在进程的内存数据进行读写并在线程间进行交换。
- 使用场景:一般在处理io密集型(上传,下载,操作文件,请求网络)操作时使用
- 缺点:如果多个线程同时对同一个全局变量操作,会出现资源竞争问题,从而数据结果会不正确。在cpython 线程全局锁的存在线程不能充分发挥cpu的性能
- 进程:是系统进行资源分配和调度的基本单位:一个进程可以开辟多条线程协程,进程之间资源是不会共享的
- 使用场景:一般在计算密集型操作进程可以充分发挥cpu的性能
- 缺点:消耗资源大
- 协程:协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元
其原理是当一个协程遇到IO(指的是input 输入输出,比如网络、文件操作等)操作时,比如访问网络,就自动切换到其他的协程,等到IO操作完成,再在适当的时候切换回来继续执行。
由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO
互斥锁
- 数据共享: 当多个线程都修改某一个共享数据的时候,需要进行同步控制。线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。互斥锁为资源引入一个状态:锁定/非锁定
某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。- 锁的好处:
确保了某段关键代码只能由一个线程从头到尾完整地执行- 锁的坏处:
阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了
由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁
死锁
- 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
- 避免死锁:
- 程序设计时要尽量避免(银行家算法)
- 添加超时时间等
线程、进程、协程
进程与线程的关系
1 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程
2 资源分配给进程,进程是程序的主体,同一进程的所有线程共享该进程的所有资源
3 cpu分配给线程,即真正在cpu上运行的是线程
4 线程是最小的执行单元,进程是最小的资源管理单元
协程的优缺点:
优点:
上下文切换消耗小
方便切换控制流,简化编程模型
高并发,高扩展性,低成本
缺点:
无法利用多核
进行阻塞操作时会阻塞掉整个程序
单纯的协程是没有意义的,只是人为的控制执行一下这个,执行一下那个,如果想监测是否有IO操作,需要结合IO多路复用
面向对象部分
面向对象优缺点:
解决了程序的扩展性,对某个对象单独修改 会立刻反映到整个体系,在调用时只需要实例化一个对象,对象就会拥有所有的属性
缺点是可控性差,无法像面向过程的程序设计一样精准的预测问题的处理结果
三大特性以及解释?
封装性多态性 继承性
多态性就是在不考虑实例的类型的情况下使用实例
封装性 它可以隐藏对象的属性和实现细节,仅对外提供公共访问方式
面向对象继承时要注意什么?
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类
继承分单继承和多继承 多继承需要注意继承的顺序,
而且子类继承父类后如果方法命名与父类相同 则会覆盖
但在python3中。可以使用super函数来调用父类方法
如何理解元类
元类就是负责帮你创建类的类 ,
new 和 init 方法?
new方法:在类初始化的时候new方法是来开辟一块内存空间的
init方法: 是在类实例化对象的时候调用的,用来实例化一些对象属性
单例模式
单例模式是一个对象只能有一个类。一个单例类只能有一个实例
Mysql
数据库引擎?
innob引擎 Memory引擎 Merge引擎
innob引擎一大特点就是支持外键。 内存和空间大 支持事务
数据库锁?
由于数据库是多用户共享资源,所以需要处理并发问题,而数据库锁的机制就是为了处理这一问题,当出现并发的时候,如果不做控制就会出现各种问题 比如脏数据。修改丢失等 所有数据库并发需要事务来控制,事务并发问题需要数据库锁来控制
事务四个特性。持久型 原子性 一致性 隔离性
数据库锁有 乐观锁 悲观锁 死锁。活锁 行锁 表锁 页级锁
排它锁有称为写锁。共享锁又称为读锁
数据库优化方案?
- 尽量避免使用select * 能用字段名就用字段名。避免查询无用字段
- select count(*)会查全表 尽量避免
- 建表时字段类型能用varchar/nvarchar就不要用char/ncahr
- 避免频繁的创建和删除临时表 会耗费性能资源 产生大量log
- 如果使用临时表 在使用的最后一定要显示删除 先trancate table 再drop table
- 尽量避免大事务操作,提高并发效率
- 避免向客户端返回大数据量 数据量过大 应考虑需求是否合理
- 比如你在一个在线网站使用delete和update操作。必然会引发数据库锁
什么是wsgi?
是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的协议
Django
什么是Django
- 重量级框架
- 对比Flask框架,Django原生提供了众多的功能组件,让开发更简便快速。
- MVT模式(MVC)
- 分工、解耦,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。
Django 中间件作用?应用?
中间件是服务器端与应用程序的一个中间层,它将个管道一样。将接受到的请求进行一些处理。然后传递到客户端 然后把客户端处理的结果再返回
它的应用场景是
1、根据url把请求给到不同的客户端程序
2、允许多个客户端
3、负载均衡和远程处理
4、应答的过滤处理