能力就是拥有分析问题的框架,解决问题的能力
1. 标识符
标识符就是变量、常量、函数、类的名字
命名规定:
- 严格区分大小写
- 由字母、数字、下划线组成(数字不能开头)
- 见名知意
- 单词组合:下划线/小驼峰/大驼峰命名法
- 变量通常小写,常量全部大写
- 不以关键字作为标识符
2. 关键字
# 查看关键字:
import keyword
print(keyword.kwlist)
3. pass语句
pass语句是占位语句,它什么都不做,只是为了保证语法的正确性
使用场景:
- 当不知道后面代码怎么写的时候
- 当你不需要写代码的细节的时候
- 当语法要求必须有语句,但是又没实际内容好写的时候
- 其他的你觉得需要的场景
3. 变量
1. 查看内存地址:
a = 1
print(id(a))
3.算数运算符
- /:除法。得到的商为小数
print(4/2) # 答案为2.0
- **:取幂
print(2**3) #答案为8
- //: 取整。若原除数为整数,取商的整数部分(负数向下取整);若原被除数为小数,则先取整数再保留1位小数
print(3//2) # 答案为1
print(5//2) # 答案为2
print(5.0//2) # 答案为2.0
print(5.00//2) # 答案为2.0
print(3.0//2) # 答案为1.0
print(-10//3) # -3.333向下取整(向小的取整)答案为-4
- %:取余数,注意负数的取余
print(10%3) # 商为3,余数为1,答案为1
print(-10%3) #商为-4(-10//3=-4),余数为:-10-(3*(-4)) = 2,答案为2
- 同时获得商与余数:
print(divmod(10,3)) # 结果为元组(tuple)类型:(3,1)
- 解决计算中精度缺失导致显示结果为科学计数法的问题
print(0.1+0.1+0.1-0.3) # 结果为:5.551115123125783e-17
from decimal import Decimal
print(Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3')) # 结果为0.0
4. 比较运算符
- "==" 比较的是运算的值是否相等,不是地址是否相等
print(3.0==3) # 结果为True
"<>"在python2中有效,python3中无效
">"或"<"
print(3>2>1) # (3>2) and (2>1) ->True and True->True
print(3>2>2) # (3>2) and (2>2) ->True and False->False
print((3>2)>1)->(3>2) and (1>1)->Ture and False->False
print("bac">"bbb") # 答案是False,因为比较的是字符的ascii值,如果相等就略过,不相等比较一次即可,不会再去比较后面,
- 元组的比较
print((2,3)>('abc','sss')) # 会报错,首先它会拆分比较,相当于2与'abc'比较,但2与'abc'类型不同,所以需要强转才能比较。
print((3,2)>(2,3)) #答案是True 先3与2比较,直接返回True,不比较后面,和字符串比较类似
5. 逻辑运算符
print(10 and 20)# 答案为20,首先10的布尔值为True,然后20的布尔值为True,所以最后结果为True,值是20
print(10 or 20) # 答案为10,首先10为True,因为or所以不再运行,最后结果为10
print(10 and 0) #答案为0,首先10为True,然后0为False,所以最后结果是False,值是0
6. 位运算
按二进制计算
- "&" 按位与:两个为1才为1
- "|" 按位或:一个为1就为1
- "^" 按异或:(1^0 = 1,0^1 = 1,1^1 = 0,0^0=0)简单理解就是相同为0,不相同为1
- "~" 取反
- "<<" 左移
- "<<" 右移
7. 成员运算符in,not in
in和not in 是python独有的运算符,用于判断对象是否是某个集合的元素之一 ,返回结果为True或False
li = [1,2,3,4]
print(3 in li) # 答案为True
print(5 in li) # 答案为False
8. 身份运算符is
判断两个标识符是否引用自同一个对象(内存地址是否相同)
a = [1]
b = [1]
print(a is b) # 答案为False,因为各自的地址不一样
b = a
print(a is b) # 答案为True,因为把a的地址赋给了b,b和a所指向地址相同
9. 三目运算符
其他语言结构:判断条件?判断为真的结果:判断为假的结果
python结构:判断为真的结果 if 判断条件 else 判断为假的结果
li = [1,2]
print("in" if 1 in li else "not in" ) # 答案为in
10. 整数类型
- 进制转化
# 十进制转十六进制
print(hex(11)) # 答案为0xb
# 十进制转八进制
print(oct(11)) # 答案为0o13
# 十进制转二进制
print(bin(11)) # 答案为0b1011
- 小整数对象池
python初始化时会自动建立一个小整数对象池,方便调用,避免重复使用。这是一个包含262个指向整数对象的指针数组,范围是-5~256,双闭合区间,比如整数10,即使程序里没创建,但python已经为我们创建了。
这里要注意在交互式解释器和IDLE等运行的差别:
a = -5
b = -5
print (a is b) # 结果为True
a = 256
b = 256
print(a is b) # 结果为True
a = 257
b = 257
print(a is b) # 结果为True
这里的原因简单讲就是由于编译单元不一致:交互式解释器中a=257是一个编译单元,b=257是一个编译单元,结果为False,而IDLE中a=257和b=257处于同一个编译单元,共享常量池,所以结果为True。具体可查看该链接:链接
- 复数
用于数学概念计算,很少用到,由实部和虚部构成,单位为j
aa = 4+3j
print(aa) # 结果为:(4+3j)
print(aa.real) # 结果为:4.0
print(aa.imag) # 结果为:3.0
11. 数字类型方法
round()在python3中遵循四舍六入五成双
print(round(4.4)) # 当小于5时,佘4,答案为:4
print(round(4.5)) # 当为5时,前面的数为偶数,佘5,答案为:4
print(round(5.5)) # 当为5时,前面的数为奇数,入1,答案为:6
print(round(4.52)) # 当为5时,且后面还有有效数字,则入1,答案为:5
print(round(4.6)) # 当大于6时,入1,答案为:5
12. 布尔类型
非0数字都为True,非空字符串都为True,列表、元组、字典同样。
None是特殊的值,类型为NoneType,不支持任何运算,也没有内置方法,布尔值永远为False。
简单讲:非空非零的布尔值都为True
print(bool(1)) # 答案为True
print(bool(0)) # 答案为False
print(bool(0.0)) # 答案为False
print(bool("x")) # 答案为True
print(bool("")) # 答案为False
13. 字符串
1. 字符串切片
- 索引默认从0开始
- 左闭右开
- 当取单个字符时,索引超出范围会报错,切片不会报错,例如print("hello"[5:])不会报错,print("hello"[5])会报错
- 步长不能为0,也不能为浮点数
2. 字符串常见方法
- int(str) str必须为十进制的数字字符串
# 以下均报错
print(int('a'))
print(int('1.0'))
- str.find(),查找该字符最低位的索引;str.rfind(),从右往左查,且没找到会返回-1不会报错。而str.index()同 str.find()效果一样,但没找到会报错
a = 'hello'
print(a.find('l')) # 结果为:2
print(a.rfind('l')) # 结果为:3
print(a.index('l')) # 结果为:2
- str.replace(要被替换的字符串,替换字符,次数(可写可不写,默认全替换))
- **str.startswith(str1),str.endswith(str2)**判断是否以该字符串开头或结尾
a = 'hello world.txt'
print(a.startswith('he')) # 结果为True
print(a.endswith('.txt')) # 结果为True
a = 'hello'
print(a.replace('l','m')) # 结果为:hemmo
a = 'hello'
print(a.replace('l','m',1))# 结果为:hemlo
- str.split(),分隔字符串
print('hello world'.split(' ')) # 结果为:['hello', 'world']
- str.upper(),str.lower
a = 'Hello'
print(a.upper()) # 结果为:HELLO
print(a.lower()) # 结果为: hello
- str.strip():去字符串或者字符数组头尾的空格
print(' hello world '.strip()) # 结果为:hello world
str.isalpha():判断是否为字母,str.isdigit():判断是否为数字,str.isalnum():判断是否为数字+字母,str是字符或者字符串
str.join()用于将序列中的元素以指定的字符连接成一个新的字符串,该序列的元素一定是字符或字符串,像数字并非可迭代对象
a = ['1','2','3','4']
print(''.join(a)) # 结果为:1234
print('-'.join(a)) # 结果为:1-2-3-4
3. 字符串格式化
- 通过%占位符:操作繁琐,有一定兼容性问题,不建议使用
- %s string 字符串
- %d decimal 十进制
- %f float 浮点
- %.2f 保留两位小数
- %o oct 八进制
- %x hex 十六进制
name = 'x'
age = 18
sex = 'female'
print("name:%s,age:%d,sex:%s"%(name,age,sex))
- format():对字典格式有一定问题
name = 'x'
age = 18
sex = 'female'
print("name:{},age:{},sex:{}".format(name,age,sex))
a = 'x'
b = 0
print("{1} is {0}".format(b,a)) # 结果为:x is 0
- f'',python3.6.4版本以上支持,推荐使用
a = 'x'
b = 0
print(f'{a} is {b}') # 结果为 x is 0
14. list列表
1. 创建列表
创建列表有两种方式,注意区别:
a = list('123')
print(a) # 结果为:['1', '2', '3']
b = ['1','2','3']
print(b) # 结果为:['1', '2', '3']
2. 列表及其元素删除
a = ['1','2','3']
del a[1]
print(a) # 结果为:['1', '3']
del a
print(a) # 报错,说明列表删除成功,a此时未定义
a = ['1','2','3']
a.remove('2')
print(a) # 结果为:['1', '3']
a.pop() # 参数为下标,可填可不填,不填默认出栈最后一个元素
a.remove()
print(a) # 报错,需要提供精确的参数,说明该方法无法删除整个列表,只能一个一个元素删除
3. 列表的组合
a = ['1','2','3']
b = ['4',1]
print(a+b) # 结果为:['1', '2', '3', '4', 1]
4. 列表的乘法
a = ['1','2','3']
print(a*3) # 结果为: ['1', '2', '3', '1', '2', '3', '1', '2', '3']
5. 判断元素是否在列表内部
a = ['1','2','3']
print('1' in a) # 结果为:True
6. 迭代列表元素
a = ['1','2','3']
for i in a:
print(i,end='') # 结果为:123
7. 列表添加元素
append()和extend(),注意extend()只能添加可迭代对象
a = [1,2,3]
a.append(1)
a.append([4,5])
a.extend("5678")
a.extend([2,4])
print(a) # 结果为:[1, 2, 3, 1, [4, 5], '5', '6', '7', '8', 2, 4]
a.extend(2) # 报错:'int' object is not iterable
8. 列表插入元素
在索引前插入元素
a = [1,2,3]
a.insert(1,'c')
print(a) # 结果为:[1, 'c', 2, 3]
8. 清空列表
a = [1,2,3]
a.clear() # 等同于del a[:]
print(a) # 结果为:[]
另外还有reverse(),remove(obj),sort([func]),copy(),index(),count()等列表的内置函数
15. tuple元组
- tuple的内部无法进行修改(增删改,但是只针对第一级元素),只能查或删除整个元组,但可以通过创建新的变量=原tuple+新tuple达到添加的伪效果,类似于字符串
a = (3,1,4,2)
c = a+(["4",5],)
print(c) # 结果为:(3, 1, 4, 2, ['4', 5])
c[4][0] = 4
print(c) # 结果为:(3, 1, 4, 2, [4, 5])
- tuple没有内置的sort()和reverse()方法,但可以通过sorted()和list(reversed())
a = (3,1,4,2)
print(sorted(a)) # 结果为:[1, 2, 3, 4]
print(reversed(a)) # 结果为:<reversed object at 0x01B7A178>
print(list(reversed(a))) # 结果为:[1, 2, 3, 4]
- vs code快速复制一行快捷键:alt+shift+down
- tuple一级元素不可变,且所占内存较小,list元素可随意变化,但内存占用相比tuple大,应灵活运用
a = (3,4)
b = [3,4]
print(a.__sizeof__()) # 结果为:20
print(b.__sizeof__()) # 结果为:28
- 将数字列表快速转化为字符串列表
a = [1,2,3,4]
# 先将列表转为字符串再用map转化为map对象,在python2中直接是列表,但在python3需要用list强转
print(map(str,a)) # 结果为:<map object at 0x0329A190>
print(list(map(str,a))) # 结果为:['1', '2', '3', '4']
16. dict字典
1. 三种创建字典的方式:
a = {"name":"小明","age":18}
print(a) # 结果为:{'name': '小明', 'age': 18}
b = dict(name="小明",age=18)
print(b) # 结果为:{'name': '小明', 'age': 18}
c = dict([('name','小明'),('age',18)])
print(c) # 结果为:{'name': '小明', 'age': 18}
2.将列表转化为元组或字典
a = [1,2,3,4]
b = [5,6,7,8]
def fmap(a,b):
return (a,b)
print(list(map(fmap,a,b))) # 结果为:[(1, 5), (2, 6), (3, 7), (4, 8)]
print(dict(map(fmap,a,b))) # 结果为:{1: 5, 2: 6, 3: 7, 4: 8}
print(dict(zip(a,b))) # 结果为:{1: 5, 2: 6, 3: 7, 4: 8}
3. 字典获取不存在的key/value的两种方法的返回结果(获取最好用get)
a = {"name":"小明","age":18}
print(a.get("sex")) # 结果为:None
print(a["sex"]) # 报错 KeyError: 'sex'
4. 以字典的value值进行排序
a = {'a':94,'b':89,'c':98}
print(sorted(list(zip(a.values(),a.keys())))) # 结果为:[(89, 'b'), (94, 'a'), (98, 'c')]