一.python的基本数据类型
1.组/序列的概念 注意:(python中表示组的概念有很多种)
(1)列表
[1,2,3,4,5,6] list类型
列表中还可以嵌套列表:[[1,2],[2,3]
访问列表: [1,2,3,4][3]/[0:2]/[-1:] :形式获取的还是一个列表,哪怕列表中只有一个元素 [-1:]最后一个元素
追加列表: [1,2,3]+[5,6,7] [1,2,3]*3
(2)元组
(1,2,3,4,‘d’,ture) tuple 类型
访问元组:(1,2,3,5)[0] (1,2,3,4)[0:2] 追加:(1,2,3)+(4) (1,2,3)*3
注意:单一元素情况下 type((1)) 整型 因为单一元素python会把你当成数学运算符号,而列表不会
定义只有一个元素的元组 (())/(1,)
总结 str /list/tuple 序列 (有顺序,每个元素有序号)
共有的操作/特性: 'hello world'[2] 访问 [1,2,3,4,5][0:3] 切片 ‘hello world’[0:8:2] 切片 3 in/not in [1,2,3] bool类型 len([1,2,3,4]) max/min([1,2,3,4,5])
(3)集合 set (无序,无重复)
集合的操作: len({1,2}) 1 in/not int {1,2,3}
集合的特殊操作: {1,2,3}-{2} 剔除(求集合差值) {1,2,3}&{3,4}交集 {1,2,3}|{3,4,5}合集/并集
定义空的集合: set() type(set())
(4)字典 dict (很多个key和value,集合类型(set)不是序列)
{key1:val,key2:val2} [key1] val:str int float list set dict key:是不可变的类型 (int,str)但是列表等就不可变
注意:int、str、tuple为值类型(复制后,修改原变量,不会造成影响,修改值内存地址改变)list、set、dict为引用类型
二.变量与运算符
1.赋值
A=[1,2,3] print(A)
2.命名规则 字母 数字(不能首位)下划线 系统关键字 不能用在变量名中 保留关键字 区分大小写
三 流程控制语句
1.if else 常量用大写
mood=True;
if mood:
print('go to left');
elese:
print('go to right');
注意: 没有switch官方解释:
四、包、模块、组织结构、函数、面向对象
包->模块->类->函数、变量
python中一个包可以包含很多模块,每个模块包含很多类,但是像java、c#等都是一个文件下只有一个和类因为他们不会把一个文件理解成一个模块
python区分一个普通文件夹和一个包:在文件夹下面有一个特定的文件(__init__.py)
注意: 获取函数返回值的时候使用类似于 skill1,skill2=fun(1,2)的方法获取 (序列解包),可以调高代码的简洁性。
序列解包:
例如: a=1 b=2 c=3 a,b,c=1,2,3 d=3,5,6 print(type(d)) a,b,c=d
方法和函数的区别:
方法:设计层面(面向对象) 函数:程序运行、过程式的一种称谓(面向过程)
定义实例方法: 定义类方法: @classmethod (装饰器) //主要是操作一些对象无关的变量
def do_h(self): def p_sum(cls):
print(str(self.__class_.sum)) print(cls.num)
调用: st1=Stu() 调用:Stu.p_sum()
st1.do_h()
静态方法:当和类、对象没用多大关系的时候使用
@staticmethod
def add():
print(Stu.num)
当方法前加__def,默认是私有的方法,但是构造函数__init__不是私有的。
扩展:python为什么找不到私有变量,因为当类中的私有变量为__score时候,python将会更改成为__student__score,这个在print(student1.__dict__)可以看出,严格意义上没有私有变量,但是可以间接的访问print(__student__score)而访问私有变量
继承:标准的继承方法,可以多继承
from c6 import People
class stu(People):
People.__init__(self,name,age) //第一种调用父类
super(Student,self).__init__(name,age) //第二张调用 (标准)
五、正则表达式和json
首先 import re
1. re.findall('正则表达式',a,re.I|re.S) re.I=>忽略大小写 re.S=>改变.的行为,匹配出\n(例如:'c#.{1}')
正则表达式: 元字符: '/d'=>指的是0-9 ‘/w’=>字符串 ‘.’=》匹配除了换行符之外其他所有字符 '\s'空白字符
字符集: 'a[cf]c'=>匹配acc/afc 加^除外 [c-f] =》范围内
数量词:'[a-z]{3,6}'=>匹配a-z中最小3到最大6次 *=》匹配0次或者无限多次 +匹配1次或者无限次 ?匹配0次或者1次(当前面为范围的时候,指的是非贪婪模式)
边界匹配:匹配完整的字符串 '^/d{4,6}$' ^=>从字符串开始匹配 $=>从字符串末尾匹配
组: ('python'){3}(js)
2.re.sub('需要替换的字符串','替换的字符串','字符串','匹配后替换的最大次数') 替换 相同的是 $new= str.replace('需要替换的字符串','替换的字符串')
灵活运用: def convert(value):
matched=value.group()
return '--'+matched+'--' //动态改变
r=re.sub('需要替换的字符串',convert,'整体字符串')
3.re.match('\d',字符串) 从字符串的首字母开始匹配 而 re.search('\d',字符串) 搜索整个字符串
JSON:是一种轻量级的数据交换格式(字符串是json的表现形式,并且是跨语言的,并不是某一个语言特有的)
JSON字符串:符合json格式的字符串叫做json字符串
JSON:转换成字典类型: st=json.loads(json_str)
反序列化:python的数据类型像json的类型转换的过程 json.dumps(str)
JSON对象:市面上的JSON对象是相对于Js的标准版定义的,而python是没有json对象的定义
六、Python高级语法
Python中一切皆是类和对象
1.枚举 //其实是单例模式,不能够实例化的
from enum import Enum //当枚举类型都是数字不是字符串的时候 from enum import IntEnum.unique(装饰器,不允许重复:例如 Y=1 G=1) // 类前加 @unique
class VIP(Enum): //class VIP(IntEnum)
Y=1
G=2
当使用时候:VIP.Y 枚举的意义重在标签而不是数值 获取标签的值 VIP.Y.value 获取标签的名字VIP.Y.name
可以通过遍历获取枚举的类型:
for v in VIP: 遍历所有枚举的类型 :for v in VIP.__members__.item():
print(v) 遍历所有枚举的名字:for v in VIP.__members__:
使用数值具体查找枚举类型:
a=1
print(VIP(a))
//在这里讲一下自己对于设计模式的理解,如果你的代码偏于执行业务,并且在小公司主要以业务的完成为准的话,不建议使用设计模式,但是如果你的团队每个成员足够优秀,而你对于你的代码有较高的要求,设计模式将是你不二的选择,因为设计模式和你的直铺下来业务的代码要求的时间成本是完全不同的,因为设计模式对于扩展是开放的,修改时关闭的,可能修改一个值就要添加一个类
2.闭包
在其他语言中,函数只是一段可执行的代码,并不是对象,我们只要获得函数的入口就可以执行函数,python中一切皆对象,在python中函数不仅可以赋值给另外一个参数,并且函数可以作为另外一个函数的参数,传递到另外的函数里,甚至还可以把一个函数当作另外一个函数的返回结果
闭包=函数+环境变量(定义函数的外部变量而不是全局变量)
例如: def curve_pre(): a=25 def curve(x): return a*x*x return curve a=10 f=curve_pre()
print(f(2)) 结果为100 不是40 //闭包的环境保存在 print(f.__closure__) 而闭包变量保存在print(f.__cloaure__[0].cell_contents)
注意:如果在函数内定义的函数有对环境变量a重新赋值,就不是闭包函数了,但是如果在闭包函数中 设置 nonlocal 变量名相当于记住了上次调用的状态