当前位置: 首页 > 科技观察

惊人的时刻!盘点让你直呼“真牛”的Python代码!

时间:2023-03-23 12:04:22 科技观察

Python作为一种设计精美的高级语言,提供了许多易于使用的特性,但简??单并不意味着容易理解。有时候有些输出结果对于初学者来说不是很清楚,反而显得有点适得其反。人性。今天佩森酱整理了一些很有意思的例子。事实上,这些例子不仅有趣,甚至可以加深你对Python的理解,了解更多有趣的特性。0x00>>>'a'*20is'aaaaaaaaaaaaaaaaaaa'True>>>'a'*21is'aaaaaaaaaaaaaaaaaaaaa'False#2.7版本返回False#3.7版本返回True,很神奇的结果,我第一次看到也愣住了。其实这是Python的一种优化机制,叫做常量折叠。Thismeansthatatcompiletimetheexpression'a'*20willbereplacedwithaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,toreduceruntimetime,andonlystringslengthlessthan20willbeconstfolded.0x01In[3]:a='python'In[4]:b='python'In[5]:aisbOut[5]:TrueIn[6]:x='python!'In[7]:y='python!'In[8]:xisyOut[8]:False这是因为Python在编译优化的时候会尝试使用一些已经存在的无法区分的对象。这种现象称为字符串常驻,只包含字母数字和下划线的字符串在编译时会常驻,而包含!不会常驻。0x02In[11]:some_dict={}In[12]:some_dict[5.5]='Java'In[13]:some_dict[5.0]='Ruby'In[14]:some_dict[5]='Python'In[15]:some_dict[5.5]+'_'+some_dict[5.0]+'_'+some_dict[5]Out[15]:'Java_Python_Python'In[16]:5==5.0Out[16]:TrueIn[17]]:hash(5)==hash(5.0)Out[17]:TruePython字典通过比较不可变对象是否相等和hash值是否相等来判断是否是不同的key,但是不同值的对象也可能具有相同的哈希值。所以字典认为5.0和5是同一个键,所以Python覆盖了Ruby。0x03In[21]:defsome_func():...:try:...:return'from_try'...:finally:...:return'from_finally'...:In[22]:some_func()Out[22]:'from_finally'函数的返回值是由最后一个return语句决定的,finally一定是最后一行,所以try中的返回结果会被覆盖。0x04In[23]:foriinrange(3):...:print(i)...:i=10...:012在每次循环开始之前,迭代器产生的下一个元素会被重新赋值给i,所以赋值语句i=10不影响循环。0x05In[24]:row=['']*3In[25]:table=[row]*3In[26]:tableOut[26]:[['','',''],['','',''],['','','']]In[27]:table[0][0]='python'In[28]:tableOut[28]:[['python','',''],['python','',''],['python','','']]这是因为用乘法初始化表时,每一项也是table[0],table[1],table[2]引用内存中的同一个列表。0x06In[29]:a=256In[30]:b=256In[31]:aisbOut[31]:TrueIn[32]:a=257In[33]:b=257In[34]:aisbOut[34]:False生成造成这种现象的根本原因是256是一个存在的对象而257不是。其实在Python启动的时候,常用的值从-5到256的对象就已经分配好了。0x07In[37]:'something'isnotNoneOut[37]:TrueIn[38]:'something'is(notNone)Out[38]:False这是因为isnot是一个单一的二元运算符,如果运算符的两边如果变量指向同一个对象,则结果不是为False,否则为True。0x08In[47]:a=[1,2,3,4]In[48]:b=aIn[49]:a=a+[5,6,7,8]In[50]:aOut[50]:[1,2,3,4,5,6,7,8]In[51]:bOut[51]:[1,2,3,4]In[52]:a=[1,2,3,4]In[53]:b=aIn[54]:a+=[5,6,7,8]In[55]:aOut[55]:[1,2,3,4,5,6,7,8]In[56]:bOut[56]:[1,2,3,4,5,6,7,8]在第一个例子中a=a+...会生成一个新的list然后a指向这个列表,但b保持不变。第二个例子中的a+=...实际上使用了extend函数,所以a和b指向同一个列表。0x09t=('一','二')foriint:print(i)print('*'*5)t=('one')foriint:print(i)print('*'*5)t=()print(t)##outputPython世界中的onetwoonetuple()()是一个特殊的标记,意思是空元组,非常好理解。而t=('one')或t='one'将被解释为字符串。正确的写法应该是t=('one',)。小结今天帕森酱带领大家整理了一些Python中有趣有趣的代码。感觉顺便也能对Python的设计思想有更深入的了解,一石二鸟。