Python的函数以及函数式编程
2017-02-28 22:04
483 查看
Python的函数以及函数式编程
列表解析语法:[exprforiter_variniterable]或[exprforiter_variniterableifcond_expr]
说明:
第一种语法:首先迭代iterable里所有内容,每一次迭代,都把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。
第二种语法:加入了判断语句,只有满足条件的内容才把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。
举例:
>>>[i+1foriinrange(10)]
[1,2,3,4,5,6,7,8,9,10]
函数参数组:
Func(*tuple_grp_nonkw_args,**dict_grp_kw_args)
例子:http://www.corepython.com/
#!/usr/bin/envpython
fromoperatorimportadd,sub
fromrandomimportrandint,choice
ops={'+':add,'-':sub}
MAXTRIES=2
defdoprob():
op=choice('+-')
nums=[randint(1,10)foriinrange(2)]
nums.sort(reverse=True)
ans=ops[op](*nums)
pr='%d%s%s='%(nums[0],op,nums[1])
oops=0
whileTrue:
try:
ifint(raw_input(pr))==ans:
print'correct'
break
ifoops==MAXTRIES:
print'sorry...theansweris\n%s%d'%(pr,ans)
else:
print'incorrect...tryagain'
oops+=1
except(KeyboardInterrupt,
EOFError,ValueError):
print'invalidinput...tryagain'
defmain():
whileTrue:
doprob()
try:
opt=raw_input('Again?[y]').lower()
ifoptandopt[0]=='n':
break
except(KeyboardInterrupt,EOFError):
break
if__name__=='__main__':
main()
内部函数:
定义:在函数内创建另外一个函数,叫做“内部/内嵌函数”
闭包:
如果内部函数的定义包含了在外部函数里面定义的对象的引用,内部函数--à闭包(closure)。
*函数(与方法)装饰器:
装饰器就是相当于在既有的函数中封装了一段代码,但是调用的时候还是调用原函数,只是用装饰器的语法将新的需要操作的代码实现为一个装饰器的装饰函数后写在前面就好了。但是装饰器的必须调用原函数,否则原函数不会执行。
装饰器以@开头,是函数在调用上的修饰
@decorator(dec_opt_args)
Deffunc2Bdecorated(dec_opt_args):
…
Eg:
抓取网页到本地文件:
#!/usr/bin/envpython
fromurllibimporturlretrieve
deffirstNonBlank(lines):
foreachLineinlines:
ifnoteachLine.strip():
continue
else:
returneachLine
deffirstLast(webpage):
f=open(webpage)
lines=f.readlines()
f.close()
printfirstNonBlank(lines),
lines.reverse()
printfirstNonBlank(lines),
defdownload(url='http://192.168.99.240:62268/dokuwiki/doku.php',process=firstLast):
try:
retval=urlretrieve(url)[0]
printtype(retval)
exceptIOError:
retval=None
ifretval:#dosomeprocessing
process(retval)
if__name__=='__main__':
download()
定义“可变长参数”的函数:
采用*vargs_tuple或**vargs_dict
Deffunc([formal_args,]*tuple)
Deffunc([formal_args,][*tuple,]**dict)
函数式编程:
测试函数的函数例子。
#!/usr/bin/envpython
deftestit(func,*nkwargs,**kwargs):
try:
retval=func(*nkwargs,**kwargs)
result=(True,retval)
exceptException,diag:
result=(False,str(diag))
returnresult
deftest():
funcs=(int,long,float)
vals=(1234,12.34,'1234','12.34')
foreachFuncinfuncs:
print'-'*20
foreachValinvals:
retval=testit(eachFunc,
eachVal)
ifretval[0]:
print'%s(%s)='%\
(eachFunc.__name__,`eachVal`),retval[1]
else:
print'%s(%s)=FAILED:'%\
(eachFunc.__name__,`eachVal`),retval[1]
if__name__=='__main__':
test()
列表解析语法:[exprforiter_variniterable]或[exprforiter_variniterableifcond_expr]
说明:
第一种语法:首先迭代iterable里所有内容,每一次迭代,都把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。
第二种语法:加入了判断语句,只有满足条件的内容才把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。
举例:
>>>[i+1foriinrange(10)]
[1,2,3,4,5,6,7,8,9,10]
函数参数组:
Func(*tuple_grp_nonkw_args,**dict_grp_kw_args)
例子:
#!/usr/bin/envpython
fromoperatorimportadd,sub
fromrandomimportrandint,choice
ops={'+':add,'-':sub}
MAXTRIES=2
defdoprob():
op=choice('+-')
nums=[randint(1,10)foriinrange(2)]
nums.sort(reverse=True)
ans=ops[op](*nums)
pr='%d%s%s='%(nums[0],op,nums[1])
oops=0
whileTrue:
try:
ifint(raw_input(pr))==ans:
print'correct'
break
ifoops==MAXTRIES:
print'sorry...theansweris\n%s%d'%(pr,ans)
else:
print'incorrect...tryagain'
oops+=1
except(KeyboardInterrupt,
EOFError,ValueError):
print'invalidinput...tryagain'
defmain():
whileTrue:
doprob()
try:
opt=raw_input('Again?[y]').lower()
ifoptandopt[0]=='n':
break
except(KeyboardInterrupt,EOFError):
break
if__name__=='__main__':
main()
内部函数:
定义:在函数内创建另外一个函数,叫做“内部/内嵌函数”
闭包:
如果内部函数的定义包含了在外部函数里面定义的对象的引用,内部函数--à闭包(closure)。
*函数(与方法)装饰器:
装饰器就是相当于在既有的函数中封装了一段代码,但是调用的时候还是调用原函数,只是用装饰器的语法将新的需要操作的代码实现为一个装饰器的装饰函数后写在前面就好了。但是装饰器的必须调用原函数,否则原函数不会执行。
装饰器以@开头,是函数在调用上的修饰
@decorator(dec_opt_args)
Deffunc2Bdecorated(dec_opt_args):
…
Eg:
#!/usr/bin/envpython
fromtimeimportctime,sleep
deftsfunc(func):
defwrappedFunc():
print'[%s]%s()called'%(
ctime(),func.__name__)
returnfunc()
returnwrappedFunc
@tsfunc
deffoo():
pass
foo()
sleep(4)
foriinrange(2):
sleep(1)
foo()
抓取网页到本地文件:
#!/usr/bin/envpython
fromurllibimporturlretrieve
deffirstNonBlank(lines):
foreachLineinlines:
ifnoteachLine.strip():
continue
else:
returneachLine
deffirstLast(webpage):
f=open(webpage)
lines=f.readlines()
f.close()
printfirstNonBlank(lines),
lines.reverse()
printfirstNonBlank(lines),
defdownload(url='http://192.168.99.240:62268/dokuwiki/doku.php',process=firstLast):
try:
retval=urlretrieve(url)[0]
printtype(retval)
exceptIOError:
retval=None
ifretval:#dosomeprocessing
process(retval)
if__name__=='__main__':
download()
定义“可变长参数”的函数:
采用*vargs_tuple或**vargs_dict
Deffunc([formal_args,]*tuple)
Deffunc([formal_args,][*tuple,]**dict)
函数式编程:
测试函数的函数例子。
#!/usr/bin/envpython
deftestit(func,*nkwargs,**kwargs):
try:
retval=func(*nkwargs,**kwargs)
result=(True,retval)
exceptException,diag:
result=(False,str(diag))
returnresult
deftest():
funcs=(int,long,float)
vals=(1234,12.34,'1234','12.34')
foreachFuncinfuncs:
print'-'*20
foreachValinvals:
retval=testit(eachFunc,
eachVal)
ifretval[0]:
print'%s(%s)='%\
(eachFunc.__name__,`eachVal`),retval[1]
else:
print'%s(%s)=FAILED:'%\
(eachFunc.__name__,`eachVal`),retval[1]
if__name__=='__main__':
test()
相关文章推荐
- python -- 函数以及函数式编程
- 【Python】[函数式编程]高阶函数,返回函数,装饰器,偏函数
- Python函数式编程之高阶函数
- Learning Python 012 函数式编程 2 返回函数 匿名函数 装饰器 偏函数
- python再复习(4)高级特性、函数式编程以及用法小结
- Python入门 第四天(函数式编程、map、reduce、filter、排序函数、函数返回函数、闭包、匿名函数lambda)
- <PY><core python programming笔记>C11 函数和函数式编程
- Python 函数式编程--偏函数
- Python学习(20):Python函数(4):关于函数式编程的内建函数
- Python学习笔记11:Python函数和函数式编程
- python函数式编程之匿名函数、装饰器、偏函数
- Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器
- 【python学习笔记】函数式编程:返回函数
- python函数式编程内建函数filter,map,reduce函数
- python 函数、函数式编程、变量作用域、函数__doc__属性
- C++与Python的混合编程-调用有参函数以及C++数据类型与Python数据类型间的转换
- python 学习笔记---函数式编程之高阶函数
- python函数之二 函数式编程
- Python基础学习代码之函数和函数式编程
- python笔记11 - lambda函数,globals()/locals()函数,eval()exec()函数,闭包函数,函数式编程,高阶函数