1.如何实现对python列表去重并保持原先顺序?
l1 = [1, 4, 3, 3, 4, 2, 3, 4, 5, 6, 1]
a = list(set(l1))
a.sort(key=l1.index)
print(a)
# a.sort(key=l1.index) 执行返回值为None,不要直接list(set(l1)).sort(key=l1.index)
2.现有两元组(('a'),('b')),(('c'),('d')),请使用python中匿名函数生成列表[{'a':'c'},{'b':'d'}]
t1 = (('a'),('b'))
t2 = (('c'),('d'))
print(list(zip(t1,t2))
print(list(map(lambda t:{t[0],t[1]},zip(t1,t2))))
data = (('a'), ('b'), ('c'), ('d'))
print(data[0:2]) # (a,b) == (('a'),('b'))
print(data[2:4]) # (c,d)
v = list(map(lambda x, y: {x: y}, data[0:2], data[2:4]))
print(v) # [{'a': 'c'}, {'b': 'd'}]
# 主要了解map 匿名函数两个参数计算
f = lambda x, y: {x: y}
v1 = list(map(f, ('a', 'b'), ('c', 'd'))) # [{'a': 'c'}, {'b': 'd'}]
print(v1)
print(('a'))
print(type('a')) # 注意括号直接加字符串和数字,不加逗号相当于啥都没加
3.请给出二分查找的python示例代码。
迭代
l = [2, 3, 5, 10, 15, 16, 18, 22, 26]
def find2(l, ans, start=0, end=None):
if not end:
end = len(l) - 1
mid = (start + end) // 2
if start <= end:
if ans > l[mid]:
start = mid + 1
return find2(l, ans, start, end)
elif ans < l[mid]:
end = mid - 1
return find2(l, ans, start, end)
else:
return mid
else:
return '找不到'
print(find2(l, 5))
非迭代
def binary_search(l, val):
start = 0
end = len(l) - 1
while start <= end:
mid = (start + end) // 2
if l[mid] < val:
start = mid + 1
elif l[mid] > val:
end = mid - 1
else:
return mid
else:
return '找不到'
4.在python字符串格式化中,% 和 .format的主要区别是什么?
python 内置的占位符%,字符串中有多少占位符就有,就需要多少变量来填充
.format是字符串的内置方法字符串中可以通过{},{0},{name}来填充数值,具体数据是有format函数的参数来确定
-
*args
和**kwargs
在什么情况下会使用到?请给出使用kwargs的示例代码
当你不确定你的函数里将要传递多少参数时你可以用args
相似的,*kwargs允许你使用没有事先定义的参数名:
常见使用情况是装饰器或者以下情况
class Foo(object):
def __init__(self, value1, value2):
# do something with the values
print value1, value2
class MyFoo(Foo):
def __init__(self, *args, **kwargs):
# do something else, don't care about the args
print 'myfoo'
super(MyFoo, self).__init__(*args, **kwargs)
还有如下方法,如果下面的`__new__`方法没有写入(*args,**kwargs)
则执行实例化时候回报错
class Bar(object):
"""
有参数__init__类
"""
def __init__(self, name):
self.name = name
def __new__(cls, *args, **kwargs):
obj = object.__new__(cls)
print(obj)
return obj
b = Bar('hello')
6.选择题
x = "foo"
y = 2
print(x*y)
执行结果: foofoo
7.问答题
kvps = {'1':1,'2':2}
theCopy = kvps
kvps['1'] = 5
sum = kvps['1'] + theCopy['1']
print(sum)
10
- 选择题 c
sys.path.append('/root/mods')
A.改变python的启动路径
B.改变python目前的工作路径
C.添加一个新的python模块的搜素路径
D.从mods中移除所有文件夹
print(sys.path)
[
'',
'/Users/BUYI/anaconda3/lib/python36.zip',
'/Users/BUYI/anaconda3/lib/python3.6',
'/Users/BUYI/anaconda3/lib/python3.6/lib-dynload',
'/Users/BUYI/anaconda3/lib/python3.6/site-packages',
'/Users/BUYI/anaconda3/lib/python3.6/site-packages/aeosa'
]
- 选择题
country_counter = {}
def addone(country):
if country in country_counter:
country_counter[country] += 1
else:
country_counter[country] = 1
addone('China')
addone('Japan')
addone('china')
print(len(country_counter)) # 3
{'China': 1, 'Japan': 1, 'china': 1}
10.选择题 (B)
重点关注切片和浅拷贝的区别
names1 = ['Amir','Barry','Chales','Dao']
names2 = names1
names3 = names1[:]
names2[0] = 'Alice'
names3[1] = 'Bob'
sum = 0
for ls in (names1,names2,names3):
if ls[0] == 'Alice':
sum += 1
if ls[1] == 'Bob':
sum += 10
print(sum)
A.11 B.12 C.21 D.22 E.33
11.填空题 (24)
d = lambda p : p * 2
t = lambda p : p * 3
x = 2
x = d(x)
x = t(x)
x = d(x)
print(x)
12.填空题(yes)
x = True
y = False
z = False
if x or y and z:
print('yes')
else:
print('no')
其一, 在不加括号时候, and优先级大于or
其二, x or y 的值只可能是x或y. x为真就是x, x为假就是y(切记如果x为真,后面的就不计算了)
第三, x and y 的值只可能是x或y. x为真就是y, x为假就是x(如果x为假,后面的也不计算了)
13.Python里面如何实现tuple和list的转换
list
tuple()
14.请写出一段Python代码实现删除一个list里面的重复元素
a = [1, 2, 4, 2, 4, 5, 6, 5, 7, 8, 9, 0]
b = {}.fromkeys(a)
print(b)
print(b.keys())
a = list(b.keys())
print(a)
15.如何得到列表list的交集与差集
a = [2, 5, 8]
b = [3, 4, 5]
print(set(a) & set(b)) # {5}
print(set(a).intersection(set(b))) # {5}
print(set(a) | set(b)) # {2, 3, 4, 5, 8}
print(set(a).union(set(b))) # {2, 3, 4, 5, 8}
print(set(a) - set(b)) # {8, 2}
print(set(a).difference(set(b))) # {8, 2}
print(set(a) ^ set(b)) # {2, 3, 4, 8}
print(set(a).symmetric_difference(set(b))) # {2, 3, 4, 8}
16.以下的代码的输出将是什么:(自己手写一下)
def extendList(val,list=[]):
list.append(val)
return list
list1 = extendList(10)
list2 = extendList(123,[])
list3 = extendList('a')
print('list1 = %s'%list1)
print('list2 = %s'%list2)
print('list3 = %s'%list3)
list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']
- python中定义函数是如何书写可变参数和关键字参数?
*args
和**kwargs
18.什么是lambda表达式?
编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数,因此也不用担心函数名冲突。
匿名函数主要是指对某数据的一个处理过程,但是不需要一个变量去承载他.
推荐知乎
19.re.match 和search 有什么区别
*re.match(pattern, string[, flags]) *
从首字母开始开始匹配,string如果包含pattern子串,则匹配成功,返回Match对象,失败则返回None,若要完全匹配,pattern要以$结尾。
ret = re.match('a', 'abc').group() # 同search,不过尽在字符串开始处进行匹配
print(ret) #结果 : 'a'
re.search(pattern, string[, flags])
若string中包含pattern子串,则返回Match对象,否则返回None,
注意,如果string中存在多个pattern子串,只返回第一个。
ret = re.search('a', 'eva egon yuan').group()
print(ret) #结果 : 'a'
通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None。
re.findall(pattern, string[, flags])
返回string中所有与pattern相匹配的全部字串,返回形式为数组
ret = re.findall('a', 'eva egon yuan') # 返回所有满足匹配条件的结果,放在列表里
print(ret) #结果 : ['a', 'a']
re.finditer(pattern, string[, flags])
返回string中所有与pattern相匹配的全部字串,返回形式为迭代器。
import re
ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器
print(ret) # <callable_iterator object at 0x10195f940>
print(next(ret).group()) #查看第一个结果
print(next(ret).group()) #查看第二个结果
print([i.group() for i in ret]) #查看剩余的左右结果
- 1 or 2 和 1 and 2输出分别是什么?为什么?
1 or 2 ---->1 # 1为True,or运算符直接结束运算,返回1
1 and 2 ---->2 # 1 为True,and运算符需要继续运算,返回值为and后的值(2)