HCIA-AI v2.0 培训03: Python基础
Python基础
- 掌握Python初级语法
- 熟悉Python高级语法
- 使用Python进行简单的编程
Python简介
介绍
- 高级编程语言
- 完全开源
- 作者:Guido Van Rossum
- Zen of Python
优缺点
- 优点
- 高级的面向对象的编程语言
- 动态解释性语言
- 拥有优雅的结构和清晰的语法,简单易学
- 丰富的第三方库
- Python可以调用其他语言所写的代码,又被称为胶水语言
- 支持函数式编程
- 缺点
- 运行速度慢
使用领域
- AI
- 数据科学
- 编写系统工具
- APP
- 自动化运维脚本
- WEB开发
环境
Python2,Python3
Anacaonda
Pycharm,Eclipse, Jupyter Notebook
Python初级
基础语法
- Python用缩进划分语句块
- 缩进为四个空格或一个TAB键,使用时保持一致
- 执行顺序是自上而下
- 用import或from...import ...进行导入模块或包
- 多个语句在一行中,要使用分号分割
- 单行注释符是#,注释多行用""" 或 '''
- PEP8规范(非强制)
- PEP8不是语法规则,用来提高代码可读性和美观性
- 关键字
- 标识符命名规则
- 由字母、下划线和数字组成,且数字不能开头,不能和关键字重名
- 变量是对数据存储地址的引用
- 作用域:程序运行时变量可被访问的范围
- 局部变量:函数内部
- 全局变量:整个模块
内置函数
input() :接受用户输入的函数
del(obj) : 删除内存中的对象
range() : 生成可迭代序列
type(obj) : 返回对象类型
dir(obj) : 查看对象内置方法和属性
id(obj) : 查看对象内存地址
help(obj) : 显示对象的帮助信息
数据结构
Number, String, List, Tuple, Dictionary, Set
数值型
- 按类型分类
- 有序:可以使用下标(索引)访问元素
- 可以使用切片形式[start:stop:step]访问元素
- 无序:不可以使用下标访问元素
- 可变:可以被修改
- 不可变:不可以被修改
- 有序:可以使用下标(索引)访问元素
数值运算时,如果不用类型的数字进行运算(比如 int 和 float),则运算结果类型为精度较高的那个类型
字符串

列表
- append(obj)
- insert(index, obj)
- extend(iter) : 将可迭代对象的每个元素逐个插入列表的尾部
- pop([index])
- remove(obj)
- sort()
- reverse()
- count(obj) : 返回obj在count中出现的次数
字典
- 字典推导式
dict2 = {value: key for key, value in dict1.items()}
-
创建字典的方式
- dict(key=value,)
- dict([(key, value),])
-
常用操作
- get(key, default=None)
- items()
- 返回 dict_items([(key1,value1),(key2,value2),...])
- keys()
- values()
- dict[key] = value
- update(dict1)
- pop(key)
- popitem()
- 随机删除并返回一个键值对
- clear() 清空字典
Set(集合)
- 创建方式
- set()
- 逻辑运算
- set1 & set2
- 对称差集 set1 ^ set2 : 两个集合中不同的元素(与并集定义刚好相反)
- set1 | set2
- set1 - set2 : set1 减去存在于set2中的元素
- 常用操作
- add(obj)
- update(obj)
- remove(obj) : 删除元素,不存在时会抛出异常
- discart(obj) : 删除元素,不存在时不会抛出异常
- clear() : 清空集合
- pop() : 随机删除并返回一个元素
浅拷贝和深拷贝
- copy()
- deepcopy()
运算符
- 算数运算符
- 比较: ==, !=, <, >, <=, >=
- 赋值: =, +=, -=, *=, **=, //=
- 位运算: &, |, ^
- 逻辑运算: and, or, not
- 成员运算符: in, not in
- 身份运算符: is, is not
控制流
- 判断
- 循环
- for condition: ... else: ... (else 最多只执行一次)
- while condition: ... else: ... (else 最多只执行一次)
- 遇到break时,else不会执行
函数与面向对象
返回值
函数可以有多个返回值,默认以元组形式返回
参数
- 必备参数
- 关键字参数
- 调用时使用等号赋值的形式传入
- 默认参数
- 不定长参数
- 有时可能需要一个函数能处理比当初声明时更多的参数,这些参数叫做不定长参数,声明时不会命名
- *args:存放所有未命名的变量参数,args为元组
- **kwargs: 存放命名参数,形如 key=value的参数,kwargs为字典
- 参数位置:必备参数,关键字参数,默认参数,不定长参数
匿名函数
- lambda
面向对象
把数据和对数据的操作放在一起。把计算机程序视为一组对象的集合,每个对象都可以接受其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象间传递
- 优势
- 提高代码复用性
- 灵活,提高可维护性
- 提高可扩展性
- 提高开发效率
标准库
- sys:负责与python解释器的交互,提供一些列函数和变量,用于操纵python运行时的环境
- os:负责程序与操作系统的交互,提供了访问操作系统底层的接口
- time
- sleep
- strftime(format[, t])
- time()
- localtime([secs])
IO操作
open(filename, mode, encoding)
encoding 默认为utf8
- 上下文管理器
- 上下文管理协议包含 enter 和 exit 方法,分别实现预处理和清理功能
- with open(...) as file: ....
模块和异常
- ZeroDivisionError: 除零操作
- OSError: 操作系统错误
- SyntaxError Python: 语法错误
- IndentationError: 缩进错误
- StopIteration: 迭代器没有更多值
自定义异常:继承自Error 或 Exception 类,使用 raise 语句引发这个异常
Python高级
数据库编程
- python标准数据库接口为 Python DB-API,为开发人员提供了数据库应用编程接口
操作 MySQL
import pymysql
# 参数依次为 ip,用户名,密码,数据库名,编码格式
db = pymysql.connect('localhost', 'root', 'mysql', 'my_database', charset='utf8')
# 使用cursor方法获取操作游标
cursor = db.cursor()
# 使用execute方法执行SQL
cursor.execute(sql)
# 关闭数据库连接
db.close()
多任务
操作系统可以在同一时间运行多个程序
- 并发:多个任务交替执行
- 并行:多个任务一起执行
多任务的实现方式:线程、进程、协成
线程
操作系统的最小执行单元
- 一个进程内的所有线程共享全局变量
- 因为全局解释器锁的问题,Python中的多线程是一个伪多线程
- GIL(Global Interpreter Lock, 全局解释器锁):Python中为了解决多线程之间的数据完整性和状态同步问题准备的锁
线程同步
多个线程按先后顺序执行,需要引入锁的机制
- 如果多个线程同时对同一个全局变量操作,会出现资源竞争问题,导致数据错误,这样需要进行线程同步
- 互斥锁:线程执行时对资源加互斥锁,使其他线程无法操作资源,直到该线程释放资源后,将锁打开
- 死锁:多个线程共享资源时,几个线程分别占有一部分资源并且等待其他线程的资源时,会造成死锁
进程
操作系统的最小资源分配单元
- 一个程序至少拥有一个进程,一个进程至少拥有一个线程
- 同一个进程中的线程数据共享
- 每个进程拥有独立的内存空间
魔法方法
Python中存在了一些可以给你的类添加特殊功能的方法,这些方法以双下划线开始和结尾,称为魔法方法
- init: 初始化对象时,定义这个对象的初始属性
- str: 输出对象时打印的值,强调可读性
- repr: 输出对象时打印的值,强调标准性
- getattr: 获取属性,仅当属性没有找到时调用
- setattr: 设置属性
- iter: 创建迭代器
高阶函数
- zip:将可迭代对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
- map(function, iterable, ...)
- filter(function, iterable)
- sorted(iterable[, cmp[, key[, reverse]]])
- 对iterable 进行排序
- key为排序的元素,可以是lambda表达式
- cmp为排序的函数
- reverse 指定是否降序排序
正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
re 模块使 Python 语言拥有全部的正则表达式功能。
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
- compile(pattern, flag=0)
- res=re.compile(".*"); res.search("abcd").group()
- match(pattern, string, flag=0) # abcd
- 从字符串开头匹配
- res=re.match(".*", "abcdxxxx") # abcdxxxx
- search(pattern, string, flag=0)
- 匹配整个字符串,直到找到一个匹配
- res.search('.*', 'xxxabcdxxxx') # xxxabcdxxxx
- findall(pattern, string, flag=0)
- 查找所有匹配
- re.findall('a', 'abcdaafba') #['a','a','a','a']
- split(pattern, string, max=0)
- 根据正则模式把字符串分割为列表
- re.split(',', 'a,b,c') # ['a','b','c']
- sub(pattern, repl, string ,count=0)
- 使用repl替换正则表达式出现在string中的位置
- re.sub(',','-','a,b,c') # a-b-c
- group(num=0): 返回整个匹配对象,或者返回编号为num的特定子组
- groups(default=None): 返回一个包含所有子组的元组
- groupdict(default=None)
- re.search('(?P
\w\w\w)-(?P \d\d\d)', 'abc-123').groupdict() #
- re.search('(?P
- re.i, re.IGNORECASE: 不区分大小写
- re.search('abc', 'abcxxx', re.i)
生成器、迭代器和装饰器
迭代器
一个可以 记住遍历位置的对象
- 迭代器对象从集合的第一个元素开始访问,直到所有元素被访问完结束,迭代器只能向前不能后退
- 可迭代对象:任意对象实现了可以返回一个迭代器的 iter 方法,或者定义了可以支持下标索引的 getitem 方法,那么它就是一个可迭代对象
- isinstance(obj, Iterable) ,根据返回值来判断对象是否为可迭代对象
- 迭代器两个基本方法
- next():输出迭代器的下一个元素(当数据全部迭代完,再次使用会抛出 StopIteration 异常)
- iter(): 创建迭代器对象
生成器
一类特殊迭代器,每次迭代时可以返回一个或多个值,可以记录当前状态
- 创建方式
- 使用yield关键字
- 使用生成器表达式(推导式)
- 当程序执行到生成器语句时,程序会暂停,等待使用next或send方法唤醒
- 使用send方法唤醒时可以传入一个数据
闭包
由函数及其相关引用环境组合而成的实体
- 从形式上看,Python的闭包是如果在一个内部函数里,对在外部作用域(非全局作用域)的变量进行引用,那么内部函数就被认为是闭包
- 闭包中不能修改外部作用域的局部变量
def func():
n = 1
def inner():
return n+1
return inner
装饰器
本质上是一个Python函数,它可以在不改变代码结构的情况下给代码添加新的功能
- 工作过程:将被装饰器装饰的函数当做参数传递给装饰器函数(名称相同的函数),并返回给被装饰的函数
- 装饰器是闭包的一种应用
@decorater
def func():
pass
拓展
JSON
JavaScript Object Notation,一种轻量级数据交换格式,便于阅读和编写
- json.dumps(): obj -> json string
- json.loads(): json string -> obj
元类
Python中类本身是一种对象,创建类这种对象的类被称为元类
- 使用type创建元类
- type(classname, 父类的元组(针对继承;可为空), 包含属性的字典(名称和值))
- type 就是python用来创建所有类的元类
- 元类的主要用途是创建API
- python中一切接对象,他们要么是类的实例,要么是元类的实例,除了type(type实际上是它自己的元类)
垃圾回收机制
python的内存管理由解释器负责
- 以“引用计数”(reference counting)来跟踪和回收垃圾
- 在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题
- 通过“分代回收”(generation collection) 以空间换取时间来进一步提高垃圾回收效率

浙公网安备 33010602011771号