Python的函数以及函数式编程
Python的函数以及函数式编程
- 列表解析语法:[expr for iter_var in iterable] 或 [expr for iter_var in iterable if cond_expr]
说明:
第一种语法:首先迭代iterable里所有内容,每一次迭代,都把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。
第二种语法:加入了判断语句,只有满足条件的内容才把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。
举例:
>>> [i + 1 for i in range(10)]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- 函数参数组:
Func(*tuple_grp_nonkw_args, **dict_grp_kw_args)
#!/usr/bin/env python
from operator import add, sub
from random import randint, choice
ops = {'+': add, '-': sub}
MAXTRIES = 2
def doprob():
op = choice('+-')
nums = [ randint(1,10) for i in range(2) ]
nums.sort(reverse=True)
ans = ops[op](*nums)
pr = '%d %s %s = ' % (nums[0], op, nums[1])
oops = 0
while True:
try:
if int(raw_input(pr)) == ans:
print 'correct'
break
if oops == MAXTRIES:
print 'sorry... the answer is\n%s%d' % (pr, ans)
else:
print 'incorrect... try again'
oops += 1
except (KeyboardInterrupt,
EOFError, ValueError):
print 'invalid input... try again'
def main():
while True:
doprob()
try:
opt = raw_input('Again? [y] ').lower()
if opt and opt[0] == 'n':
break
except (KeyboardInterrupt, EOFError):
break
if __name__ == '__main__':
main()
- 内部函数:
定义:在函数内创建另外一个函数,叫做“内部/内嵌函数”
- 闭包:
如果内部函数的定义包含了在外部函数里面定义的对象的引用,内部函数--à闭包(closure)。
- *函数(与方法)装饰器:
装饰器就是相当于在既有的函数中封装了一段代码,但是调用的时候还是调用原函数,只是用装饰器的语法将新的需要操作的代码实现为一个装饰器的装饰函数后写在前面就好了。但是装饰器的必须调用原函数,否则原函数不会执行。
装饰器以@开头, 是函数在调用上的修饰
@decorator(dec_opt_args)
Def func2Bdecorated(dec_opt_args):
…
Eg:
#!/usr/bin/env python
from time import ctime, sleep
def tsfunc(func):
def wrappedFunc():
print '[%s] %s() called' % (
ctime(), func.__name__)
return func()
return wrappedFunc
@tsfunc
def foo():
pass
foo()
sleep(4)
for i in range(2):
sleep(1)
foo()
- 抓取网页到本地文件:
#!/usr/bin/env python
from urllib import urlretrieve
def firstNonBlank(lines):
for eachLine in lines:
if not eachLine.strip():
continue
else:
return eachLine
def firstLast(webpage):
f = open(webpage)
lines = f.readlines()
f.close()
print firstNonBlank(lines),
lines.reverse()
print firstNonBlank(lines),
def download(url='http://192.168.99.240:62268/dokuwiki/doku.php', process=firstLast):
try:
retval = urlretrieve(url)[0]
print type(retval)
except IOError:
retval = None
if retval: # do some processing
process(retval)
if __name__ == '__main__':
download()
- 定义“可变长参数”的函数:
采用*vargs_tuple 或 **vargs_dict
Def func([formal_args,] *tuple)
Def func([formal_args,] [*tuple,] **dict)
- 函数式编程:
测试函数的函数例子。
#!/usr/bin/env python
def testit(func, *nkwargs, **kwargs):
try:
retval = func(*nkwargs, **kwargs)
result = (True, retval)
except Exception, diag:
result = (False, str(diag))
return result
def test():
funcs = (int, long, float)
vals = (1234, 12.34, '1234', '12.34')
for eachFunc in funcs:
print '-' * 20
for eachVal in vals:
retval = testit(eachFunc,
eachVal)
if retval[0]:
print '%s(%s) =' % \
(eachFunc.__name__, `eachVal`), retval[1]
else:
print '%s(%s) = FAILED:' % \
(eachFunc.__name__, `eachVal`), retval[1]
if __name__ == '__main__':
test()