第一章 程序设计与Python语言3 一、Python语言的基本语法 1. Python程序元素 (1) 缩进 · 1个TAB键或4个空格 · 表示代码的层次关系 · 是Python语言中表示程序框架的唯一手段 (2) 注释 · 开发者加入的说明信息, 不被执行 · 单行注释以#开头 · 多行注释以三引号(""")开始和结束 (3) 常量与变量 · 常量: o 程序执行过程中,值不发生改变的元素; o 程序中多次使用的值可作为常量,便于更改及维护。 · 变量: o 程序执行过程中,值发生改变或需要改变的元素。 (4) 命名 · 为程序元素关联一个名称,要保证唯一性 · Python标识符 o 在Python里,标识符由字母、数字、下划线组成;但不能以数字开头。 o 在Python中,所有标识符区分大小写 o 以下划线开头的标识符是有特殊意义的。以单下划线开头_foo的代表不能直接访问的类属性,需要通过类提供的接口进行访问,不能以from … import *而导入 o 以双下划线开头的__foo代表类的私有成员;以双下划线开头和结尾的__foo__代表Python里特殊方法专用的标识符,如,__init__()代表类的构造函数。 o 不能与保留字相同 #=============查看系统(Python 3.x)保留字============= # 导入模块 import keyword # keyword帮助文档 help(keyword) # Python 关键字列表 print(keyword.kwlist) keyword.kwlist # 判断字符串是否是 Python 关键字 keyword.iskeyword('and') keyword.iskeyword('has') 保留字:['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] (5) 表达式 · 程序中产生新数据值或执行操作的一行代码 · 运算符 o ** 指数 o // 相除取整(商) o % 取余 o != 不相等 (6) 输入 · input() #获得用户的输入并以字符串的形式保存 (7) 输出 · print() #输出信息 二、数据结构 1. 数值型 Python中常用的数值类型 (1) 整数类型,与数学中的整数概念一致;如:100,-250 (2) 浮点数类型,带有小数点及小数的数值;如:0.0,-3.14,3.4e-3(科学计数法) (3) 类型转换: · 整数→浮点数,float(4)→4.0 · 浮点数→整数,int(3.14)→3,只会保留整数部分 · 字符串→整数,int('3')→3 · 字符串→浮点数,float('3.14')→3.14 (4) 判断类型:type()函数 2. 字符串 (1) 文本在程序中通过字符串(string)类型表示 (2) 两个双引号或单引号括起来表示 (3) 索引/访问方式 · 正向索引:0,1,2,…… · 反向索引:……,-3,-2,-1;[:-3] #字符串不取后3位;[-3:] #取字符串后3位 · 区间索引 [A:B:C]:从位置A到B的部分字符串,不包含位置B,步长为C (4) 字符串分割:str.split() https://docs./3/library/stdtypes.html#str.split (5) 字符串格式化输出,使用{}占位:str.format() 如, '{}公斤,{}厘米'.format(70,175) 重复输出时可以使用数字标记顺序:'{0}公斤,{1}厘米,{0}公斤'.format(70,175) (6) 字符串乘以一个数字n,结果为由n个该字符串组成的字符串,即字符串的复制 (7) Python字符串操作 str.isnumeric() # 检测字符串是否只由数字组成 str.isalpha() # 检测字符串是否只由字母组成 str.islower() # 检测字符串中所有字母是否都为小写 str.isupper() # 检测字符串中所有字母是否都为大写 更多isxxx()方法参考:https://docs./3/library/stdtypes.html#string-methods (8) 代码示例 # ======字符串操作========# input_str = '性别 体重(Kg) 身高(Cm) 年龄' input_str.find(' ') # 字符串查找 input_str.split(' ') # 字符串分割 type(input_str.split(' ')) # 查看类型,为list类型(容器) input_str.split(' ')[1] # 字符串分割后,取第2个元素 # 字符串的格式化: {}占位;str.split() '{1},{0}'.format(70,100) # 对应位置输出100,70 # ============= 索引练习 ============= s = 'Python' print(s) print(s[2]) # 正向位置索引 print(s[-4]) # 反向位置索引 print(s[2:4]) # 正向区间索引,前闭后开 print(s[:3]) print(s[0:3]) print(s[-3:]) # 反向区间索引,获取后3位 print(s[:-3]) # 去除最后3个字符 # 列表list的所引 # var[A:B:C] # A索引初始位置,B索引索引结束为止,C:步长;前闭后开 n = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(n[2:8:3]) a="Hi" a*2 a*7 # ===== 字符串操作练习 ===== password = 'abc123def' len(password) # 字符串长度 password.isnumeric() # 字符串是否只含有数字 password.isalpha() # 字符串是否只含有字母 password.islower() # 字符串是否均为小写 password.isupper() #字符串是否均为大写 for X in password: print(X) 3. 列表 (1) 列表(list)是有序的元素集合 (2) 可通过索引访问单个元素,如l[2],l[-1] (3) 可通过区间索引访问子列表内容,如l[2:5],l[-3:],依然是前闭后开 (4) 列表中每个元素类型可以不同 注:列表排序 · list.sort(func) # func指定了排序的方法 · func可以通过匿名函数lambda实现 # ======列表操作练习======= l1 = [1, 3, 5, 7, 9] l1 l2 = [2, 4, 6.5, 8, 'abc'] print(l2) l1 + l2 # 连接两个list中的内容 l1 * 3 # 将列表l1重复3次 len(l1) # 返回列表长度 1 in l1 # 判断元素1时是否在列表l1中,返回逻辑值 l1.append(11) # 在列表l1后追加元素11 l1 l1 = [1, 3, 7, 5, 9, 9] l1.sort() # list中元素排序 l1 l1.reverse() # list中元素逆序 l1 l1.index(5) # 返回list中元素5的位置 l1.insert(2, 10) # 在索引为2的位置插入元素10 l1.count(9) # 返回list中元素9的个数 l1.remove(10) #删除元素10 l1.pop(2) # 取出列表中i元素所在的位置,并将其删除 l1 4. 元组(tuple) (1) 元组是特殊的序列类型 (2) 一旦被创建就不能修改,使代码更安全 (3) 使用逗号和圆括号来表示,如,(1, "green", "True"),(1, 2, 3) (4) 访问方式和列表相同 (5) 一般用于表达固定数据项、函数多返回值等情况 (6) 特点: o 元组中的元素可以是不同类型的 o 元组中各元素存在先后关系,可通过索引访问元组中的元素 (7) 元组与列表 o 元组是不可变的,列表是可变的 o 元组通常由不同的数据组成,列表通常是由相同类型的数据组成 o 元组表示的是结构,列表表示的是顺序 # # ======数据容器:元组(tuple) 练习====== # # 元组中的元素不能进行增删改 # # 元组和列表都能包含不同的数据类型,但是一般列表放同一类型的数据元素 l=[1, 2, 3, 4, 5] type(l) l[1] = 5 # 修改元素 del l[1] # 删除第二个元素 l.append(6) # 末尾追加一个元素 t=(1, 2, 3, 4, 5) type(t) t[1]=5 a=() # 空元组 type(a) a=(123) # 返回int型 type(a) a=(1,"ni",'TRUE') a b=[1,"ni",'TRUE'] b (1) zip()函数 zip()函数用于将对应的元素打包成一个个元组 注意:元组中的元素是不可修改的,若要修改需要转换成字典或其他数据容器类型,如dict(zip(l1,l2)) 5. 集合(set) (1) Python中的集合(set)类型同数学中的集合概念一致,即包含0或多个数据项的无序组合 (2) 集合中的元素不可重复 (3) 集合是无序组合,没有索引和位置的概念 (4) set()函数用于集合的生成,返回结果是一个无重复且排序任意的集合 (5) 集合通常用于表示成员间的关系、元素去重等 (6) 集合操作 # # ======数据容器:集合(set) 练习====== l = [1, 2, 3, 4, 5, 3, 5] # 列表 l t = set(l) t s = {1, 3, 5, 7, 9} s - t # 返回差集 s & t # 返回交集 s | t # 返回并集 s ^ t # 返回并集,去掉交集 6. 字典(dict) (1) 字典类型(dict)是“键-值”数据项的组合,每个元素是一个键值对 · 如:身份证号(键)-个人信息(值) (2) 字典类型数据通过映射查找数据项 · 映射:通过任意键查找集合中的值的过程 (3) 字典类型以键为索引,一个键对应于一个值 (4) 字典类型的数据是无序的 (5) 基本操作 a) d[key] = value # 增加一项 b) d[key] # 访问 c) del d[key] # 删除某项 d) key in d # 判断key是否在字典里 (6) 字典的遍历 a) 遍历所有的key for key in d.keys(): print(key) b) 遍历所有的value for value in d.values() print(value) c) 遍历所有的数据项 for item in d.items(): print(item) # ======数据容器:字典(key - value) 练习====== # 字典间的值是无序的 d = dict() # 创建空字典 d['eggs'] = 2.59 # 添加数据项,键值对 d['milk'] = 3.19 d['cheese'] = 4.8 d['eggs'] = 3.59 # 修改数据项,键值对 del d['cheese'] # 删除数据项 'eggs' in d # 查看数据项是否在字典中 d.keys() # 遍历keys d.values() # 遍历values d.items() # 变量键值对 list(d.values()) list(d.values())[1] 7. 补充:解析式 (1) 列表 (2) 字典 三. Python的语句结构 1. 分支结构 if (1) 控制程序的语句 (2) 根据判断条件选择程序的执行路径 (3) 使用方法 if <条件1>: <语句块> elif <条件2>: <语句块> … else: <语句块N> (4) pass语句 1) pass语句不会执行任何操作 2) pass语句可作为占位符 3) pass语句可以用来创建占位程序 2. 循环语句 (1) while循环 1) 控制程序的语句 2) 根据判断条件确定一段程序是否再次执行一次或者多次 3) 使用方法 while(<条件1>): <语句块1> <语句块2> 4) 当条件为真(TRUE)时,执行语句块1;为假(FASLE)时,退出循环。 (2) for循环 1) 使用for语句可以循环遍历整个序列的内容 for <x> in <list1>: <body> 2) 循环变量x在每次循环时,被赋值成对应的元素内容 3) 与while循环的区别 a) for循环次数固定,即遍历的序列长度 b) while为无限循环 4) range(n) 返回一个可迭代的对象 a) list(range(n)) 将迭代类型转换为列表类型 b) range(n) # 返回从0到n-1的值 c) range(1,n) # 返回1到n-1的值 5) 循环的终止
# ===== 终止循环操作练习 ===== for i in range(100): if i % 2 == 0: break # 终止整个循环,之后所有 的语句都不执行 print(i) # 无输出 for i in range(100): if i % 2 == 0: continue # 终止本次循环,继续下一次循环 print(i) # 输出奇数 (3) enumerate() 函数 enumerate()函数用于将可遍历的组合转换为一个序列索引 一般用于for循环中,同时列出元素和元素的索引号 四、Python函数 1. 函数 · 将特定功能代码编写在一个函数里 · 便于阅读和复用 · 对一组表达特定功能表达式的封装 · 使程序模块化 · Python内置函数 input(), print(), eval() (1) 函数的定义 def <函数名>(<参数列表>): <函数体> return <返回值列表> (2) 函数的调用过程 · 调用程序在调用函数处暂停执行 · 调用时将参数(实参)赋值给函数的参数(形参) · 执行函数体 · 返回函数结果,回到调用处继续执行 2. 匿名函数lambda · 特殊函数 - 匿名函数 · 使用方法: <函数名> = lambda <形参列表>:<表达式> · 用于简单的、能够在一行内表示的函数,计算结果为返回值 3. 函数的参数传递 (1) 函数通过参数与调用程序传递信息 (2) 变量的作用范围 a) 局部,函数内的变量作用范围只在函数内 b) 全局,函数外的变量,在所有函数中都能使用,global (3) 函数的形参只接受实参的值,给形参赋值并不影响实参 # =====变量作用范围===== # 示例1:局部变量 def num_value(num1): num1 = 2 num1 = 1 num_value(num1) print(num1) # 1 # 示例2:全局变量 def num_value(): global num1 num1 = 2 num1 = 1 num_value() print(num1) # 2 五. 面向对象编程 1. 基本介绍 (1) 面向过程(Procedure Oriented Programming,POP):以程序执行过程为设计流程的编程思想 (2) 面向对象(Object Oriented Programming,OOP):以事物为中心的编程思想 (3) 什么是对象(Object)? a) 现实世界中的对象:① 属性;②行为 (4) 对象的例子: a) 波斯猫 属性:品种、颜色、大小;行为:叫、捉老鼠 b) 吉普车 属性:类型、用途;行为:发动、停车 (5) 类(class):某种类型集合的描述 (6) 属性:类本身的一些特性 (7) 方法:类所能实现的行为 (8) 类的定义: class ClassName: __init__(self) # 构造函数:初始化对象的各属性 # self代表类的实例 # __init__(self)中self参数,不需要开发者传递,python解释器会自动把当前对象引用传递进去 2. 面向对象的特点 (1) 封装 · 将数据及相关操作打包在一起 · 支持代码复用 (2) 继承 · 子类(subclass)借用父类(superclass)的行为 · 避免重复操作,提升代码复用程度 · 定义class ClassName(SuperClassName) (3) 多态 · 在不同情况下用一个函数名启用不同方法 · 灵活性 六. 异常处理机制 引入异常处理机制可以用来解决程序运行时的错误 语法: 七、 文件 (1) 文件的基础 1) 文件:存储在外部介质(如:硬盘)上的数据或信息的集合 2) 文本文件:一般指只有字符编码存储的文件,能够被简单的文本编辑器直接读取 3) 编码:信息从一种形式转换成另一种形式的过程 4) 常用的编码:ASCII、Unicode、UTF-8等 5) 多行文本,用 表示换行 (2) 文件的操作 步骤IPO:打开文件→操作文件(读写等)→关闭文件 1) 打开文件:建立文件与程序的关联 open(filename,mode) # filename:文件名(包括路径);mode:打开模式 2) 操作文件:写入、读取等 · 写入操作:从计算机内存向文件写入数据
· 读取操作:从文件中读取数据到计算机内存中 o read() # 返回值为包含整个文件内容的一个字符串 o readline() # 返回值为文件下一行内容的字符串 o readlines() # 返回值为整个文件内容的列表,每项是以换行符为结尾的一行字符串 # 1. read() content = f.read() # 文本整体当成字符串 f.close() print(content) # 2. readline() line = f.readline() # 每次只读1行数据 print(line) # 3. readlines() lines = f.readlines() # 读取文件的所有行存入列表中,每一行是一个元素 print(lines) o 文件的遍历 # 按行输出1: for line in f.readlines(): print('read:{}'.format(line)) # 处理一行数据 f.close() # 按行输出2: for line in f: print('read:{}'.format(line)) f.close() 3) 关闭文件:终止程序与文件的关联 close() 4) 使用with语句操作文件对象 with open('file_name') as somefile: for line in somefile: print(line) 使用with语句,不管在处理文件过程是否发生异常,都能保证with语句执行完毕后关闭文件。不需要close()语句。 八、库/模块 调用:① 库.函数();② 对象.属性 (1). keyword库 #=============查看系统(Python 3.x)保留字============= # 导入模块 import keyword # keyword帮助文档 help(keyword) # Python 关键字列表 print(keyword.kwlist) keyword.kwlist # 判断字符串是否是 Python 关键字 keyword.iskeyword('and') keyword.iskeyword('has') (2). math库 https://docs./3/library/math.html # ====Python库操作练习===== import math math.fsum(l1) math.pi math.floor(2.2) (3). datetime库 1) 处理时间的标准函数库datetime 2) datetime.now() # 获取当前日期和时间 3) 字符串→datetime:datetime.strptime() # 解析parse时间字符串 4) datetime→字符串:datetime.strftime() # 格式化format为字符串显示 a) 日期时间格式参考:https://docs./3/library/datetime.html#strftime-strptime-behavior 5) isocalender():返回年,周数,及周几 a) 更多操作参考:https://docs./3/library/datetime.html#module-datetime # ======时间函数模块======= import datetime now = datetime.datetime.now() # 模块.函数() now type(datetime.datetime.now()) now.day # 对象.元素 # strptime 解析时间字符串为日期类型parse # Y 大写的为4位格式,y 小写的为2位格式 datetime.datetime.strptime('2019/07/05',format('%Y/%m/%d')) datetime.datetime.strptime('19-07-05',format('%y-%m-%d')) datetime.datetime.strptime('2019-07-05',format('%Y-%m-%d')) now.isocalendar() # 输出年份和周数 (2019, 29, 2),2019年第29周的周二 # strftime 将时间类型类型转换为字符串类型format datetime.datetime.strftime(now, '%d/%m/%Y') (4). random模块 random模块用于生成随机数 常用函数 更多random模块的方法参考:https://docs./3/library/random.html # ======随机数模块练习======== import random random.random() # 生成一个[0,1)间的随机浮点数 random.uniform(1, 10) # 生成一个[a,b]间的随机浮点数 random.randint(1, 10) # 生成一个[a,b]间的随机整数 l = list(range(10)) # 生成一个[0,10)的列表 random.choice(l) # 从列表l中随机返回一个元素 random.shuffle(l) # 将列表中的元素随机打乱 l random.sample(l, 4) # 从指定列表中随机获取4个元素 random.sample(list(range(1, 7)), 2) (5). matplotlib模块 matplotlib是一个数据可视化函数库 matplotlib的子模块pyplot提供了了2D图表制作的基本函数 例子:https:///gallery.html 1) matplotlib绘制散点图: import matplotlib.pyplot as plt # x,y分别是x坐标和y坐标的列表 plt.scatter(x,y) plt.show() 2) matplotlib绘制直方图 import matplotlib.pyplot as plt # x,y分别是x坐标和y坐标的列表 plt. hist(data, bins) # data:数据列表;bins:分组边界 plt.xticks() # 设置x坐标的坐标点位置及标签 plt.title() # 设置绘图标题 plt.xlabel(),plt.ylabel() # 设置坐标轴的标签 (6). NumPy模块 1) NumPy(Numeric Python):用Python实现的科学计算库 包括: · 强大的N维数组对象 · 成熟的科学计算库 · 实用的线性代数、随机数生成函数等 2) NumPy的操作对象是多维数组ndarray · ndarray.shape数组的维度 3) 创建数组:np.array(<list>), np.arange() 4) 改变数组形状reshape() 5) NumPy创建随机数组 · np.random.randint(a, b, size) # 创建[a,b)间形状为size的数组 例如, 6) NumPy基本运算 以数组为对象进行基本运算,即向量化操作 例如, · np.histogram() # 输出直方图的统计结果 (7). JSON模块 1) JSON格式 · JSON(JavaScript Object Notation)是一种轻量级数据交换格式 · 可以对复杂数据进行表达和存储,易于阅读和理解 · 规则: ① 数据保存在键值对中 ② 键值对之间由逗号分隔 ③ 花括号(字典)用于保存键值对数据组成的对象 ④ 方括号(列表)用于保存键值对数据组成的数组 · 采用对象、数组方式组织起来的键值对可以表示任何结构的数据 · json格式是互联网上主要使用的复杂数据格式之一 2) JSON库 · JSON库是处理JSON格式的Python标准库 · 两个过程: o 编码(encoding),将Python数据类型转换成JSON格式的过程 o 解码(decoding),从JSON格式中解析数据对应到Python数据类型的过程 (8). CSV模块 1) CSV格式 · csv(Comma-Separated Values) 是一种通用的、相对简单的文件格式 · 在商业和科学领域上广泛使用 · 规则 ① 以行为单位 ② 每行表示一条记录 ③ 以英文逗号分隔每列数据(如果数据为空,逗号也要保留) ④ 列名通常放置在文件第一行 2) CSV库 CSV文件读取 import csv csv.writerow(list) #将列表中的元素写入文件的一行中 (9). os模块 os模块提供了与系统、目录操作相关的功能,不受平台的限制 # ======os模块中的join()方法练习====== import os l = [1, 2, 3, 4, 5] l l = ['1', '2', '3', '4', '5'] l '+'.join(l) eval('+'.join(l)) (9). requests模块 · requests模块是一个简洁且简单的处理HTTP请求的工具 · 支持非常丰富的链接访问功能,包括URL获取,HTTP会话,Cookie记录等 · requests网页请求 · requests对象属性 更多方法参考:https://2./en/master/ (10). BeautifulSoup模块 · 结构化解析 · DOM(Document Object Model),树形结构 2) BeautifulSoup解析网页 a) BeautifulSoup用于解析HTML或XML b) 安装 pip install beautifulsoup4 c) 导入 from bs4 import BeautifulSoup d) 使用步骤 · 创建BeautifulSoup对象 bs=BeautifulSoup(url, html_parser, # 指定解析器 encoding # 指定编码格式(确保和网页编码格式一致) ) · 查询节点 o find #找到第一个满足条件的节点 o find_all,找到所有满足条件的节点 例:<a href='a.html' class='a_link'>next page</a> 可按节点类型、属性或者内容访问 ① 按类型查找节点 bs.find_all('a') ② 按属性查找节点 bs.find_all('a',href='a.html') bs.find_all('a',href='a.html',string='next page') bs.find_all('a',class_='a_link') #注意:是class_ 或者:bs.find_all('a',{'class':'a_link'}) (11). Pandas模块 1) 什么是Pandas · Pandas是一个强大的分析结构化数据的工具集 · 基础是Numpy,提供了高性能矩阵的运算 · 应用:数据挖掘、数据分析 o 如,学生成绩分析、股票数据分析等 · 提供数据清洗功能 2) Pandas的数据结构 · Series:类似一维数组的对象 o 通过list构建Series:ser_obj = pd.Series(range(1,10)) o 由数据和索引组成:① 索引在左,数据在右;② 索引时自动创建的 o 获取数据和索引:ser_obj.index, ser_obj.values o 预览数据:ser_obj.head(n), ser_obj.tail(n) o 通过索引获取数据:ser_obj[idx] o 索引与数据的对应关系仍保持在数组运算的结果中 o 通过dict构建Series o name属性:ser_obj.name, ser_obj.index.name · DataFrame:类似多维数组/表格数据(如,excel和R中的data.frame) o 每列数据可以是不同的类型 o 索引包括列索引和行索引 o 通过ndarray构建DataFrame o 通过列索引获取列数据(Series类型):df_obj[col_idx]或df_obj.col_idx o 增加列数据,类似dict添加key-value:df_obj[new_col_idx]=data o 删除列:del df_obj[col_idx] 3) Pandas的数据操作 · DataFrame索引操作 o 列索引:df_obj['label'] o 不连续索引:df_obj[['label1','label2']] · 排序 o sort_index,索引排序:对DataFrame操作时注意轴方向 o 按值排序:sort_value(by='label') 4) Pandas统计计算和描述 · 常用的统计计算 o sum, mean, max, min…… o axis=0按列统计,axis=1按行统计 o skipna # 排除缺失值,默认为True o idmax, idmin, cumsum · 统计描述 o describe #产生多个统计数据 5) Pandas数据清洗 · 处理缺失数据 o dropna() #丢弃缺失数据 o fillna() #填充缺失数据 · 数据过滤 o df[filter_condition] #依据filter_condition对数据进行过滤 6) Pandas数据可视化 · Pandas提供了内建的绘图功能(基于matplotlib) o plot(kind,x,y,title,figsize) # x,y横纵坐标对应的数据列;title图像名称;figsize图像尺寸 · 保存图片:plt.savefig() · 更多例子参考:https://pandas./pandas-docs/stable/user_guide/visualization.html 九、总结 |
|
来自: hucy_Bioinfo > 《Python》