一,认识Python
考虑主流和趋势,我们的Python学习主要基于Python3.x+;
Python核心使用领域和发展方向:爬虫、数据科学、人工智能、运维自动化、云计算、Web技术、游戏开发等,应用十分广泛,是我们国家人工智能战略的第一编程语言,连中小学生都在学习;Python至今已经流行了30多年了,还在不断焕发生机和活力,学会Python语言可以让你可以用20年不在话下!
Python是一门高级编程语言,需要Python解释器编译成字节码然后在对应的虚拟机上面运行,与JAVA类似;
Python是一种面向对象、解释型、动态类型计算机程序设计语言, 程序无需编译成二进制代码,而是在执行时对语句一条一条编译,在程序执行过程中,可以改变变量的类型。
二,Python解释器
Python解释器:理解就是Python代码的解释执行环境,我们写好了Python代码,里面的print()函数、if语句、数据计算等都是一堆纯文本,如果直接打开就会直接显示的一堆的纯文字给你,为了让这些字符串可以运行,就需要Python解释器解析这些文本字符,解析成功后,计算机就会执行相应的对应的操作,比如:我们写print('hello'),Python解释器解析后,就会输出hello到电脑屏幕上面,就相当于我们写代码然后,计算机读取代码了解了我们的想法,就让计算机来干活;
安装Python解释器:到官网(https://www.python.org/)下载对应的下载安装即可,在终端(windows下的命令提示符)通过python --version来建议是否安装成功。如果windows提示python不是内部命令的话,可以手动把python的根目录加入到windows的系统设置的系统变量path下面,然后重新启动命令提示符应该就可以了,加入到path下面就是全局可以调用这python的命令;
pip包管理器:python最强大的其中一个地方是:全世界程序员无私免费开源了数以万计的Python功能模块,我们可以很方便的使用这些模块,而这些模块的安装、删除、维护等管理操作就是通过pip这个包管理器来管理的,安装python解释器的时候自带pip包管理器,pip的作用就是管理第三方的模块,通过命令:pip install 模块/包名来进行安装模块,pip help可以查看pip的其他的操作命令。
三,Python开发工具
我们使用的开发IDE主要是:PyCharm,官网下载:https://www.jetbrains.com/pycharm/download/,编写好的.py的文件可以直接在PyCharm中直接运行,当然也可以使用python终端运行,只是终端运行操作稍显麻烦;
在线Web编码可以安装使用Jupyter,使用pip安装:pip install jupyter
四,Python编程基础:
缩进:Python中,四个字符为一个缩进,和其他编程语言如:Java、PHP、JavaScript相比,Python中没有{ }, 使用缩进替代代码块
续行:Python中,尽量一行把代码写完,需要强制换行并且下一行需要连起来的话,在行的末尾使用
字符转义:使用\加上需要转义的字符,和其他语言Java、PHP、JavaScript类似,如: \, \n, \t: \将\当做普通字符对待
标识符:可以理解为就是直接的文件名、变量名、函数名等的名字命名,规则有:
只能以字母或下划线开头
只能是字母、下划线、数字
不能使用Python中的关键字
区分大小写
常量:就是保持不变的意思,Python中没有常量,通常使用大写字母表示常量,如INIT_NUM = 1,这样我们就知道这个变量尽量不要去改变它,保持它的不变
变量:我们可以对其赋值,改变它的值,如:height = 1,height变量值为2,height = 2,height变量值变更为2了。
建立第一个Python程序文档:使用PyCharm创建一个Python的项目,选择好保存路径,保存。PyCharm项目可以方便管理文件、提高效率。建立好之后,在PyCharm的项目文件夹下右键新建Python File文件(new => Python File),命名保存,这个就是Python程序文件,以.py结束。在里面输入:print('hello'),右键执行run,即可看到输出,这样第一个Python文档就建立起来啦!
官方文档:我们不需要、也记不住每一个Python语法、函数等的参数、使用说明等,这个时候就需要查询一下官方的文档使用说明,通过文档我们就可以知道某个函数如何使用了,学会看文档,是每一个开发人员必备的最基本技能,官方文档地址:https://docs.python.org/3/。在PyCharm中,光标移到某个函数上面然后执行:view =》Quick Documentation,可以快速的查看这个函数的简单文档(建议使用快捷键,我自己定义的快捷键是F2),当无法理解时,需要详细查看这个函数和用法是,可以到官方文档和各种搜索引擎进行进一步的查找相关资料。
五,Python中的8种基本数据类型(内置数据类型)
不可变类型(4 个):Number(数字)、String(字符串)、Tuple(元组)、bytes(字节)
可变类型(4 个):List(列表)、Dictionary(字典)、Set(集合)、bytearray(字节数组)
可变数据类型都可以CURD(增删改查),不可变类型是固定的,不能修改和删除,对不可变的数据类型的变量进行重新赋值是新建一个同名的变量,而不是修改这个变量的值哦(也就是在内存中新建一个变量存储空间,会增加了内存开销);不可变类型数据访问速度要比可变类型要快。所以,需要对数据进行频繁修改的,那么就使用可变数据类型,仅仅读取数据的,那么就使用不可变数据类型。
数值(Number):是不可变数据类型
包括整型int、浮点型float、布尔值bool、复数complex;
整型理解为整数,浮点型就理解为带小数点的,都可以有正负值;布尔值对应的真的关键字是True,值为1;假的关键字为False,对应值为0,可以和其他数字进行运算。数值类型的最常用的就是+-*/ ** %等算术运算;
列表(List):是可变数据类型
使用最频繁,使用[]或list()初始化,它是可变的,包括长度和元素都可以变化,也就是初始化后还可以对里面的元素进行更改,里面元素可以放任意类型数据。
基本使用:(CURD(意思是:create创建【增】、read读取【查】、update修改【改】、delete删除【删】,各种对象最常用的操作))
初始化(C):
lst = list() 初始化空列表
lst = [] 初始化空列表
lst = [1,2,3] 初始化非空列表
lst = list(range(10)) 初始化非空列表
访问(R):
1.通过索引访问,索引从0开始计算(编程语言的索引大多数都是从0开始),如:lst[1],访问第2个元素
2.通过前后索引获取区间数据:这也叫切片,列表变量[起始索引:结束索引],包含起始索引的值,不包含结束索引的值,就是大于等于起始索引,小于结束索引;
如果起始或者结束索引为空,那么就截取到最前面或者最末尾,如:lst[:3],从索引0开始,截取到不包含索引3的数值;lst[:],截取全部;
3.通过index(传入值)方法,传入值参数可以获取对应值的索引
4.通过count(传入值)方法,传入值参数可以获得对应值在列表中出现的次数
5.通过len(传入列表)方法,传入列表可以获得列表的元素个数,也是就列表长度
修改(U):
通过索引修改,如lst[0] = 100,修改lst列表的索引0的元素值为100
也可以传入区间进行修改,如:lst[1:2]=[11,22],lst[1:2]=[11,22,33,44]
插入(U):
1.可以通过append方法在列表的末尾插入数据,如:lst.append(5)
2.可以通过insert方法在列表的任意位置插入数据,如:lst.insert(0, 100)
3.可以通过extend方法,添加可迭代对象的元素(可迭代可以理解为可循环对象),如:lst.extend(range(10))
4.可以通过 + 将两个列表元素叠加,如:lst_new = lst + [1,2,3]
5.可以通过 * 将列表的元素复制(浅拷贝),如:lst_new = lst * 3
删除(D):
1.可以通过remove方法,传入元素值,从左至右找到第一次匹配的元素删除, 且只会删除一个元素,
如:lst.remove(3),删除元素为3的第一个元素,多个3个,可以使用循环删除
2.可以通过pop方法,弹出指定索引的元素,如果不给定索引,弹出末尾元素,如:lst.pop(2),lst.pop()
3.可以通过clear方法,清空列表所有的元素,如lst.clear()
列表其他操作:
1.可以通过reverse方法,将列表中的元素反向,如:lst.reverse()
2.可以通过sort方法,对列表中的元素进行排序, sort(key=None, reverse=False),
key为排序函数,reverse指定正向排序还是反向排序,如:lst.sort(),lst.sort(reverse=True)
3.in 关键字,可以判断元素是否在列表内部,如:if 1 in lst:print('yes')
4.浅拷贝:copy()方法,复制出来的对象,会跟着原始对象数据变化而变化,如:lst.copy()
5.深拷贝:使用copy模块的deepcopy()方法,copy.deepcopy(lst),复制出来的对象,不会跟着原始对象数据变化
元祖(Tuple):不可变数据类型
与列表类似,使用()或者tuple()初始化,一旦定义不可修改,可存储任意类型数据
基本使用:CR(创建+读取),无UD(无修改和删除)
初始化(C):
与列表也类似,也有不一样的
t = tuple()
t = ()
t = tuple(range(1,10))
t = (1,2,3,4,5)
t = (5) : 这样定义的不是元祖,而是一个数值
t = (5,) :这样才是元祖
访问(R):
与列表的访问基本一致:
1.通过索引访问,索引从0开始计算(编程语言的索引大多数都是从0开始),如:lst[1],访问第2个元素
2.通过前后索引获取区间数据:这也叫切片,列表变量[起始索引:结束索引],包含起始索引的值,不包含结束索引的值,就是大于等于起始索引,小于结束索引;
如果起始或者结束索引为空,那么就截取到最前面或者最末尾,如:lst[:3],从索引0开始,截取到不包含索引3的数值;lst[:],截取全部;
3.通过index(传入值)方法,传入值参数可以获取对应值的索引
4.通过count(传入值)方法,传入值参数可以获得对应值在列表中出现的次数
5.通过len(传入列表)方法,传入列表可以获得列表的元素个数,也是就列表长度
命名元祖:理解就是给元祖加上一个名字,它需要使用collections的namedtuple模块,如:
from collections import namedtuple
Point = namedtuple('Point',['x','y'])
使用命名元祖可以在当有多个元祖的时候,我们可以通过元祖的名字来区分某个元祖。
字符串(String):不可变数据类型
不可变对象、可循环迭代对象,是Unicode编码,是Python编程中最常用的数据类型
基本使用:CR(创建+读取),无UD(无修改和删除)
初始化(C):
使用 '', "", ''' ''' , """ """,如:str = 'xkd',单引号和双引号效果类似,
单引号内可以包含以内容输出双引号,双引号内也可以包含单引号,
如:str = 'x"k"d';三引号用于换行写很长的字符串而不需要转义符
一旦定义后,不可改变,对其字符串变量操作的修改等,都会生成新的字符串变量内存空间
访问(R):
索引访问,如:
string = 'xkd'
string[1]
循环迭代访问,如:
string = 'xkd'
for item in string:
print(item)
常见使用:
1.转义:使用\加转义字符来转义,如:print('hello\nxkd'),\n转义为换行
2.连接:使用+号或者join()
3.切割:左到右:split()、右到左:rsplit()、按行切割:splitlines()、分段切割:partition()
4.修改:替换:replace()、删除两端空白:strip()、rstrip()、lstrip()
5.查找:find()、index()、count()
6.判断:startswith()、endswith()
7.格式化:format()
8.更多:大小写转换:upper()、lower()、swapcase()、title()、capitalize();
更多请参考文档:[https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str]
(https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str),
字符串方法很多,学会几个常用的做法后,可以先大概过一遍文档里的字符串方法,知道有哪些功能,以后需要用到再翻文档参考即可
集合(Set):可变数据类型,无序
特点:
1.可变的,无序列的,不可重复的元素的集合**(重复的元素会被自动去除重复部分)
2.集合元素必须是可以hash类型,也就是必须是hashable,x不可变的数据类型就是可以hashable的
3.所以,数值类型,布尔类型,字符串类型,bytes,元组,None都可以作为集合的元素数据类型
基本使用:(CURD(意思是:create创建、read读取、update修改、delete删除,各种对象最常用的操作))
初始化(C):
set()
{},使用{}的时候,元素不能为空,否则就是定义字典,空的集合使用set()定义,如:s5 = {9,10,11},
访问(R):
循环迭代读取:由于集合是无序的,无法使用index索引查询,只能迭代
set1 = {1,2,3,4}
for item in set1:
print(item)
修改(U):
update方法:如old_set.update([1,2,3])
插入(U):
add方法:如:old_set.add(1),添加重复的数据会自动去重的哦
删除(D):
remove方法:删除某个元素,传入元素删除,如:old_set.remove(1)
discard方法:discard与remove的区别在于,如果元素不存在,remove方法会报错,而discard不会,如:old_set.discard(1)
pop方法:随机删除,不能指定索引,一次删除一个,而列表没有传入索引是从后面往前删除的,如:old_set.pop()
clear方法:清除所有,如:old_set.clear()
其他常用操作:
1.两个集合的并集:union()
2.两个集合的交集:intersection()
3.两个集合的差集:difference()
字典(Dict):可变数据类型,无序
可变的,无序的,key不可重复的key-value键值对集合,key必须是可哈希(hash)的数据类型,也就是不可变数据类型,如:数值类型,布尔类型,字符串类型,bytes,元组,None,这个与集合的元素的数据类型要求类似哦
基本使用:(CURD(意思是:create创建、read读取、update修改、delete删除,各种对象最常用的操作))
初始化(C):
d = dict()
d = {} 要注意和集合区分哦
d = {'name':'Robby', 'age':27}
d = dict(name='Robby', age=27)
d = dict((('name','Robby'),('age', 27)))
d = dict.fromkeys(range(5), 100)
访问(R):
通过索引key来访问
通过get()方法访问,如下:
d = {'name':'Robby', 'age':27}
print(d['name'])
print(d.get('nme', None))
修改(U):
update(),指定键和需要修改的值,如:update({'name': 'xkd'})
插入(U):
直接把数据赋值给key索引的字典,如:
d = {'name':'Robby', 'age':27}
d['hobby'] = 'Run'
删除(D):
传入键名删除,如:d.pop('name', None)
任意删除键值对,如:d.popitem()
全部删除,如:d.clear()
del删除,**如:del d['name']
常用操作:
keys():获得所有字典键
遍历:使用for in遍历,如下:
# key的遍历
for key in d:
print(key)
for key in d.keys():
print(key)
# value的遍历
for key in d:
print(d[key])
for key in d.keys():
print(d.get(key))
# key/value遍历
for item in d.items():
print(item)
for key,value in d.items():
print(key, value)
标准库的字典:(from collections import defaultdict)
defaultdict:使用基本类型的字典,如果访问一个不存在的key的时候,就会报错,
为了避免报错,我们可以使用collections的defaultdict,这样访问的时候,就不会报错了,并且返回默认值,如:
from collections import defaultdict
dict1 = defaultdict(int) # 默认值是0
print(dict1['name'])
OrderedDict:有序字典,记录key的插入顺序
字节(bytes):不可变类型,有序
Python3新增,用于对二进制数据的处理
与字符串对比:
1. 与字符串类似,字符串是有编码的,编码不对就出现文字变乱,可以使用utf-8、gbk等编码,这样就避免乱码;
而字节bytes是没有编码的,不会出现乱码,所以,在某些场景下可以使用字节来进行数据传输而确保没有乱码。
在socket通讯中,数据的传输就是使用bytes的;
2. 字符串和字节都可以互相转换,字符串.encode()方法就可以转换为字节,
字节.decode()方法就可以还原为字符串;
初始化:
bytes()
bytes(9)
bytes('hello', encoding='utf-8')
bytes('中国', encoding='utf-8')
常用读取操作:
decode()
hex()
startswith()
bytes.fromhex()
字节数组(bytearray):可变类型,有序
是字节bytes的可变类型,用于频繁修改数据的场景,如:视频或者图片识别处理中,需要不断的存储更新图像数据字节,如果使用bytes就会不断的创建新的内存空间,消耗大量资源,但是使用bytearry就开辟一个内存空间就够了,可以节省大量资源。
初始化:
bytearray('hello', encoding='utf-8')
常用操作:
append(100)
append(99)
insert(1,98)
extend([65,66,67])
remove(66)
pop()
reverse()
clear()
decode()
Day14:时间数据类型
在上一篇文章中,我们梳理了Python中的基本数据类型,也就是Python自带的数据类型,而时间这个数据类型,来自Python的标准库time,所以,需要导入才可以使用。Python需要做时间相关的处理时,我们就使用这个time标准库来实现;
time模块
时间戳:就是从格林威治时间(简称GMT,但目前我们开发中基本都是用世界标准时间UTC,UTC=GMT)1970年01月01日0时0分0秒(北京时间1970年01月01日08时00分00秒,北京时间比UTC时间晚8小时),到所给定日期时间的总秒数(浮点型),如果没有指定日期,就会获得到当前时间的时间戳,获取当前时间戳的语法为:time.time(),在实际应用中,我们经常存储到数据库里面可以存储当前时间戳的整数来方便后续调用,比如:写一篇文章,我要记录发布时间,就把这个发布时间的时间戳整数记录下来,存储整数比字符串程序访问速度更快。取整可以使用:int( time.time() )。【TIP:一天的秒数是24小时60分钟60秒=86400秒】
有了时间戳,可以通过localtime方法格式化时间戳为本地的时间,得到当前时间的元组(包括年月日时分秒等),如:time.localtime(1552996290)
通过localtime方法获得了元组后,可以通过asctime方法将元组转变为字符串(欧美国家的时间格式)
通过localtime方法获得了元组后,还可以通过strftime方法格式化字符串,接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定,这个灵活性就比较强了,如:time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())、time.strftime("%Y{y}%m{m}%d{d}", time.localtime()).format(y='年', m='月', d='日')
可以通过strptime方法根据指定的格式把一个时间字符串解析为时间元组
可以通过sleep方法推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起的时间
更多time方法参考文档:https://docs.python.org/3/library/time.html
datetime模块,time模块的增强版,功能更多更强大
python中的datetime模块提供了操作日期和时间功能,该模块提供的五种核心对象分别是:datetime(时间日期类型), date(日期类型), time(时间类 型), tzinfo(时区类型),timedelta(时间差类型)
可以通过timestamp方法计算时间戳
可以通过fromtimestamp方法使用时间戳获取datetime对象
使用类似time模块,更多请参考文档:https://docs.python.org/3/library/datetime.html