您的位置:首页 > 编程语言 > Python开发

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


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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: