为了账号安全,请及时绑定邮箱和手机立即绑定
慕课网数字资源数据库体验端
python进阶_学习笔记_慕课网
为了账号安全,请及时绑定邮箱和手机立即绑定

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
  • @new_fn                def f1(x):

    def f1(x):                      return x*2

        return x*2  等于  f1=new_fn(f1)

    查看全部
  • 要让 @log 自适应任何参数定义的函数,可以利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用:

    def log(f):
        def fn(*args, **kw):
            print 'call ' + f.__name__ + '()...'
            return f(*args, **kw)
        return fn

    现在,对于任意函数,@log 都能正常工作


    查看全部
  • def myabs():
        return abs   # 返回函数def myabs2(x):
        return abs(x)   # 返回函数调用的结果,返回值是一个数值


    查看全部
  • sorted()是一个高阶函数, 可以直接用来排序。

    实现倒序排序,需要编写一个reversed_cmp函数:

    def reversed_cmp(x, y):
        if x > y:
            return -1
        if x < y:
            return 1
        return 0

    sorted()也可以对字符串进行排序,字符串默认按照ASCII大小来比较

    查看全部
  • 按照python3的习惯,写作class Person:即不加(obejct)

    再写super(Teacher, self).__init__(name, gender)的时候,会被提示错误:

    Traceback (most recent call last):
      File "index.py", line 12, in
        t = Teacher('Alice', 'Female', 'English')
      File "index.py", line 9, in __init__
        super(Teacher, self).__init__(name, gender)
    TypeError: super() argument 1 must be type, not classobj


    查看全部
  • 打印日志:@log

    检测性能:@performance

    数据库事务:@transaction

    url路由:@post('/register')


    查看全部
  • 发现filter方法的两个参数只能是按照固定的顺序,第一个为函数,第二个为list

    查看全部
  • 57fc9dba0001487201000100-40-40.jpg qq_染上空白_04172504

    这两种写法有什么区别

    key=lambda x:x.name

    lambda p1,p2:cmp(p1.name,p2.name)

    这两种写法有什么区别,为什么第一种写法返回的是字符串,sorted不是返回值要是1、-1的吗

    2018-08-10源自:python进阶 4-3427 浏览1 回答

    最佳回答

    2018-08-10

    sorted(iterable[, cmp[, key[, reverse]]])

    sorted 这个函数接受这3个关键词,key表示排序的元素,比如一个人的信息,可以从名字排序,可以从年龄排序,这就是排序元素,所以设置key的话,返回字符串就行了。

    返回值1,-1是详细的对比规则,写在cmp里面。一般是大于为1,小于为-1,等于为0。

    reverse 是排序规则,正序为true,逆序为false。


    查看全部
  • for k ,v in kw.items():

                setattr(self, k ,v)

    关键字参数在函数内部组成一个dict,拥有Key-value,这段代码对实例过程中,job为key,student为value

    查看全部
  • 注意区分返回函数和返回值

    调用calc_sum()函数时,将立刻计算并得到结果

    查看全部
  • 2018-07-17源自:python进阶 2-14719 浏览3 回答

    最佳回答

    2018-07-18

    123456789101112def performance(unit):#创建带参数的decorator,其中unit为参数的形参    def perf_decorator(f):#定义装饰器函数         @functools.wraps(f)#将原函数f的所有属性复制到新函数wrapper              def wrapper(*args, **kw):#定义装饰函数             t1 = time.time()#记录函数开始时间                      = f(*args, **kw)#运行函数f                         t2 = time.time()#记录函数结束时间                         = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1)#计算函数f的运行时间                         print 'call %s() in %f %s' % (f.__name__, t, unit)#打印函数f的名称,运行时间以及所带参数的实参                         return r#调用原函数f         return wrapper#返回装饰函数    return perf_decorator#返回装饰器函数


    54584eff000195a302200220-80-80.jpg qq_天涯_81 

    +2积分什么是积分?

    举报 回复  19

    54585079000110f202200220-100-100.jpg

    qq_Burstsky_0 (提问者)

    非常感谢!

    #12018-07-18 回复 举报

    54585079000110f202200220-100-100.jpg

    qq_Burstsky_0 (提问者)

    能麻烦再解释下为什么要定义3层函数吗

    #22018-07-19 回复 举报

    54584eff000195a302200220-100-100.jpg

    qq_天涯_81 回复 qq_Burstsky_0

    因为要打印自定义的字符串呀,每层函数的参数都是不同的,第一层函数的参数是传入要打印的字符串,第二层函数的参数是原函数,第三层函数的参数是原函数的参数;定义两层的话,应该就只能打印固定的字符串了(函数名除外)


    查看全部
  • filter是个内置的比较好用的过滤函数,输入一个flag和一个list,利用flag来筛选list

    查看全部
  • r = f(*args, **kw)

    放中间,是为了在此操作前后记录时间戳,


    最赞回答 / Awful_Leo

    结合之前学过的闭包的内容,闭包实际上就是指两层函数,一层包着一层,外面那层传参数给里面那层用,这样做的意义是,要想用里层的函数,只能通过外层,不能直接使用,也就起到了保护的作用。装饰器在闭包的基础上,增加了实际的意义,比如用外层的函数辅助输出一些内容,像print一些日志出来,或者计算内部函数调用的时间,说到底是为内层函数服务的。而且装饰器不是为某一个函数服务的,而是为所有函数服务的,是一个通用的东西。里层的函数该怎么运行怎么运行,装饰器只是协助实现了某些辅助的功能,这也会它为什么叫装饰器,


    查看全部
  • def count():

        fs = []

        for i in range(1, 4):

            def f(j):

                def g():

                    return j*j

                return g

            fs.append(f(i))

        return fs


    f1, f2, f3 = count()

    print f1(), f2(), f3()


    def count1():

        fs = []

        for i in range(1, 4):

            def f(j):

                return j*j

            fs.append(f(i))

        return fs

        

    f1, f2, f3 = count1()

    print f1, f2, f3


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

    2019-04-02

  • 将 g 的定义移入函数 f 内部,防止其他代码调用 g:

    def f():
        print 'f()...'
        def g():
            print 'g()...'
        return g

    但是,考察上一小节定义的 calc_sum 函数:

    def calc_sum(lst):
        def lazy_sum():
            return sum(lst)
        return lazy_sum

    注意: 发现没法把 lazy_sum 移到 calc_sum 的外部,因为它引用了 calc_sum 的参数 lst。

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

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

    # 希望一次返回3个函数,分别计算1x1,2x2,3x3:def count():
        fs = []
        for i in range(1, 4):
            def f():
                 return i*i
            fs.append(f)
        return fs
    
    f1, f2, f3 = count()

    你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果全部都是 9(请自己动手验证)。

    原因就是当count()函数返回了3个函数时,这3个函数所引用的变量 i 的值已经变成了3。由于f1、f2、f3并没有被调用,所以,此时他们并未计算 i*i,当 f1 被调用时:

    >>> f1()
    9     # 因为f1现在才计算i*i,但现在i的值已经变为3

    因此,返回函数不要引用任何循环变量,或者后续会发生变化的变量。


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

    2019-04-02

举报

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

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