python之函数

上一篇 / 下一篇  2013-10-22 16:44:14 / 个人分类:python

#函数和函数式编程
#python的过程(没有返回值)就是函数,因为解释器会隐式地返回None
def hello():
    print 'hello'
print hello()
print type(hello())  #NoneType,该函数没有返回值,所以默认的饭后只为NoneType
print type(hello)   #function类型

def foo():
    return ['xyz',10000,-98.0]
def bar():
    return ['x','a'],('a',2,3),{'name':'zhaoyehong'},'myname is zhaoyeong'  #其实是返回一个元组,看起来像是返回多个值,可以用()括起来
print foo()
print bar()
#以多种方式存储函数返回的值
a,b,c,d = bar();print a,b,c,d
atuple = bar();print atuple
(a,b,c,d) = bar();print (a,b,c,d)
#函数返回0个对象:None   返回1 个对象:object  返回多个对象:tuple

#调用函数
#有参函数
def func(x ,y ='zq',z = 'zyehon'):  #z 是使用的默认值,如果没有传入参数,那么就使用默认值.但是设置默认值不能这样设置:foo(x ='a',b,z = 'ad'),默认值设置参数只能是后面的
    print x,y
    print z
    print foo()
print func(y ='a',x = 'b')   #调用函数可以不按照顺序

#参数组:传入一个tuple和dict.分别为*tupel_arg,**dict_arg
from operator import add,sub
from random import randint,choice
ops = {'+':add,'-':sub}
MAXTRIES = 2

def dropob():
    '''this is a calculate function'''   #文档字符串
    p = choice('+-')
    nums = [randint(1,10) for i in range(2)]
    nums.sort(reverse = True)
    ans = ops[op](*nums)            #调用add(*num) 或 sub(*num)
    pr = '%d %s  %d = '%(nums[0],op,nums[1])
    ops = 0
    while True:
        try:
            if int(raw_input(pr)) == ans:
                print 'correct'
                break
            if ops == MAXTRIES:
                print 'answer \n%s%d'%(pr,ans)
            else:
                print 'incorrect ... try again'
                oops += 1
        except (EOFError,ValueError):
            print 'invalid input ...try again'
def main():
    while True:
        dropob()
        try:
            pt = raw_input('Again? [y]'.lower())
            if opt and opt[0] == 'n':
                break
        except EOFError:
            break
if __name__  == '__main__':
    main()
    print dropob().__doc__

#函数引用问题
def foo1():

    print "foo12"
    print bar1()
    print type(bar1())
def bar1():
    print 'hello'
foo1()              #在调用foo1()之前要先定义bar1函数。否者会出现错误。

#内部/内嵌函数
def foo():
    def bar():
        print 'bar() called'
    print 'foo() called'
    bar()
#传递函数
def foo(f):
    f()
    print 'hello foo'
bar = foo    #bar 和foo 引用了同一个函数,所以可以以和调用foo()的方式来调用bar() .foo  :函数对象的引用   foo():函数对象的调用
bar(foo1)

#默认参数例子:抓取web页面
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 = g.readlines()
    f.close()
    print firstNonBlank(lines)
    lines.reverse()
    print firstNonBlank(lines)

def downLoad(url = 'http://www'
             ,process = firstLast):
    try:
        retval = urlretrieve(url)[0]
    except IOError:
        retval = None
    if retval :
        process(retval)
if __name == '__main__':
    downLoad()

#非关键字可变长参数(元组):可变长参数必须是在位置和默认参数之后。语法:def function(args,*vargs_tuple):   *操作符之后的形参将作为元组传递给函数。
def tupeVarArgs(arg1,arg2 = 10,*varg_tuple):
    'display regular args and non-keyword variable args'
    print 'formal args 1',arg1
    print 'formal args 2',arg2
    for eachXtrArg in var_tuple:
        print 'another arg:',eachXtrArg
#关键字变量参数(字典):有不定数目的或者额外集合的关键字的情况中,参数被放入一个字典中,字典中的键为参数名,字典中的值为参数值:
                #语法:def functiong(arg1,*var_tuple,**var_dict):  关键字变量参数被放在最后一个位置。
def dictVarArgs(arg1,arg2 = 'defaultvalue',*argTuple,**argDict):
    'display regular args and keword variable args'
    print 'formal args 1',arg1
    print 'formal args 2',arg2
    for eachXtrArg in argTuple:
        print 'another arg:',eachXtrArg
    for eachdict in argDict.keys():
        print 'argDict  ars %s :%s'%(eachdict,str(argDict[eachdict]))

print dictVarArgs(12,'dde',(1,2,3),{'a':'b',"c":'d'})
tu = (1,2,3)
d ={'a':'b',"c":'d'}
print dictVarArgs(12,'dde',*tu,**d)
print dictVarArgs(12,'dde',*(1,2,3),**{'a':'b',"c":'d'})

#函数式编程
#lambda与匿名函数 :lambda arg :expr 。这条表达式必须在同一行
def add(x,y):
    return x +y
#等价于
lambda x,y : x+y
#因为lambda在创建时是一个函数对象,但是没有任何地方保存它。所以创建时被设置为1,但是引用没有保存下来,计数被恢复为0,被回收。所以最好将它赋值给一个变量
a = lambda x,y = 2: x * y  #不要用括号将参数括起来,会出错lambda (x,y =2) :x + y
print a(10)

#内建函数filter() apply() map() reduce()

#首先是filter(func,seq):根据func函数的条件约束,来遍历seq序列,返回使得func返回值为true的序列
def f(x):return x %2 != 0  and x %3 != 0
filter(f,range(2,35))
def f(x):return x != 'a'
filter(f,'abcd')

import random
for num = []
[num.append(random.randint(1,99)) for i in range(20)]
filter(lambda x: x%2 ,num)

#重构
print [num for num in [random.randint(1,99) for i in range(20)] if num %2]

#map(func,seq):将seq的每个值都作用于func,然后返回func(seq的某个值)的列表
map(lambda x ,y: x**y,(1,2,3,4),(5,6,7,8))   #map可以支持多个参数,前提是函数也要传入多个参数,输出为1的5次方,2的六次方。。。。对应的
map(lambda x:x **2,(1,2,3))  #输出1的平方,2的平方,3的平方


#reduce(function, sequence, starting_value):对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用
reduce(lambda x ,y:x+y,range(1,5))   #range(1,5)为1,2,3,4   ,运算过程:1+2  3+3   6+4

#变量作用域,全局变量和局部变量:如果在那申明过程中申明的变量,为局部变量,否则为全局变量
#当收索标示符时,python先从局部变量开始收索,如果没有找到,就会去全局变量中收索,还没有就会抛出NameError
global_str = 'zhaoyezi'
def foo():
    local_str = "bar"
    global s
    s = 'zhaoyeho'
    print local_str
    print s
print global_str
print s  
def fu():
    bar = 100
    print 'local:',bar
bar = 200
print 'global :',bar

TAG:

 

评分:0

我来说两句

日历

« 2024-04-20  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 15333
  • 日志数: 25
  • 建立时间: 2013-07-27
  • 更新时间: 2013-10-22

RSS订阅

Open Toolbar