Python是一门设计精美的解释型高级语言,它提供了许多让程序员感到舒服的特性。但是有时候,Python的一些输出结果对于初学者来说似乎不是那么清晰。如果你是经验丰富的Python程序员,可以尝试挑战一下,看能否一眼看出运行结果。只运行一次?下面的代码会运行多少次?foriinrange(4):print(i)i=10运行后输出:0123什么?不是输出0吗?原理分析:由于Python中循环的工作方式,赋值语句i=10不会影响迭代循环。在每次迭代开始之前,迭代器(此处为range(4))生成的下一个元素被解包并分配给目标列表的变量(此处为i)。调皮的hashsome_dict={}some_dict[5.5]="Ruby"some_dict[5.0]="JavaScript"some_dict[5]="Python"print(some_dict[5.5])print(some_dict[5.0])print(some_dict[5])运行后输出:RubyPythonPython原理分析:Python字典通过检查键值是否相等并比较哈希值来判断两个键是否相同。执行some_dict[5]="Python"语句时,由于Python将5和5.0识别为some_dict的同一个key,所以已有值"JavaScript"处处被"Python"覆盖returndefsome_func():try:return'from_try'finally:return'from_finally'print(some_func())运行后输出:Isn'tfrom_finallyfrom_try?原理分析:在“try...finally”语句的try中执行return、break或continue时,finally子句仍然会被执行。函数的返回值由最后执行的return语句决定。由于finally子句必须被执行,所以finally子句中的return总是最后执行的语句。Noandnoprint('something'isnotNone)print('something'is(notNone))结果:TrueFalse原理分析:isnot是一个单独的二元运算符,区别于单独使用is和not。如果运算符两边的变量指向同一个对象,则is不计算为False,否则计算为True。来自some_list=[1,2,3]some_dict={"key_1":1,"key_2":2,"key_3":3}some_list=some_list.append(4)some_dict=some_dict.update({"key_4":4})print(some_dict)print(some_list)results:NoneNone原理分析:大多数修改序列/映射对象的方法,如list.append、dict.update、list.sort等,都是就地修改对象并返回无。同一个人有不同的命运先来看一个程序片段:a=[1,2,3,4]b=aa=a+[5,6,7,8]print(a)print(b)运行后结果:[1,2,3,4,5,6,7,8][1,2,3,4]让我们看另一个程序片段:a=[1,2,3,4]b=aa+=[5,6,7,8]print(a)print(b)运行后结果:[1,2,3,4,5,6,7,8][1,2,3,4,5,6,7,8]按照常规理解,这两个程序片段返回的结果应该是一样的吧?原理分析:a+=b并不总是和a=a+b一样,类中实现operator=运算符的方式可能不同,列表是这样的。表达式a=a+[5,6,7,8]生成一个新列表并引用这个新列表,同时保持b不变。表达式a+=[5,6,7,8]实际上是在使用“扩展”函数,所以a和b仍然指向相同的已修改的列表。看完这些代码的运行结果,你是不是直接调用了WC?有的话点个赞吧!即使是Python的老手,也很可能被这些代码迷得神魂颠倒,很难说对。这些代码就像线试中的逻辑题一样,很容易被表面搞糊涂!不过跑完了再看看原理,对我们学习Python也是很有帮助的!以上就是本次分享的全部内容。想了解更多Python知识,请前往公众号:Python编程学习圈,每日干货分享,送“J”,海量学习资料。
