Skip to content

[TOC]

CPython的dict底层使用的数据结构?

底层是基于哈希表实现的。

参考:https://zhuanlan.zhihu.com/p/74003719

https://docs.python.org/3/library/stdtypes.html#dict

CPython和pypy的区别

https://www.python.org/

https://www.pypy.org/

https://www.python.org/dev/peps/pep-0620/

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)

python
s = 'python is shell'
print(' '.join(map(lambda x: x[::-1], s.split(' ')))) # nohtyp si llehs

字符串a = "not 404 found 张三 99 深圳",每个词中间是空格,用正则的方法,最终输出"张三 深圳"(2021/4/9)

python
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)

python
_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

答案参考:

python
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判断的是内存地址,==判断的是值。

python
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)

python
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)

python
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]
python
"""
下面我使用了冒泡和选择排序两个算法,但这两个算法我推荐使用选择排序算法来实现,
因为冒泡算法这里用的是最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)

python
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和它本身不能被其它数整除

python
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的输出结果和原因

python
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)

参考示例:

python
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)

参考:https://www.cnblogs.com/Neeo/articles/11261365.html

闭包:

python
def foo():  
    x = 1  
    y = 2  
    def bar():  
        print(x, y)  
    return bar

装饰器:

python
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)

编写装饰器,在函数正常执行后打印成功日志,如果执行过程中出错(有异常抛出),打印错误日志。

python
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)

python
# 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两个模块,且各自的代码如下:

python
# 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。

csv
user,pwd
zhangkai,123
likai,
wangkai,345

Python代码示例:

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
"""

请写出下面这段程序的输出,并说明原因。

python
# 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证明:

python
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
"""

请给出下面这段代码的运行结果

python
a = 1
def func():
    a += 1
    print(a)
func()

结果是上例第三行报错,因为局部作用域中如果没有global生命的话,只能引用全局作用域的变量而不能修改。

Python解释器种类以及特点?

Python和Java、PHP、C、C#、C++等其他语言的对比?

简述解释型和编译型编程语言?

print 方法默认调用 sys.stdout.write 方法,即往控制台打印字符串。

位和字节的关系?

b、B、KB、MB、GB 的关系?

请至少列举5个 PEP8 规范(越多越好)

求结果:or and

python
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

答案:

python
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 区别?

字节码和机器码的区别?

三元运算编写格式。

python
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?

用一行代码实现数值交换

python
a, b = 1, 2
print(a, b)
a, b = b, a
print(a, b)

Python3和Python2中 int 和 long的区别?

xrange和range的区别?

如何实现字符串的反转?

如: name = "zhangkai" 请反转为 name = "iakgnahz" 。

python
# 法1
name = "zhangkai"
print(name[::-1])

# 法2
name = "zhangkai"
tmp = list(name)
tmp.reverse()
print(''.join(tmp))

文件操作时:xreadlines和readlines的区别?

列举布尔值为False的常见值?

列举字符串、列表、元组、字典的常用方法?

python
# 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']

python
print("1,2,3".split(','))  # ['1', '2', '3']

如何实现['1', '2', '3']变成[1, 2, 3]

python
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] ?

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

常用字符串格式化哪几种?

有三种:

  • 模板字符串系列,即%
  • format
  • 在Python3.6之后,有f这种写法

什么是断言(assert)?应用场景?

有一个多层嵌套的列表A=[1,2,[3,4,["434",...]]],请写一段代码遍历A中的每一个元素并打印出来

python
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] 的结果是

python
# 基于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

哈希冲突回避算法有哪几种,分别有什么特点?

如何判断是函数还是方法?

python
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升序排序

python
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个, 要求不能重复, 可以自己设计数据结构

python
# 法1
print(list(range(1, 101, 10)))

# 法2
import random
li = range(1, 101)
print(random.sample(li, 10))

请列举你所知道的Python代码检测工具及他们间的区别?

输入一个字符串, 返回倒序排列的结果 如: abcdef, 返回 fedcba

python
a = "abcdef"
print(a[::-1])

判断dict中有没有某个key用的方法是什么?

python
print({}.__contains__('a'))  # Python3这么用
print({}.has_key('a'))  # Python2中这么用
print({}.get('a', None))   # 用get也可以

如何判断一个变量是否是字符串?

python
print(isinstance('abc', str))

list和tuple有什么不同?

tuple格式的数据是否可以作为字典的key,为什么?

只有tuple中所有元素类型都是可哈希类型的才能作为字典的key;但如果tuple中的元素有不可哈希的类型如列表,那么这个tuple就不能作为字典的key。

python
t1 = (1, 'a')  # 可以
t2 = (1, 'a', ['b', 'c'])  # 不可以

如何在Python中拷贝一个对象, 并说明他们之间的区别?

关于Python程序的运行性能方面, 有什么手段能提升性能?

Python是如何进行内存管理的? Python的程序会内存泄漏吗?说说有没有什么方面阻止或检测内存泄漏

使用Python获取文件的最后几行,如5行

python
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的及具体实现过程

python
t1 = ('a', 'b', 'c', 'd', 'e')
t2 = (1, 2, 3, 4, 5)
res = dict(zip(t1, t2))

如何打乱一个排好序的list对象alist

python
import random
li = list(range(1, 100))
random.shuffle(li)
print(li)

如何查找一个字符串中特定的字符?find和index的差异?

find找不到返回-1;index找不到就报错。

Python递归的最大层数?

1000

利用尾递归实现阶乘函数

简述 生成器、迭代器、装饰器以及应用场景?

装饰器的应用场景:

  • 引入日志
  • 程序执行时间的统计
  • 执行程序前的预处理/执行程序后的处理
  • 权限校验
  • 缓存
  • 事务处理

python一行print出1~100偶数的列表, (列表推导式, filter均可)

python
print([i for i in range(1, 101) if i % 2 == 0])

如何判断一个对象是函数还是方法?

python
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实现(主要功能是能打印函数名)

python
@log
def now():
    print("2021-4-15")
now()
"""
call now()
2021-4-15
"""

参考:

python
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

列举面向对象中带双下划线的特殊方法

python
__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__

请实现一个栈

python
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单例类, 要求遵循基本语言编程规范(用尽量多的方式)

python
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中如何判断一个对象是否可调用?那些对象可以是可调用

python
def foo(): ...
print(callable(foo))
print(callable(1111))
print(callable('abc'))

参考:https://www.cnblogs.com/haiyan123/p/8450483.html

__init__方法有什么作用

__new__方法有什么作用

举个例子,用来实现单例模式:

python
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"

参考答案:

python
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