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

python进阶

廖雪峰 移动开发工程师
难度中级
时长 3小时33分
学习人数
综合评分9.20
575人评价 查看评价
9.6 内容实用
9.0 简洁易懂
9.0 逻辑清晰
  • >>> import types >>> def fn_get_grade(self): if self.score >= 80: return 'A' if self.score >= 60: return 'B' return 'C' >>> class Person(object): def __init__(self, name, score): self.name = name self.score = score >>> p1 = Person('Bob', 90) >>> p1.get_grade = fn_get_grade >>> print(p1.get_grade()) Traceback (most recent call last): File "<pyshell#15>", line 1, in <module> print(p1.get_grade()) TypeError: fn_get_grade() missing 1 required positional argument: 'self' >>> del p1.get_grade >>> del p1.get_grade Traceback (most recent call last): File "<pyshell#17>", line 1, in <module> del p1.get_grade AttributeError: get_grade >>> p1.get_grade = types.MethodType(fn_get_grade, p1, Person) Traceback (most recent call last): File "<pyshell#18>", line 1, in <module> p1.get_grade = types.MethodType(fn_get_grade, p1, Person) TypeError: method expected 2 arguments, got 3 >>> p1.get_grade = types.MethodType(fn_get_grade, p1) >>> p1.get_grade() 'A'
    查看全部
  • 要定义关键字参数,使用 **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
    查看全部
  • 要正确使用闭包,就要确保引用的局部变量在函数返回后不能变,例如i是变量,x = i 即可保留一个常量x
    查看全部
    0 采集 收起 来源:python中闭包

    2015-05-05

  • def calc_prod(lst): def multi(x, y): return x*y def prod(): return reduce(multi, lst) return prod f = calc_prod([1, 2, 3, 4]) print f()
    查看全部
  • return function def calc_sum(lst): def lazy_sum(): return sum(lst) return lazy_sum
    查看全部
  • 对Pool对象调用join()方法会等待所有子进程执行完毕,调用join()之前必须先调用close(),调用close()之后就不能继续添加新的Process了。 请注意输出的结果,task 0,1,2,3是立刻执行的,而task 4要等待前面某个task完成后才执行, 这是因为Pool的默认大小在我的电脑上是4,因此,最多同时执行4个进程。这是Pool有意设计的限制,并不是操作系统的限制。如果改成: p = Pool(5) 就可以同时跑5个进程。 python进程间通信 from multiprocessing import Process, Queue import os, time, random # 写数据进程执行的代码: def write(q): for value in ['A', 'B', 'C']: print 'Put %s to queue...' % value q.put(value) time.sleep(random.random()) # 读数据进程执行的代码: def read(q): while True: value = q.get(True) print 'Get %s from queue.' % value if __name__=='__main__': # 父进程创建Queue,并传给各个子进程: q = Queue() pw = Process(target=write, args=(q,)) pr = Process(target=read, args=(q,)) # 启动子进程pw,写入: pw.start() # 启动子进程pr,读取: pr.start() # 等待pw结束: pw.join() # pr进程里是死循环,无法等待其结束,只能强行终止: pr.terminate() 运行结果如下: Put A to queue... Get A from queue. Put B to queue... Get B from queue. Put C to queue... Get C from queue.
    查看全部
  • 如果要启动大量的子进程,可以用进程池的方式批量创建子进程: from multiprocessing import Pool import os, time, random def long_time_task(name): print 'Run task %s (%s)...' % (name, os.getpid()) start = time.time() time.sleep(random.random() * 3) end = time.time() print 'Task %s runs %0.2f seconds.' % (name, (end - start)) if __name__=='__main__': print 'Parent process %s.' % os.getpid() p = Pool() for i in range(5): p.apply_async(long_time_task, args=(i,)) print 'Waiting for all subprocesses done...' p.close() p.join() print 'All subprocesses done.' Parent process 669. Waiting for all subprocesses done... Run task 0 (671)... Run task 1 (672)... Run task 2 (673)... Run task 3 (674)... Task 2 runs 0.14 seconds. Run task 4 (673)... Task 1 runs 0.27 seconds. Task 3 runs 0.86 seconds. Task 0 runs 1.41 seconds. Task 4 runs 1.91 seconds. All subprocesses done.
    查看全部
  • python 多进程: # multiprocessing.py import os print 'Process (%s) start...' % os.getpid() pid = os.fork() //只有在linux下才能运行。 if pid==0: print 'I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()) else: print 'I (%s) just created a child process (%s).' % (os.getpid(), pid) multiprocessing模块就是跨平台版本的多进程模块。 from multiprocessing import Process import os # 子进程要执行的代码 def run_proc(name): print 'Run child process %s (%s)...' % (name, os.getpid()) if __name__=='__main__': print 'Parent process %s.' % os.getpid() p = Process(target=run_proc, args=('test',)) //windows 下也可用这种方法。 print 'Process will start.' p.start() p.join() print 'Process end.' 创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动,这样创建进程比fork()还要简单。 join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。
    查看全部
  • 1、变量可以指向函数; 函数名是指向函数的变量; f = abs; f(-20); 2、高阶函数:能接收函数作为参数 因为变量可以指向函数,接收变量即接收了函数 3 >>> def add(x,y,f): return f(x)-f(y) >>> add(-5,9,abs) -4
    查看全部
  • python支持的函数式编程 1、不是纯的函数式编程,允许有变量 2、支持高阶函数:函数可以作为变量传入 3、支持闭包:有了闭包就可以返回函数 4、有限度的支持匿名函数
    查看全部
  • 有一点需要注意,就是反序列化得到的所有字符串对象默认都是unicode而不是str。由于JSON标准规定JSON编码是UTF-8, 所以我们总是能正确地在Python的str或unicode与JSON的字符串之间转换。 class的JSON序列化 import json class Student(object): def __init__(self, name, age, score): self.name = name self.age = age self.score = score s = Student('Bob', 20, 88) def student2dict(std): return { 'name': std.name, 'age': std.age, 'score': std.score } print(json.dumps(s, default=student2dict)) def dict2student(d): return Student(d['name'], d['age'], d['score']) json_str = '{"age": 20, "score": 88, "name": "Bob"}' print(json.loads(json_str, object_hook=dict2student)) <__main__.Student object at 0x10cd3c190>
    查看全部
  • 序列化: Python提供两个模块来实现序列化:cPickle和pickle。这两个模块功能是一样的,区别在于cPickle是C语言写的,速度快, try: import cPickle as pickle except ImportError: import pickle >>> d = dict(name='Bob', age=20, score=88) >>> pickle.dumps(d) //对象序列化 "(dp0\nS'age'\np1\nI20\nsS'score'\np2\nI88\nsS'name'\np3\nS'Bob'\np4\ns." >>> f = open('dump.txt', 'wb') >>> pickle.dump(d, f) //直接把对象序列化后写入文件 >>> f.close() >>> f = open('dump.txt', 'rb') >>> d = pickle.load(f) //反序列化 >>> f.close() >>> d {'age': 20, 'score': 88, 'name': 'Bob'} 如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML, 但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。 JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。 >>> import json >>> d = dict(name='Bob', age=20, score=88) >>> json.dumps(d) '{"age": 20, "score": 88, "name": "Bob"}' >>> json_str = '{"age": 20, "score": 88, "name": "Bob"}' >>> json.loads(json_str) {u'age': 20, u'score': 88, u'name': u'Bob'}
    查看全部
  • class Student(Person): def __init__(self, name, gender, score): super(Student, self).__init__(name, gender) self.score = score 一定要用 super(Student, self).__init__(name, gender) 去初始化父类,否则,继承自 Person 的 Student 将没有 name 和 gender。 函数super(Student, self)将返回当前类继承的父类,即 Person ,然后调用__init__()方法,注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出(也不能写)。
    查看全部
  • # 希望一次返回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 因此,返回函数不要引用任何循环变量,或者后续会发生变化的变量。 任务 返回闭包不能引用循环变量,请改写count()函数,让它正确返回能计算1x1、2x2、3x3的函数。 ?不会了怎么办 考察下面的函数 f: def f(j): def g(): return j*j return g 它可以正确地返回一个闭包g,g所引用的变量j不是循环变量,因此将正常执行。 在count函数的循环内部,如果借助f函数,就可以避免引用循环变量i。 参考代码: def count(): fs = [] for i in range(1, 4): def f(j): def g(): return j*j return g r = f(i) fs.append(r) return fs f1, f2, f3 = count() print f1(), f2(), f3()
    查看全部
    1 采集 收起 来源:python中闭包

    2018-03-22

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

举报

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

微信扫码,参与3人拼团

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

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