Python 学习笔记-1
写在最前面,因为组内小伙伴要走,生信团队由原来的7个人,慢慢的变的只有我一个人了,需要紧急突击下python,因为有python的流程要交接维护
python 基本情况
代码块的结构使用缩进进行区分,这下倒是不用担心忘记末尾的结束标志“;”了;但是引入了一个小问题,更改复杂代码时,结构调整的问题
面向对象编程,强调代码的复用行和跨脚本的调用
丰富的资源库是个保障
现在处于上升期,比较活跃,比如我想进行邮件的解析,python找到的起码是18,19年的分享,但是perl的都是08,10年的
跟perl和R一样,使用#进行注释,注释重要信息是很重要的代码编程习惯,有助于提高可读性和降低维护代码难度,增加团队协作的流畅性
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非常好用
集合
无序的不重复的元素组成的,由这个性质决定了它很适合进行比较元素的比较,并且与字典的键与某些方面的一致性