作者:Luther Blissett 中文翻译:Tony Gu 问题 如何判断传递给函数或方法的参数是字符串(更准确的说,是否是“类字符串”对象)? 解决方法 判断是否是字符串或Unicode对象的一个简单快速的方法是使用Python内置的isinstance和basestring: def isAString(anobj): return isinstance(anobj, basestring) 讨论 对大多数的程序员来说,解决这类问题最先想到的办法就是类型判断: def isExactlyAString(anobj): return type(anobj) is type('') 但是这种方法很不好。因为它完全忽略了Python的一个强项:平滑的基于特征的多态性。这类判断将Unicode对象,用户自定义的str子类的实例,以及其它用户自定义的“类字符串"的实例排除在外。 而菜谱中提供的这种使用Python内置函数isinstance的方法就要好得多。内置类型basestring恰好能配合这种方法。basestring是str和unicode类型的共同基类,而用户自定义的作为basestring的子类的“类字符串”类型也能被上述的方法接受。basestring实际上是一个“空的”类型,就像object,所以继承它并不费周折。 但遗憾的是,这种看起来经典的isinstance判断法却无法接受UserString实例这种明显的“类字符串”对象,要知道UserString类来自于Python标准库中的UserString模块。原因当然是因为它不是继承自basestring.如果我们要支持这样的类型,直接判断对象的行为是否与字符串类似就可以了,比如: def isStringLike(anobj): try: anobj + '' except: return False else: return True 这个isStringLike函数要比“解决方法”中的isAString方法要复杂些,运行起来也慢一些,但是它确实在接受str和Unicode对象的同时也能接受UserString类和其他“类字符串”类型的实例。 Python类型判断的的一般方法被称作“类鸭判断”:如果它走起来象鸭子,叫起来象鸭子,那么对我们来说它已经足够“类鸭”了。isStringLike函数只做到了叫得象鸭子这个程度,或许这也就足够了。如果你需要检测anobj对象更多的类字符串特征,只要简单的在try语句的表达式中添加更多相关属性判断,比如: try: anobj.lower()+anobj+ '' 按照我的经验,象isStringLike函数这样的简单判断就已经足够了。 对于类型校验(或其他校验任务)最Python式的方法就是直接尝试执行需要作的任何任务,同时检测并处理任何因为某些特殊场合而产生的错误或异常。这种方法叫做“先做再纠错”(EAFP--"It's easy to ask forgiveness than permission'")。try/except是使用这种EAFP的关键工具。一般情况下,正如本文中的例子,我们只选择使用很简单的判断任务,(比如,连接一个空字串),而不用去处理全部的对象属性(比如字符串对象所有的操作和方法)。 参见 Pyhton的函数库参考的关于isinstance和basestring的内容,和Python in a Nutshell 网络书签
(,“,‘,[符号的自动闭合 我们可以用简单的键映射来实现以上这些成对符号的闭合,也就是在插入模式下输入这些符号的左边部分,键映射将自动完成右边部分,并保持插入模式,光标保持在成对符号的当中以便在其中输入字符。比如: :inoremap ( ()<Esc>i 以上的设置的意思是在插入模式时将输入的(转换为()然后回到正常模式,再用i回到插入模式,这时候光标位置正好落在)之前。同理可以完成其它符号的自动闭合。 但是这样的设置,在完成在成对符号中的输入后,要跳出成对符号继续输入时还是不方便。下面的方法就可以来解决这个问题: ... :inoremap ( ()<Esc>:let leavechar=")"<CR>i :inoremap [ []<Esc>:let leavechar="]"<CR>i ... :imap <C-l> <Esc>:exec "normal f" .leavechar<CR>a 这里的设置分两段,第一段在之前提到的方法上又加了: let leavechar=")"<CR> 这里表示在闭合符号的同时,将对应的右侧符号附给leavechar这个变量,<CR>表示回车。 第二段中的<C-l>表示CTRL+l,exec "normal f" .leavechar<CR>a表示在正常模式下用命令f来定位到leavechar中所保存的字符,然后用a命令在其后插入光标,这样就做到了跳出成对符号继续编辑的要求。 对现有的文字添加成对符号 有的时候我们需要对已经输入的字符加上成对符号。 一般情况是我们选中一段文字然后对其加上成对符号,我们可以这样来实现: :vnoremap ( <Esc>`>a)<Esc>`<i(<Esc> 这里要注意的是`>和`<的用法,前者表示定位到所选区域的最后一个字符,而后者表示定位到所选区域的最后一个字符,这样就能在所选区域的开头和结尾加上成对符号了。 根据上面的说明,我们可以根据需要将这些设置写入VIM的设置文件.vimrc里,这样就可以让Vim来简化我们的输入操作了。 网络书签
作者:Luther Blissett 中文翻译: Tony Gu(digitalsatori) 问题 将字符转换为ASCII(ISO)或Unicode编码的数字编码,或反之 解决办法 内置函数ord和chr就是专为此而设的: >>> print ord('a') 97 >>> print chr(97) a 内置函数ord也可以接受长度为1的Unicode字符串,它可以返回最大到65536的Unicode编码值。如果要从Unicode的数字编码获取Unicode字符串就要用到内置函数unichr: >>>print ord(u'u2020') 8224 >>>print repr(unichr(8224)) u'\u2020' 讨论 内置函数ord, chr和unichr可以将字符或Unicode字符转变为相应的数字编码,或者相反。注意:chr(n)和str(n)的区别,这是初学者经常会混淆的: >>> print repr(chr(97)) 'a' >>> print repr(str(97)) '97' chr将参数中的整数转换并根据ASCII编码返回对应的字符,而str返回的是这个整数的10进制数的字符串。 要将一个字符串转变为字符编码值的列表,可以同时使用内置函数map和ord来完成: >>> print map(ord, 'ciao') [99, 105, 97, 111] 要将字符编码值的一个列表转换为字符串,需要使用''.join,map和chr: >>> print ''.join(map(chr, range(97, 100))) abc 参见 Python函数库参考手册关于内置函数chr,ord,unichr的内容,Python in [...]
如果你正气急败坏的在屏幕上双击打开一个又一个的文件夹疯狂寻找你两年前保存的关于“如何烹制独一无二的番茄炒蛋”的文章;如果你正盯着电脑上混乱如麻的文件夹,想把分散在各处的叫“菜谱XXX”的文件归并到一处,却无所适从时;如果你... “嗨,这位使用Linux的大厨兄,别忙了,是时候学习一下Linux众多优秀文件管理工具中非常实用,趁手的一个了。find命令可以让您非常从容,优雅的按照您的吩咐来匹配相关的文件或目录(文件夹),并对其实施指定的操作。 find命令语法 find . -name foo -print 这个命令的意思是从当前目录开始搜索带有“foo“的文件并显示出来。 注:在多数的Linux版本中-print可以省略。 find的常用语法: find 起始目录 搜寻条件 如果命令中没有设置起始目录,find会默认使用当前目录作为起始目录。你可以定义多个起始目录,比如: find /usr /home /tmp -name "*.jar" 该命令会在/usr, /home, /tmp三个目录及其子目录下搜索带有“.jar“的文件。如果您对某些要搜索的起始目录及其子目录没有访问权限,在搜索过程中会生成错误消息,比如: find: /root/protected: Permission denied 这样的出错信息会与搜索结果的输出混在一起。我们可以象如下这样过滤掉这些错误信息,以获得“干净”的搜索结果。 注:2>/dev/null 用来将出错信息重定向到空文件,从而不在屏幕上显示 find /usr /home /tmp -name "*.jar" 2>/dev/null 注:在上面的例子中通配符都需要括在引号中或用转义符(\)转义,比如上例也可以表示为: find /usr /home /tmp -name \*.jar find搜寻条件的逻辑及顺序 搜寻条件可以是多个条件组成的复合条件,可以由逻辑运算符and, or , not来连接: and: 逻辑与,在命令中用"-a"表示,是系统的缺省选项,表示只有当所给的条件都满足时,搜寻条件才满足。例如: find /prj/reports -type [...]













