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

python进阶

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

    请给Person类的__init__方法中添加name和score参数,并把score绑定到__score属性上,看看外部是否能访问到。

     

    • ?不会了怎么办

    • 以双下划线开头的属性无法被外部访问,"__xxx__"除外。

      参考代码:

      class Person(object):
          def __init__(self, name, score):
              self.name = name
              self.__score = score
      
      p = Person('Bob', 59)
      
      print p.name
      print p.__score


  • 任务

    请定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。

     

    • ?不会了怎么办

    • 要定义关键字参数,使用 **kw;

      除了可以直接使用self.name = 'xxx'设置一个属性外,还可以通过 setattr(self, 'name', 'xxx') 设置属性。

      参考代码:

      class Person(object):
          def __init__(self, name, gender, birth, **kw):
              self.name = name
              self.gender = gender
              self.birth = birth
              for k, v in kw.iteritems():
                  setattr(self, k, v)
      xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')
      print xiaoming.name
      print xiaoming.job


  • 顺序:,x1 < x2(第一个元素小于第二个) 返回-1;

    倒序:,x1 < x2(第一个元素小于第二个) 返回1;

  • int(数字)  会计算出取整数后的值,默认十进制,向下取整
    判断一个数的平方根是否是整数:math.sqrt(x)==int(math.sqrt(x))

  • map():一个参数,是对所有元素调用f,生成新list

    reduce():两个参数

    reduce(function, iterable[, initializer])

    ,显示第一二调用f,再结果和第三调用f,以此类推

    filter():一个参数,过滤不符合条件的元素,符合条件的组成新的list


  • p1.get_grade 返回的是一个函数对象,但这个函数是一个绑定到实例的函数,p1.get_grade() 才是方法调用。

  • sum(iterable[, start])

    iterable -- 可迭代对象,如:列表、元组、集合。

    反例:

    print   map(sum,[1,2,3])  

    运行后报错:TypeError: 'int' object is not iterable

  • import functools


    def cmp_ignore_case(s1, s2):

        str1=s1.upper()

        str2=s2.upper()

        

        if str1 < str2:

            return -1

        if str1 > str2:

            return 1

        return 0


    sorted_ignore_case = functools.partial(sorted,cmp=cmp_ignore_case)



    print sorted_ignore_case(['bob', 'about', 'Zoo', 'Credit'])


  • 任务

    请定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。

     

    • ?不会了怎么办

    • 要定义关键字参数,使用 **kw;

      除了可以直接使用self.name = 'xxx'设置一个属性外,还可以通过 setattr(self, 'name', 'xxx') 设置属性。

      参考代码:

      class Person(object):
          def __init__(self, name, gender, birth, **kw):
              self.name = name
              self.gender = gender
              self.birth = birth
              for k, v in kw.iteritems():
                  setattr(self, k, v)
      xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')
      print xiaoming.name
      print xiaoming.job


  • 任务

    请创建包含两个 Person 类的实例的 list,并给两个实例的 name 赋值,然后按照 name 进行排序。

    • ?不会了怎么办

    • sorted() 是高阶函数,接受一个比较函数。

      参考代码:

      class Person(object):
          pass
      p1 = Person()
      p1.name = 'Bart'
      
      p2 = Person()
      p2.name = 'Adam'
      
      p3 = Person()
      p3.name = 'Lisa'
      
      L1 = [p1, p2, p3]
      L2 = sorted(L1, lambda p1, p2: cmp(p1.name, p2.name))
      
      print L2[0].name
      print L2[1].name
      print L2[2].name


  • 任务

    请练习定义Person类,并创建出两个实例,打印实例,再比较两个实例是否相等。

     

    • ?不会了怎么办

    • 要打印实例,直接使用print语句;

      要比较两个实例是否相等,用==操作符。

      参考代码:

      class Person(object):
          pass
      xiaoming = Person()
      xiaohong = Person()
      print xiaoming
      print xiaohong
      print xiaoming == xiaohong


  • 任务

    在Python 3.x中,字符串统一为unicode,不需要加前缀 u,而以字节存储的str则必须加前缀 b。请利用__future__的unicode_literals在Python 2.7中编写unicode字符串。

     

    • ?不会了怎么办

    • 使用from __future__ import unicode_literals将把Python 3.x的unicode规则带入Python 2.7中。

      参考代码:

      from __future__ import unicode_literals
      s = 'am I an unicode?'
      print isinstance(s, unicode)


  • 任务

    利用import ... as ...,还可以动态导入不同名称的模块。

    Python 2.6/2.7提供了json 模块,但Python 2.5以及更早版本没有json模块,不过可以安装一个simplejson模块,这两个模块提供的函数签名和功能都一模一样。

    试写出导入json 模块的代码,能在Python 2.5/2.6/2.7都正常运行。

    • ?不会了怎么办

    • 先尝试导入json,如果失败,再尝试导入simplejson as json

      参考代码:

      try:
          import json
      except ImportError:
          import simplejson as json
      print json.dumps({'python':2.7})


  • Python的os.path模块提供了 isdir() 和 isfile()函数,请导入该模块,并调用函数判断指定的目录和文件是否存在。

    注意: 

    1. 由于运行环境是平台服务器,所以测试的也是服务器中的文件夹和文件,该服务器上有/data/webroot/resource/python文件夹和/data/webroot/resource/python/test.txt文件,大家可以测试下。

    2. 当然,大家可以在本机上测试是否存在相应的文件夹和文件。

    import os
    print os.path.isdir(r'C:\Windows')
    print os.path.isfile(r'C:\Windows\notepad.exe')
    • ?不会了怎么办

    • 注意到os.path模块可以以若干种方式导入:

      import os
      import os.path
      from os import path
      from os.path import isdir, isfile

      每一种方式调用 isdir 和 isfile 都有所不同。

      参考代码:

      import os
      print os.path.isdir(r'/data/webroot/resource/python')
      print os.path.isfile(r'/data/webroot/resource/python/test.txt')


  • 任务

    在第7节中,我们在sorted这个高阶函数中传入自定义排序函数就可以实现忽略大小写排序。请用functools.partial把这个复杂调用变成一个简单的函数:

    sorted_ignore_case(iterable)
    • ?不会了怎么办

    • 要固定sorted()的cmp参数,需要传入一个排序函数作为cmp的默认值。

      参考代码:

      import functools
      sorted_ignore_case = functools.partial(sorted, cmp=lambda s1, s2: cmp(s1.upper(), s2.upper()))
      print sorted_ignore_case(['bob', 'about', 'Zoo', 'Credit'])


举报

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

微信扫码,参与3人拼团

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

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