Python3系统学习记录

2022-10-26 16:55:26 浏览数 (1)

Python3系统学习记录

  • 1、Python简介
  • 2、安装Python3.7
  • 3、第一个Python程序
  • 4、Python基础
  • 5、函数
  • 6、高级特征
  • 7、函数式编程
  • 8、模块
  • 9、面向对象编程
  • 10、面向对象高级编程
  • 11、错误、调试和测试
  • 12、IO编程
  • 13、进程和线程
  • 14、正则表达式
  • 15、常用内建模块
  • 16、常用第三方模块
  • 17、virtuallenv
  • 18、图形界面
  • 19、网络编程

1、Python简介

代码语言:javascript复制
-- 代码简洁,运行速度慢
-- 日常任务、网站(youtobe、Instagram)、网络游戏后台
-- 不能写OS、写手机应用可以Swift/Objective-C和Java(Android)、3D游戏(C或者C  )
-- 内置库丰富
-- 优雅、明确、简单
-- 解释性语言,逐行翻译成机器码,很慢
-- 对于网速慢的前提,比方说网络需要等待1s,Python程序需要0.1s,而C程序只需要0.001s,其实差别不大
-- 代码不能加密

2、安装Python3.7

代码语言:javascript复制
-- Python2.x和Python3.x不兼容
-- 下载exe64位安装包:https://www.python.org/ftp/python/3.7.0/python-3.7.0-amd64.exe
-- 把python主目录下面的Script文件夹路径加入到Path中
-- Python解释器很多种,使用最广泛的是CPython

3、第一个Python程序

代码语言:javascript复制
-- >>> print(100 200)
-- 单引号和双引号都可以用来定义字符串
-- exit()退出Python交互模式
-- 2**10=1024
-- 文件名由英文字母、数字、下划线组成
-- linux下面可以直接运行python文件,只需要在首行加上特殊注释,并且给文件授执行权限
-- 输出串可通过逗号隔开,其输出结果用空格代替逗号
-- name=input("please enter your name")

4、Python基础

代码语言:javascript复制
-- 缩进语法(4个空格)
-- 数据类型:整数(0x开始表示十六进制)、浮点型(科学记数法)、字符串(单引号和双引号,注意转义。r''里面字符串默认不转义)、布尔值(True、False)、None
-- ('''...''' 表示有多行)
-- 用 and、or、not 操作布尔值
-- // 整除
-- 字符编码。Unicode把所有语言都统一到一套编码里面,这样不会有乱码问题
-- ASCII 1个字节、Unicode 2个字节、UTF-8 1-6个字节可变长
-- ord('') 把单个字符转为整数表示,chr()函数把编码转换为对应的字符
-- b'' 表示是bytes类型字符
-- len() 用来计算字符串长度和bytes类型的字节数
  #!/usr/bin/env python3
  # -*- coding: utf-8 -*-
-- 格式化输出:print('%s,%d' % ('你好',14656)),用 %%来表示输出中包含%,也是转义
-- list 有序集合,随时增删元素,classmates=[],classmates.append('Jack'),len(classmates),classmates.insert(1,'Lucy'),classmates.pop(),classmates.pop(i),classmates[1]=Henry
-- tuple 元组,与list类似,但是一旦初始化就不可变。t=()或t=(1,)
-- if/else else if/elif。if x: 只要x是非零数值、非空字符串、非空list等就判断为True
-- input()读入的是str型数据,如果需要整型则需要强制转换 age=int(sage)
-- for in循环,range()函数生成一个证书序列,通过list()函数可以转换为list,如 list(range(1,100))
-- break、continue。不要频繁使用这两个语句,会造成代码执行逻辑分叉过多
-- Ctrl C推出程序或强制结束Python进程
-- dict 字典,键-值,查询速度极快,因为添加了索引。如同在字典中查询某个不认识的字一样,一种是从头到尾查,另一种是拼音或者部首查询。占用空间大,内存浪费多。空间换时间
-- d={'name':'Henry','age':18},d['height']=168,'name' in d,pop('age')
-- set 不可重复集合,无序。s=([1,2,3]),s.add(key)

5、函数

代码语言:javascript复制
-- abs()、max()、int()、str()、bool()、float()、hex()、sqrt()、trim()
-- def functionName():
-- from fileName import functionName 引入某类中的某方法
-- pass 空占位符
-- isinstance(5,(int,float)) 类型判断
-- return age,name 返回多个值,其实是返回一个tuple元组
-- x,y=functionName() 接受多个值
-- 对参数类型做检查
-- raise TypeError('Bad Type Operator')
-- 没有return语句时,自动返回 return None
-- 默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误
-- 递归函数,使用时注意反之栈溢出。栈数据结构大小有限

6、高级特征

代码语言:javascript复制
-- L=[],L[0:55]。切片功能,左闭右开,L[:10] 前10个,L[-10:]后10个,L[::5] 每5个取一个
-- enumerate(L),把List转变为 索引-元素对
-- 列表生成 [x*x for x in range(1,11) if x%2==0]。[生成计算结果 数据范围 生成筛选条件]
-- 生成全排列 [X Y for X in 'ABC' for Y in 'abc']
-- [d for d in os.listdir('C:')] 列出C盘下全部目录文件
-- 生成器 generator,可以在循环的过程中不断推算出后续的元素,把list的[]改成()即可
-- (d for d in os.listdir('C:'))
-- 用 yield修饰生成器中需要返回的值,除此之外,执行流程也和函数不同。generator在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
-- 可以被next()函数调用并不断返回下一个值得对象称为迭代器:Iterator
-- Iterator可以理解为懒加载的数据类型, Iterator对象=iter(Iterable对象)

7、函数式编程

代码语言:javascript复制
-- 高度抽象的编程范式,允许把函数本身作为参数传入另一个函数,这种函数就称之为高阶函数,还允许返回一个函数。Python不是纯函数式编程语言
-- 变量可以指向函数
-- def add(x,y,f):return f(x) f(y)。其中f可以传入 abs作为参数
-- map(函数1,函数1操作的每个参数的集合),如 map(abs,[-1,-4,-5,-3,-9])
-- reduce,导包 from functools import reduce。 reduce(pow,[2,3,4,5]) 等同于 pow(5,pow(4,pow(2,3))))
-- filter() 过滤元素 list(filter(is_odd,[1,2,3,6,6,7,3,4,3])),is_odd函数是用来判断一个数是不是基数,是就返回True。属于Iterator,惰性结构
-- sorted排序,如 sorted([1,5,7,9,3,6])。也可以 sorted([-5,-1,-9,-11,-3],key=abs) 按绝对值大小排序
-- sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True) 忽略大小写后反向排序
-- 匿名函数 list(map(lambda x:x*x,[1,2,3,4,5,6]))
-- 装饰器,对函数进行加强(略难)
-- 偏函数,functools.partial(int, base=2),int()函数默认是把str转为int型,是应为base参数默认为10。

8、模块

代码语言:javascript复制
-- 一个 .py文件就是一个模块,又引入包这个概念
-- .py文件中第一个字符串都被是为模块的文档注释,__author__='WuDG'
-- __xxx__是特殊变量,有特殊用途, _xxx_和__xxx 的函数或变量是非公开的(private),这里是封装和抽象
-- 安装模块,使用pip工具(pip install 模块名)

9、面向对象编程

代码语言:javascript复制
-- 继承、封装、多态
-- 类和实例的关系
-- 可以通过 实例对象.属性名=属性值 来将属性放到这个实例对象中
-- 可以将类中的变量名加__,就可以设置为private私有变量,外部代码就不能访问该变量。向外部提供访问接口,避免传入无效的参数。其实可以通过 _类名__属性名 来访问
-- __变量名__ 是特殊变量,可以直接访问
-- class Cat(Animal)
-- 对于静态语言(如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,沟泽,将无法调用run()方法。对于Python这样的动态语言来说,则不一定要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了。
-- file-like object
-- isinstance([1,2,3,4],(list,tuple))
-- dir() 获取一个对象的所有属性和方法
-- len(L)=L.__len__()
-- setattr(对象实例名,属性名,属性值) 来插入一个属性
-- getattr(对象实例名,属性名,<可选 属性默认值>) 来获取到实例对象的属性值
-- hasattr(对象实例名,属性名) 来判断实例对象是否有这个属性
-- del 实例名.属性名 删除实例拥有的属性
-- 实例属性属于各个势力所有,互不干扰。类属性属于类所有,所有实例共享一个属性,不要对实例属性和类属性使用相同的名字,否则将产生难以发现的错误。

10、面向对象高级编程

代码语言:javascript复制
-- 多重继承、定制类、元类...
-- 可以给某个实例绑定一个方法。 对象名.方法名=MethodType(方法名,对象名)  s.set_age=MethodType(set_age,s)。s.set_age=属性值
-- 也可以给某个类绑定一个方法。只是将上面的实例名改成类名即可。(python交互窗口未测试成功)
-- class Student(object): __slots__ = ('name', 'age')。用__slots__变量来限制只能对实例中添加某些属性。
-- __slots__ 变量对继承的子类不起作用。除非在子类中也定义了__slots__ ,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。
-- 限定属性值的范围和修改属性值的手段。
-- @property 可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性
-- 多重继承(MixIn)
-- 定制类,也就是类似重写父类的方法。如 __str__、__repr__、__call__
-- 用 callable()方法来判断一个对象是否能被调用
--枚举类, Month=Enum('Month',('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')),value属性是自动赋给成员int常量,默认从1开始技术
-- Enum 可以把一组相关常量定义在一个class中,而且class不可变,同时成员可以直接比较
-- type()可以返回一个对象的类型,又可以返回一个对象的新类型。
-- 元类 metaclass,先定义metaclass,就可以创建类,最后创建实例。(不好理解)

11、错误、调试和测试

代码语言:javascript复制
-- 跟踪程序的执行,查看变量的值是否正确,这个过程成为调试。python的pdb可以让我们以单步方式执行代码
-- 错误处理机制,可以用错误代码来表示出错问题
-- try...except...finally...
-- 如果没有错误发生,可以在except语句后面加一个else,当没有错误发生时,会自动执行else语句
-- BaseExcepiton是所有异常的父类
-- 出错的时候,一定要分析错误的调用栈信息,才能定位到错误的位置
-- 日志模块 import logging, logging.方法名()
-- 抛出异常 raise 异常名()。 如 raise  FooErroe(‘invalid value:%s’ % s)
-- 调试:print()、断言、logging、pdb调试器
-- 断言 assert n!=0,'n is zero',可以通过加入参数-O来关闭断言,如 python -O err.py。这个assert就相当于pass语句
-- 通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件
-- pdb调试器,通过添加参数 -m pdb 启动后,pdb定位到下一步要执行的代码,输入1来查看代码,输入n可以单步执行代码。可以通过 p 变量名来查看变量,输入命令 q 推出程序。
-- pdb.set_trace() 不需要但不执行,只需要 import pdb,然后再可能出错的地方放一个 pdb.set_trace()就可以设置一个断点,程序会在设置断点的地方暂停并进入pdb调试环境,可以用命令 p 查看变量,或者用命令 c 继续运行
-- 带有调试功能的IDE工具。如 Visual Studio Code、Pycharm等
-- 单元测试,import unittest,可以通过添加参数 -吗unittest来运行单元测试代码

12、IO编程

代码语言:javascript复制
-- 同步IO/异步IO,区别在于CPU是否等待IO操作
-- 用with来解决文件打开关闭问题 with open('/path/to/file', 'r') as f:print(f.read())
-- 读文件 f = open('2019-7-3 工作日志.txt', 'r')。r是读取 UTF-8编码的文本, rb是读取图片、视频等二进制文件,若要读取非UTF-8编码的文本,则需要添加一个参数指定编码方式,如encoding=gbk,读取文本文件过程中可能遇到编码错误,可以添加一个参数 error='ignore'来忽略错误
-- 写文件 w和wb代替r和rb即可
-- 在内存中读写数据, from io import StringIO  f=StringIO() f.write('hello world') print(f.getvalue())
-- 初始化一个 StringIO。 f=StringIO('i am a student,n and you?n you are a work!!!') f.readline()
-- ByteIO操作二进制数据。f=BytesIO("你好呀".encode('utf-8'))
-- os模块。import os  os.environ os.name os.rename('原','目标') os.remove('文件名')
-- os.path.abspath('.') 获取当前目录绝对路径。os.mkdir('D:\dev\testDir') os.rmdir('D:\dev\testDir')
-- 列出当前目录下全部文件夹 [x for x in os.listdir('.') if os.path.isdir(x)]
-- 列出当前目录下全部.py文件 [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
-- 复制文件 import shutil 。shutil.copyfile('test.txt','copytest.txt')
-- 序列化 把变量从内存中变成可存储或传输的过程称之为序列化,在python中交pickling。序列化之后,就可以把序列化后的内容写入到磁盘或者通过网络传输到别的机器上
-- 序列化到二进制文本中 import pickle d=dict(name='henry',age=18,job='work') pickle.dumps(d) f=open('birany.txt','wb') pickle.dump(d,f) f.close()
-- 反序列化 f=open('birany.txt','rb') r=pickle.load(f) f.close() r {'name': 'henry', 'age': 18, 'job': 'work'}
-- json将python对象序列化为字符串。import json json.dumps(d) json.loads(json_str)
-- 把任意对于序列化成json:json.dumps(s, default=lambda obj: obj.__dict__)

13、进程和线程

代码语言:javascript复制
-- 进程与线程之间的关系
-- 线程是最小的执行单元,而进程由至少一个线程组成,完全由操作兄决定,程序自己不能决定什么时候执行和执行多久。多进程和多线程的程序涉及到同步、数据共享等问题,编写起来更复杂。
-- 多进程 linux系统下提供os.fork(),Windows下提供了跨平台版本的多进程multiprocessing模块
-- 通过进程池的方式批量创建子进程
-- 通过subprocess调用系统命令,如r = subprocess.call(['nslookup', 'www.python.org']),这和直接输入命令 nslookup www.python.org 作用相同
-- 进程间通信是通过 Queue和Pipes。
-- Python 解释器由于设计时有GIL全局所,导致了多线程无法利用多核,多线程的并发在Python中即使一个美丽的噩梦
-- ThreadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本,互不干扰。ThreadLocal解决了参数在一个线程中各个哈书之间互相传递的问题。
-- 线程切换时间开销问题。计算密集型 VS IO密集型。计算密集型任务同时进行的数量应当等于CPU核心数
-- 分布式进程

14、正则表达式

代码语言:javascript复制
-- d 一个数字、w 一个字母或者数字、 . 任意一个字符、 * 任意个字符、   至少一个字符、 {n} 表示n个字符、? 表示0个或1个字符、{n,m} 表示n到m个字符
-- [0-9a-zA-Z_]  至少一个由数字、字母、下划线组成的字符串
-- [a-zA-Z_][0-9a-zA-Z_]* 匹配Python合法变量
-- A|B A或B  (P|p)ython 匹配 python或Python
-- ^ 表示行的开头,如 ^d表示必须以数字开头
-- $ 表示行的结尾,如 d$ 表示必须以数字结尾
-- import re re.match(r'^d{3}-d{3,8}$', '010-12345')
-- 切分字符串 re.split(r'[s,] ', 'a,b, c  d')
-- 分组 通过()来实现 m = re.match(r'^(d{3})-(d{3,8})$', '010-12345')
-- m.group(0) '010-12345' m.group(1) '010' m.group(2) '12345'
-- 贪婪匹配,正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。
-- 编译,如果一个正则表达式要重复使用很多次,处于效率的考虑,可以进行预编译该正则表达式。re_telephone = re.compile(r'^(d{3})-(d{3,8})$')  然后直接使用 re_telephone.match('010-12345').groups() 即可

15、常用内建模块

代码语言:javascript复制
-- datetime  from datetime import datetime  datatime.now()
-- 构造时间和时间戳 print(datetime(2019,7,5,15,50).timestamp())
-- 时区不同 datetime.utcfromtimestamp(datetime(2019,7,5,15,50).timestamp())和datetime.fromtimestamp(datetime(2019,7,5,15,50).timestamp()) 这是本地时间
-- 时间字符串格式化成 datetime对象 datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
-- datetime对象转换为世界字符串:datetime.now().strftime('%a, %b %d %H:%M')
-- datetime 加减,导入 timedelta模块。print(datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S') timedelta(hours=10))
2015-06-02 04:19:59
-- datetime 标识的时间需要时区信息才能确定一个特定的时间,否则只能视为本地时间。如果要从年初datetime,最佳方法是将其转换成timestamp再存储,因为timestamp的值与时区无关
-- namedtuple namedtuple('名称', [属性list])  Point = namedtuple('Point', ['x', 'y'])或者Circle = namedtuple('Circle', ['x', 'y', 'r'])
-- deque 双向列表 q = deque(['a', 'b', 'c']) q.append('x') q.appendleft('y')
-- deque 除了实现了list的append方法和pop方法之外,还支持appendleft和popleft等方法,这样就可以非常高效地往头部添加或删除元素
-- defalutdict 提供了key不存在时返回一个默认值,而不是报错。
-- OrderDict 保持键值插入的顺序
-- Counter 计数器,可以用来统计字符出现个数
-- Base64 是一种任意二进制到文本字符串的编码方法,常用语URL、Cookie、网页中传输少量二进制数据
-- struct 模块中pack函数把任意数据类型变成bytes
-- hashlib 摘要算法(md5、SHA1),也称哈希算法、散列算法,它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。目的是为了发现原始数据是否被人篡改过
-- 摘要算法应用 密码存储。加盐。摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特特性决定了可以在不存储明文口令的情况下验证用于口令
-- Hmac算法,在计算哈希的过程中,把key混入计算过程。hmac.new(key,message,digestmod='MD5') key和message都是bytes类型 。
-- itertools提供了非常有用的用于操作迭代对象的函数。itertools.count(1)会产生一个自然数迭代对象、itertools.cycle(字符串1) 会产生字符串1的循环迭代、repeat('第一个元素','次数')把一个元素无限重复下去,
-- takewhile()函数根据条件判断来截取出一个有限序列、chain()函数可以把一组迭代对象串联起来,形成一个更大的迭代器 for c in itertools.chain('ABC', 'XYZ')
-- groupby()把迭代器中相邻的重复元素挑出来放一起 for key, group in itertools.groupby('AAABBBCCAAA'):
-- itertools模块提供的全部是处理迭代功能的函数,他们的返回值不是list,而是Iterator,只有for 循环迭代的时候才真正计算
-- 并不是只有open函数返回的fp对象才能使用with语句。只要正确实现了上下文管理,就可以用于with语句。实现上下文管理是通过 __enter__和__exit__这两个方法实现的
-- @contextmanager也可以实现对上下文的管理功能,如 计算一个函数的运行时间
-- urllib 提供了一系列用于操作URL的功能
-- xml解析 。DOM vs SAX,DOM会把整个xml读入内存,解析为树,慢但是可以任意遍历树的节点。SAX 流模式,边读边解析,内存小,快
-- html解析

16、常用第三方模块

代码语言:javascript复制
-- 所有的第三方模块都会在 https://pypi.org/ 上面注册,只需要找到对应的模块名字,就可以直接用 pip工具进行安装操作
-- pillow 强大的图片处理标准库。修改图片尺寸、图片模糊、生成验证码
-- requests, urllib模块可以用于访问呢网络资源,但是用起来麻烦,而且缺少很多实用的高级功能,而requests处理URL资源特别方便
-- 检测编码模块 chardet。chardet.detect(b'Hello, world!') 支持检测中文、日文、韩文等
-- (3.4安装失败)psutil 系统监控模块。 psutil.cpu_count() # CPU逻辑数量 psutil.cpu_count(logical=False) # CPU物理核心  psutil.cpu_times() psutil.disk_partitions() # 磁盘分区信息

17、virtuallenv

代码语言:javascript复制
-- python环境隔离模块。由于不同的项目需要的环境和模块不同,所以引入这个模块的作用很大

18、图形界面

代码语言:javascript复制
-- Tk(python自带,无需安装)、wxWidgets、Qt、GTK
-- Tkinter可以满足基本的GUI程序要求,如果是非常复杂的GUI程序,建议用操作系统原声支持的语言和库来编写
-- 海龟绘图

19、网络编程

代码语言:javascript复制
-- TCP/IP简介 为了把全世界所有不同类型的计算机都链接起来,规定的一套全球通用的协议,TCP和IP协议最为重要,所以把互联网的协议简称TCP/IP协议
-- TCP编程 服务器绑定UDP端口和TCP端口互不冲突

未完待续… 原文路径:

0 人点赞