为了账号安全,请及时绑定邮箱和手机立即绑定

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
学习人数
综合评分9.20
575人评价 查看评价
9.6 内容实用
9.0 简洁易懂
9.0 逻辑清晰
  • python中创建类属性

    类是模板,而实例则是根据类创建的对象。

    绑定在一个实例上的属性不会影响其他实例,但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!也就是说,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

    定义类属性可以直接在 class 中定义:

    class Person(object):     address = 'Earth'     def __init__(self, name):         self.name = name

    因为类属性是直接绑定在类上的,所以,访问类属性不需要创建实例,就可以直接访问:

    print Person.address # => Earth

    对一个实例调用类的属性也是可以访问的,所有实例都可以访问到它所属的类的属性:

    p1 = Person('Bob') p2 = Person('Alice') print p1.address # => Earth print p2.address # => Earth

    由于Python是动态语言,类属性也是可以动态添加和修改的:

    Person.address = 'China' print p1.address # => 'China' print p2.address # => 'China'

    因为类属性只有一份,所以,当Person类的address改变时,所有实例访问到的类属性都改变了。


    查看全部
  • python中访问限制

    我们可以给一个实例绑定很多属性,如果有些属性不希望被外部访问到怎么办?

    Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。看例子:

    class Person(object):     def __init__(self, name):         self.name = name         self._title = 'Mr'         self.__job = 'Student' p = Person('Bob') print p.name # => Bob print p._title # => Mr print p.__job # => Error Traceback (most recent call last):   File "<stdin>", line 1, in <module> AttributeError: 'Person' object has no attribute '__job'

    可见,只有以双下划线开头的"__job"不能直接被外部访问。

    但是,如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"__xxx__"定义。

    以单下划线开头的属性"_xxx"虽然也可以被外部访问,但是,按照习惯,他们不应该被外部访问


    查看全部
  • python中初始化实例属性

    虽然我们可以自由地给一个实例绑定各种属性,但是,现实世界中,一种类型的实例应该拥有相同名字的属性。例如,Person类应该在创建的时候就拥有 name、gender 和 birth 属性,怎么办?

    在定义 Person 类时,可以为Person类添加一个特殊的__init__()方法,当创建实例时,__init__()方法被自动调用,我们就能在此为每个实例都统一加上以下属性:

    class Person(object):     def __init__(self, name, gender, birth):         self.name = name         self.gender = gender         self.birth = birth

    __init__() 方法的第一个参数必须是 self(也可以用别的名字,但建议使用习惯用法),后续参数则可以自由指定,和定义函数没有任何区别。

    相应地,创建实例时,就必须要提供除 self 以外的参数:

    xiaoming = Person('Xiao Ming', 'Male', '1991-1-1') xiaohong = Person('Xiao Hong', 'Female', '1992-2-2')

    有了__init__()方法,每个Person实例在创建时,都会有 name、gender 和 birth 这3个属性,并且,被赋予不同的属性值,访问属性使用.操作符:

    print xiaoming.name # 输出 'Xiao Ming' print xiaohong.birth # 输出 '1992-2-2'

    要特别注意的是,初学者定义__init__()方法常常忘记了 self 参数:

    >>> class Person(object): ...     def __init__(name, gender, birth): ...         pass ...  >>> xiaoming = Person('Xiao Ming', 'Male', '1990-1-1') Traceback (most recent call last):   File "<stdin>", line 1, in <module> TypeError: __init__() takes exactly 3 arguments (4 given)

    这会导致创建失败或运行不正常,因为第一个参数name被Python解释器传入了实例的引用,从而导致整个方法的调用参数位置全部没有对上。


    查看全部
  • python中创建实例属性

    虽然可以通过Person类创建出xiaoming、xiaohong等实例,但是这些实例看上除了地址不同外,没有什么其他不同。在现实世界中,区分xiaoming、xiaohong要依靠他们各自的名字、性别、生日等属性。

    如何让每个实例拥有各自不同的属性?由于Python是动态语言,对每一个实例,都可以直接给他们的属性赋值,例如,给xiaoming这个实例加上name、genderbirth属性:

    xiaoming = Person() xiaoming.name = 'Xiao Ming' xiaoming.gender = 'Male' xiaoming.birth = '1990-1-1'

    xiaohong加上的属性不一定要和xiaoming相同:

    xiaohong = Person() xiaohong.name = 'Xiao Hong' xiaohong.school = 'No. 1 High School' xiaohong.grade = 2

    实例的属性可以像普通变量一样进行操作:

    xiaohong.grade = xiaohong.grade + 1


    查看全部
  • # sorted() 函数是能给一个指定参数按照大小进行排序
    #创建一个函数,作用是将参数 t 的内容全部转换为小写
    def cmp_ignore_case(t):
        return t.lower()
        
    #调用 sorted()函数,将后面的参数列表全部调用 cmp_ignore_case 函数后进行大小排序,在这里, key 也是一个参数,或者说是一个指令 True
    print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=cmp_ignore_case))


    查看全部
  • # sorted() 函数是可以根据大小进行排序的函数
    
    #创建一个函数,作用是将 参数的 所有字母全部转换为小写
    def cmp_ignore_case(s1,s2):
        #给 函数内的 s1 和 s2 参数赋值,并调用 sorted() 函数转换为小写
        a = s1.lower()
        b = s2.lower()
        #比较 a 和 b 的大小,包括字母 a~z 排序
        #如果 a 应该排在 b 的后面,返回 -1,
        if a > b :
            return 1
        #如果 a 应该排在 b 的前面,返回 -1,
        if a < b :
            return -1
        #如果 a 和 b 相等,返回 0。
        return 0
    
    #调用 sorted()函数,返回后面参数的排序,至于后面的函数 cmp_ignore_case,是用来调用参数的
    print(sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case))


    查看全部
  • python中动态导入模块

    如果导入的模块不存在,Python解释器会报 ImportError 错误:

    >>> import something Traceback (most recent call last):   File "<stdin>", line 1, in <module> ImportError: No module named something

    有的时候,两个不同的模块提供了相同的功能,比如 StringIO 和 cStringIO 都提供了StringIO这个功能。

    这是因为Python是动态语言,解释执行,因此Python代码运行速度慢。

    如果要提高Python代码的运行速度,最简单的方法是把某些关键函数用 C 语言重写,这样就能大大提高执行速度。

    同样的功能,StringIO 是纯Python代码编写的,而 cStringIO 部分函数是 C 写的,因此 cStringIO 运行速度更快。

    利用ImportError错误,我们经常在Python中动态导入模块:

    try:     from cStringIO import StringIO except ImportError:     from StringIO import StringIO

    上述代码先尝试从cStringIO导入,如果失败了(比如cStringIO没有被安装),再尝试从StringIO导入。这样,如果cStringIO模块存在,则我们将获得更快的运行速度,如果cStringIO不存在,则顶多代码运行速度会变慢,但不会影响代码的正常执行。

    try 的作用是捕获错误,并在捕获到指定错误时执行 except 语句。


    查看全部
  • python之导入模块

    要使用一个模块,我们必须首先导入该模块。Python使用import语句导入一个模块。例如,导入系统自带的模块 math:

    import math

    你可以认为math就是一个指向已导入模块的变量,通过该变量,我们可以访问math模块中所定义的所有公开的函数、变量和类:

    >>> math.pow(2, 0.5) # pow是函数 1.4142135623730951 >>> math.pi # pi是变量 3.141592653589793

    如果我们只希望导入用到的math模块的某几个函数,而不是所有函数,可以用下面的语句:

    from math import pow, sin, log

    这样,可以直接引用 pow, sin, log 这3个函数,但math的其他函数没有导入进来:

    >>> pow(2, 10) 1024.0 >>> sin(3.14) 0.0015926529164868282

    如果遇到名字冲突怎么办?比如math模块有一个log函数,logging模块也有一个log函数,如果同时使用,如何解决名字冲突?

    如果使用import导入模块名,由于必须通过模块名引用函数名,因此不存在冲突:

    import math, logging print math.log(10)   # 调用的是math的log函数 logging.log(10, 'something')   # 调用的是logging的log函数

    如果使用 from...import 导入 log 函数,势必引起冲突。这时,可以给函数起个“别名”来避免冲突:

    from math import log from logging import log as logger   # logging的log现在变成了logger print log(10)   # 调用的是math的log logger(10, 'import from logging')   # 调用的是logging的log


    查看全部
  •  """
     s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。
     当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' '),如下:
    a = '     123'
    a.strip()
    结果:'123'
    a='\t\t123\r\n'
    a.strip()
    结果:'123'
    """


    查看全部
  • # import 调用 math 模块,计算平方根
    import math
    
    #创建一个函数,返回结果是计算 一个数值本身是不是另一个整数的平方根
    def is_sqr(x) :
        return int(math.sqrt(x)) * int(math.sqrt(x)) == x
    
    # 调用 filter()函数,filter()是根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
    #格式是: filter(<过滤条件>,<过滤内容>)
    
    #根据 filter() 函数过滤掉列表 1~100 中不符合 is_sqr() 函数条件的值
    print(filter(is_sqr,range(1,101)))


    查看全部
  • (1)模块的名字就是py名字的文件名;

    (2)引用其他模块,如下:

    http://img1.sycdn.imooc.com//5d9d96fc0001e36f08370384.jpg

    (3)解决模块同名的方法,将同名的模块放入不同的包中:

    http://img1.sycdn.imooc.com//5d9d97a60001d65305820459.jpg

    (4)引用完整的模块:

    http://img1.sycdn.imooc.com//5d9d980a0001fbcc07430312.jpg

    (5)文件系统中:

    http://img1.sycdn.imooc.com//5d9d9856000138b206980390.jpg

    (6)如何区分包和普通目录,即使是空包也必须包含_init_.py:

    http://img1.sycdn.imooc.com//5d9d98af0001315e07680435.jpg


    查看全部
  • #因为 Python 3 的版本里没有内置函数 reduce 需要导入 functools 模块里的 reduce()函数
    from functools import reduce
    #定义一个函数,结果是返回两个参数的乘积
    def prod(x, y):
        return x * y
    
    #调用 reduce()函数,在本函数中它是从第一个参数 * 第二个参数开始获取乘积<2 * 4 * 5 * 7 * 12 >
    #格式是 reduce(<转换方式>,[转换列表])
    print(reduce(prod, [2, 4, 5, 7, 12]))


    查看全部
  • #定义一个函数,返回的结果是首字母大写,其余字母全部小写
    def format_name(s):
        #用索引的方式调用 参数 s 的第1个值 s[0],在调用 upper()函数将 s[0] 位置的元素转换为大写,之后用运算符号 + 连接剩下的元素。再次用索引调用 参数 s 除 s[0] 之外的所有值 s[:1] ,最后再用 lower()函数将剩下的元素全部转换为小写 s[1:].lower()
        return s[0].upper() + s[1:].lower()
        
    # 调用 map()函数将原列表的元素利用 format_name(s) 函数格式化后返回一个新列表
    # 格式为 map(<转换方式函数>,[<转换内容>])
    print(map(format_name, ['adam', 'LISA', 'barT']))


    查看全部
  • #导入 math 模块
    import math
    
    #定义一个函数,计算两个数字的平方根,并返回两个值的和
    def add(x, y, f):
        return f(x) + f(y)
        
    #调用 math()函数的 sqry()函数,sqrt()函数的作用是计算平方根
    print(add(25, 9, math.sqrt))


    查看全部
  • 重点,概念

    查看全部
    0 采集 收起 来源:python中闭包

    2020-02-12

举报

0/150
提交
取消
课程须知
本课程是Python入门的后续课程 1、掌握Python编程的基础知识 2、掌握Python函数的编写 3、对面向对象编程有所了解更佳
老师告诉你能学到什么?
1、什么是函数式编程 2、Python的函数式编程特点 3、Python的模块 4、Python面向对象编程 5、Python强大的定制类

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!