[TOC]
CPython的dict底层使用的数据结构?
底层是基于哈希表实现的。
参考:https://zhuanlan.zhihu.com/p/74003719
https://docs.python.org/3/library/stdtypes.html#dict
CPython和pypy的区别
CPython是基于C语言开发的Python解释器,也是目前Python的官方发行版,更新稳定、扩展库丰富、社区支持较好。
pypy是RPython开发的。pypy相比CPython最大优势,就是性能!pypy非常快,大约平均快4.2倍。而rpython则是python的子集,即pypy是python语言实现的!
想要弄懂这里面的道道,你就要好好了解关于编程语言级别的更多细节了,我就不扯了,看的脑壳疼。
列举使用过的标准库
os sys time random shutil time datetime
sorted和list.sort的区别?
sorted是内置的排序算法,可以对列表、元组、字典、集合等排序,且sorted是非原地排序,即不影响原有的数据。
而sort是list专有的排序算法,且是原地排序列表,即在原有的列表上进行排序。
将 'python is shell' 转为 'nohtyp si llehs'(2021/4/9)
s = 'python is shell'
print(' '.join(map(lambda x: x[::-1], s.split(' ')))) # nohtyp si llehs
字符串a = "not 404 found 张三 99 深圳",每个词中间是空格,用正则的方法,最终输出"张三 深圳"(2021/4/9)
import re
a = "not 404 found 张三 99 深圳"
res = re.findall('[\u4e00-\u9fa5]{2}', a)
print(' '.join(res)) # 张三 深圳
参考:https://www.cnblogs.com/zhangjian0092/p/12332381.html
_dict = {'a': 1, 'b': 2, 'c': 3},要求根据value值从大到小输出key(2021/4/9)
_dict = {'a': 1, 'b': 2, 'c': 3}
print(sorted(_dict.keys(), key=lambda x: _dict[x], reverse=True)) # ['c', 'b', 'a']
给定data所示文件,标签格式为:多音字(拼音),如:一(yi1)。要求:对文件中出现的每个带标签的多音字及其读音,统计其出现的次数,如:
data = """
党的根本宗旨是全心全意为人民服务,文艺的根本宗旨也是为(wei4)人们服务。
许多人被短片戳中,并通过短片为(wei4)患者发声,产生了刷屏效应。
白宫幕僚长(zhang3)JohnKelly更是多次称特朗普是“白痴”.
出现“将死不死”买入信号时,DIF向上开口当天,有些股票当天成交量小于5田均量(liang4)。
关晓彤赴美工作父亲陪同,虽然比爸爸矮5cm,但腿却长(chang2)了一大截。
根据GlobalInstitute的网页,DBA项目为(wei4)中国及其周边区域的高管量身打造。
CSCR-1,CSC-RAPE-COMPLETE,罪行等级为一(yi1)级重罪。
"""
# 统计效果如下:
长: 2
zhang3: 1
chang2: 1
答案参考:
import re
data = """
党的根本宗旨是全心全意为人民服务,文艺的根本宗旨也是为(wei4)人们服务。
许多人被短片戳中,并通过短片为(wei4)患者发声,产生了刷屏效应。
白宫幕僚长(zhang3)JohnKelly更是多次称特朗普是“白痴”.
出现“将死不死”买入信号时,DIF向上开口当天,有些股票当天成交量小于5田均量(liang4)。
关晓彤赴美工作父亲陪同,虽然比爸爸矮5cm,但腿却长(chang2)了一大截。
根据GlobalInstitute的网页,DBA项目为(wei4)中国及其周边区域的高管量身打造。
CSCR-1,CSC-RAPE-COMPLETE,罪行等级为一(yi1)级重罪。
"""
dic = {}
res = re.findall('(?P<char>[\u4e00-\u9fa5]{1})\((?P<count>.*?)\)', data)
def foo(k, v):
dic[k][0][k] += 1
if dic[k][1].get(v):
dic[k][1][v] += 1
else:
dic[k][1][v] = 1
for item in res:
k, v = item
if k not in dic:
dic[k] = [{k: 0}, {}]
foo(k, v)
print(dic)
"""
{
'为': [{'为': 3}, {'wei4': 3}],
'长': [{'长': 2}, {'zhang3': 1, 'chang2': 1}],
'量': [{'量': 1}, {'liang4': 1}],
'一': [{'一': 1}, {'yi1': 1}]
}
"""
Python的命名规则(2020/11/19)
考察变量、函数、了的命名规则
is和==的区别(2021/4/6-2)
is判断的是内存地址,==判断的是值。
li1 = [1, 2, 3]
li2 = li1
print(li1 == li2) # True
print(li1 is li2) # True
li3 = [1, 2, 3]
li4 = [1, 2, 3]
print(li3 == li4) # True 元素相同
print(li3 is li4) # False 两个列表内存地址不一样
一行代码实现1-100的求和(2021/3/29-2)
print(sum(range(1, 101)))
print((1 + 100) * 100 // 2) # 等差数列求和公式
print(sum([i for i in range(1, 101)]))
参考:https://blog.csdn.net/qq_40808154/article/details/94136325
Python中的基础数据类型有哪些?哪些是可变类型?哪些是不可变类型(3)
Python中,基础数据类型有:
- 可变类型:
- list、dict、set;关于dict在Python3.6之后,就变成有序的了。
- 不可变类型:
- tuple、str、int、float
列表去重(2020/1/19-5)
li1 = [1, 1, 2, 3, 2, 5]
print(list(set(li1)))
li2 = [1, 1, 2, 3, 2, 5]
tmp_list = []
for i in li2:
if i not in tmp_list:
tmp_list.append(i)
print(tmp_list)
将两个列表[1, 5, 7, 9],[2, 2, 6, 8]合并为[1, 2, 2, 5, 6, 7, 8, 9].(2)
合并有序数组
arg1和arg2是两个升序数组,不允许使用sort和sorted,将两个数组合并:
- arg1 = [1, 3, 5]
- arg2 = [2, 4, 6]
- 输出:arg3 = [1, 2, 3, 4, 5, 6]
"""
下面我使用了冒泡和选择排序两个算法,但这两个算法我推荐使用选择排序算法来实现,
因为冒泡算法这里用的是最low的版本,因为优化版本不适用这个待排序列表
详情参考:https://www.cnblogs.com/Neeo/articles/7835425.html
"""
def select_sort_simple(li):
tmp_list = []
for i in range(len(li)): # 循环 i 趟
min_value = min(li)
tmp_list.append(min_value)
li.remove(min_value)
return tmp_list
arg1 = [1, 3, 5]
arg2 = [2, 4, 6]
arg3 = arg1 + arg2
print(arg3)
print(select_sort_simple(arg3))
"""
[1, 3, 5, 2, 4, 6]
[1, 2, 3, 4, 5, 6]
"""
def bubble_sort(li):
""" 冒泡排序"""
for i in range(len(li) - 1): # 从0开始的第i趟
for j in range(len(li) - i - 1): # 要循环的趟数
if li[j] > li[j + 1]: # 后一个数比当前数大,就交换位置
# if li[j] < li[j+1]: # 降序排序, 大于是升序排序
li[j], li[j + 1] = li[j + 1], li[j]
arg1 = [1, 3, 5]
arg2 = [2, 4, 6]
arg3 = arg1 + arg2
print(arg3)
bubble_sort(arg3)
print(arg3)
"""
[1, 3, 5, 2, 4, 6]
[1, 2, 3, 4, 5, 6]
"""
Python中的list和tuple可以作为字典的key么?为什么?(2021/3/4)
两种方法,求列表l = [5, 9, 3]中的最大值(2021/3/4)
对数值1.3425四舍五入保留2位小数点(2021/3/4)
print(round(1.3425, 2))
一句语句把 L=[(1,2), (3,4)] 转换成 [(1,3),(2,4)],可以写下不同的方法(2021/3/4)
列表和元组的区别?什么时候用到了列表?(2020/11/19-2)
各写一个列表生成式,字典生成式,集合生成式的列子(2021/3/4)
字符串拆分成数组,如"ab&&2"通过"&&"做分隔符,分割得到字符串数组["ab", "2"]
(2021/3/4)
实现字符串组合,如["ab", "2"]通过"&&"分隔符,组合成字符串"ab&&2"(2021/3/4)
找出不大于n的最大质数(2021/3/4)
质数:一个大于1的自然数,除了1和它本身不能被其它数整除
def foo(n):
if n <= 1:
return False
for i in range(n, 1, -1):
for k in range(2, i):
if i % k == 0:
break
else:
# print(i) # 如果把下面的return注释,这里将从大到小打印所有小于n的质数
return i
print(foo(10)) # 7
更多参考:https://blog.csdn.net/qq_36883141/article/details/89004473
集合为什么不能重复(2021/4/6)
给你一个字符串,查看它在日志中出现的次数(2021/4/3)
深浅拷贝(6)
这个知识点也是一个大的考点,比如:
- python如何实现对象的深拷贝?
- 深浅拷贝的区别?
说明下面l
的输出结果和原因
l = []
for i in range(10):
l.append({"num": i})
print(l)
l = []
a = {"num": 0}
for i in range(10):
a['num'] = i
l.append(a)
print(l)
参考示例:
l = []
for i in range(10):
l.append({"num": i})
print(l)
l = []
a = {"num": 0}
for i in range(10):
a['num'] = i
l.append(a)
print(l)
"""
第一个没啥好说的,每次都append一个新的字典
[{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}, {'num': 5}, {'num': 6}, {'num': 7}, {'num': 8}, {'num': 9}]
第二个就有点意思了,l.append的其实是对于字典a的引用,而随着循环结束,字典中num的值就变成了最大的i值,即9,也因为是引用,它影响到了列表中
的所有元素
[{'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}]
补充:上面的问题可以算是深浅拷贝的一个典型案例了,解决上面影响的办法,可以使用深拷贝来解决这个问题
from copy import deepcopy
l = []
a = {"num": 0}
for i in range(10):
a['num'] = i
new_a = deepcopy(a)
l.append(new_a)
print(l) # [{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}, {'num': 5}, {'num': 6}, {'num': 7}, {'num': 8}, {'num': 9}]
"""
分别简单实现一个闭包和装饰器的例子(2021/3/4)
闭包:
def foo():
x = 1
y = 2
def bar():
print(x, y)
return bar
装饰器:
import time
def timer(func):
def wrapper():
start = time.time()
func()
print('function %s run time %s' % (func.__name__, time.time() - start))
return wrapper
@timer
def f1():
time.sleep(0.1)
@timer
def f2():
time.sleep(0.2)
编写装饰器,在函数正常执行后打印成功日志,如果执行过程中出错(有异常抛出),打印错误日志。
import time
def timer(func):
def wrapper(*args, **kwargs):
try:
res = func(*args, **kwargs)
print(f'{func.__name__}正常运行....')
except Exception as e:
print(f'{func.__name__}出现内部错误: {e}')
return wrapper
@timer
def f1():
time.sleep(0.1)
@timer
def f2():
time.sleep('a')
f1()
f2()
"""
f1正常运行....
f2出现内部错误: an integer is required (got type str)
"""
求一个数的n次方 不使用pow函数,不使用for循环(2021/3/4)
斐波那契数列是什么东西?(2021/3/4)
# 0 基础版
x, y = 0, 1
for i in range(10):
x, y = y, x + y
print(x) # 55
match和search的区别(2021/4/6)
正则匹配如何匹配手机号(2021/4/6)
正则匹配字符串S是否以api开头,sys结尾,如果能匹配成功,打印出匹配的内容(2021/3/4)
Python标准库及第三方库(2020/11/29-3)
模块的循环导入问题(2021/4/8)
现在有b、c两个模块,且各自的代码如下:
# c.py
import b
def foo(): ...
b.foo() # AttributeError: module 'b' has no attribute 'foo'
# b.py
import c
def foo(): ...
c.foo()
正如上面例子所示,在模块c中导入模块b,在模块b中导入模块c。此时我们运行模块c,会发生什么样的事情?
- 程序从上往下执行到第2行,导入模块b,程序跳转到模块b内,执行其内的代码。
- 程序在模块b内执行到第6行,导入模块c,程序又跳转到模块c内,从第2行开始往下执行,第2行,定义函数foo,这步没问题,接着往下走。
- 序执行到第4行,调用b中的foo属性,抛出AttributeError错误并中止程序。原因是什么呢?原因是在程序在模块b内只执行了一行代码就跳转了,因为碰到调用模块c(第6行),程序没有往下执行。也就是说,foo变量没有成为模块c的属性,却在第4行就去调用,结果就是报错。
由上例可以看到,在导入模块时,应该避开这种相互导入的情况,也就是闭环式的导入。
Python装饰器的作用(3)
装饰器也是一个大的考点,主要考察:
- 有用到过装饰器么?
- 在哪里用到过?
- 在项目中用到过么?
- 装饰器的开放封闭原则?
简单描述Python中的面向对象思想(2021/3/29)
__eq__
和__str__
(2021/4/6)
__new__
和__init__
(2020/11/29)
Python垃圾回收机制(2021/4/3-3)
Python的存储机制(2021/4/3)
全局GIL锁(2020/11/29-3)
列举3种熟悉的异常类型,并且简述下什么情况下会出现(2021/3/4)
a=[1, {'a':12}]; b=a; a[1]['a']=1;print(b)
输出什么? 并且简述下原因(2021/3/4)
Python中,什么会出现NAN,如何判断NAN?
一般的在pands中对于数据的缺省时,会出现nan,如下面的示例。
a.csv文件中,likai对应的密码值为空,后续处理时,会出现nan。
user,pwd
zhangkai,123
likai,
wangkai,345
Python代码示例:
import pandas as pd
data = pd.read_csv('./a.csv', encoding='utf-8')
for pwd in data['pwd']:
if not pd.isna(pwd): # 如果pwd为nan返回True
print(pwd)
"""
123.0
345.0
"""
请写出下面这段程序的输出,并说明原因。
# m.py
class A:
def func(self):
print('Hi')
# main.py
import m
def monkey(self):
print('Hi, monkey')
m.A.func = monkey
foo = m.A()
foo.func()
答案是打印Hi, monkey
,其原因是m.A.func=monkey
相当于用monkey覆盖掉原来的func方法。可以通过打印id证明:
import m
def monkey(self):
print('Hi, monkey')
print(id(monkey))
print(id(m.A.func))
m.A.func = monkey
print(id(m.A.func))
foo = m.A()
foo.func()
"""
3223844589920
3223846049248
3223844589920
Hi, monkey
"""
请给出下面这段代码的运行结果
a = 1
def func():
a += 1
print(a)
func()
结果是上例第三行报错,因为局部作用域中如果没有global生命的话,只能引用全局作用域的变量而不能修改。
Python解释器种类以及特点?
Python和Java、PHP、C、C#、C++等其他语言的对比?
简述解释型和编译型编程语言?
print 调用 Python 中底层的什么方法?
print 方法默认调用 sys.stdout.write 方法,即往控制台打印字符串。
位和字节的关系?
b、B、KB、MB、GB 的关系?
请至少列举5个 PEP8 规范(越多越好)
求结果:or and
v1 = 1 or 3
v2 = 1 and 3
v3 = 0 and 2 and 1
v4 = 0 and 2 or 1
v5 = 0 and 2 or 1 or 4
v6 = 0 or False and 1
答案:
v1 = 1 or 3 # 1
v2 = 1 and 3 # 3
v3 = 0 and 2 and 1 # 0
v4 = 0 and 2 or 1 # 1
v5 = 0 and 2 or 1 or 4 # 1
v6 = 0 or False and 1 # False
ascii、unicode、utf-8、gbk 区别?
字节码和机器码的区别?
三元运算编写格式。
a, b = 1, 2
result = True if a > b else False
print(result) # False
列举你了解的所有Python2和Python3的区别?
参考:https://www.cnblogs.com/Neeo/p/8033520.html
python2项目如何迁移成python3?
用一行代码实现数值交换
a, b = 1, 2
print(a, b)
a, b = b, a
print(a, b)
Python3和Python2中 int 和 long的区别?
xrange和range的区别?
如何实现字符串的反转?
如: name = "zhangkai" 请反转为 name = "iakgnahz" 。
# 法1
name = "zhangkai"
print(name[::-1])
# 法2
name = "zhangkai"
tmp = list(name)
tmp.reverse()
print(''.join(tmp))
文件操作时:xreadlines和readlines的区别?
列举布尔值为False的常见值?
列举字符串、列表、元组、字典的常用方法?
# str.startswith
# str.endswith
# str.split
# str.replace
# str.strip
# str.index
# str.format
# str.find
# str.isdigit
# list.append
# list.insert
# list.index
# list.extend
# list.pop
# list.remove
# dict.get
# dict.fromkeys
# dict.setdefault
# dict.clear
# dict.keys
# dict.values
# dict.items
# dict.pop
# dict.popitem
# dict.setdefault
# tuple.index
# tuple.count
# set.add
# set.remove
# set.pop
# set.discard
# set.remove
# set.union
# set.difference
# set.symmetric_difference
Python的可变类型和不可变类型的区别?
如何实现"1,2,3"变成['1', '2', '3']
print("1,2,3".split(',')) # ['1', '2', '3']
如何实现['1', '2', '3']变成[1, 2, 3]
l = ['1', '2', '3']
print(list(map(int, l))) # [1, 2, 3]
比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 c = [(1,),(2,),(3,) ] 的区别?
如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
print([i ** 2 for i in range(1, 11)])
常用字符串格式化哪几种?
有三种:
- 模板字符串系列,即%
- format
- 在Python3.6之后,有f这种写法
什么是断言(assert)?应用场景?
有一个多层嵌套的列表A=[1,2,[3,4,["434",...]]],请写一段代码遍历A中的每一个元素并打印出来
def foo(n):
if isinstance(n, list):
for i in n:
if isinstance(n, list):
foo(i)
else:
print(i)
else:
print(n)
foo([1, 2, [3, 4, [5, 6], [7, 8], 9, 10, [11, 12, [13, 14]]]])
a = range(10),a[::-3] 的结果是
# 基于Python3实现
a = range(10)
print(a[::-3]) # range(9, -1, -3)
print(list(a[::-3])) # [9, 6, 3, 0]
下面那个命令可以从虚拟环境中退出
a. deactivate
b. exit
c. quit
d. 以上均可
答案是a。
关于虚拟环境,参考:https://www.cnblogs.com/Neeo/articles/12327035.html
哈希冲突回避算法有哪几种,分别有什么特点?
如何判断是函数还是方法?
import inspect
class A(object):
x = 'abc'
def foo(self):
pass
def func(): pass
a = A()
print(inspect.isclass(A)) # True
print(inspect.ismethod(a.foo)) # True
print(inspect.isfunction(func)) # True
简述Python的字符串驻留机制?
Python语言中那些数据类型能做为字典的key?
将下面的列表内的元素以age升序排序
tmp_list = [
{'name': '张开', 'age': 18}, {'name': '李开', 'age': 8},
{'name': '王开', 'age': 32}, {'name': '赵开', 'age': 25}
]
tmp_list.sort(key=lambda x: x['age'], reverse=False)
print(tmp_list)
从0-99这100个数中随机取出10个, 要求不能重复, 可以自己设计数据结构
# 法1
print(list(range(1, 101, 10)))
# 法2
import random
li = range(1, 101)
print(random.sample(li, 10))
请列举你所知道的Python代码检测工具及他们间的区别?
输入一个字符串, 返回倒序排列的结果 如: abcdef, 返回 fedcba
a = "abcdef"
print(a[::-1])
判断dict中有没有某个key用的方法是什么?
print({}.__contains__('a')) # Python3这么用
print({}.has_key('a')) # Python2中这么用
print({}.get('a', None)) # 用get也可以
如何判断一个变量是否是字符串?
print(isinstance('abc', str))
list和tuple有什么不同?
tuple格式的数据是否可以作为字典的key,为什么?
只有tuple中所有元素类型都是可哈希类型的才能作为字典的key;但如果tuple中的元素有不可哈希的类型如列表,那么这个tuple就不能作为字典的key。
t1 = (1, 'a') # 可以
t2 = (1, 'a', ['b', 'c']) # 不可以
如何在Python中拷贝一个对象, 并说明他们之间的区别?
关于Python程序的运行性能方面, 有什么手段能提升性能?
Python是如何进行内存管理的? Python的程序会内存泄漏吗?说说有没有什么方面阻止或检测内存泄漏
使用Python获取文件的最后几行,如5行
from collections import deque
with open("test.txt", 'r', encoding="utf-8") as f:
d = deque(f, 5)
for line in d:
print(line, end='')
python代码如何获取命令行参数?
有两种方式:
- 使用sys.argv
- 使用相关模块,argparse
写代码,写出由t1和t2得到res的及具体实现过程
t1 = ('a', 'b', 'c', 'd', 'e')
t2 = (1, 2, 3, 4, 5)
res = dict(zip(t1, t2))
如何打乱一个排好序的list对象alist
import random
li = list(range(1, 100))
random.shuffle(li)
print(li)
如何查找一个字符串中特定的字符?find和index的差异?
find找不到返回-1;index找不到就报错。
Python递归的最大层数?
1000
利用尾递归实现阶乘函数
简述 生成器、迭代器、装饰器以及应用场景?
装饰器的应用场景:
- 引入日志
- 程序执行时间的统计
- 执行程序前的预处理/执行程序后的处理
- 权限校验
- 缓存
- 事务处理
python一行print出1~100偶数的列表, (列表推导式, filter均可)
print([i for i in range(1, 101) if i % 2 == 0])
如何判断一个对象是函数还是方法?
from types import FunctionType, MethodType
def foo(): ...
class Bar(object):
def bar(self): ...
b = Bar()
print(isinstance(foo, FunctionType))
print(isinstance(b.bar, FunctionType))
print(isinstance(foo, MethodType))
print(isinstance(b.bar, MethodType))
lambda表达式格式以及应用场景?
请简述标准库中functools.wraps的作用
参考:https://www.cnblogs.com/Neeo/articles/8371826.html
请写出log实现(主要功能是能打印函数名)
@log
def now():
print("2021-4-15")
now()
"""
call now()
2021-4-15
"""
参考:
def log(func):
def wrapper(*args, **kwargs):
print('call {}()'.format(func.__name__))
res = func(*args, **kwargs)
return res
return wrapper
@log
def now():
print("2021-4-15")
now()
"""
call now()
2021-4-15
"""
unittest 是什么?
unittest是Python内置的单元测试框架。
参考:https://www.cnblogs.com/Neeo/articles/11494077.html
什么是c3算法?
参考:https://www.cnblogs.com/Neeo/articles/10003881.html
列举面向对象中带双下划线的特殊方法
__setattr__, __delattr__, __getattr__,__getattribute__, __getattr__
__get__, __set__, __delete__,__enter__, __exit__,__call__
__setitem__, __getitem__, __delitem__
__str__, __repr__, __format__,__init__, __del__
__slots__,__next__, __iter__,__doc__, __module__, __class__
请实现一个栈
class Stack(object):
def __init__(self):
self.stack = []
def push(self, element):
""" 入栈 """
self.stack.append(element)
def gettop(self):
""" 查栈顶元素 """
return self.stack[-1] if self.stack else None
def pop(self):
""" 出栈 """
return self.stack.pop() if self.stack else None
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print(stack.pop()) # 3
参考:https://www.cnblogs.com/Neeo/articles/9199427.html
实现一个Singleton单例类, 要求遵循基本语言编程规范(用尽量多的方式)
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
def __init__(self, num):
self.num = num
num1 = Singleton(10)
num2 = Singleton(20)
print(num1.num, num2.num) # 20 20
print(id(num1), id(num2)) # 2467135043848 2467135043848
参考:https://www.cnblogs.com/Neeo/articles/11912183.html
请描述with的用法, 如果自己的类需要支持with语句, 应该如何书写?
参考:https://www.cnblogs.com/Neeo/articles/10680731.html
python中如何判断一个对象是否可调用?那些对象可以是可调用
def foo(): ...
print(callable(foo))
print(callable(1111))
print(callable('abc'))
参考:https://www.cnblogs.com/haiyan123/p/8450483.html
__init__
方法有什么作用
__new__
方法有什么作用
举个例子,用来实现单例模式:
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
def __init__(self, num):
self.num = num
num1 = Singleton(10)
num2 = Singleton(20)
print(num1.num, num2.num) # 20 20
print(id(num1), id(num2)) # 2467135043848 2467135043848
classmethod、static method、property有什么作用
__new__的原理是什么,它在触发之前携带了什么参数
有一个c类,继承了了a和b两个类,a和b类里有一个同样的方法,问c这个类在实例化的时候,调用的这个方法是a类里的方法还是b类里的方法
写代码
问题:
1,实现函数,输入字符串,输出其对应的对象:
Input:
string1 = '["ITEM0001 x 1", "ITEM0013 x 2", "ITEM0022 x 1"]'
Output:
obj1 = {
"ITEM0001": 1,
"ITEM0013": 2,
"ITEM0022": 1,
}
2,在上题的基础上,增加额外信息 ITEM 指的是商品: ITEM0001 的价格 为 10; ITEM0013 的价格 为 20; ITEM0022 的价格 为 30。
Input:
string1 = '["ITEM0001 x 1", "ITEM0013 x 2", "ITEM0022 x 1"]'
Output:
80
Input:
string1 = '["ITEM0006 x 1"]'
Output:
"ITEM 不合法!"
3,「附加题」在上两题的基础上,增加额外信息 优惠 1: 同时购买 ITEM0001 和 ITEM0022,则该商品半价
优惠 2: 满 100 减 30
优惠只能选一种。自动计算多种优惠的结果,并输出最优结果。
Input:
string1 = '["ITEM0001 x 1", "ITEM0013 x 2", "ITEM0022 x 1"]'
Output:
60
"优惠 1"
Input:
string1 = '["ITEM0001 x 1", "ITEM0013 x 3", "ITEM0022 x 1"]'
Output:
70
"优惠 2"
参考答案:
def f1(s):
return {item.split('x')[0].strip("'\" "): item.split('x')[1].strip("'\" ") for item in s.strip("'[]'").split(',')}
def f2(s):
tmp = {item.split('x')[0].strip("'\" "): item.split('x')[1].strip("'\" ") for item in s.strip("'[]'").split(',')}
price = {"ITEM0001": 10, "ITEM0013": 20, "ITEM0022": 30}
return sum([price[i[0]] * int(i[1]) for i in tmp.items()])
def f3(s):
tmp = {item.split('x')[0].strip("'\" "): item.split('x')[1].strip("'\" ") for item in s.strip("'[]'").split(',')}
price = {"ITEM0001": 10, "ITEM0013": 20, "ITEM0022": 30}
d1 = d2 = 0
if "ITEM0001" in tmp and "ITEM0022" in tmp:
if sum([price[i[0]] * int(i[1]) for i in tmp.items()]) >= 100:
d2 = sum([price[i[0]] * int(i[1]) for i in tmp.items()])
else:
price = {"ITEM0001": 10 * 0.5, "ITEM0013": 20, "ITEM0022": 30 * 0.5}
d1 = sum([price[i[0]] * int(i[1]) for i in tmp.items()])
else:
d2 = sum([price[i[0]] * int(i[1]) for i in tmp.items()])
return f'{d1} 优惠1' if d1 > d2 else f'{d2 - 30} 优惠2'
s = '["ITEM0001 x 1", "ITEM0013 x 2", "ITEM0022 x 1"]'
print(f1(s)) # {'ITEM0001': '1', 'ITEM0013': '2', 'ITEM0022': '1'}
print(f2(s)) # 80
print(f3('["ITEM0001 x 1", "ITEM0013 x 2", "ITEM0022 x 1"]')) # 60.0 优惠1
print(f3('["ITEM0001 x 1", "ITEM0013 x 3", "ITEM0022 x 1"]')) # 70 优惠2