人工智能小白日记之3python篇
关于python
python嘛,本来不打算写这篇的,但是其实自己也没用过几次,还是总结下。免得一些基础地方都看不懂,就要丢人啦。来来来,让我们干了这杯python3。
选用廖大神的:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
盗用廖大神的话是这么讲的:
接下来我就快速总结了。这里不写的太详细,过一遍,以后用的时候回来翻就行了,这阶段的目标是了解python里面的都有哪些工具可以用。
1.知己知彼
Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。(看到没,这就是装逼的最高境界,因为无聊)
Python为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,也有大量其他人员编写的第三方库。也就是说我们直接使用这些封装好的库就行了。
Python的优点:简单优雅,尽量写容易看明白的代码,尽量写少的代码。而且也是跨平台的。
Python的缺点:速度慢。Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码;代码不能加密。如果要发布你的Python程序,实际上就是发布源代码。
适用场景:
1.首选是网络应用,包括网站、后台服务等等;
2.其次是许多日常需要的小工具,包括系统管理员需要的脚本任务等等;
3.另外就是把其他语言开发的程序再包装起来,方便使用。
2.安装跳过,大家看教程去
3.关键点
3-1.运行
可以在python的交互界面直接运行,也可以是.py后缀的文件中编写,然后通过
python xxx.py
执行。
3-2.日志
日志是比较重要的,如果没有单步调试,就靠日志来排除错误,找出问题了,python的日志也超级简单
print()
3-3.输入
输入可以接收外部的参数
name = input()
3-4.注释
注释可以方便大家阅读代码,python的注释以“#”开头
#name = input()
注释掉这行,这行代码不再执行。
3-5.基础语法跳过,记录特殊点
1)为了简化,Python还允许用r’‘表示’‘内部的字符串默认不转义
2)允许用’’’…’’'的格式表示多行内容
3)空值是Python里一个特殊的值,用None表示
4)python的变量没有类型,可以直接赋值。这种变量本身类型不固定的语言称之为动态语言,常见的java,c这些都是静态语言。
5)python的两种除法。/除出来是浮点数,//除出来是取整
6)在最新的Python 3版本中,字符串在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
7)Python对bytes类型的数据用带b前缀的单引号或双引号表示,但bytes的每个字符都只占用一个字节。str通过encode()方法可以编码为指定的bytes,要把bytes变为str,就需要用decode()方法。
>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> b'ABC'.decode('ascii')
'ABC'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
8)为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,
Windows系统会忽略这个注释;
第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,
你在源代码中写的中文输出可能会有乱码。
申明了UTF-8编码并不意味着你的.py文件就是UTF-8编码的,必须并且要确
保文本编辑器正在使用UTF-8 without BOM编码:
9)静态有序的元祖tuple,动态有序的list
10)函数定义
def my_abs(x):
python的函数可以返回多值,实际上是一个tuple。
》可以定义默认参数
def power(x, n=2):
》可变参数仅仅在参数前面加了一个号
》关键字参数,如果希望保留可变参数的变量名,可以**key,key将获得一个dict拷贝
》命名关键字参数需要一个特殊分隔符,*后面的参数被视为命名关键字参数。
def person(name, age, *, city, job):
》如果需要将以上组合,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
3-6.高级特性
1)list和str可以切片获取片段
2)迭代
3)列表生成式超强的有木有
4)更加强大的generator生成器
5)Iterable对象与Iterator对象的区别
3-7.函数式编程
也叫面向过程编程
1)强大的映射函数map
2)强大的累积函数reduce
3)filter()函数用于过滤序列
4)sorted()函数就可以对list进行排序
5)装饰器Decorator的用法
6)偏函数通过设定参数的默认值,可以降低函数调用的难度。相当于定义重载函数。
3-8.模块
这里讲了模块的创建,第三方模块的安装
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
' a test module '
__author__ = 'Michael Liao'
import sys
def test():
args = sys.argv
if len(args)==1:
print('Hello, world!')
elif len(args)==2:
print('Hello, %s!' % args[1])
else:
print('Too many arguments!')
if __name__=='__main__':
test()
3-9.面向对象编程
这里跟其他语言的比较类似。记下不一样的
1)使用__slots__可以限制该class实例能添加的属性
class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
2)Python内置的@property装饰器就是负责把一个方法变成属性调用的
3)MixIn的目的就是给一个类增加多个功能,优先考虑通过多重继承来组合多个MixIn的功能。
class Dog(Mammal, RunnableMixIn, CarnivorousMixIn):
pass
4)看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。
定义_str__()方法可以定制输出;
通常__repr__ = __str__,__repr__是开发人员看的字符串;
如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个
__iter__()方法;
__next__()方法拿到循环的下一个值;
要表现得像list那样按照下标取出元素,需要实现__getitem__()方法;
在没有找到属性的情况下,会调用__getattr__;
只需要定义一个__call__()方法,就可以直接对实例进行调用;
5)同样有枚举类Enum
6)对类本身进行操作的type()和metaclass
3-10.测试调试相关
这里需要特别关注,这关系到我们以后编码的效率,如果发生错误,结果你半天都找不到原因,那就非常尴尬了。
1)try…except…finally…的错误处理机制
2)logging模块可以非常容易地记录错误信息,打印完错误信息后会继续执行,并正常退出。通过配置,logging还可以把错误记录到日志文件里。
3)启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态
4)Python自带的unittest模块可以用作单元测试
5)Python内置的“文档测试”(doctest)模块可以直接提取注释中的代码并执行测试。
3-11.高级编程
3-11-1. IO编程
1)文件读写
这里在自然语言处理的时候可能会用到,需要将语音转换为文本,转换成文本的时候就处理语音和文本的输入输出。
2)StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口
3)操作文件和目录
4)把变量从内存中变成可存储或传输的过程称之为序列化。
3-11-2. 进程和线程
1)多进程
在Unix/Linux下,可以使用fork()调用实现多进程。当然windows可以装虚拟机来代替。
要实现跨平台的多进程,可以使用multiprocessing模块。
进程间通信是通过Queue、Pipes等实现的。
2)多线程
Python的标准库提供了两个模块:_thread和threading,_thread是低级模块,threading是高级模块
多线程是内存数据共享的,需要保护数据一致性。也是通过同步锁的概念Lock。
Python由于GIL锁的存在,多线程其实还是单核任务。但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。
一个ThreadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。ThreadLocal解决了参数在一个线程中各个函数之间互相传递的问题。(做安卓的同志应该能很快理解)
3)Python的分布式进程接口简单,封装良好,适合需要把繁重任务分布到多台机器的环境下。
3-11-3. 大名鼎鼎的正则,跳过了
不为啥,哈哈,内容太多,讲不完。完全可以当一门课单独学习。
3-11-4. 常用内裤
前面说的各种库,终于要在这里了解了。
1)datetime 很明显时间日期相关的操作可以在这里找到
2)collections模块提供了一些有用的集合类
3)Base64现在应用广泛,什么图片转文本用于传输,还有加密算法里面很常见。Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。
4)struct模块解决bytes和其他二进制数据类型的转换。
5)hashlib 包含MD5,SHA1等摘要算法,在服务端保护用户信息很常见。
6)hmac 我们经常听到的加盐算法
7)itertools提供了非常有用的用于操作迭代对象的函数
8)contextlib 上下文工具,理解起来有点费解
9)urllib提供了一系列用于操作URL的功能。http请求可以用上
10)xml,经常会涉及xml文本的解析与输出
11)HTMLParser可以非常方便地解析HTML,只需简单几行代码。
3-11-5. 常用别人的内裤
1)Pillow已经是Python平台事实上的图像处理标准库了
2)requests 处理网络请求比urllib更加便捷
3)使用chardet检测编码非常容易
4)psutil = process and system utilities 。可以方便的获取系统信息,运维好搭档。
3-11-6. virtualenv
virtualenv为应用提供了隔离的Python运行环境,解决了不同应用间多版本的冲突问题。
3-11-7. GUI界面,这个暂时跳过,估计用不上
3-11-8. 网络编程,大同小异,tcp,udp,跳过
3-11-9. 电子邮件,跳过
3-11-10. 数据库
1)Python就内置了SQLite3,直接无缝使用。
在Python中操作数据库时,要先导入数据库对应的驱动,然后,通过Connection对象和Cursor对象操作数据。
要确保打开的Connection对象和Cursor对象都正确地被关闭,否则,资源就会泄露。
2)mysql耳熟能详了
3)SQLAlchemy ,python的ORM(对象关系映射)框架,可以直接把数据库存储与内存对象映射,谁用谁知道。
3-11-11. web开发
Python有上百种Web开发框架,有很多成熟的模板技术,选择Python开发Web应用,不但开发效率高,而且运行速度快。
1)web的html,js跳过
2)通过WSGI接口可以实现python版本的web服务。当然如果太复杂的web服务,要利用在这个基础上抽象出来的框架。
3)常用web框架Flask
3-11-12. 异步IO
也叫非阻塞式IO,不同线程之间相互协作,互不干扰。
1)asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持
2)Python从3.5版本开始为asyncio提供了async和await的新语法
3)asyncio实现了TCP、UDP、SSL等协议,aiohttp则是基于asyncio实现的HTTP框架
教程最后附赠了实战。
4. 小结
呼呼,python3就这样干撸完了。大致内容跟诸多语言一样,还是比较全面的。从基本语法,到函数,到面向对象,IO,多线程,网络编程,数据库,web,应有尽有。学完基本上可以独立开发web应用和跨平台软件,可以可以。