基础
python的PEP8规范
1、 变量名,函数名,方法名的命名
1) 命名的名字要力求见名知意;
2) 命名不要和python的关键字(比如while)和内建字重名(比如int);
3) 不能以数字开头,只能由字母,数字和下划线组成;
4) 常量字母都大写,一个单词描述不下可以用下划线连接多个单词来描述。
2、 缩进,空行以及单行字符数要求
3、 脚本第一行指定编码:# -- coding: utf-8 --
4、 编写程序时,尽量少使用全局变量,易于维护,且对于常量可统一定义在配置文件。
5、 不要在一句import中多个库,比如import os, sys不推荐
导入语句一般顶头写。如果写多个导入语句,建议先写导入内建的模块,然后再导入的第三方模块,最后写导入自定义模块。
7、 在if/for/while语句中,即使执行语句只有一句,也必须另起一行。比如if 3>2:print("ok"),这种写法虽然没错,但是不推荐,需要把print语句另起一行。
8. 尽可能使用'is''is not'取代'',比如if x is not None 要优于if xNone。
为什么字典必列表快
字典可hash,无顺序,去重,查询速度比列表快,比列表占内存多
元祖与列表的区别
元组 不可变,可以做函数返回多值,可以做字典的key,元组没有增删改查,反而换取性能上的提升,创建tuple比list 快,存储空间比list占用小,多线程并发的时候,tuple是不需要加锁的,不用担心安全问题
python2 跟Python3的区别
Python3 中的print是一个内置函数,而Python2中print是一个语法结构
python3:
# print()
# input() ==raw_input()
# utf-8
# readlines 列表
# bytes 字节
# str 字符串
# range() 可迭代对象
# 新式类(c3)
# int
python2:
print
raw_input()input() 你输入什么类 型,就是什么类型
ascii
xreadlines 迭代器
str 字节
unicode 字符串
range() 列表/xrange() 可迭代对象
经典类/新式类(object)
int/long可哈希的数据类型,即不可改变的数据
字符串:
Strip split replace find upper lower capitalize startswith endswith
列表:Append insert remove pop count del sort
元祖:Count index 无
字典:Get setdefault update pop popitem keys values itemsSet
集合:Add update pop remove clear
可变数据类型:列表和字典
不可变数据类型:字符串,元祖,集合
1.格式化输出
msg = '你好%s,我是%s'%('少年','meet')
print(msg)
变量
%s %d %%
f'{变量名}' 3.6以上
name=input(‘jjlk’)
age = input(‘12’)
msg = f'姓名:{name},年龄:{age}' #python3.6版本以上
print(msg)
s=’{}{}’.format(1,2)
print(s)
‘’.join(s) 字符串拼接
2.not>and>or
X and y And : 同真为真,取后边,有一个假即为假,同假取前边
X or y Or : 同真取前边,有一个真即为真,同假取后边
3.编码
utf-8 转成Unicode 是解码
ascii 美国 256 没有中文
一个字节 8位
gbk 中国
英文 1字节 8位
中文 2字节 16位
unicode 万国码
英文 2个字节 16位
中文 4个字节 32位
utf-8 可变编码
英文 1字节 8位
欧洲 2字节 16位
亚洲 3字节 24位
4.索引
获取s字符串中所有内容
m[:]
m ='人生若只如初见'
print(m[6:2:-2])
print(m[2:7:2])
5.字符串 不可变
s1 = 'Alex'
s1 = s.capitalize() 首字母大写
print(s1)
s.capitalize() # 首字母大写
print(s.title()) # 特殊符号分割的每个单词首字母大写
s.upper() # 全部大写
s.lower() # 全部小写
print(s.count('L')) # 返回的是数量
print(s.endswith('x')) # 以什么结尾 结果为true or false
print(s.startswith('a')) # 以什么开头
print(s.find('p')) #通过元素查找下标 查找的没有返回-1
print(s.index('p')) #通过元素查找下标 查找的没有就报错
s.format()添加
s='njkj,{a},{b}' 字符串形式
print('_'.join(s))
答案:n_j_k_j_,{a},_{b}
S=[‘hj’,’hgjh’] 列表形式
Print(‘_’.join(s))
答案:hj_hgjh
For 循环
li = ["alex", "wusir", "taibai"]
#msg = ''
#for i in li:
#msg = msg + i+'_'
#print(msg[0:-1])
print('_'.join(s))
s.split('x')) #分割 (没了)
s. strip(' a')) #脱 脱头尾两边的(空格 换行符)东西
s.replace(‘a’,’b’)第一个放要被替换的 第二个是替换的内容
print(s.swapcase()) # 大小写转换 里边不用填东西
s.isdigit() #判断是不是纯数字
s.isalpha()#判断是不是只有字母和数字
s.isspace() #判断是否为空
6.列表 可变数据 有序的
可hash的(int, str, tuple,bool)
增
Append(‘画江湖’) #添加 在末尾添加
insert(3,’成交价’) # 插入 第一个位置插入为下标,第二个位置插入为内容
extend() #迭代添加整型和布尔值不能迭代
print(lst1+lst2) #列表的合并
删
Del lst[2] #通过下标删除
Del lst[0:3] #切片删除
Remove() #通过内容删除
Pop() #没有指定,默认删除最后一个,可以指定下标删除
Clear() #清空
Ret=lst.pop(2) #可以指定下标,有返回值
改
Lst[2]=’hjk’ #通过下标改 ************
Lst[0:3] =’新得内容’ #通过切片改
Lst[0:5:2] =’新的内容’ #切片+步长 长度要统一
查
For 循环
Print(Lst[2]) 通过下标查
其他操作
Reverse() #翻转 括号里不加内容
Sort() #排序 升序
Sort(reverse=True)
sort 排序,是属于列表的方法,在原列表基础上直接排序
sorted 排序,是内置函数,排序后会生成一个新的变量,不会在原变量的基础上修改
Index() 通过内容获取下标
Count() 计数
7.元祖: 不可变数据 有序 有下标
Counter:计数
index:通过元素找下标
Tu=(‘jnjknk’,1,23) 元祖没有增删…
print(tu[0:5])
元祖切片结果也是元祖
元祖不可修改,可以转变成列表,再进行增删…
Tu=list(tu)
Tu.append(‘njnk’)
Print(tu)
查看类型
Tu=() 空的和有逗号是元祖 有数据为数据类型
Print(type(tu))
8. 字典 键不能重复,重复的话就会把值覆盖,键是不可变的
Dic={‘键’:’值’}
增
dic[12]=’小米’ 通过键查找值
dic.setdefault(11,'华为') # 17 键 华为 值
dic[(1,2,3)].setdefault('k4','v4')
1.先去字典中通过11这个键去查有没有值 就是None
2.如果是值 就不进行添加
3.如果是None, 就添加 返回的是添加的值
删
Dic[1] 通过键删除
print(dic.pop('25')) # pop 通过指定键删除 pop也有返回值, 返回的是被删除的值
dic.clear() # 清空
print(dic)
dic.popitem() # 随机删除 python3.6 删除最后一个 3.5 中随机删除
print(dic)
dic2.update(dic1)
# 更新 被更新的内容如果在 要更新的内容中那值就会被覆盖
改
dic2['33'] = 'tsp' #是字典中没有的时候才叫增,如果字典中这个键存在就叫做修改
print(dic2[2]) # 通过键查找 值 如果键不存在就报错
print(dic2.get(2)) # 通过键查找值 如果键不存在不会报错,返回None
print(dic2.setdefault('33')) # 不存在返回None
其他操作
获取键
for i in dic2:
print(i)
for i in dic2.keys():
print(i)
获取值
for i in dic2:
print(dic2.get(i))
for i in dic2.values():
print(i)
获取 键值
for i in dic2.items():
print(i)
合并多个字典:可以使用{**dict_name, **dict_name2, … }将多个字典进行合并
d1 = {"v1": 22, "v2": 33}
d2 = {"v2": 44, "v3": 55}
d3 = {**d1, **d2}
print(d3)
结果:{'v1': 22, 'v2': 44, 'v3': 55}
解构
a,b,c=’1,2,3’ true,False,True '456' [7,8,9] (7,8,9) {'1':8,'2':9,'3':0}
# print(a)
# print(b)
# print(c)
9.set{ } 天然去去重 不能用下标,有增删… ,可变数据
Se={1,2,3,1,5}
Print(se)
例:面试题先去重再转换成列表
lst=[1,2,3,1,5]
print(list(set(lst)))
增
se.add(6)
改
se.update([1,23,34]) # 可迭代对象
se.update(‘123’)
结果{‘1’,’2’,’3’}
删
se.clear()
print(se.pop())
se.remove(4) # 通过内容删除
S1 = {1,2,2,3,89}
s2 = {1,25,2,3,69}
print(s1 & s2) # 俩个共有的
print(s1 | s2) # 两个合并(去重后的)
print(s1 - s2) # 显示前边有,而后边没有的,(以前边为主)不显示共有的 {89}
print(s1 ^ s2) # 显示不共有的 {89, 69, 25}
Rang 范围
Python3中 原生态
print(range(0,10))
结果为range(0,10)
Python3中range为可迭代对象
Python2:分为range xrange
range(1,9) 列表 结果为[1,2,3,4,5,6,7,8,]
Xrange(1,9) 原生态 结果和python3中一样,都是可迭代对象 xrange(1,9)
Python3中
print(list(range(1,9)))
结果为[1,2,3,4,5,6,7,8,]
range和切片一样顾头不顾尾
For i in range(0,10,2)
Print(i)
结果为0,2,4,6,8
range可以让for循环来循环数字(求奇数偶数)
冻结集合frozenset
s=frozenset([1,2,3,1,5])
print(s)
结果 frozenset({1, 2, 3, 5})
# dic={{1,2}:'你好'} 错的
dic={s:'你好'}
print(dic)
结果:{frozenset({1, 2, 3, 5}): '你好'}
continue和break区别
break是终止for循环里所有的循环,下面的代码也不执行
continue:是停止当前所在条件的执行,下面的代码接着执行
for i in range(5):
print(i,'nkn')
if i==3:
break
# continue
print(i,'fefr')
break结果:
0 nkn
0 fefr
1 nkn
1 fefr
2 nkn
2 fefr
3 nkn
continue结果:
0 nkn
0 fefr
1 nkn
1 fefr
2 nkn
2 fefr
3 nkn
4 nkn
4 fefr