Python学习笔记5-闭合与生成器

 

>>> import re
>>> re.search('[abc]','mark')
<_sre.SRE_Match object; span=(1, 2), match='a'>

>>> re.sub('[abc]','o','Mark')
'Mork'
>>> re.sub('[abc]','o', 'carp')
'oorp'

 

import re

def plural(noun):
	if re.search('[sxz]$',noun):
		return re.sub('$','es',noun)
	elif re.search('[^aeioudgkprt]h$',noun): 
		return re.sub('$','es',noun)
	elif re.search('[^aeiou]y$',noun):
		return re.sub('y$','ies',noun)
	else:
		return noun+'s' 

 

注:

[abc] --匹配a,b,c中的任何一个字符

[^abc] -- 匹配除了a,b,c的任何字符

 

>>> import re
>>> re.search('[^aeiou]y$','vancancy')
<_sre.SRE_Match object; span=(6, 8), match='cy'>

>>> re.sub('y$','ies','vacancy')
'vacancies'
>>> re.sub('([^aeiou])y$',r'\1ies','vacancy')
'vacancies'

 注:

\1-- 表示将第一个匹配到的分组放入该位置。 如果有超过一个分组,则可用\2, \3等等。

 

函数列表:

 

a. 在动态函数中使用外部参数值的技术称为闭合。

import re

def build_match_and_apply_functions(pattern,search,replace):
	def matches_rule(word):
		return re.search(pattern,word)

	def apply_rule(word):
		return re.sub(search,replace,word)

	return (matches_rule,apply_rule)

 

b.

>>> patterns = (
	('[sxz]$','$', 'es'),
	('[aeioudgkprt]h$', '$', 'es'),
	('(qu|[^aeiou])y$', 'y$','ies'),
	('$', '$', 's')
	)

>>> rules = [build_match_and_apply_functions(pattern, search, replace) for (pattern, search, replace) in patterns]

>>> rules
[(<function build_match_and_apply_functions.<locals>.matches_rule at 0x10384d510>, <function build_match_and_apply_functions.<locals>.apply_rule at 0x10384d598>), (<function build_match_and_apply_functions.<locals>.matches_rule at 0x10384d620>, <function build_match_and_apply_functions.<locals>.apply_rule at 0x10384d6a8>), (<function build_match_and_apply_functions.<locals>.matches_rule at 0x10384d730>, <function build_match_and_apply_functions.<locals>.apply_rule at 0x10384d7b8>), (<function build_match_and_apply_functions.<locals>.matches_rule at 0x10384d840>, <function build_match_and_apply_functions.<locals>.apply_rule at 0x10384d8c8>)]
>>> 

 

c.匹配模式文件

import re

def build_match_and_apply_functions(pattern, search,replace):
	def matches_rule(word):
		return re.search(pattern,word)

	def apply_rule(word):
		return re.sub(search,replace,word)

	return (matches_rule,apply_rule)

rules = []
with open('plural4-rules.txt', encoding = 'utf-8') as pattern_file:
	for line in pattern_file:
		pattern,search,replace = line.split(None,3)

rules.append(build_match_and_apply_functions(pattern,search,replace))

 1) open():打开文件并返回一个文件对象。

 2) 'with':创建了一个context:当with语句结束时,python自动关闭文件,即便是打开是发生意外。

 3)split(None,3): None表示对任何空白字符(空格,制表等)进行分隔。3表示针对空白分隔三次,丢弃该行剩下的部分。

 

生成器:

>>> def make_counter(x):
	print('entering make_counter')
	while True:
		yield x
		print('incrementing x')
		x=x+1

		
>>> counter = make_counter(2)
>>> counter
<generator object make_counter at 0x1038643f0>
>>> next(counter)
entering make_counter
2
>>> next(counter)
incrementing x
3
>>> next(counter)
incrementing x
4
>>> next(counter)
incrementing x
5

 

def fib(max):
	a,b = 0, 1

	while a < max :
		yield a
		a, b = b, a+b


>>> for n in fib(100):
	print(n,end=' ')

0 1 1 2 3 5 8 13 21 34 55 89 
>>> list(fib(200))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144

 

1)将一个生成器传递给list()函数,它将遍历整个生成器并返回所有生成的数值。

 

posted @ 2015-05-07 14:30  summerlong  阅读(310)  评论(0编辑  收藏  举报