Python 学习笔记-1
- 写在最前面,因为组内小伙伴要走,生信团队由原来的7个人,慢慢的变的只有我一个人了,需要紧急突击下python,因为有python的流程要交接维护
python 基本情况
- 代码块的结构使用缩进进行区分,这下倒是不用担心忘记末尾的结束标志“;”了;但是引入了一个小问题,更改复杂代码时,结构调整的问题
- 面向对象编程,强调代码的复用行和跨脚本的调用
- 丰富的资源库是个保障
- 现在处于上升期,比较活跃,比如我想进行邮件的解析,python找到的起码是18,19年的分享,但是perl的都是08,10年的
- 跟perl和R一样,使用#进行注释,注释重要信息是很重要的代码编程习惯,有助于提高可读性和降低维护代码难度,增加团队协作的流畅性
python 基本数据类型
常量
- 不能改变,具备字面的意义
- 数值型
- 数值类型
2 # 整型 int 2.11 # 浮点型 float 2.3-4.5j # 复数 complex
- 数值类型转化
type(2) # 使用type可以返回其类型,该例中返回int float(2)# 前面直接加类型,可以进行可以转化的相互的转化,该例中返回2.0;float,int,str
- 数字运算
3+2 3-5 3*4 3/4 # 这里要说明一下,在python2中,两个整型数字相除,得到的是整数,python3中,得到的是浮点数,这一点python3中的做法,更合理,主要是跟perl中一至,哈哈
- 判断
3>4 ## False 3<=4 ## True 3==3 ## True 仅对刚开始接触编程的小伙伴提醒一下,几乎所以编程语言中相等的判断都是用双等号的,因为“=”一般用于赋值了
- 数值类型
- 字符串型
- 引号(单双引号的用法一致)之间的符号集,包括字母,数字,下划线,空格,制表符等
- 这里有一点,因为python中换行就代表新的语句,所以引入了三单引号和三双引号的换行不换新变量或者语句的语法,个人感觉这个好像md语法中的(```)表示代码块的一种用法
a = ''' sfdg dfg '''
- 运算操作
- 连接
a = "liubei " " is learning " "python " a = "liubei " + " is learning " + "python " # 上述结果相同,但是一般使用下面的方法,可读性更好,便于维护 # 因为连接时默认没有任何连接符号,所以需要显示的加入空格等你想使用的分割符号
- 分割
b=a.split(" ") print(b) # ['liubei', '', 'is', 'learning', 'python'] # 以空格为分隔符,将a分割为列表;当然根据实际需要分隔符可以是任意的字母数据及其他符号或组合
- 去除一些字母符号等
b=a.strip(' ') # 去除a任意两端的空格给到b变量;注意这里的a的值并不会因此发生改变,并且strip可以是字母,空格,下划线等,但是不能是空 c=a.lstrip(" ") # 去除a左端的空格,因为a左端没有空格,所以c与a实际是一致的 d=a.rstrip(" ") # 去除a右端的空格 ## 注意上述情况,不管多少个要去除的边际的东西,一次性全部去除完
- 替换
e=a.replace("i",'') # 将a中所有i替换掉,a本身并不会发上改变 f=a.replace("i","",2) # 将a中前两个i替换掉(如果a中不足2个i,全部替换),a本身并不会发上改变,
- 重复
l=a*3 # l由3个a重复而成,“ liubei is learning python liubei is learning python liubei is learning python”
- 切片或者说索引
a[2] # 下标为2的字符,因为python的计数从0开始编码,所以是第三个元素 a[2:8] # 获得2-8之间的元素,(如果最后一个数字超出元素下标的最大值,直接取到最后,并不会报错) a[2:6:3] # 添加了每隔个字符取一个 a[2:] # 取下标从2开始,之后所有的字符 a[::-1] # 相当于变量进行了发转,每一个字符都进行了转换,有点像reverse的结果
- 成员判断
"s" in a # True 判断是否在其中 "s" not in a # False 判断是否不在其中
- 字母的大小写转化
a.upper() # 返回全部字母大写的字符串 a.lower() # 返回全部字母小写的字符串 a.capitalize() # 返回首字母大写的字符串,并且这个首字母必须是第一个,如果之前有空格的化,会被认为不是首字母,所以不进行转化 a.center(200,"*") # 返回长度200的居中字符串,并且以*在前后进行空白补充
- 统计,判断
a.count("o") # 统计‘o’在a中出现的次数 a.find("o") # 返回第一次出现o的下标,否则返回-1 a.index("o") # 返回第一次出现o的下标,否则返回异常
- 连接
- 布尔值(真假)
- True:真:非0数字,非空列表,非空字典,非空字符串
- False:假:0,空列表,空字符串,空字典
- 数值型
变量
-
可以储存信息,同时可以对他们进行操作
-
命名规则:
- 标识符的第一个字符必须是字母表中的字母或者下划线
- 标识符的其他部分可以由字母,数字,下划线组成
- 区分大小写(即大小写字母差异的表示符被认为是两个变量)
- python中变量不需要提前申明,可以直接赋值
- 变量的使用受到结构的限制,在结构内部赋值的变量可能不能在结构外调用,这个后面详细讨论,这里强调下有这个事情
- 因为没有表示的其他固定用法,所以不能使用python内置的标识符进行赋值如:in,int等
- 所有编程语言规范里都会要求命名要能看懂其指代的含义,不要出现:a,b,c这种命名,虽然理论上没有问题,但是后续代码的查看,维护是个很大的问题呢,可读性也会很差,不利于交流合作
-
ngs_seq_quality = 20 ## 好的变量名称,明确可以看出是二代测序序列的质量 a = 20 ## 不好的变量命名,自己半个月后都不知道这个a是个什么鬼东东,更别说别人看的时候的心情
-
变量赋值:
a = 1 # 数字 a = 'string' # 字符串 a = [1,2,'s'] # 列表,即数组的概念 a = ['a':1,"d":2] # 字典,perl中称为hash,哈希 x=y=z=1 # 多重赋值,多个变量直接赋值为同一值,这个比perl的用法简单 x,y,z=1,2,3 # 多元赋值,太爱这个了,可以减少很多行看上去类似的 ## 变量赋值时自己首先要搞清楚数据类型,这个我现在其实还是有点晕的,准备五一劳动节好好学习,对于使用perl的孩子来说,习惯了自由洒脱的编码风格,不知道后续这个会遇到啥样的好玩的问题了 ## python中因为变量没有其他的标识符,所以,一旦标量,列表,哈希等使用了相同的单词组合作为变量名称,就会存在最后的覆盖前面的变量的问题,所以命名一定要慎重,并且要先构思好框架,再进行撰写
python基础数据结构
列表/数组
- 可以保存任意数字,字符等的有序排列的数组,能通过下标进行数据的索引
array1 = [1,2,3,"a"] # 定义并赋值
len(array1) # 获得列表的长度,即元素个数
array1.sort() # 列表排序
array1.reverse() # 列表反向
array1.append("b") # 列表末尾追加新元素
array1.remove(1) # 列表删除特定元素,只删除遇到的第一个,不删除后面的,并且如果没有该元素会报错,无返回值,数组直接进行的操作
"\t".join(array1) # 以tab键将列表连接,返回字符串
## 这里大部分的用法跟perl相似,sort,reverse,append,len,但是预留字和写法确实有差别
元祖
- 与列表相似,但是不能修改,一般是一些不允许修改的预留的会使用
- 适合严格纠错类的测试等的使用
字典
- 无序,键值对一一映射的关系,键是唯一的,值是可以相同的;这里可以想象成键是每个人的身份证号码,值是名字,身高等,键唯一,值可以相同;通过键可以查到每个数据,但是不能通过值,或者顺序调取
hash={"a":1,"b":2} # 进行一个新的字典的定义并赋值
hash["c"]=3 # 新添加一个键值对,如果键已经存在,会覆盖之前获得的值
del hash["a"] # 删除键为a的键值对
len(hash) # 获得字典的键值对的数量
hash.keys() # 获得字典的所有键值对的键,这里注意下,它返回的并不是一个标准的列表,所以这个实际使用的时候应该还是会有其他问题,需要转化的
hash.values() # 获得字典的所有键值对的值,重复的也会重复的输出
for k,v in hash.items(): # 这里k和v是hash里一一对应的键值对,可能更好理解,应用场景也更好写
for k in hash: # 这里k是hash里的键的遍历,跟perl中的几乎一摸一样,当年perl中hash是很值得骄傲的地方,多位hash,hash的数组,数组的hash非常好用
集合
- 无序的不重复的元素组成的,由这个性质决定了它很适合进行比较元素的比较,并且与字典的键与某些方面的一致性