Python语言基础常见考题
1、Python是静态还是动态类型?强类型还是弱类型?
动态强类型
Python作为后端语言优缺点
鸭子类型
关注点在对象的行为,而不是类型(duck typing)
比如 file,StringIO,socket 对象都支持read/write方法(file like object)
再比如定义了 iter 魔术方法的对象可以用 for 迭代
#鸭子接口,更关注方法而非类型
class Duck:
def quack(self):
print("gua gua")
class Person:
def quack(self):
print("我是人类,但我也会gua gua gua")
def in_the_forest(duck):
duck.quack()#quack方法
def game():
donald = Duck()
john = Person()
in_the_forest(donald)#调用在森林中这个方法,不管类型是duck还是Person都可以输出
in_the_forest(john)
print(type(donald))#输出类型
print(type(john))
print(isinstance(donald,Duck))#自省方法
print(isinstance(john,Person))
game()
monkey patch
什么是自省?
运行时判断一个对象的类型
Python一切皆对象,用 type, id, isinstance 获取对象类型信息
Inspect 模块提供了更多获取对象信息的函数
is和= 区别
is 是判断id是否相等(是否同一个对象)
= 是判断两个变量的值是否相等
什么是列表和字典推导?
a = ['a','b','c']
b = [1, 2, 3]
d={}
for i in range(len(a)):
d[a[i]] = b[i]
print(d)
#列表和字典推导
d = {k: v for k, v in zip(a,b)}#用zip成对迭代a b
print(d)
x = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
sets = {x for x in range(10)}
print(sets)
# 获得1~20的偶数的平方值的 list
#不优雅方式
list = []
for i in range(1, 21):
if i % 2 == 0:
list.append(i*i)
print(list)
#优雅方式
# step 1:[]
# step 2:[for i in range(1, 21) if i%2==0]
# step 3:[i*i for i in range(1, 21) if i%2==0]
betterList = [i*i for i in range(1, 21) if i%2==0]
print(betterList)