Python语句、函数与方法的使用技巧总结.doc

上传人:jian****018 文档编号:9549865 上传时间:2020-04-06 格式:DOC 页数:18 大小:188.50KB
返回 下载 相关 举报
Python语句、函数与方法的使用技巧总结.doc_第1页
第1页 / 共18页
Python语句、函数与方法的使用技巧总结.doc_第2页
第2页 / 共18页
Python语句、函数与方法的使用技巧总结.doc_第3页
第3页 / 共18页
点击查看更多>>
资源描述
Python语句、函数与方法的使用技巧总结显示有限的接口到外部当发布python第三方package时,并不希望代码中所有的函数或者class可以被外部import,在_init_.py中添加_all_属性,该list中填写可以import的类或者函数名, 可以起到限制的import的作用, 防止外部import其他函数或者类。#!/usr/bin/env python# -*- coding: utf-8 -*-from base import APIBasefrom client import Clientfrom decorator import interface, export, streamfrom server import Serverfrom storage import Storagefrom util import (LogFormatter, disable_logging_to_stderr, enable_logging_to_kids, info)_all_ = APIBase, Client, LogFormatter, Server,Storage, disable_logging_to_stderr, enable_logging_to_kids,export, info, interface, streamwith的魔力with语句需要支持上下文管理协议的对象, 上下文管理协议包含_enter_和_exit_两个方法。 with语句建立运行时上下文需要通过这两个方法执行进入和退出操作。其中上下文表达式是跟在with之后的表达式, 该表达式返回一个上下文管理对象。# 常见with使用场景with open(test.txt, r) as my_file: # 注意, 是_enter_()方法的返回值赋值给了my_file, for line in my_file: print line知道具体原理,我们可以自定义支持上下文管理协议的类,类中实现_enter_和_exit_方法。#!/usr/bin/env python# -*- coding: utf-8 -*-class MyWith(object): def _init_(self): print _init_ method def _enter_(self): print _enter_ method return self # 返回对象给as后的变量 def _exit_(self, exc_type, exc_value, exc_traceback): print _exit_ method if exc_traceback is None: print Exited without Exception return True else: print Exited with Exception return Falsedef test_with(): with MyWith() as my_with: print running my_with print -分割线- with MyWith() as my_with: print running before Exception raise Exception print running after Exceptionif _name_ = _main_: test_with()执行结果如下:_init_ method_enter_ methodrunning my_with_exit_ methodExited without Exception-分割线-_init_ method_enter_ methodrunning before Exception_exit_ methodExited with ExceptionTraceback (most recent call last): File bin/python, line 34, in exec(compile(_file_f.read(), _file_, exec) File test_with.py, line 33, in test_with() File test_with.py, line 28, in test_with raise ExceptionException证明了会先执行_enter_方法, 然后调用with内的逻辑, 最后执行_exit_做退出处理, 并且, 即使出现异常也能正常退出filter的用法相对filter而言, map和reduce使用的会更频繁一些, filter正如其名字, 按照某种规则过滤掉一些元素。#!/usr/bin/env python# -*- coding: utf-8 -*-lst = 1, 2, 3, 4, 5, 6# 所有奇数都会返回True, 偶数会返回False被过滤掉print filter(lambda x: x % 2 != 0, lst)#输出结果1, 3, 5一行作判断当条件满足时, 返回的为等号后面的变量, 否则返回else后语句。lst = 1, 2, 3new_lst = lst0 if lst is not None else Noneprint new_lst# 打印结果1装饰器之单例使用装饰器实现简单的单例模式# 单例装饰器def singleton(cls): instances = dict() # 初始为空 def _singleton(*args, *kwargs): if cls not in instances: #如果不存在, 则创建并放入字典 instancescls = cls(*args, *kwargs) return instancescls return _singletonsingletonclass Test(object): passif _name_ = _main_: t1 = Test() t2 = Test() # 两者具有相同的地址 print t1, t2staticmethod装饰器类中两种常用的装饰, 首先区分一下他们:普通成员函数, 其中第一个隐式参数为对象classmethod装饰器, 类方法(给人感觉非常类似于OC中的类方法), 其中第一个隐式参数为类staticmethod装饰器, 没有任何隐式参数. python中的静态方法类似与C+中的静态方法#!/usr/bin/env python# -*- coding: utf-8 -*-class A(object): # 普通成员函数 def foo(self, x): print executing foo(%s, %s) % (self, x) classmethod # 使用classmethod进行装饰 def class_foo(cls, x): print executing class_foo(%s, %s) % (cls, x) staticmethod # 使用staticmethod进行装饰 def static_foo(x): print executing static_foo(%s) % xdef test_three_method(): obj = A() # 直接调用噗通的成员方法 obj.foo(para) # 此处obj对象作为成员函数的隐式参数, 就是self obj.class_foo(para) # 此处类作为隐式参数被传入, 就是cls A.class_foo(para) #更直接的类方法调用 obj.static_foo(para) # 静态方法并没有任何隐式参数, 但是要通过对象或者类进行调用 A.static_foo(para)if _name_ = _main_: test_three_method() # 函数输出executing foo(, para)executing class_foo(, para)executing class_foo(, para)executing static_foo(para)executing static_foo(para)property装饰器定义私有类属性将property与装饰器结合实现属性私有化(更简单安全的实现get和set方法)。#python内建函数property(fget=None, fset=None, fdel=None, doc=None)fget是获取属性的值的函数,fset是设置属性值的函数,fdel是删除属性的函数,doc是一个字符串(像注释一样)。从实现来看,这些参数都是可选的。property有三个方法getter(), setter()和delete() 来指定fget, fset和fdel。 这表示以下这行:class Student(object): property #相当于property.getter(score) 或者property(score) def score(self): return self._score score.setter #相当于score = property.setter(score) def score(self, value): if not isinstance(value, int): raise ValueError(score must be an integer!) if value 100: raise ValueError(score must between 0 100!) self._score = valueiter魔法通过yield和_iter_的结合,我们可以把一个对象变成可迭代的通过_str_的重写, 可以直接通过想要的形式打印对象#!/usr/bin/env python# -*- coding: utf-8 -*-class TestIter(object): def _init_(self): self.lst = 1, 2, 3, 4, 5 def read(self): for ele in xrange(len(self.lst): yield ele def _iter_(self): return self.read() def _str_(self): return ,.join(map(str, self.lst) _repr_ = _str_def test_iter(): obj = TestIter() for num in obj: print num print objif _name_ = _main_: test_iter()神奇partialpartial使用上很像C+中仿函数(函数对象)。在stackoverflow给出了类似与partial的运行方式:def partial(func, *part_args): def wrapper(*extra_args): args = list(part_args) args.extend(extra_args) return func(*args) return wrapper利用用闭包的特性绑定预先绑定一些函数参数,返回一个可调用的变量, 直到真正的调用执行:#!/usr/bin/env python# -*- coding: utf-8 -*-from functools import partialdef sum(a, b): return a + bdef test_partial(): fun = partial(sum, 2) # 事先绑定一个参数, fun成为一个只需要一个参数的可调用变量 print fun(3) # 实现执行的即是sum(2, 3)if _name_ = _main_: test_partial() # 执行结果5神秘evaleval我理解为一种内嵌的python解释器(这种解释可能会有偏差), 会解释字符串为对应的代码并执行, 并且将执行结果返回。看一下下面这个例子:#!/usr/bin/env python# -*- coding: utf-8 -*-def test_first(): return 3def test_second(num): return numaction = # 可以看做是一个sandbox para: 5, test_first : test_first, test_second: test_second def test_eavl(): condition = para = 5 and test_second(test_first) 5 res = eval(condition, action) # 解释condition并根据action对应的动作执行 print resif _name_ = _execexec在Python中会忽略返回值, 总是返回None, eval会返回执行代码或语句的返回值exec和eval在执行代码时, 除了返回值其他行为都相同在传入字符串时, 会使用compile(source, , mode)编译字节码。 mode的取值为exec和eval#!/usr/bin/env python# -*- coding: utf-8 -*-def test_first(): print hellodef test_second(): test_first() print seconddef test_third(): print thirdaction = test_second: test_second, test_third: test_third def test_exec(): exec test_second in actionif _name_ = _main_: test_exec() # 无法看到执行结果getattrgetattr(object, name, default)返回对象的命名属性,属性名必须是字符串。如果字符串是对象的属性名之一,结果就是该属性的值。例如, getattr(x, foobar) 等价于 x.foobar。 如果属性名不存在,如果有默认值则返回默认值,否则触发 AttributeError 。# 使用范例class TestGetAttr(object): test = test attribute def say(self): print test methoddef test_getattr(): my_test = TestGetAttr() try: print getattr(my_test, test) except AttributeError: print Attribute Error! try: getattr(my_test, say)() except AttributeError: # 没有该属性, 且没有指定返回值的情况下 print Method Error!if _name_ = _main_: test_getattr() # 输出结果test attributetest method命令行处理def process_command_line(argv): Return a 2-tuple: (settings object, args list). argv is a list of arguments, or None for sys.argv1:. if argv is None: argv = sys.argv1: # initialize the parser object: parser = optparse.OptionParser( formatter=optparse.TitledHelpFormatter(width=78), add_help_option=None) # define options here: parser.add_option( # customized description; put -help last -h, -help, action=help, help=Show this help message and exit.) settings, args = parser.parse_args(argv) # check number of arguments, verify values, etc.: if args: parser.error(program takes no command-line arguments; %s ignored. % (args,) # further process settings & args if necessary return settings, argsdef main(argv=None): settings, args = process_command_line(argv) # application code here, like: # run(settings, args) return 0 # successif _name_ = _main_: status = main() sys.exit(status)读写csv文件# 从csv中读取文件, 基本和传统文件读取类似import csvwith open(data.csv, rb) as f: reader = csv.reader(f) for row in reader: print row# 向csv文件写入import csvwith open( data.csv, wb) as f: writer = csv.writer(f) writer.writerow(name, address, age) # 单行写入 data = ( xiaoming ,china,10), ( Lily, USA, 12) writer.writerows(data) # 多行写入各种时间形式转换只发一张网上的图, 然后查文档就好了, 这个是记不住的
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!