当前位置: 首页 > news >正文

外贸建站上海手机商城网站建设

外贸建站上海,手机商城网站建设,上市公司网站建设分析,惠州品牌网站建设价格我个人对陷阱的定义是这样的#xff1a;代码看起来可以工作#xff0c;但不是以你“想当然“”的方式。如果一段代码直接出错#xff0c;抛出了异常#xff0c;我不认为这是陷阱。比如#xff0c;Python程序员应该都遇到过的“UnboundLocalError”, 示例#xff1a;代码看起来可以工作但不是以你“想当然“”的方式。如果一段代码直接出错抛出了异常我不认为这是陷阱。比如Python程序员应该都遇到过的“UnboundLocalError”, 示例 a1 def func():...     a1...     print a... func()Traceback (most recent call last):File stdin, line 1, in moduleFile stdin, line 2, in funcUnboundLocalError: local variable a referenced before assignment对于“UnboundLocalError”,还有更高级的版本import random def func(ok):    if ok:        a  random.random()    else:        import random        a  random.randint(1, 10)    return a func(True)# UnboundLocalError: local variable random referenced before assignment可能对于很多python新手来说这个Error让人摸不着头脑。但我认为这不算陷阱因为这段代码一定会报错而不是默默的以错误的方式运行。不怕真小人就怕伪君子。我认为缺陷就好比伪君子。那么Python中哪些真正算得上陷阱呢第一以mutable对象作为默认参数这个估计是最广为人知的了Python和其他很多语言一样提供了默认参数默认参数确实是个好东西可以让函数调用者忽略一些细节比如GUI编程TkinterQT对于lambda表达式也非常有用。但是如果使用了可变对象作为默认参数那么事情就不那么愉快了。 def f(lst  []):...     lst.append(1)...     return lst... f()[1] f()[1, 1]惊喜不惊喜究其原因python中一切都是对象函数也不列外默认参数只是函数的一个属性。而默认参数在函数定义的时候已经求值了。  Default parameter values are evaluated when the function definition is executed.stackoverflow上有一个更适当的例子来说明默认参数是在定义的时候求值而不是调用的时候。  import time def report(whentime.time()):... return when... report()1500113234.487932 report()1500113234.487932python docoment 给出了标准的解决办法  A way around this is to use None as the default, and explicitly test for it in the body of the function def report(whenNone):...  if when is None:...  when  time.time()... return when... report()1500113446.746997 report()1500113448.552873第二: x y vs x x y一般来说二者是等价的至少看起来是等价的这也是陷阱的定义 — 看起来都OK但不一定正确。 x1;x  1;print x2  x1;x  x1;print x2 x[1];x[2];print x[1, 2] x[1];xx[2];print x[1, 2]呃被光速打脸了 x[1];print id(x);xx[2];print id(x) 43571328004357132728 x[1];print id(x);x[2];print id(x)43571328004357132800前者x指向一个新的对象后者x在原来的对象是修改当然那种效果是正确的取决于应用场景。至少得知道二者有时候并不一样 第三神奇的小括号–()小括号parenthese在各种编程语言中都有广泛的应用python中小括号还能表示元组tuple这一数据类型, 元组是immutable的序列。 a  (1, 2) type(a)type tuple type(())type tuple但如果只有一个元素呢 a(1) type(a)type int神奇不神奇如果要表示只有一个元素的元组正确的姿势是 a(1) type(a)type int第四生成一个元素是列表的列表这个有点像二维数组当然生成一个元素是字典的列表也是可以的更通俗的说生成一个元素是可变对象的序列很简单嘛 a [[]] * 10 a[[], [], [], [], [], [], [], [], [], []] a[0].append(10) a[0] [10]看起来很不错简单明了but a[1][10] a[[10], [10], [10], [10], [10], [10], [10], [10], [10], [10]]我猜这应该不是你预期的结果吧究其原因还是因为python中list是可变对象上述的写法大家都指向的同一个可变对象正确的姿势 a  [[] for _ in xrange(10)] a[0].append(10) a[[10], [], [], [], [], [], [], [], [], []]第五在访问列表的时候修改列表列表list在python中使用非常广泛当然经常会在访问列表的时候增加或者删除一些元素。比如下面这个函数试图删掉列表中为3的倍数的元素 def modify_lst(lst):... for idx, elem in enumerate(lst):... if elem % 3  0:... del lst[idx]测试一下 lst  [1,2,3,4,5,6] modify_lst(lst) lst[1, 2, 4, 5]好像没什么错不过这只是运气好 lst  [1,2,3,6,5,4] modify_lst(lst) lst[1, 2, 6, 5, 4]上面的例子中6这个元素就没有被删除。如果在modify_lst函数中print idx item就可以发现端倪lst在变短但idx是递增的所以在上面出错的例子中当3被删除之后6变成了lst的第2个元素从0开始。在C中如果遍历容器的时候用迭代器删除元素也会有同样的问题。如果逻辑比较简单使用list comprehension是不错的注意 第六闭包与lambda这个也是老生长谈的例子在其他语言也有类似的情况。先看一个例子: def create_multipliers():...  return [lambda x:i*x for i in range(5)]... for multiplier in create_multipliers():... print multiplier(2)...create_multipliers函数的返回值时一个列表列表的每一个元素都是一个函数 将输入参数x乘以一个倍数i的函数。预期的结果时02468. 但结果是5个8意外不意外。由于出现这个陷阱的时候经常使用了lambda所以可能会认为是lambda的问题但lambda表示不愿意背这个锅。问题的本质在与python中的属性查找规则LEGBlocalenclousingglobalbulitin在上面的例子中i就是在闭包作用域enclousing而Python的闭包是 迟绑定 这意味着闭包中用到的变量的值是在内部函数被调用时查询得到的。 解决办法也很简单那就是变闭包作用域为局部作用域。 def create_multipliers():... return [lambda x, i  i:i*x for i in range(5)]...第七定义__del__大多数计算机专业的同学可能都是先学的C、C构造、析构函数的概念应该都非常熟。于是当切换到python的时候自然也想知道有没有相应的函数。比如在C中非常有名的RAII即通过构造、析构来管理资源如内存、文件描述符的声明周期。那在python中要达到同样的效果怎么做呢即需要找到一个对象在销毁的时候一定会调用的函数于是发现了__init__, __del__函数可能简单写了两个例子发现确实也能工作。但事实上可能掉进了一个陷阱在python documnet是有描述的  Circular references which are garbage are detected when the option cycle detector is enabled (it’s on by default), but can only be cleaned up if there are no Python-level __del__() methods involved.简单来说如果在循环引用中的对象定义了__del__,那么python gc不能进行回收因此存在内存泄漏的风险第八不同的姿势import同一个module示例在stackoverflow的例子上稍作修改假设现在有一个package叫mypackage里面包含三个python文件mymodule.py, main.py, __init__.py。mymodule.py代码如下l  []class A(object):    passmain.py代码如下def add(x):    from mypackage import mymodule    mymodule.l.append(x)    print updated list,mymodule.l, id(mymodule) def get():    import mymodule    print module in get, id(mymodule)    return mymodule.l if __name__  __main__:    import sys    sys.path.append(../)    add(1)        ret  get()    print lets check, ret运行python main.py结果如下updated list [1] 4406700752module in get 4406700920lets check [] 从运行结果可以看到在add 和 get函数中import的mymodule不是同一个moduleID不同。当然在python2.7.10中需要main.py的第13行才能出现这样的效果。你可能会问谁会写出第13行这样的代码呢事实上在很多项目中为了import的时候方便会往sys.path加入一堆路径。那么在项目中大家同意一种import方式就非常有必要了第九python升级python3.x并不向后兼容所以如果从2.x升级到3.x的时候得小心了下面列举两点在python2.7中range的返回值是一个列表而在python3.x中返回的是一个range对象。map()、filter()、 dict.items()在python2.7返回列表而在3.x中返回迭代器。当然迭代器大多数都是比较好的选择更加pythonic但是也有缺点就是只能遍历一次。在instagram的分享中也提到因为这个导致的一个坑爹的bug。 第十gil以GIL结尾因为gil是Python中大家公认的缺陷从其他语言过来的同学可能看到python用threading模块拿过来就用结果发现效果不对啊然后就会喷什么鬼。总结毫无疑问的说python是非常容易上手也非常强大的一门语言。python非常灵活可定制化很强。同时也存在一些陷阱搞清楚这些陷阱能够更好的掌握、使用这么语言。本文列举了一些python中的一些缺陷这是一份不完全列表欢迎大家补充。来源xybabywww.cnblogs.com/xybaby/p/7183854.html
http://www.yutouwan.com/news/7229/

相关文章:

  • 怎么建设一个淘宝客网站谁知道wordpress建站要钱吗
  • 网站开发人员周报江门市网站建设 熊掌号
  • wordpress 建站 图床江苏城乡建设厅网站
  • html5做简单网站网站推广软件排名
  • 公司建设网站需要什么一站式网站建设架构
  • 平台网站建设费用wordpress装修模板
  • 网站开发与应用dw制作一个手机网站模板
  • 深圳做企业网站的公司推荐建设工程机械职业技能鉴定
  • 网站建设实验分析阜新市建设学校管方网站
  • 上海建设网站哪家好有网络网站打不开
  • 帮别人做违法网站会怎么样网站ui设计是什么意思
  • 易班网站的建设内容最新免费网站收录提交入口
  • 阿里云建设网站好吗wordpress用户名怎么起
  • 行业数据网站二维码生成在线制作
  • 网站托管解决方案app开发企业
  • wordpress网站上传服务器商城网站不易优化
  • 蓝色清爽网站快速搭建网站服务器
  • 阿克苏网站建设价格成都诗和远方网站建设
  • seo网站首页推广wordpress批量传图片
  • wordpress网站空间wordpress加百度一下
  • 优化手机访问网站速度小说网站做封面要钱吗
  • z怎么建设视频网站分析杭州高端网站建设开发的区别
  • wordpress仿站实战做家教备课用什么网站
  • 遨翔网站建设照片网站模版
  • 哪个公司做企业网站好html个人网站源码
  • 网站的备案信息wordpress响应慢原因
  • 吉林做网站wordpress企业内网主题
  • 太原 招聘 网站建设 技术经理设计开发流程
  • 网站建设及管理制度文章网站建设策
  • 如何用网站做课件vue vs wordpress