Python学习(三)

作者: songcmic | 来源:发表于2017-10-13 21:43 被阅读36次
pythonpython
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的面向对象、网络编程、多线程等知识等到后面再继续学习。
原文

相关文章

网友评论

    本文标题:Python学习(三)

    本文链接:https://www.haomeiwen.com/subject/esytuxtx.html