一、背景
最近老是能看到抖音上给推荐一个博主的python视频,主要介绍python中各种的技巧,今天(五一期间)专门抽出时间来进行下总结。
二、知识整理
1.数字相关操作(太基础,简要写只写运算符和内置函数)
- 计算商 //
- 计算余数 %
- 计算次幂 **
- 求绝对值 asb(-5)
- 将10进制转为16进制 hex(10)—>0xa (0x表示这是16进制)
- 2进制转10进制 int(‘1001’, base=2) —>9 (不太明白base)
- 求字符’A’的ascill码,ord(‘A’)
- 求计算机中数字对应的ascill码(计算机中的字符都对应着的是数字)char(65)—>‘A’[]
2.列表
- 索引一个列表,如访问第一个元素,a[0]
- 切片访问 如:[:2:]
- 插入列表1 在列表末尾插入‘a’ —>append(‘a’) *
- 插入列表2 向列表中的某一位置插入元素 a.insert(index, object)
- 插入列表3 批量加入元素,列表之间可以使用运算符 +
- 插入列表4 批量插入元素,list.extend([1,2,3])
- 列表删除一个元素(最后一个) pop()
- 列表删除指定元素 list.remove(obj)
- 删除指定位置的元素 del a[1]
- 修改元素 a[1] = 10
- 快速克隆列表中的元素(列表乘法 ) a=[1,2,3] a3
- 实现列表中嵌套一个列表 a[1] = [1,2,3]
- 列表排序 从小到大 a.sort()
- 列表排序 从大到小 a.sort()
3.转义
解释:一个 \ 加字符,组合后单个字符去原来字面意义,被赋予一个新的功能
- 响铃 \a
- 退格 \b
- 换行 \n
- 纵向制表符 \v
- 横向制表符\t
- 回车 \r
- 换页 \f
4.字符串与数字
- 支持运算符 + 如:‘hell’ + ‘o’
- 支持乘 * 如:“haha” * 3
- 支持无运算符 ,如: ‘he’ ‘llo’
- ord() 和 char() 上面有写
- 字符串转换成字节,bytes(obj, encoding=‘utf-8’)
- 字节转换成字符串 obj.decode(encoding=‘utf-8’)
5.字符串打印格式
- “this is {}”.format(‘aaa’)
- 保留小数点后2位:“{:.2f}”.format(3.1415)
- 占位然后补齐:“{:0>3d}”.format(5)
- “{:.1%}”.format(0.718)
6.字符串
- str.join([‘hello’, ‘world’])
- 分割,str.split()
- 替换字符,replace() 如:‘aaabbb’.replace(‘a’, ‘’) —>‘bbb’
- 字符串去除开头和结尾的空格 str.strip()
7.python领域
- 爬虫:urllib、beautifulsoup4(从html或者xml中提取数据的)、第三方爬虫——>requests、scrapy、pyspider
- 自动化办公:excel——>xlwings、wlsxweiter、xlrd、openpyxl;PPT——>pywin32com、pptx;word——>docx、pypiwin32;邮件——>smtplib、imaplib、email;
- 运维和测试:运维——>psutil:能够获取运行的进程和系统利用率、内存、cpu、网络等;测试——>unitest、pytest
- web开发:Django、 flask
- AI:视觉领域:OpenCV;自然语言处理:Gensim、NLTK、Transformer
8.python对象类型
- 不可变类型:整形、浮点型、字符串、元组
- 可变类型:列表、字典
只有不可变的类型才是可哈希的
9.类和属性
- 创建类,用关键字class,具体略。
- 创建公开属性和内部属性
class Dog(object):
# 假设统计年龄从2000年开始
begin = 2000
def __init__(self, name):
self.name = name # 创建一个对外公开的属性
self.__coller = 'write' # 创建一个仅内部使用的属性
-
类属性可以直接由类访问,如Dog.begin
-
类方法:@classmethod 标记类方法,第一个参数cls表示类对象,类方法要求访问的属性必须是类属性。
-
静态方法:@staticmethod标记,静态方法不需要有类对象的变量,访问的属性是全局属性
begin = 2000 # 全局变量
class Dog(object):
begin = 2000 # 类变量
def __init__(self, name):
self.name = name # 创建一个对外公开的属性
self.__coller = 'write' # 创建一个仅内部使用的属性
@classmethod
def get_age(cls, birthday):
return birthday - cls.begin
@staticmethod
def get_age(birthday):
return birthday - begin
- 类的继承:class A(A1):继承了类A1,可以直接使用A1里面的方法,继承时,先走基类init的方法
- 复用类父类的init方法:super().init()
class A1(object):
def __init__(self, name):
print('is', name)
class A(A1):
def __init__(self, name):
super().__init__(name)
print('复用A1的init')
if __name__ == '__main__':
A('ds')
- 覆盖(重写)基类的方法:两个前提:方法名必须和基类中的方法名相同,参数也一致,然后进行重写
10.鸭子类型
只需要里面有那个方法即可,不需要是子类
class Dog:
def shout(self):
print('Dog is shouting ')
class Car:
def shout(self):
print('Car is shouting')
def f(obj):
obj().shout()
f(Dog)
f(Car)
11.各种可能用到的函数或装饰器
- 求和:reduce()
from functools import reduce
res = reduce(lambda x,y: x+y, [1,2,3,4,5,6])
print(res)
# 结果是21
- 枚举:enumerate(names)
l = ['苹果','香蕉','梨子']
for i, fruit in enumerate(l):
print(i,fruit)
# 0 苹果
# 1 香蕉
# 2 梨子
- zip()
name = ['高圆圆', '孙俪', '赵丽颖']
hight = [1.68, 1.62, 1.69]
print({n:h for n, h in zip(name, hight)})
- @property装饰器
意义:将一个方法的调用方式变为"属性调用",代替get()和set()方法,使获取值和赋值更简单。
class Empoloyee:
def __init__(self, name, salary):
self.__name = name
self.__salary = salary
@property
def salary(self):
return self.__salary
@salary.setter
def salary(self, salary):
if 2000 < salary < 30000:
self.__salary = salary
else:
print("薪水在2000-30000范围内")
emp = Empoloyee('张三', 2000)
print(emp.salary)
emp.salary = 5000
print(emp.salary)
emp.salary = 0
print(emp.salary)
# 运行结果如下:
# 2000
# 5000
# 薪水在2000-30000范围内
# 5000
12.迭代器
13.装饰器
14.生成器
形象解释,就像一个马拉松选手,跑跑还能停下喝口水。
是一个带yield的特殊函数
def f():
a = ['hello', 'world']
for w in a:
yield w # 有yield所以是生成器
print('yes')
go = f()
print(next(go))
print(next(go))
# print(next(go)) # 这一次就会报错,因为循环终止了
15.python使用习惯
- 不要将空列表作为函数默认参数
def add_names(name, names=[]) # 不可取!因为函数的默认参数只会在第一次调用时才会评估
def add_names(name, names=None) # 可取!