2019独角兽企业重金招聘Python工程师标准>>>
基础知识
%s 字符串格式输出,%d 数字格式化输出
可变类型(mutable):列表,字典,集合 不可变类型(unmutable):数字,字符串,元组
有序数据 : 列表,元组 无序数据 : 结合
s为字符串判断
s.isalnum() 所有字符都是数字或者字母
s.isalpha() 所有字符都是字母
s.isdigit() 所有字符都是数字
s.islower() 所有字符都是小写
s.isupper() 所有字符都是大写
s.istitle() 所有单词都是首字母大写,像标题
s.isspace() 所有字符都是空白字符、\t、\n、\r
# True or False
列表
1、有序的集合 2、通过偏移来索引,从而读取数据 3、支持嵌套 4、可变的类型
基础
l = []
l =[‘张三‘,‘李四’,'alex']
# 创建
l.append("eva")
# 追加
# 删除
l.remove('eva')
l.pop() # 删除最后一个
索引
l = ['egon','alex','seven','yuan']
l[0]
切片
切片后是新的列表
l = ['egon','alex','seven','yuan']
l[0:3]
# 1-3 之间的元素
l[2:]
# 第3个开始的元素
l[:]
# 切片
l[::2]
l[::-1]
枚举打印索引
for x,y in enumerate (lists):
print(x,y)
列表推导式
a=[ i for i in lists]
常用数据处理(索引、查找、分割、连接、替换、统计、大写)
find搜索
s = 'hello'
print (s.find('e'))
# 搜索到 值为1
print (s.find('i'))
# 未搜索到 值 -1
index索引
s = 'hello'
print(s[1])
# 第二位
print (s[-1])
# 最后一位
print(s.index('e'))
# 字符串索引序号
print(type(s))
len长度
len(lists)
# 字符、列表...长度
replace替换
s = 'hello,world'
s = s.replace('h','H')
print (s)
split字符串切割成列表
s = 'hello,world'
print (s.split(","))
strip清除
s = ' hello,world! '
s.strip() # 清除头尾两边空白
s.lstrip() # 清理左空白
s.rstrip() # 清理右空白
s2 = '***hello,world!***'
s2.strip('*') #清除指定内容
collections模块
namedtuple: 生成可以使用名字来访问元素内容的tuple子类 tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:
p = (1, 2)
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
p.x
# 1
p.y
# 2
deque: 双端队列,可以快速的从另外一侧追加和推出对象
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x')
# 追加元素
q.appendleft('y')
# 左边添加元素
deque除了实现list的append()和pop()外,还支持appendleft()和popleft(),这样就可以非常高效地往头部添加或删除元素。
defaultdict
: 默认字典,当引用key不存在,返回一个默认值
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
dd['key1']
dd['key2']
OrderedDict:保持Key的顺序
od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
od.keys()
hash
可变的数据类型是不可以被hash
一个值可以hash那么说明这是一个不可变得数据类型
copy
深浅拷贝的作用:
1,减少内存的使用; 2,以后在做数据的清洗、修改或者入库的时候,对原数据进行复制一份,以防数据修改之后,找不到原数据。
对于不可变对象的深浅拷贝:
不可变对象类型,没有被拷贝的说法,即便是用深拷贝,查看id的话也是一样的,如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已; 一句话就是,不可变类型,不管是深拷贝还是浅拷贝,地址值和拷贝后的值都是一样的。
浅copy
alist=[1,2,3,["a","b"]]
b=alist
alist.append(5)
print (b)
#直接赋值,默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变
alist=[1,2,3,["a","b"]]
import copy
c=copy.copy(alist)
alist.append(5)
print (alist,c)
[1, 2, 3, ['a', 'b'], 5],[1, 2, 3, ['a', 'b']]
# copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变
alist[3]
alist[3].append('cccc')
print (alist,c)
# 里面的子对象被改变了
深copy
import copy
alist=[1,2,3,["a","b"]]
d=copy.deepcopy(alist)
alist[3].append("ccccc")
print (alist,d)
# 始终没有改变
字典
基础
# dic = {}
dictionary["lj"] = "18069" #或者用下面
dictionary1= {"lj":"18099"}
# 赋值
del dictionary["gd"]
# 删除key
dictionary.clear()
# 清空所有条目
dictionary = {"lj":"18099","gd":"hehehe","gg":"1199","aaa":"11"}
for key in sorted(dictionary.keys()):
print (key,dictionary[key])
# sorted返回新副本排序keys,原数据不变
循环迭代
for k in dic.keys()
for k,v in dic.items()
for k in dic:
print (k,dic(k))
合集
1.确定性(集合中的元素必须是确定的) 2.互异性(集合中的元素互不相同。例如:集合A={1,a},则a不能等于1) 3.无序性(集合中的元素没有先后之分),如集合{3,4,5}和{3,5,4}算作同一个集合。
基础
list_1 = set{2,4,6,8,9}
# set 语法
list_2 = [1,3,4,6,3,5,7]
#列表
list_2 = set(list_1)
#转集合类型
print ('交集',list_1 & list_2)
#list1与list2都有的 (交集)
print ('差集',list_1 - list_2)
##list1 有 list2没的
print ('对称差集',list_1 ^ list_2)
#取两边不重复的 (对称差集)
print ('并集',list_1 | list_2)
#list1和list2合集
常用方法
s.add(x)
增加元素
s.remove(x)
# 删除元素,如果不存在则引发 KeyError
s.s.discard(x)
# "s"中存在元素 x, 则删除
s.pop()
# 删除第一个
s.clear()
# 清空元素
数据处理:
join拼接方法
lists=['alex', 'steven', 'egon']
"_".join(lists)
'alex_steven_egon
切割列表
s = 'hello,world'
s.split(',')
['hello', 'world']
大小写
str.upper()
str.lower()
#字符串转大写;字符串转小写
流程控制
循环从大到小输出1 - 100
count = 101
for i in range (count):
print(i)
print("for done")
count = 0
while count <100:
count +=1
print(count)
print("while done")
循环从小到大输出100 - 1
count = 101
for i in range(count,0,-1):
print(i)
print("for done")
while count >1:
count -=1
print(count)
print("while done")
最大最小
li=[1, 3, 2, 7, 6, 23, 41, 243, 33, 85, 56]
max(li),min(li),sum(li)
# 最大,最小,求和
乘法表
number=1
print ("显示乘法表:")
for i in range(1,11):
print (number, "*",i,"=",number * i)
利用for循环和range输出9 * 9乘法表
print('\n'.join([ ' '.join([ "%d*%d=%2s" %(y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))
在不改变列表中数据排列结构的前提下,找出以下列表中最接近最大值和最小值的平均值 的数 li = [-100,1,3,2,7,6,120,121,140,23,411,99,243,33,85,56]
编码
简述 把Unicode和UTF-8关系
1.在计算机内存中统一使用Unicode编码
·,当需要保存到硬盘或需要传输时,就转换为UTF-8编码 2.用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件
编码长度
字母: 字节数 : 1;编码:GBK 字节数 : 1;编码:UTF-8
中文汉字 字节数 : 2;编码:GB2312 字节数 : 2;编码:GBK 字节数 : 3;编码:UTF-8
编码转换
unicode > s.encode("utf-8") > s.decode("utf-8") > unicode
# 将python3默认的Unicode字符 通过encode编码为utf-8;通过decode 解码为unicode(万国码)
bin(10),oct(10),hex(10)
# 二进制,十进制,十六进制
练习题:
查找列表中元素,移除每个元素的空格,并查找以a或A开头并且以c结尾的所有元素
li = ["alec", " aric", "Alex", "Tony", "rain"]
tu = ("alec", " aric", "Alex", "Tony", "rain")
dic = {'k1': "alex", 'k2': ' aric', "k3": "Alex", "k4": "Tony"}
文件a.txt内容:每一行内容分别为商品名字,价钱,个数,求出本次购物花费的总钱数
apple 10 3
tesla 100000 1
mac 3000 3
lenovo 30000 3
chicken 10 3
with open('a.txt','r') as f:
info = f.read()
f.close()
f = info.split('\n')
count = 0
for line in f:
line = line.split()
line_count =int( line[1]) * int (line[2])
count += line_count
print(count)
使用 while/for循环实现输出 2-3+4-5+6...+100的和
sum = 0
count = 1
while count <100:
count = count + 1
if count%2 !=0:
sum -= count
else:
sum += count
print("2-3+4-5+6...+100=",sum )
num=0
count = 0
for i in range (2,101):
count += 1
if (count % 2) == 0:
#print(i)
num -= i
else:
num += i
print("2-3+4-5+6...+100=",num)
求100以内的素数和
N=100
i=2
num=2
s=0
for i in range(2,100):
for num in range(2,i):
if (i%num==0):
break
else:
s+=i
print(i)
print(s)
在不改变列表中数据排列结构的前提下,找出以下列表中最接近最大值和最小值的平均值 的数li = [-100,1,3,2,7,6,120,121,140,23,411,99,243,33,85,56]
解题思路,找到最大值 ,找到最小值 ,求平均值 ,找到列表中离这个平均值 最近的值
li = [-100,1,3,2,7,6,120,121,140,23,411,99,243,33,85,56]
max_n = max(li)
min_n = min(li)
avg_n = (max_n + min_n)/2
print("最大数",max_n,"最小数",min_n)
print("平均数",avg_n)
avg_like = 0
for i in li:
if abs(i - avg_n) < abs(avg_like - avg_n):
avg_like = i
print('最接近平均值 的是',avg_like)
作业
登陆
_user = 'lj'
_passwd = '123456'
count = 0
while count <3:
count += 1
username = str(input("Username:")).strip()
password = str(input("Password:")).strip()
if username == _user and password == _passwd:
print("%s,欢迎登陆" % username)
break
else:
pass
三级菜单
menu = {
'北京':{
'海淀':{
'五道口':{
'soho':{},
'网易':{},
'google':{}
},
'中关村':{
'爱奇艺':{},
'汽车之家':{},
'youku':{},
},
'上地':{
'百度':{},
},
},
'昌平':{
'沙河':{
'老男孩':{},
'北航':{},
},
'天通苑':{},
'回龙观':{},
},
'朝阳':{},
'东城':{},
},
'上海':{},
'山东':{},
}
current_layer = menu
layers = []
Flag = True
while Flag:
for line in current_layer:
print (line)
choose_input = input('>:').strip()
if not choose_input: continue
if choose_input in current_layer:
layers.append(current_layer) # 进入下一层,保存当前层
#print(layers)
current_layer = current_layer[choose_input] # 当前层
elif choose_input == "B" or choose_input == "b":
if len(layers) == 0: # pop不能删空列表,会报错
print("已经是顶层了")
else:
current_layer = layers.pop()
if choose_input == "q" or choose_input == "Q":
exit("退出")