Python编程的两处陷阱是什么

这篇“Python编程的两处陷阱是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python编程的两处陷阱是什么”文章吧。

成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的南票网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

不可变对象陷阱

思路:生成1百万个随机字符串,分别使用不可对象或可变对象合并字符串,比较花费时间。

生成随机字符串的代码:

import random import time
big = [chr(i) for i in range(65,91)]small = [chr(i) for i in range(97,123)]
def ranDNStr(n):    ...:     result = []    ...:     for i in range(n):    ...:         strlen = random.randint(3,9)    ...:         result.append(''.join(random.sample(small+big,strlen)))    ...:     return result

使用不可变对象方法:combine+s 再赋值给combine,这条语句:因为combine, s都为不可变对象,返回的结果就是新生成一个对象,对象不断堆积。

def immfn(n):     ...:     combine=''     ...:     res = randNStr(n)     ...:     beg = time.time()     ...:     print('beg time %s'%str(beg))     ...:     for s in res:     ...:         combine = combine + s     ...:     #print(combine)     ...:     end = time.time()         ...:     print('end time %s'%str(end))     ...:     print('elispe time: %s'%str(end-beg))

为了避免重复生成新的对象,使用可变对象,文中 Python解惑之对象可变与不可变 提到过,一般可迭代对象,都是可变的。

def mutfn(n):     ...:     combine=''     ...:     res = randNStr(n)     ...:     beg = time.time()     ...:     print('beg time %s'%str(beg))     ...:     combine = ''.join(res)     ...:     #print('print result:%s'%combine)     ...:     end = time.time()         ...:     print('end time %s'%str(end))     ...:     print('elispe time: %s'%str(end-beg)) 

此处使用 str.join(iter),接受可迭代对象,并只返回一个新对象。比较以上两种方法的计算时间,分别从10万,步长10万,终止到100万,比较分析合并字符串的时间。

Python编程的两处陷阱是什么

可以看到可变对象只生成一个新对象的方法,比不可变对象在数据量越大情况下,优势更明显,呈现扩张的喇叭口,当数据为90万时,节省时间成本高达:(0.19-0.025)/0.025 = 6.6倍。当数据量增长到1千万或更大时,优势更明显。

可变对象陷阱

BAT面试题26:一道Python填空题

题目是这样的:

def f(x,l=[]):    ...:     for i in range(x):    ...:        l.append(i*i)    ...:     print(l) 
f(2)f(3)
结果为:
In [2]: f(2)                                                                                         [0, 1]
In [3]: f(3)                                                                                         [0, 1, 0, 1, 4]

原因,可变对象作为函数参数,并被设为默认值后,当被再次调用函数后,函数参数原来取值将被再次索引。

为了避免这个问题,可变对象的默认值一般取值为常数:None

def f(x,l=None):    ...:     if l is None:    ...:         l = []    ...:     for i in range(x):    ...:        l.append(i*i)    ...:     print(l)    ...:      

这样连续被调用时,将会按照预期输出。

以上就是关于“Python编程的两处陷阱是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注创新互联行业资讯频道。


新闻标题:Python编程的两处陷阱是什么
文章网址:http://scyanting.com/article/pcghed.html