Python基础学习(二)

字符串

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.findstring.index(类似于Perl的index,返回指定str的索引)
  • string.joinstring.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转载请注明出处