
python的一些高级用法
原文
Python的高级特性
python中有很多高级特性,比起C/C++来说要简单许多,运用起来十分方便。
切片
通常需要取一个list或者tuple中的部分元素或者截取字符串中的子串,此时使用切片十分方便
>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
>>> L[0:3]
['Michael', 'Sarah', 'Tracy']
如果第一个索引是0则可以省略
>>> L[:3]
['Michael', 'Sarah', 'Tracy']
同样最后一个索引是最有一个是也可以省略。
还可以使用负数来作为索引,-1表示倒数第一个,-2表示倒数第二个,以此类推。
>>> L[-2:]
['Bob', 'Jack']
>>> L[-2:-1]
['Bob']
注意上述的切片区间[i,j]是半开半闭区间,即数学上表示为[i,j),包含第i个元素不包含第j个元素
同时还可以设置取数间隔
>>> L = range(100)
>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
上面表示从最开始到最结尾每5个数取一个
字符串的切片同样的道理
>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[::2]
'ACEG
列表生成式
比如需要生成列表[1,2,3,4,5,6,7,8,9,10]可以使用range(1,11)来表示,大现在假如需要生成x^2即[1,4,9,16,25,36,49,64,81,100]则需要一个循环来将列表中的元素每一个都平方,显然用循环很麻烦,这是可以使用列表生成式
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
一条语句就可以解决,还可以在for循环后面添加if判断来筛选,还可以在添加循环
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']
生成器
前面学习了列表生成式,只要将方括号[]改成圆括号()就可以得到生成器,生成器可以通过next()函数来获取元素
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x104feab40>
>>> g.next()
0
>>> g.next()
1
>>> g.next()
4
>>> g.next()
9
>>> g.next()
16
>>> g.next()
25
>>> g.next()
36
>>> g.next()
49
>>> g.next()
64
>>> g.next()
81
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
生成器保存的是算法,每次在调用next()的时候就计算出元素的值
函数也可以改造成生成器,只需要在需要打印或者返回的地方把对应的打印或返回语句改成yield语句就可以了,每当函数执行到yield之后就返回,下次调用生成器是接着上那次的yield地方继续运行
>>> def odd():
... print 'step 1'
... yield 1
... print 'step 2'
... yield 3
... print 'step 3'
... yield 5
...
>>> o = odd()
>>> o.next()
step 1
1
>>> o.next()
step 2
3
>>> o.next()
step 3
5
>>> o.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
高阶函数
高阶函数的概念很简单,就是以函数作为参数的函数。。。有点拗口,下面学习了几个python内置的高效的高阶函数
map&reduce函数
查看python的官方文档就可以发现python内建了map和reduce函数。
map()函数接收两个参数,一个是函数,一个是序列map的作用是将传入的函数对序列的每一个元素进行运算。
>>> def f(x):
... return x * x
...
>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
[1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])
['1', '2', '3', '4', '5', '6', '7', '8', '9']
reduce()函数同样是接受两个参数,一个是函数,一个是序列,有个额外的要求就是传入的函数必须两个参数,reduce的作用效果如下
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
比如求序列的和
>>> def add(x, y):
... return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
map()和reduce()可以结合着使用
>>> def fn(x, y):
... return x * 10 + y
...
>>> def char2num(s):
... return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
...
>>> reduce(fn, map(char2num, '13579'))
13579
filter函数
filter函数从名字上就能知道是过滤作用,用来过滤序列的,filter函数同样传入两个参数,将传入的函数作用于每个元素,根据返回的结果是True或False来决定是否保留该元素
def is_odd(n):
return n % 2 == 1
filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
# 结果: [1, 5, 9, 15]
def not_empty(s):
return s and s.strip()
filter(not_empty, ['A', '', 'B', None, 'C', ' '])
# 结果: ['A', 'B', 'C']
sorted函数
排序函数,可以对序列中的元素进行排序
>>> sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]
同时sorted函数也可以像C++中algorithm中的sort函数一样自定义比较规则
def reversed_cmp(x, y):
if x > y:
return -1
if x < y:
return 1
return 0
>>> sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]
返回函数
可以将函数作为返回值返回,被返回的函数会记住传进去的参数。
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function sum at 0x10452f668>
>>> f()
25
匿名函数
匿名函数的作用类似于C/C++中的inline函数,python中的匿名函数用lambda表示
>>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])
[1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x10453d7d0>
>>> f(5)
25
目前先学习到此为止,都是python的一些基础知识,关于python的面向对象、网络编程、多线程等知识等到后面再继续学习。
原文
网友评论