根据候选人过去的行为评测其胜任能力
__iter__
魔术方法的对象可以用for迭代[i for i in range(10) if i % 2 == 0]
(i for i in range(10))
返回生成器def hello(name: str) -> str:
return 'hello' + name
class Base(object):
def hello(self):
print('say hello')
class C(Base):
def hello(self):
# py2
return super(C, self).hello()
class C2(Base):
def hello(self):
# py3
return super().hello()
a, b, *rest = range(10)
def add(a, b, *, c):
print(a+b+c)
# 会报错
add(1, 2, 3)
# 正确写法
add(1, 2, c=3)
__pycache__
__future__
def flist(l):
l.append(0)
print(l)
l = []
flist(l) #[0]
flist(l) #[0, 0]
def fstr(s):
s + = 'a'
print(s)
s = 'hehe'
fstr(s) #'hehea'
fstr(s) #'hehea'
# 一个小例题,请问这段代码会输出什么结果?
# first
def clear_list(l):
l = []
ll = [1, 2, 3]
clear_list(ll)
print(ll)
# second
# 默认参数只计算一次
def flist(l=[1]):
l.append(1)
print(l)
flist()
flist()
*args
被打包成tuple**kwargs
被打包成dicttry:
# func # 可能会抛出异常的代码
except (Exception1, Exception2) as e: # 可以捕获多个异常并处理
# 异常处理代码
else:
pass # 异常没有发生的时候代码逻辑
finally:
pass # 无论异常有没有发生都会执行的代码,一般处理资源的关闭和释放
class MyException(Exception):
pass
try:
raise MyException('my exception')
except MyException as e:
print(e)
import threading
n = [0]
def foo():
n[0] = n[0] + 1
n[0] = n[0] + 1
threads = []
for i in range(50000):
t = threading.Thread(target=foo)
threads.append(t)
for t in threads:
t.start()
print(n)
# 大多数情况下打印10000,偶尔打印9998,Python的多线程并不是绝对安全的
import dis
def update_list(l):
# 原子操作,不用担心线程安全问题
l[0] = 1
dis.dis(update_list)
'''
5 0 LOAD_CONST 1 (1)
2 LOAD_FAST 0 (l)
4 LOAD_CONST 2 (0)
6 STORE_SUBSCR # 字节码操作,线程安全
8 LOAD_CONST 0 (None)
10 RETURN_VALUE
'''
def incr_list(l):
# 危险!不是原子操作
l[0] += 1
dis.dis(incr_list)
'''
3 0 LOAD_FAST 0 (l)
2 LOAD_CONST 1 (0)
4 DUP_TOP_TWO
6 BINARY_SUBSCR
8 LOAD_CONST 2 (1)
10 INPLACE_ADD # 需要多个字节码操作,有可能在线程执行过程中切到其他线程
12 ROT_THREE
14 STORE_SUBSCR
16 LOAD_CONST 0 (None)
18 RETURN_VALUE
'''