谈谈Python那些不为人知的冷知识(二)

本文转载自Python的编程时光(ID:Python-Time)
小明在日常Code中遇到一些好玩,冷门的事情,通常都会记录下来。
从上一篇的分享来看,仍然有不少 Pythoner 对这些冷知识存在盲区,所以今天迎来第二篇。
如果上篇你还没来得及查看,可以点击下方传送门直接进入。
默认参数最好不为可变对象
函数的参数分三种
可变参数
默认参数
关键字参数
这三者的具体区别,和使用方法在 廖雪峰的教程 里会详细的解释。这里就不搬运了。
今天要说的是,传递默认参数时,新手很容易踩雷的一个坑。
先来看一个示例
def?func(item,?item_list=[]):
????item_list.append(item)
????print(item_list)
func('iphone')
func('xiaomi',?item_list=['oppo','vivo'])
func('huawei')
在这里,你可以暂停一下,思考一下会输出什么?
思考过后,你的答案是否和下面的一致呢
['iphone']
['oppo',?'vivo',?'xiaomi']
['iphone',?'huawei']
如果是,那你可以跳过这部分内容,如果不是,请接着往下看,这里来分析一下。
Python 中的 def 语句在每次执行的时候都初始化一个函数对象,这个函数对象就是我们要调用的函数,可以把它当成一个一般的对象,只不过这个对象拥有一个可执行的方法和部分属性。
对于参数中提供了初始值的参数,由于 Python 中的函数参数传递的是对象,也可以认为是传地址,在第一次初始化 def 的时候,会先生成这个可变对象的内存地址,然后将这个默认参数 item_list 会与这个内存地址绑定。
在后面的函数调用中,如果调用方指定了新的默认值,就会将原来的默认值覆盖。如果调用方没有指定新的默认值,那就会使用原来的默认值。

个人理解的记忆方法,不代表官方,点击查看大图
访问类中的私有方法
大家都知道,类中可供直接调用的方法,只有公有方法(protected类型的方法也可以,但是不建议)。也就是说,类的私有方法是无法直接调用的。
这里先看一下例子:
class?Kls():
????def?public(self):
????????print('Hello?public?world!')
????def?__private(self):
????????print('Hello?private?world!')
????def?call_private(self):
????????self.__private()
ins?=?Kls()
#?调用公有方法,没问题
ins.public()
#?直接调用私有方法,不行
ins.__private()
#?但你可以通过内部公有方法,进行代理
ins.call_private()
既然都是方法,那我们真的没有方法可以直接调用吗?
当然有啦,只是建议你千万不要这样弄,这里只是普及,让你了解一下。
#?调用私有方法,以下两种等价
ins._Kls__private()
ins.call_private()
时有时无的切片异常
这是个简单例子:
my_list?=?[1,?2,?3,?4,?5]
print(my_list[5])
执行一下,和我们预期的一样,会抛出索引异常。
Traceback?(most?recent?call?last):
??File?"F:/Python?Script/test.py",?line?2,?in?< module>
????print(my_list[5])
IndexError:?list?index?out?of?range
但是今天要说的肯定不是这个,而是一个你可能会不知道的冷知识。
来看看,如下这种写法就不会报索引异常,执行my_list[5:],会返回一个新list:[]。
my_list?=?[1,?2,?3]
print(my_list[5:])
哪些情况下不需要续行符
在写代码时,为了代码的可读性,代码的排版是尤为重要的。
为了实现高可读性的代码,我们常常使用到的就是续行符?。
>>>?a?=?'talk?is?cheap,'
...?????'show?me?the?code.'
>>>
>>>?print(a)
talk?is?cheap,show?me?the?code.
那有哪些情况下,是不需要写续行符的呢?
经过总结,在这些符号中间的代码换行可以省略掉续行符:[],(),{}
>>>?my_list=[1,2,3,
...??????????4,5,6]
>>>?my_tuple=(1,2,3,
...???????????4,5,6)
>>>?my_dict={"name":?"MING",
...??????????"gender":?"male"}
另外还有,在多行文本注释中?''' ,续行符也是可以不写的。
>>>?text?=?'''talk?is?cheap,
...???????????show?me?the?code'''
上面只举了一些简单的例子。
但你要学会举一反三。一样的,在以下这些场景也同样适用
类,和函数的定义。
列表推导式,字典推导式,集合推导式,生成器表达式。
Py2 也可以使用 print()
我相信应该有不少人,思维定式,觉得只有 Py3 才可以使用 print(),而 Py2 只能使用print ''。
今天,小明要为 Py2 正名一次。
在Python 2.6之前,只支持
print?"hello"
在Python 2.6和2.7中,可以支持如下三种
print?"hello"
print("hello")
print?("hello")
在Python3.x中,可以支持如下两种
print("hello")
print?("hello")
(本文为 AI科技大本营转载文章,转载请微信联系原作者)
◆
精彩推荐
◆
推荐阅读

?点击“阅读原文”,查看更多精彩文章。
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
- 1 因地制宜发展新质生产力 7904007
- 2 中央:增加普通高中学位供给 7808753
- 3 10人聚餐9人开溜 男子看账单傻眼 7712584
- 4 乘冬而起 向雪而行 7618520
- 5 医院躺了2700多天的男子是植物人 7523521
- 6 驻柬埔寨大使馆:中国公民尽快转移 7424272
- 7 网警:男子AI生成车展低俗视频被拘 7331502
- 8 中央定调明年继续“国补” 7234721
- 9 一粒米盖住6个字 药品说明书该改了 7138537
- 10 卓越工程师培养有了新标准 7039252








AI100
