Python小记04

来源:互联网 发布:新页软件 编辑:程序博客网 时间:2024/06/05 15:27

        ----定义函数,用def语句

def my_abs(x):    if x >= 0:        return x    else:        return -x

        ----函数返回多个值    实际上是反悔了tpple

import mathdef move(x, y, step, angle):    nx = x + step * math.cos(angle)    ny = y - step * math.sin(angle)    return nx, ny

这样我们就可以同时获得返回值:

>>> x, y = move(100, 100, 60, math.pi / 6)>>> print x, y151.961524227 70.0

但其实这只是一种假象,Python函数返回的仍然是单一值:

>>> r = move(100, 100, 60, math.pi / 6)>>> print r(151.96152422706632, 70.0)

用print打印返回结果,原来返回值是一个tuple!


       ----定义默认参数

由于函数的参数按从左到右的顺序匹配,所以默认参数只能定义在必需参数的后面:

# OK:def fn1(a, b=1, c=2):    pass# Error:def fn2(a=1, b):    pass

        ----定义可变参数

如果想让一个函数能接受任意个参数,我们就可以定义一个可变参数:

def fn(*args):    print args

可变参数的名字前面有个 * 号,我们可以传入0个、1个或多个参数给可变参数:

>>> fn()()>>> fn('a')('a',)>>> fn('a', 'b')('a', 'b')>>> fn('a', 'b', 'c')('a', 'b', 'c')

可变参数也不是很神秘,Python解释器会把传入的一组参数组装成一个tuple传递给可变参数,因此,在函数内部,直接把变量 args看成一个 tuple 就好了。


        ----切片

Python提供了切片(Slice)操作符,能大大简化这种操作。

对应上面的问题,取前3个元素,用一行代码就可以完成切片:

>>> L[0:3]['Adam', 'Lisa', 'Bart']

L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素。

如果第一个索引是0,还可以省略:

>>> L[:3]['Adam', 'Lisa', 'Bart']

也可以从索引1开始,取出2个元素出来:

>>> L[1:3]['Lisa', 'Bart']

只用一个 : ,表示从头到尾:

>>> L[:]['Adam', 'Lisa', 'Bart', 'Paul']

因此,L[:]实际上复制出了一个新list。

切片操作还可以指定第三个参数:

>>> L[::2]['Adam', 'Bart']

第三个参数表示每N个取一个,上面的 L[::2] 会每两个元素取出一个来,也就是隔一个取一个。


        ----range()函数可以创建一个数列

>>> range(1, 101)[1, 2, 3, ..., 100]

        ----

zip()函数可以把两个 list 变成一个 list:

>>> zip([10, 20, 30], ['A', 'B', 'C'])[(10, 'A'), (20, 'B'), (30, 'C')]

        ----迭代dict的key和value

 dict 对象的 items() 方法返回的值:

>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59 }>>> print d.items()[('Lisa', 85), ('Adam', 95), ('Bart', 59)]

可以看到,items() 方法把dict对象转换成了包含tuple的list,我们对这个list进行迭代,可以同时获得key和value:

>>> for key, value in d.items():...     print key, ':', value... Lisa : 85Adam : 95Bart : 59

和 values() 有一个 itervalues() 类似, items() 也有一个对应的 iteritems(),iteritems() 不把dict转换成list,而是在迭代过程中不断给出 tuple,所以, iteritems() 不占用额外的内存。


        ----生成列表

>>> [x * x for x in range(1, 11)][1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

这种写法就是Python特有的列表生成式。利用列表生成式,可以以非常简洁的代码生成 list。

列表生成式的 for 循环后面还可以加上 if 判断

>>> [x * x for x in range(1, 11) if x % 2 == 0][4, 16, 36, 64, 100]


        ---- isinstance(x, str) 可以判断变量 x 是否是字符串;


for循环可以嵌套,因此,在列表生成式中,也可以用多层 for 循环来生成列表。

对于字符串 'ABC' 和 '123',可以使用两层循环,生成全排列:

>>> [m + n for m in 'ABC' for n in '123']['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']

翻译成循环代码就像下面这样:

L = []for m in 'ABC':    for n in '123':        L.append(m + n)

0 0
原创粉丝点击