字符串
Python将字符串、列表和元组都当做序列,因此可对序列操作的函数都适用于以上三者,因此在Perl中常用的索引、切片等操作都适用于字符串,这相比Perl就方便多了,如:
"Hello"[1]
如果切片始于开头,则可以省略第一个索引(下面的结果是"Hel",是因为Python的索引是半闭环,这点跟Perl不一样,容易搞混):
"Hello"[:3]
可以用下述方式来复制序列(Python中简单的变量赋值是不等于变量复制的)
a = "Hello"
b = a[:]
可以在切片中加上第三个参数即步长
"Hello"[1:4:2]
还可以通过序列乘法来创建指定长度的空列表(一般的空列表都是用[]
直接创建的)
seq = [None] * 10
之前说有运算符in
,其也可以在字符串中使用,判断某个字符是否在字符串中(但从这点来看,有时候处理字符串时确实要比Perl方便)
'H' in 'Hello'
对于字符串操作函数方便,本来我觉得肯定还是R方便,毕竟有个神奇的R包-stringr包,但是Python原来也有个string模块,而且现在还有些内建函数支持字符串的操作,如:
string.upper()
和string.lower()
函数(大小写转化)string.count
(返回指定str出现次数)string.find
和string.index
(类似于Perl的index,返回指定str的索引)string.join
和string.split
(类似于Perl的split和join操作符)string.replace
(替换字符串)string.startswith
(检查是否以str字符串开头,这个可以省一个正则)string.translate
(类似于Perl的正则转换,但是使用似乎有点繁琐)
列表
Python里创建变量时不需要指定类型,因此创建列表只要list = []
即可,整体上与Perl的数组同一个用法,不外乎索引、切片以增加/删除列表元素等方法
主要几个常用函数:
- 字符串/元组转化为列表可以用
list()
函数 - 列表长度
len()
函数 - 取最大/最小数:
max()
和min()
删除元素:
a = list("Hello")
del a[0:2]
列表方法:
- list.append,将元素添加到末尾
list.append("Hello")
,类似于Perl的push,很常用 - list.extend,将多个元素(列表)附件到末尾
list.extend([1,2,3])
- list.index,查找特定值第一次出现的索引
list.index("Hello")
- list.insert,将元素插入列表
list.insert(1, "Hello")
,类似于Perl的splice - list.pop,从列表中取出一个元素
x = list.pop(0)
,默认是最后一个元素,也可以指定元素位置,相比Perl的pop方法,似乎更加方便了点 - list.count,统计元素出现次数
list.count("Hello")
- list.remove,删除特定值(第一个出现的)
list.remove("Hello")
- list.sort/reverse,前者排序(直接改变原列表),reverse参数TRUE表示降序,参数cmp可指定用于排序的函数;后者则是反向序列
- list.copy,复制列表(而不是单纯的列表赋值)
- list.clear,清空列表
还有一个与列表类似的是元组,两者的不同之处只在于后者不能被修改!元组以()
创建,或者tuple("Hello")
,因此索引、切片都可对元组使用
除了上述简单创建列表/元组的方法外,还可以通过表达式(推导式)的方法从序列创建你想要的列表/元组,一般接在for/if语句,如下所示:
vec = [2, 4, 6]
[3*x for x in vec if x > 3]
然后如果要用上述方式创建嵌套列表的话:
[[x, x**2] for x in vec if x > 3]
对于嵌套数组的访问跟R的访问方式类似,比Perl要方便点,如matrix = [[1,2,3], [4,5,6]]
,访问第一个列表中的第一个元素,则matrix[0][0]
,历遍输出所有元素,则:
for i in matrix:
for j in i:
print(j)
del不仅可用于删除变量,还可以删除列表中的指定索引的元素,如del list[0:1]
;而删除整个列表则可以:del list[:]
字典
Python的字典相当于Perl的哈希,键与值之间以冒号分隔,{}
创建字典,或者用dict()
函数将键-值对序列转化为字典
items = [("a", "aaa"), ("b", "bbb")]
d = dict(items)
因此Perl中的哈希规则一般都适用于字典,有些地方Python的字典显得更加方便一点,如:
- len(d),返回键-值的数目
- d[k],返回键K对应的值(跟Perl的表达式不一样),d[k] = v,将键k的值为v,可当做更改,也可当做赋值
- del d[k],删除键k的键-值对
- k in d,查看k是否在d字典的键中(而Perl中一般用匿名哈希来判断键是否存在)
- str(d),输出可打印的字典字符串表
对于字典中没有的键也可以赋值(跟Perl一样,类似于匿名哈希);对于字典的键,可以用数字、字符串或者元组,但不能用列表(Perl中的话,一般只能用变量或者引用),但字典的值却无这个限制,如:
d["aa"] = ["a", "aa"]
字典也有像列表一样的一系列方法:
- d.items(),返回键-值的列表(叫字典视图的特殊类型?),主要用于迭代吧,类似于:
for key, value in d.items(): print(key, value)
- d.keys(),返回字典所有的键,返回的也是字典视图,也可以叫做迭代器?,主要还是用于for循环,
list(d.keys())
;对应的还有d.values()
,返回所有的键对应的值 - d.get(),返回指定键对应的值,如果键不存在则返回None(Perl的话直接访问键就行,键不存在的话也不会报错);类似的还有
d.setdefault()
,如果键不存在的话,可以指定键返回的值,相当于不返回None,当然如果键存在的话,就返回其对应的值 - d.fromkeys(),以输出的序列为键创建一个新的字典,键返回值都是None
- d.clear(),清空字典
- d.copy(),浅复制,创建一个副本字典;当副本修改时,原本无变化,当原本修改时,副本也随之变化;为了避免以上问题,可以选择copy模块的深复制函数
deepcopy(d)
在列表中所示的表达式也可以适用于字典(用冒号分割即可):
{x: x**2 for x in (2, 4, 6)}
函数
Python中的函数的定义方式跟Perl和R都大同小异
def func(x):
xxxxx
用Python中也是用return语句来提前或者选择性的返回表达式
对于函数可以设定参数以及默认参数
def func(x, y = "aaa"):
print(x)
print(y)
return
Python自定义函数中可以用*
来收集多余参数,并将参数放到元组中;而如果要收集默认参数,则用**
来收集,此时是将默认参数和其对应的值放到字典中(在Perl中一般是把参数放到数组中,然后将其引用作为参数放到函数中,而R则跟Python比较类似,也有默认参数)
对于上述的说的Perl导入参数的方法,其实Python也有类似操作,就是用*
来分配参数
def func(x, y):
return x + y
func(*(1,2))
Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问
这点跟Perl不太一样,Perl在if/for/while等里面声明的变量都是局部变量;对于R来说,在for/while中新建变量也是局部变量,但是if中的则还是全局变量的(如果我没记错的话。。。),如:
if True:
tmp = "1"
print(tmp)
如果函数中的变量想要修改作用于以外的变量时,需要用到global
(如果是嵌套作用域以外的变量,则用nonlocal
)
num = 1
def func():
global num
num = 123
print(num)
func()
参考网站:
Python 3 教程
本文出自于http://www.bioinfo-scrounger.com转载请注明出处