现在的位置: 首页 > 综合 > 正文

python tips(5)

2012年01月24日 ⁄ 综合 ⁄ 共 5938字 ⁄ 字号 评论关闭

1. list 序列,sample_list = [1, 2, 3, 'abc']

dictionary 字典,sample_dic = {"key" = value, 2:3}

tuple 只读的序列,sample_tuple = (1, 3, "ab")

序表:序表由一系列值用逗号分隔而成,序表与字符串一样是不可变的,不允许对序表的某一项赋值。

字典:关联数组。

与字符串不同的是列表是可变的,可以修改列表的每个元素。可以建立嵌套列表(表的元素也是列表)。

 

2. 内置函数:

filter(),filter(函数,序列)返回一个序列(尽可能与原来同类型),序列元素时原序列中由指定的函数筛选出来的那些,筛选规则是“函数(序列元素)=true”,filter()可以用来取出满足条件的子集。

map(),map(函数,序列)对指定序列的每一项调用指定的函数,结果为返回值组成的列表,map()可以对序列进行隐式循环。

reduce(),reduce(函数,序列)用来进行类似累加这样的操作,这里的函数式一个两个子变量的函数,reduce()先对序列的前两项调用函数得到一个结果,然后对结果和序列的下一项调用函数得到一个新结果,如此进行到序列尾部。

 

3. python中的and从左到右计算表达式,若所有值均为真,则返回最后一个值,若存在假,返回第一个假值。

or也是从左到右计算表达式,返回第一个为真的值。

>>> 'a' and 'b'
'b'
>>> '' and 'b'
''
>>> 'a' or 'b'
'a'
>>> '' or 'b'
'b'

另外有类似三目表达式的用法:bool?a:b

a = 'first'
b = 'second'
print 1 and a or b #等价于bool = true时的情况
print 0 and a or b #等价于bool = false时的情况
a = ''
print 1 and a or b #a为假时,出现问题
print (1 and [a] or [b])[0] #安全用法,因为[a]不可能为假,至少有一个元素
>>> 
first
second
second

>>> 

另外一个例子。

collapse = True # False
processFunc = collapse and (lambda s:" ".join(s.split())) or (lambda s:s)

此处无问题,因为一个lambda函数在一个布尔环境下总为真。(这并不意味着lambda函数不能返回假值,函数本身总是为真,它的返回值可以为任何值)。

test = lambda x, y, z = 2:x*y*z
print test(2, 3, 4)
print test(2, 3)
>>> 
24
12
>>> 

注意lambda可选参数,lambda函数只是一个内联函数。

 

4. 序列逆序可以使用reverse()。

 

5. python中如何实现tuple和list的转换?

1)函数tuple(seq)可以把所有可迭代的(iterable)序列转换成一个tuple,元素不变,排序也不变。

e.g. tuple([1, 2, 3])返回(1, 2, 3)

tuple('abc')返回('a', 'b', 'c')

如果参数已经是一个tuple的话,函数不做任何拷贝而直接返回原来的对象,所以在不确定对象是不是tuple的时候来调用tuple()函数也不是很耗费的。

2)函数list(seq)可以把所有的序列和可迭代的对象转换成一个list,元素不变,排序也不变。

例如list([1, 2, 3])返回(1, 2, 3),list('abc')返回['a', 'b', 'c'],如果参数是一个list,它会像set[:]一样做一个拷贝。

 

6. 请写出一段python代码实现删除一个List里面的重复元素。

def del_Redundant(seq):
    for item in seq:
        if seq.count(item) > 1:
            del seq[seq.index(item)]
    return seq

print del_Redundant([1, 2, 3, 4, 1, 5, 2, 6, 1])
>>> 
[3, 4, 5, 2, 6, 1]
>>> 

7. python里面如何拷贝一个对象:

在python中,无论把对象作为参数传递,作为函数返回值,都是引用传递的。

标准库中的copy模块提供了两个方法来实现拷贝,一个方法是copy,它返回和参数包含内容一样的对象。

import copy
new_list = copy.copy(existing_list)

以上为浅拷贝,若希望对象中的属性也被复制,可以使用deepcopy方法。

import copy
new_list_of_dics = copy.deepcopy(existing_list_of_dicts)

copy.copy可以进行shallow copy,对于对象中的元素,依然使用引用。

浅复制,有时不能获得一个和原来对象完全一致的副本,如果你想修改对象中的元素,不仅仅是对象本身的话。

>>> 
[3, 4, 5, 2, 6, 1]
>>> import copy
>>> list_of_lists = [['a'], [1, 2], ['z', 23]]
>>> copy_lol = copy.copy(list_of_lists)
>>> copy_lol[1].append('boo')
>>> print list_of_lists, copy_lol
[['a'], [1, 2, 'boo'], ['z', 23]] [['a'], [1, 2, 'boo'], ['z', 23]]
>>> a = [1, 2, 3]
>>> b = a
>>> b.append(5)
>>> print a, b
[1, 2, 3, 5] [1, 2, 3, 5]
>>> s = 'cat'
>>> t = copy.copy(s)
>>> s is t
True
>>> 

注意t = copy.copy(s)这一句不可修改对象(string,数字,元组),用复制依然会得到原来的。

is操作符用于判断两个对象是否完全一致,而且是同一个对象。

python中的对象包含三要素:id, type, value。

其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值。

is判断的是a对象是否就是b对象,是通过id判断的。

==判断的是a对象的值是否和b对象的值相等,是通过value来判断的,参照如下代码。

>>> a = 1
>>> b = 1.0
>>> a is b
False
>>> a == b
True
>>> id(a)
27047920
>>> id(b)
27080240
>>> a = 1
>>> b = 1
>>> a is b
True
>>> a == b
True
>>> id(a)
27047920
>>> id(b)
27047920
>>> #dictionary
>>> a = {'m':1, 'n':2}
>>> b = dict(a)
>>> a is b
False
>>> a == b
True
>>> #list
>>> a = [1, 2, 3]
>>> b = list(a)
>>> a is b
False
>>> a == b
True
>>> #tuple
>>> a = (1, 2, 3)
>>> b = tuple(a)
>>> a is b
True
>>> a == b
True
>>> 

8. python中pass语句的作用:

1)pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作。

while False:
    pass

2)pass语句通常用来创建一个最简单的类。

class MyEmptyClass:
    pass

3)pass在软件设计阶段也经常用来作为TODO,提醒实现相应的功能。

def initlog():
    pass # please implement this

9. python异常处理。

class myException(Exception):
    def __init__(self, str):
        Exception.__init__(self, str)
        self.value = str

try:
    raise myException("error...")
except myException, e:
    print e.value
finally:
    print "pass"
>>> 
error...
pass
>>> 
try:
    raise Exception, "hello world"
except Exception, e:
    print e
>>> 
hello world
>>> 

10. python assert用法:
1)assert语句用来声明某个条件是真的

2)如果非常确信某个使用的列表中至少有一个元素,且想要检验这一点,并且在它非真的时候引发一个错误,则较适合用assert语句。

3)当assert语句失败的时候,会引发一个Assertion Error。

>>> my_list = ['item']
>>> assert len(my_list) >= 1
>>> my_list.pop()
'item'
>>> assert len(my_list) >= 1

Traceback (most recent call last):
  File "<pyshell#52>", line 1, in <module>
    assert len(my_list) >= 1
AssertionError
>>> 

11. 知道一个python对象的类型用type(x)。

 

12. python中range的用法。

1)range(stop)

2)range(start, stop[, step])

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5)
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3)
[0, 3, 6, 9]
>>> range(0, -10, -1)
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0)
[]
>>> range(1, 0)
[]
>>> 

13. python全局变量:

def a():
    x = 2
    print x
def b():
    global x
    x = 4
    print x

x = 3
print x
a()
print x
b()
print x
>>> 
3
2
3
4
4
>>> 

1)global variable全局变量:
在程序文件中任何地方都可以引用,包括函数和类的内部,但是如果在函数和类中对全局变量赋值,必须在该函数或者类中声明该变量为全局变量,否则经过赋值操作后,变量为本地变量。

2)local variable本地变量:

通常是在函数或者类的方法中直接使用,在该函数或者类方法之外,不能引用该变量。

 

14. python中生成随机数:

import random
random.random() #[0.0, 1.0)中一个浮点数
random.randint(start, stop) #[start, stop]中一个整数
random.randrange(start, stop) #[start, stop)中一个整数

15. 正则表达式通常用于在文本中查找匹配的字符串。

使用正则表达式进行匹配的流程:

首先由正则表达式引擎编译正则表达式文本,生成正则表达式对象(包含应如何进行匹配的信息),然后将正则表达式对象与需要匹配的文本进行匹配得到匹配结果(包含了这次成功匹配的信息,如匹配到的字符串、分组以及在文本中的索引)。

 

16. 用python来查询和替换一个文本字符串。

import re
pattern = re.compile('blue|white|red')
print pattern.sub('haha', 'blue socks and red shoes')
print pattern.sub('haha', 'blue socks and red shoes', 1)
print pattern.subn('haha', 'blue socks and red shoes')
print pattern.subn('haha', 'blue socks and red shoes', 1)
>>> 
haha socks and haha shoes
haha socks and red shoes
('haha socks and haha shoes', 2)
('haha socks and red shoes', 1)
>>> 

17. python里search()和match()的区别。

1)match()函数只检测Re是不是在string的开始位置匹配,search()会扫描整个string查找匹配,也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回None。

2)search()会扫描整个字符串并返回第一个成功的匹配。

import re
print re.match('super', 'superstition').span()
print re.match('super', 'superstition')
print re.match('super', 'insuperable')
print re.search('super', 'superstition').span()
print re.search('super', 'superstition')
print re.search('super', 'insuperable').span()
print re.search('super', 'insuperable')
>>> 
(0, 5)
<_sre.SRE_Match object at 0x015E1D40>
None
(0, 5)
<_sre.SRE_Match object at 0x015E1D40>
(2, 7)
<_sre.SRE_Match object at 0x015E1D40>
>>> 

18. python匹配HTML Tag时,<.*>和<.*?>有什么区别?

1)<.*>为贪心匹配

2)<.*?>为非贪心匹配

import re
s = 'abc'
print re.match('.*', s).group()
print re.match('.*?', s).group()
print re.match('a.*', s).group()
print re.match('a.*?', s).group()
>>> 
abc

abc
a
>>> 

19. python中如何发送邮件?

可以使用smtplib标准库。

编写的代码可在支持SMTP监听器的服务器上执行。

 

20. 有没有一个工具可以帮助查找python的bug和进行静态的代码分析?

1)有,PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug,会对代码的复杂度和格式提出警告。

2)Pylint是另外一个工具,可以进行coding standard检查。

 

21. python是如何进行内存管理的?

python的内存管理是由python的解释器负责的,开发人员可以从内存管理器事务中解放出来,致力于应用程序的开发,这样就使得开发的程序错误更少,程序更健壮,开发周期更短。

抱歉!评论已关闭.