这篇“Python编程的两处陷阱是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python编程的两处陷阱是什么”文章吧。
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站建设、网站制作、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的南票网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
不可变对象陷阱
思路:生成1百万个随机字符串,分别使用不可对象或可变对象合并字符串,比较花费时间。
生成随机字符串的代码:
import randomimport timebig = [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万,比较分析合并字符串的时间。

可以看到可变对象只生成一个新对象的方法,比不可变对象在数据量越大情况下,优势更明显,呈现扩张的喇叭口,当数据为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://www.jxjierui.cn/article/pcghed.html


咨询
建站咨询
