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

python进阶

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

  • // 是地板除。即无论是什么类型的数据做除法都会舍去小数部分,而取比真正的商小的最接近的那个数。而/则是指 若两个整数相除 则进行地板除。若是浮点数类型相除,则进行传统除法。比如:1/2=0.5 

    如果想要让/在进行除法时,无论是整数相除还是浮点数相除都进行传统除法,那么需要添加from __future__ import division

  • 对于数学的余数和相关的数学算术不太了解 比如3除以10余数是多少 如何计算。此题中gcd的作用是什么?

  • 这是一个自定义排序函数!!!!!

  • __len__的使用

    class Fib(object):


        def __init__(self, num):

            self.num = num

            self.fibo = [0,1]

            i = 2

            while i < self.num:

                self.fibo.append(self.fibo[i-2] + self.fibo[i-1])

                i = i + 1

        

        def __str__(self):

            return str(self.fibo)


        def __len__(self):

            return len(self.fibo)


    f = Fib(10)

    print f

    print len(f)


  •  sorted()也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。

  • filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list

  • filter() 接收的函数必须判断出一个数的平方根是否是整数,而 math.sqrt()返回结果是浮点数float, 因此没法用isinstance(math.sqrt(x),int)来判断是否是整数,只能变相用均根取整再平方是否等于原数来判断

  • sorted()也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0

  • lambda匿名函数

    <!--此处有图片-->

    查看代码快照
  • 像这种内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)。



  •  s[0].upper() 变大写
     s[1:].lower() 变小写


  • def add(x,y,f):

        return f(x)+f(y)

    add(-5,9,abs)

    ->14

  • 匿名函数 lambda x: x * x 实际上就是:

    def f(x):
        return x * x
    关键字lambda 匿名函数有个限制,就是 返回函数的时候,也可以返回匿名函数:
    注:python2.7中,cmp(x,y) 函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。
    但是,python3.7中 
    cmp()已经不存在了,如果你需要实现比较功能,需要引入 operator 模块,适合任何对象
    >>> import operator
    >>> operator.eq('hello', 'name');
    False
    >>> operator.eq('hello', 'hello');
    True
  • def calc_sum(lst):
        def lazy_sum():
            return sum(lst)
        return lazy_sum
     注意:

    像这种内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)

    闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。

    考察下面的函数 f:

    def f(j):
        def g():
            return j*j
        return g

    它可以正确地返回一个闭包g,g所引用的变量j不是循环变量,因此将正常执行。

    在count函数的循环内部,如果借助f函数,就可以避免引用循环变量i。

  • #_*_coding:UTF-8_*_



    def format_name(s):

        a = s[:1].upper()

        b = s[1:].lower()

        c = a+b

        return c 


    print map(format_name, ['adam', 'LISA', 'barT'])

    #这里map函数的第二个参数表示的是分别传入3个字符串到format_name函数里。

    #而不是将list=['adam', 'LISA', 'barT']传入format_name

    #所以结果是调用3次format_name函数,并且参数分别是'adam', 'LISA', 'barT'


  • Rational类虽然可以做加法,但无法做减法、乘方和除法,请继续完善Rational类,实现四则运算。

    提示:
    减法运算:__sub__
    乘法运算:__mul__
    除法运算:__div__

    如果运算结果是 6/8,在显示的时候需要归约到最简形式3/4。

    参考代码:

    def gcd(a, b):
        if b == 0:
            return a
        return gcd(b, a % b)
    
    class Rational(object):
        def __init__(self, p, q):
            self.p = p
            self.q = q
        def __add__(self, r):
            return Rational(self.p * r.q + self.q * r.p, self.q * r.q)
        def __sub__(self, r):
            return Rational(self.p * r.q - self.q * r.p, self.q * r.q)
        def __mul__(self, r):
            return Rational(self.p * r.p, self.q * r.q)
        def __div__(self, r):
            return Rational(self.p * r.q, self.q * r.p)
        def __str__(self):
            g = gcd(self.p, self.q)
            return '%s/%s' % (self.p / g, self.q / g)
        __repr__ = __str__
    
    r1 = Rational(1, 2)
    r2 = Rational(1, 4)
    print r1 + r2
    print r1 - r2
    print r1 * r2
    print r1 / r2


  • 斐波那契数列是由 0, 1, 1, 2, 3, 5, 8...构成。

    请编写一个Fib类,Fib(10)表示数列的前10个元素,print Fib(10) 可以打印出数列的前 10 个元素,len(Fib(10))可以正确返回数列的个数10。

    需要根据num计算出斐波那契数列的前N个元素。

    参考代码:

    class Fib(object):
        def __init__(self, num):
            a, b, L = 0, 1, []
            for n in range(num):
                L.append(a)
                a, b = b, a + b
            self.numbers = L
    
        def __str__(self):
            return str(self.numbers)
    
        __repr__ = __str__
    
        def __len__(self):
            return len(self.numbers)
    
    f = Fib(10)
    print f
    print len(f)


  •  

    已有定义:

    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
    
    class Student(Person):
        def __init__(self, name, gender, score):
            super(Student, self).__init__(name, gender)
            self.score = score
        def whoAmI(self):
            return 'I am a Student, my name is %s' % self.name

    则:

    >>> dir(s)
    ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'gender', 'name', 'score', 'whoAmI']

    如何去掉`__xxx__`这类的特殊属性,只保留我们自己定义的属性?

    >>>filter(lambda x: not(x[0] == '_'), dir(s) )
    ['gender', 'name', 'score', 'whoAmI']


  • 由于属性可以是普通的值对象,如 str,int 等,也可以是方法,还可以是函数,大家看看下面代码的运行结果,请想一想 p1.get_grade 为什么是函数而不是方法:

    class Person(object):
        def __init__(self, name, score):
            self.name = name
            self.score = score
            self.get_grade = lambda: 'A'
    
    p1 = Person('Bob', 90)
    print p1.get_grade
    print p1.get_grade()
    • 直接把 lambda 函数赋值给 self.get_grade 和绑定方法有所不同,函数调用不需要传入 self,但是方法调用需要传入 self


  • 请给 Person 类添加一个类属性 count,每创建一个实例,count 属性就加 1,这样就可以统计出一共创建了多少个 Person 的实例。

    由于创建实例必定会调用__init__()方法,所以在这里修改类属性 count 很合适。

    参考代码:

    class Person(object):
        count = 0
        def __init__(self, name):
            Person.count = Person.count + 1
            self.name = name
    p1 = Person('Bob')
    print Person.count# => 1p2 = Person('Alice')
    print Person.count# => 2p3 = Person('Tim')
    print Person.count# => 3


  • 请定义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


  • filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。

  • 注意: s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。

    当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' '),如下:


  • reduce()对list的每个元素反复调用函数f,并返回最终结果值。

首页上一页1234567下一页尾页

举报

0/150
提交
取消
课程须知
本课程是Python入门的后续课程 1、掌握Python编程的基础知识 2、掌握Python函数的编写 3、对面向对象编程有所了解更佳
老师告诉你能学到什么?
1、什么是函数式编程 2、Python的函数式编程特点 3、Python的模块 4、Python面向对象编程 5、Python强大的定制类
意见反馈 帮助中心 APP下载
官方微信
友情提示:

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