这几天在家无事,论文看不进去,就完整的看了看python,等开学应该会经常用到它。 下面是python的基础,学习过c++,java,或者JavaScript的同学不会花费长时间就可以熟悉python的基础知识。python即用即学比较好,有编程基础的同学不需要专门看视频学很长时间。下面是防止有时自己会一时想不起来,记的笔记。
python中的布尔运算
在Python中,布尔类型可以与其他数据类型做 and、or和not运算,请看下面的代码:
a = True
print a and 'a=T' or 'a=F'
计算结果不是布尔类型,而是字符串 'a=T',这是为什么呢?
因为Python把0
、空字符串''
和None
看成 False,其他数值和非空字符串都看成 True,所以:
举例,
a = 'python'
print 'hello,', a or 'world'
b = ''
print 'hello,', b or 'world'
运行结果是:
Python创建list
Python内置的一种数据类型是列表:list
。list是一种有序的集合,可以随时添加和删除其中的元素。
例如:
classmates = ['Michael', 'Bob', 'Tracy']
由于Python是动态语言,所以list中包含的元素并不要求都必须是同一种数据类型,我们完全可以在list中包含各种数据:
例如: L = ['Michael', 100, True]
一个元素也没有的list,就是空list。 例如 : empty_list = []
对list的访问,添加新元素,删除,替换
- 索引访问list:
需要特别注意的是,索引从 0 开始,也就是说,第一个元素的索引是0,第二个元素的索引是1,以此类推。
>>> print L[0]
Adam
倒序访问list:
Bart同学是最后一名,俗称倒数第一,所以,我们可以用 -1 这个索引来表示最后一个元素:
>>> print L[-1]
Bart
类似的,倒数第二用 -2 表示,倒数第三用 -3 表示,倒数第四用 -4 表示:
- list添加新元素:
方法1:用 list 的 append()
方法:
>>> L.append('Paul')
>>> print L
['Adam', 'Lisa', 'Bart', 'Paul']
但是:append()总是把新的元素添加到 list 的尾部。
方法2:用list的
insert()方法,它接受两个参数,第一个参数是索引号,第二个参数是待添加的新元素:
>>> L.insert(0, 'Paul')
>>> print L
['Paul', 'Adam', 'Lisa', 'Bart']
insert()方法可以指定新元素插入指定位置上。
L.insert(0, 'Paul') 的意思是,'Paul'将被添加到索引为 0 的位置上(也就是第一个),而原来索引为 0 的Adam同学,以及后面的所有同学,都自动向后移动一位。
- list删除元素
利用list的pop()
方法删除元素:
pop()方法总是删掉list的最后一个元素,并且它还返回这个元素。
pop(index):表示将索引为index位置上的元素删除
L = ['Adam', 'Lisa', 'Paul', 'Bart']
L.pop() #'Bart'
print L # ['Adam', 'Lisa', 'Paul']
L.pop(1) #'Lisa'
print L #['Adam', 'Paul']
- list替换元素
将 L = ['Adam', 'Lisa', 'Bart'] 中的 'Bart' 替换为 'Paul'
L = ['Adam', 'Lisa', 'Bart']
L[2] = 'Paul' # 将索引2位置上的'Bart'替换为'Paul'
print L # L = ['Adam', 'Lisa', 'Paul']
对list中的某一个索引赋值,就可以直接用新的元素替换掉原来的元素,list包含的元素个数保持不变。
由于Bart还可以用 -1 做索引,因此,下面的代码也可以完成同样的替换工作:
L[-1] = 'Paul'
Python的dict
list和tuple可以用来表示顺序集合,比如班里学生的姓名,或者成绩:
['Adam', 'Lisa', 'Bart']
[95, 85, 59]
但是,要根据名字找到对应的成绩,用两个 list 表示就不方便。
如果把名字和分数关联起来,组成类似的查找表:
给定一个名字就可以查到该学生的分数。
d = {
'Adam': 95,
'Lisa': 85,
'Bart': 59
}
我们把名字称为key,对应的成绩称为value,dict就是通过 key来查找 value。
花括号 {} 表示这是一个dict,然后按照 key: value, 写出来即可。最后一个 key: value 的逗号可以省略。
由于dict也是集合,len() 函数可以计算任意集合的大小。
查找成绩:可以简单地使用 d[key] 的形式来查找对应的 value,这和 list 很像,不同之处是,list 必须使用索引返回对应的元素,而dict使用key:
>>> print d['Adam']
95
要避免 KeyError 发生,有两个办法:
一是先判断一下 key 是否存在,用 in 操作符:
if 'Paul' in d:
print d['Paul']
二是使用dict本身提供的一个 get 方法,d.get(''),在Key不存在的时候,返回None:
>>> print d.get('Bart')
59
>>> print d.get('Paul')
None
dic的特点:
- 查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样。而list的查找速度随着元素增加而逐渐下降。注意:由于dict是按 key 查找,所以,在一个dict中,key不能重复。
- 存储的key-value序对是没有顺序的!
- 作为 key 的元素必须不可变,Python的基本类型如字符串、整数、浮点数都是不可变的,都可以作为 key。但是list是可变的,就不能作为 key。
dic更新:
上面那个例子,要把新同学'Paul'的成绩 72 加进去,用赋值语句:
>>> d['Paul'] = 72
切片
L = ['Adam', 'Lisa', 'Bart', 'Paul']
print L[0:3] #['Adam', 'Lisa', 'Bart'] 表示:取前3个元素.索引0开始取,到索引3为止且不包括索引3
print L[:3] #['Adam', 'Lisa', 'Bart'] 如果第一个索引是0,还可以省略:
print L[1:3] # ['Lisa', 'Bart'] 从索引1开始,取出2个元素出来
print L[:] #['Adam', 'Lisa', 'Bart', 'Paul'] 只用一个 : ,表示从头到尾
print L[::2] #['Adam', 'Bart']
#第三个参数表示每N个取一个,上面的 L[::2] 会每两个元素取出一个来,也就是隔一个取一个。
切片操作可以指定第三个参数,如上最后一个输出,第三个参数表示每N个取一个,上面的 L[::2] 会每两个元素取出一个来,也就是隔一个取一个。
举例:
1-100里,请利用切片,取出:
1. 前10个数;
2. 3的倍数;
3. 不大于50的5的倍数。代码如下:
L = range(1, 101)
print L[0:10]
print L[2::3]
print L[4:50:5]
倒序切片
对于list,既然Python支持L[-1]取倒数第一个元素,那么它同样支持倒数切片:
>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> L[-2:]
['Bart', 'Paul']
>>> L[:-2]
['Adam', 'Lisa']
>>> L[-3:-1]
['Lisa', 'Bart']
>>> L[-4:-1:2]
['Adam', 'Bart']
记住倒数第一个元素的索引是-1。倒序切片包含起始索引,不包含结束索引。
举例:利用倒序切片对 1 - 100 的数列取出:
* 最后10个数;
* 最后10个5的倍数。
L = range(1, 101)
print L[-10:]
print L[4::5][-10:]
对字符串切片
字符串 'xxx'和 Unicode字符串 u'xxx'也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:
>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[-3:]
'EFG'
>>> 'ABCDEFG'[::2]
'ACEG'
什么是迭代
在Python中,如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们成为迭代(Iteration)。
在Python中,迭代是通过 for ... in 来完成的。
索引迭代:
Python中,迭代永远是取出元素本身,而非元素的索引。
对于有序集合,元素确实是有索引的。有的时候,我们确实想在 for 循环中拿到索引,怎么办?
方法是使用 enumerate() 函数:
>>> L = ['Adam', 'Lisa', 'Bart', 'Paul']
>>> for index, name in enumerate(L):
... print index, '-', name
...
0 - Adam
1 - Lisa
2 - Bart
3 - Paul
使用 enumerate() 函数,我们可以在for循环中同时绑定索引index和元素name。但是,这不是 enumerate() 的特殊语法。实际上,enumerate() 函数把:
变成了:
因此,迭代的每一个元素实际上是一个tuple:
如果我们知道每个tuple元素都包含两个元素,for循环又可以进一步简写为:
for index, name in enumerate(L):
print index, '-', name
迭代dict的value
dict 对象有一个 values() 方法,这个方法把dict转换成一个包含所有value的list,这样,我们迭代的就是 dict的每一个 value:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.values()
# [85, 95, 59]
for v in d.values():
print v
# 85
# 95
# 59
如果仔细阅读Python的文档,还可以发现,dict除了values()方法外,还有一个 itervalues() 方法,用 itervalues() 方法替代 values() 方法,迭代效果完全一样:
d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }
print d.itervalues()
# <dictionary-valueiterator object at 0x106adbb50>
for v in d.itervalues():
print v
# 85
# 95
# 59
那这两个方法有何不同之处呢?
1. values() 方法实际上把一个 dict 转换成了包含 value 的list。
2. 但是 itervalues() 方法不会转换,它会在迭代过程中依次从 dict 中取出 value,所以 itervalues() 方法比 values() 方法节省了生成 list 所需的内存。
3. 打印 itervalues() 发现它返回一个 <dictionary-valueiterator> 对象,这说明在Python中,for 循环可作用的迭代对象远不止 list,tuple,str,unicode,dict等,任何可迭代对象都可以作用于for循环,而内部如何迭代我们通常并不用关心。
如果一个对象说自己可迭代,那我们就直接用 for 循环去迭代它,可见,迭代是一种抽象的数据操作,它不对迭代对象内部的数据有任何要求。
迭代dict的key和value
首先,我们看看 dict 对象的 items() 方法返回的值:
可以看到,items() 方法把dict对象转换成了包含tuple的list,我们对这个list进行迭代,可以同时获得key和value:
和 values() 有一个 itervalues() 类似, items() 也有一个对应的 iteritems(),iteritems() 不把dict转换成list,而是在迭代过程中不断给出 tuple,所以, iteritems() 不占用额外的内存。
列表生成式
生成列表:
要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],我们可以用range(1, 11):
但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环:
但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:
这种写法就是Python特有的列表生成式。利用列表生成式,可以以非常简洁的代码生成 list。
写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。
>>> [x * x for x in range(1, 11)]
例如:请利用列表生成式生成列表 [1x2, 3x4, 5x6, 7x8, ..., 99x100]
print([x*y for x,y in zip(range(1,101,2),range(2,101,2))],'\n')
条件过滤
列表生成式的 for 循环后面还可以加上 if 判断。例如:
如果我们只想要偶数的平方,不改动 range()的情况下,可以加上 if 来筛选:
有了 if 条件,只有 if 判断为 True 的时候,才把循环的当前元素添加到列表中。
举例:编写一个函数,它接受一个 list,然后把list中的所有字符串变成大写后返回,非字符串元素将被忽略。
def toUppers(L):
return [x.upper() for x in L if isinstance(x, str)]
print toUppers(['Hello', 'world', 101])
isinstance(x, str) 可以判断变量 x 是否是字符串。
多层表达式
for循环可以嵌套,因此,在列表生成式中,也可以用多层 for 循环来生成列表。
对于字符串 'ABC' 和 '123',可以使用两层循环,生成全排列:
翻译成循环代码就像下面这样:
举例:利用 3 层for循环的列表生成式,找出对称的 3 位数。例如,121 就是对称数,因为从右到左倒过来还是 121。
print [x*100+y*10+z for x in range(1,10) for y in range(10) for z in range(1,10) if x==z]