Python全栈工程师(每周总结:3)
ParisGabriel 每天坚持 一天一篇 点个订阅吧灰常感谢 当个死粉也阔以 week summer: Python人工智能从入门到精通 函数式编程: 是指用一系列函数解决问题 每一个函数完成细小的功能,一系列函数的任意组合可以完成大问题 函数仅接受输入并产生输入,不包含任何影响输出的内部 状态函数的可重用性: 如果一个函数的输入参数一定,则返回结果必须一定的函数 称为可重用函数 可重入和不可重入区别就是访问除局部变量以外的变量函数式编程要求: def 创建函数最好不要访问局部作用域以外的变量,这样可以保证 结果的唯一性(可重入性)高阶函数 high order function: 满足下列条件之一的就是高阶函数 1.函数接受一个或多个函数作用参数传入 2.函数返回一个函数 内建高阶函数: map,filter,sorted map(func, *iterables): 用函数和对可迭代对象中的每一个元素作为参数计算出新的可迭代对象, 当最短的一个可迭代对象不再提供数据时此可迭代对象生成结束 func 函数 *iterables 排列 filter(function, iterable): 筛选可迭代对象iterable中的数据,返回一个可迭代器对象,此可迭代对象 将对iterable进行筛选.函数function 将对iterable中的每个元素进行求值, 返回False则将此数据丢弃,返回True,则保留此数据 sorted(iterable, key=None, reverse=False): 将原可迭代对象的数据进行排序,生成排序后的列表iterable 可迭代对象 key 函数是用来提供一个值,这个值将作为排序的依据reverse 标志用来设 置是否降序排序 返回可迭代对象函数: range() map() filter() reverse()递归函数; 函数直接调用或间接的调用自身 直接调用自己 def f(): f() 间接调用自己 def fa(): fb() def fb(): fa() 递归一定要控制递归的层数,当符合条件时要终止递归 几乎所有的递归都能用while循环来代替递归特点: 优点: 递归吧问题简单化,让思路更清晰,代码更简洁 缺点: 递归因系统环境影响大,当递归深时,可能会得到不可预知的结果 递推阶段: 从原问题出发,按递归公式递推从未知到已知,最终达到递归的终止条件 回归阶段 按递归终止条件求出结果,逆向逐步代入递归公式 回归到原问题求解 闭包 closure: 闭包是引用了此函数外部的变量函数 闭包是将内部嵌套和函数外部的执行环境绑定在一起的对象 装饰器 decorators(专业提高篇) 装饰器是一个函数 ,主要用来包装另一个函数或类 装饰的目的是在 不改变函数的的原名(或类名)的情况下 改变对象的行为函数装饰器 函数装饰器指装饰器传入的是一个函数,返回的也是一个函数 原理就是改变原变量绑定的函数函数的文档字符串: 函数内第一次未被赋值给任何变量的字符串是此函数的文档字符串 模块 Module: 模块是一个包含有一系列数据、函数、类等组成的程序组 模块是一个文件,模块文件通常以.py结尾 作用: 让一些相关的数据、函数、类等有逻辑的组织在一起,使用逻辑结构清晰 模块的数据、函数、类等 可提供给其他模块或程序使用模块的分类; 内建模块(builtins)在解析器的内可以直接使用、 标准库模块,安装python时已安装且可以使用 第三方模块(通常开源),需要自己安装 用户自己编写模块(可以作为其他人的第三方模块) import 将某模块整体导入到当前模块中 from import 将谋模块的一个或多个属性导入到当前模块的作用域 from import * 将某模块的所有属性全部导入到当前模块dir函数: dir([对象]) 返回一个字符串的列表 不给参数这返回当前作用域内的所有变量的列表 内建模块 数学模块用法: import math # 或 from math import * 变量 描述 math.e 自然对数的底e math.pi 圆周率pi 函数名 描述math.ceil(x) 对x向上取整,比如x=1.2,返回2math.floor(x) 对x向下取整,比如x=1.2,返回1math.sqrt(x) 返回x的平方根math.factorial(x) 求x的阶乘math.log(x[, base]) 返回以base为底x的对数, 如果不给出base,则以自然对数e为底math.log10(x) 求以10为底x的对数math.pow(x, y) 返回 x**y (x的y次方)math.fabs(x) 返回浮点数x的绝对值角度和弧度degrees互换 math.degree(x) 将弧度x转换为角度math.radians(x) 将角度x转换为弧度三角函数 math.sin(x) 返回x的正弦(x为弧度)math.cos(x) 返回x的余弦(x为弧度)math.tan(x) 返回x的正切(x为弧度)math.asin(x) 返回x的反正弦(返回值为为弧度)math.acos(x) 返回x的反余弦(返回值为为弧度)math.atan(x) 返回x的反正切(返回值为为弧度) 时间模块 time 此模块提供了时间相关的函数,且一直可用 时间简介 公元纪年是从公元 0000年1月1日0时开始的 计算机元年是从1970年1月1日0时开始的,此时时间为0,之后每过一秒时间+1 UTC 时间 (Coordinated Universal Time) 是从Greenwich时间开始计算的. UTC 时间不会因时区问题而产生错误 DST 阳光节约时间(Daylight Saving Time),又称夏令时, 是一个经过日照时间修正后的时间 时间元组 时间元组是一个9个整型元素组成的,这九个元素自前至后依次为: 四位的年(如: 1993) 月 (1-12) 日 (1-31) 时 (0-23) 分 (0-59) 秒 (0-59) 星期几 (0-6, 周一是 0) 元旦开始日 (1-366) 夏令时修正时间 (-1, 0 or 1). 注: 如果年份值小于100,则会自动转换为加上1900后的值 模块名: time 时间模块用法: import time # 或 from time import xxx # 或 from time import * 变量 描述 time.altzone 夏令时时间与UTC时间差(秒为单位) time.daylight 夏令时校正时间 time.timezone 本地区时间与UTC时间差(秒为单位) time.tzname 时区名字的元组, 第一个名字为未经夏令时修正的时区名, 第一个名字为经夏令时修正后的时区名 注: CST为中国标准时间(China Standard Time UTC+8:00) 函数名 描述 time.time() 返回从计算机元年至当前时间的秒数的浮点数(UTC时间为准) time.sleep(secs) 让程序按给定秒数的浮点数睡眠一段时间 time.gmtime([secs]) 用给定秒数转换为用UTC表达的时间元组 (缺省返回当前时间元组) time.asctime([tuple]) 将时间元组转换为日期时间字符串 time.mktime(tuple) 将本地日期时间元组转换为新纪元秒数时间(UTC为准) time.localtime([secs]) 将UTC秒数时间转换为日期元组(以本地时间为准) 系统模块 sys 运行时系统相关的信息 sys模块的属性 属性 描述sys.path 模块搜索路径 path[0] 是当前脚本程序的路径名,否则为 ''sys.modules 已加载模块的字典sys.version 版本信息字符串sys.version_info 版本信息的命名元组sys.platform 操作系统平台名称信息sys.argv 命令行参数 argv[0] 代表当前脚本程序路径名sys.copyright 获得Python版权相关的信息sys.builtin_module_names 获得Python内建模块的名称(字符串元组)sys模块的函数 函数名 描述sys.exit([arg]) 退出程序,正常退出时sys.exit(0)sys.getrecursionlimit() 得到递归嵌套层次限制(栈的深度)sys.setrecursionlimit(n) 得到和修改递归嵌套层次限制(栈的深度) $ pip3 install tensorflow 第三方模块 tensorflow 的安装 必须有网 命令自动下载安装 自定义模块文件名必须是标识符模块的加载过程: 1. 在模块导入时,模块的所有语句都会执行 2. 如果一个模块已经导入,则再次导入时不会重新执行模块内的语句 重新加载mymodl1模块 import imp imp.reload(mymodl1) __doc__属性 文档字符串自动赋值给__file__ 属性 查看模块的当前路径dir(模块名) 查看模块属性模块以导入和执行的过程: 1. 先搜索相关的路径,找到模块名.py 2. 判断是否有此模块对应的.pyc文件。如果.pyc比.py文件新,则直接加载.pyc文件 3. 否则 用模块.py,文件生成.pyc,并加载执行 pyc python的编译 编译 解释执行 mymod.py --------> mymod.pyc --------> python3 模块的文档字符串和函数一样 模块的 __doc__ 属性 此属性用于绑定模块的文档字符串 模块的 __file__属性 此属性用于记录模块对应的文件路径名 模块的 __name__属性 __name__属性 用来记录模块自身名字 判断是否为主模块 主模块: __name__绑定 '__main__' 非主模块: __name__ 绑定模块名 模块的 __all__列表 模块中的 __all__列表是一个用来存放可导出属性的字符串列表 模块的隐藏属性 模块中以'_'开头的属性,在from xxx import * 导入时,通常将不被导入 标准库模块 随机模块 random说明: random模块是用于模拟或生成随机输出的模块. import random as R 函数名 描述R.random() 返回一个[0, 1) 之间的随机实数R.uniform(a,b) 返回[a,b) 区间内的随机实数R.randrange([start,] stop[, step]) 返回range(start,stop,step)中的随机数R.choice(seq) 从序列中返回随意元素R.shuffle(seq[, random]) 随机指定序列的顺序(乱序序列)R.sample(seq,n) 从序列中选择n个随机且不重复的元素包(模块包) package 包是将模块以文件夹的组织形式进行分组管理的管理方法 __init__.py是常规包内必须存在的文件 __init__.py会在包加载时自动调用 __init__.py : 1. 编写此包的内容 2. 在内部填写文档字符串 . 在__init__.py文件内可以加载此包所依懒的一些其它模块 __init__.py内的 __all__ 列表 用来记录此包中有哪些子包或模块在用from import *语句 时被导入 __all__列表只对 from xxx import *语句起作用 导入包时的索引路径顺序: 1. 搜索程序的当前路径 2. sys.path 提供的路径 包的相对导入: 包的相对导入是指包内模块的相互导入 相对导入时不能超出包的外部 包的相对导入 只对后两种导入方式有用 异常(基础)except: 什么是错误: 是指由于逻辑或语法等导程序无法正常执行的问题 什么是异常: 是程序出错的标识符的一种状态 当异常发时 程序不会再向下执行,而转去调用此函数的地方 待处理此错误并恢复为正常状态异常的作用: 用作信号, 通知上层调用者有错误产生需要处理 异常处理语句(4条): try-except 语句: 用于接受异常通知, 捕获异常 try-finally 语句: 执行必须执行的语句 raise 语句: 发送异常通知, 并进入异常状态 assert 语句: 根据条件选着性的发送 AssertionError类型的异常通知为什么要处理异常机制: 在程序调用层数比较深的时候, 向主调用函数传递错误信息 需要层层return返回 比较麻烦, 用异常处理机制可以较简单的传递错误信息 用<>括号表示的一定是对象 什么是迭代器 迭代器是访问可迭代对象的工具 迭代器是指用iter(obj) 函数返回的对象 迭代器可以用next(it) 函数获取可迭代对象的数据 迭代器只能向前取值,不会后退 用iter函数可以返回一个可迭代对象的迭代器 迭代器函数iter和nextiter(iterable) 从可迭代对象中返回一个迭代器,iterable 必须是能提供一个迭代器的对象next(iterator) 从迭代器iterator中获取下一个记录,如果无法获取下一条记录,则触发StopIteration异常 什么是生成器: 生成器是能够动态提供数据的对象,生成器对象也是可迭代对象 动态就是现用现生成数据 生成器有两种: 1. 生成器函数 2. 生成器表达式 生成器函数的定义 含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象 yield 翻译为(产生或生成) 动态生成数据 在函数内可以一个或多少 在生成器函数调用return 会触发一个StopIteration异常 函数: zip(iter1[, iter2[, ...]]) 返回一个zip对象,此对象用于生成元组,元组的个数由最小的可迭代对象决定 enumerate(iterable[, start]) 生成带索引的枚举对象,返回迭代类型为索引-值对(index-value对) , 默认索引从零开始,也可以用start指定(排序 自定义标号) 字节串和字节数组字节串bytes (也叫字节序列) 作用: 存储以字节为单位的数据 字节串是不可变的字节序列 字节: 字节是由8个位(bit)组成的数据单位,是计算机进行数据管理的单位 字节是用 0 ~ 255 范围内的整数表示的 2 ** 8 - 1 字节串的构造函数 bytes bytes() 生成一个空的字节串 等同于 b'' bytes(整数可迭代对象) # 用可迭代对象初始化一个字节串 bytes(整数n) 生成n个值为0的字节串 bytes(字符串, encoding='utf-8') 用字符串转为编码生成一个字节串 bytes 的运算: + += * *= < <= > >= == != in / not in 索引和切片 len(x) max(x) min(x) sum(x) any(x) all(x) bytes 和 str 的区别: bytes 存储字节( 通常值在 range(0, 256)) str 存储unicode字符( 通常值在0~65535) bytes 与 str 的转换 编码(encode) str ------------> bytes b = s.encode(encoding='utf-8') 解码(decode) bytes ----------> str s = b.decode(encoding='utf-8') 字节数组 bytearray 是可变的字节序列 字节数组的构造函数: bytearray bytearray() 创建空的字节数组 bytearray(整数) 用可迭代对象初始化一个字节数组 bytearray(整型可迭代对象) 生成n个值为0的字节数组 bytearray(字符串, encoding='utf-8') 用字符串的转换编码生成一个字节数组 索引和切片 (字节数组支持索引和切片的赋值操作,规则同列表的索引和切片赋值规则) bytearray的方法: BA.clear() 清空 BA.append(n) 追加一个字节(n为0~255的整数) BA.remove(value) 删除第一个出现的字节,如果没有出现,则触发ValueError错误 BA.reverse() 字节顺序反转 BA.decode(encoding='utf-8') # 解码为字符串 BA.find(sub[, start[,end]]) # 查找 sub