专栏名称: 爱数据LoveData
中国统计网(www.itongji.cn),国内最大的数据分析门户网站。提供数据分析行业资讯,统计百科知识、数据分析、商业智能(BI)、数据挖掘技术,Excel、SPSS、SAS、R等数据分析软件等在线学习平台。
目录
相关文章推荐
51好读  ›  专栏  ›  爱数据LoveData

20个Python不为人知的冷知识,你知道几个?

爱数据LoveData  · 公众号  · BI  · 2019-10-10 14:59

正文

请到「今天看啥」查看全文



函数的参数分三种
  • 可变参数
  • 默认参数
  • 关键字参数

今天要说的是,传递默认参数时,新手很容易踩雷的一个坑。

先来看一个示例
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 会与这个内存地址绑定。


在后面的函数调用中,如果调用方指定了新的默认值,就会将原来的默认值覆盖。如果调用方没有指定新的默认值,那就会使用原来的默认值。


个人理解的记忆方法,不代表官方,点击查看大图


07
访问类中的私有方法


大家都知道,类中可供直接调用的方法,只有公有方法(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()

08
时有时无的切片异常


这是个简单例子
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:])

09
哪些情况下不需要续行符

在写代码时,为了代码的可读性,代码的排版是尤为重要的。
为了实现高可读性的代码,我们常常使用到的就是续行符 \。

>>> 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'''

上面只举了一些简单的例子。
但你要学会举一反三。一样的,在以下这些场景也同样适用
  • 类,和函数的定义。
  • 列表推导式,字典推导式,集合推导式,生成器表达式。


10
Py2 也可以使用 print()


我相信应该有不少人,思维定式,觉得只有 Py3 才可以使用 print(),而 Py2 只能使用print ''。

今天,小编要为 Py2 正名一次。
在Python 2.6之前,只支持
print






请到「今天看啥」查看全文