zoukankan      html  css  js  c++  java
  • 盘点 Python 中的那些冷知识(二)

    上一篇文章分享了 Python中的那些冷知识,地址在这里

    今天将接着分享!!

    06. 默认参数最好不为可变对象

    函数的参数分三种

    • 可变参数
    • 默认参数
    • 关键字参数

    这三者的具体区别,和使用方法在 廖雪峰的教程 里会详细的解释。这里就不搬运了。

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

    先来看一个示例

    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 = [12345]
    print(my_list[5])

    执行一下,和我们预期的一样,会抛出索引异常。

    Traceback (most recent call last):
      File "F:/Python Script/test.py", line 2in <module>
        print(my_list[5])
    IndexError: list index out of range

    但是今天要说的肯定不是这个,而是一个你可能会不知道的冷知识。

    来看看,如下这种写法就不会报索引异常,执行my_list[5:],会返回一个新list:[]。

    my_list = [123]
    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 "hello"

    在Python 2.6和2.7中,可以支持如下三种

    print "hello"
    print("hello")
    print ("hello")

    在Python3.x中,可以支持如下两种

    print("hello")
    print ("hello")



  • 相关阅读:
    2018.5.22 Oracle安装配置在虚拟机中外部电脑连接服务
    2018.5.20 oracle强化练习
    2018.5.19 Oracle数据操作和管理表的综合练习
    2018.5.18 AndroidStudio创建项目出错
    2018.5.17 oracle函数查询
    2018.5.14 XML文档类型定义----DTD
    2018.5.13 oracle遇到的问题
    二元搜索算法(分治法)
    循环队列(弥补队列顺序储存的不足)
    队列的顺序储存
  • 原文地址:https://www.cnblogs.com/wongbingming/p/10392853.html
Copyright © 2011-2022 走看看