python学习笔记(六)——函数

小编 2026-06-25 阅读:1589 评论:0
                      函数  有了语句我们可以做很多事,但是如果要编写大型...

                      函数

  有了语句我们可以做很多事,但是如果要编写大型或更复杂的程序,那么代码的重用性值得我们考虑,因此就有了函数,函数其实可以重复利用的代码块。回忆一下我们N年前用C++痛苦的编写一个斐波那契数列,现用python是多么容易的实现:

fibs=[0,1]num=input('How much numbers do you want:') #注意这里是input,或者是int(raw_input("")),不然会出错for i in range(num-2):    fibs.append(fibs[-2]+fibs[-1])print fibsraw_input('press any key to exit!')

  函数可以调用,它执行某种操作并且可能返回值,内建的callable函数(python3中无此函数)可以判断函数是否可以调用:

>>> import math>>> x=1>>> y=math.sqrt>>> callable(x)False>>> callable(y)True

创建函数——用def关键字来定义

>>> def fibs(num):  #创建函数    result=[0,1]    for i in range(num-2):        result.append(result[-2]+result[-1])    return result>>> fibs(10)   #调用函数[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]>>> fibs(15)   #调用函数[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]

记录函数

  要想给函数写文档让函数容易理解的话,除了写注释外还可以写文档字符串,它作为函数的一部分进行存储,并且可以调用查看:

>>> def square(x):    'caculate the square of the number x.'  #插入文档字符串    return x*x>>> square.func_doc   #访问文档字符串'caculate the square of the number x.'
(__doc是函数属性,输入square.,然后按tab键,能看到所有的函数属性)

函数参数

函数的定义和调用都比较简单,但是函数的用法是体现在它的参数上的,这个比较复杂。

(1)、普通形参

>>> def printMax(a, b):    if a > b:        print a, 'is maximum'    else:        print b, 'is maximum'        >>> printMax (5,3)5 is maximum

(2)、默认参数值

>>> def say(message, times = 2):    print message * times    >>> say('hello')hellohello>>> say(4)8

(3)、关键参数

>>> def func(a, b=5, c=10):    print 'a is', a, 'and b is', b, 'and c is', c    >>> func(4)a is 4 and b is 5 and c is 10

(4)、可变长度参数

  1)、*非关键字可变长参数(元组)

>>> def tupleVarArgs(arg1, arg2 = "defaultB", *theRest):    print 'arg 1:', arg1    print 'arg 2:', arg2    for eachXtrArg in theRest:        print 'another arg:', eachXtrArg     >>> tupleVarArgs('abc')arg 1: abcarg 2: defaultB>>> tupleVarArgs(45,67.8)arg 1: 45arg 2: 67.8>>> tupleVarArgs('abc',123,'xyz',456.7)arg 1: abcarg 2: 123another arg: xyzanother arg: 456.7

  2)、**关键字变量参数(字典)

>>> def dictVarArgs(arg1, arg2 = "defaultB", **theRest):    print 'arg 1:', arg1    print 'arg 2:', arg2    for eachXtrArg in theRest.keys():        print 'Xtra arg %s: %s' %(eachXtrArg, str(theRest[eachXtrArg]))        >>> dictVarArgs(1220, 740.0, c = 'gmail')arg 1: 1220arg 2: 740.0Xtra arg c: gmail
>>> dictVarArgs(arg2 = 'tales', c = 123, d = 'zoo', arg1 = 'my')arg 1: myarg 2: talesXtra arg c: 123Xtra arg d: zoo
>>> dictVarArgs('one', d = 10, e = 'zoo', girls = ('Jenny', 'Penny'))arg 1: onearg 2: defaultBXtra arg girls: ('Jenny', 'Penny')Xtra arg e: zooXtra arg d: 10

   3)、组合使用

>>> def newfoo(arg1, arg2, *t, **d):    print 'arg1 is :', arg1    print 'arg2 is :', arg2    for eacht in t:        print 'add non-keyword:', eacht    for eachd in d.keys():        print "add keyword '%s': %s" %(eachd, d[eachd])        >>>newfoo(10, 20, 30, 40, foo = 50, bar = 60)arg1 is : 10arg2 is : 20add non-keyword: 30add non-keyword: 40add keyword 'foo': 50add keyword 'bar': 60>>> newfoo(2,4,*(6,8),**{'jzhou':22,'James':45})arg1 is : 2arg2 is : 4add non-keyword: 6add non-keyword: 8add keyword 'jzhou': 22add keyword 'James': 45>>> atuple=(7,8,9)>>> adict={'jzhou':22}>>> newfoo(1,2,3,x=4,y=5,z=6,*atuple ,**adict)arg1 is : 1arg2 is : 2add non-keyword: 3add non-keyword: 7add non-keyword: 8add non-keyword: 9add keyword 'y': 5add keyword 'jzhou': 22add keyword 'z': 6add keyword 'x': 4

变量

(1)、变量作用域

python能够改变变量作用域的代码段是def、class、lamda

>>> def scopetest():    localvar=6;    print(localvar)>>> scopetest()6>>> scopetest(localvar)  #在函数外不能访问lcoalvarTraceback (most recent call last):  File "<pyshell#74>", line 1, in <module>    scopetest(localvar)NameError: name 'localvar' is not defined

if/elif/else、try/except/finally、for/while 并不能涉及变量作用域的更改,也就是说他们的代码块中的变量,在外部也是可以访问的

>>> if True:    a=3    print aelse: print 'not equals 3'3>>> a  #外部也可以访问3

(2)、局部变量和全局变量

#局部变量>>> def func(x):    print 'x is', x    x = 2    print 'Changed local x to', x>>> x=50>>> func(x)x is 50Changed local x to 2>>> x50#全局变量>>> def func():    global x   #定义全局变量x    print 'x is', x    x = 2    print 'Changed local x to', x>>> x=50>>> func()x is 50Changed local x to 2>>> x2

lambda匿名函数

  使用方法:lambda [arg1[,arg2,arg3,...,argn]] : expression

>>> Factorial = lambda x: x > 1 and x * Factorial(x - 1) or 1   # x>1时求x的阶乘,其它返回1>>> print Factorial(6)  # 6!720>>> max = lambda a, b: (a > b) and a or b  # a>b时返回a,否则返回b>>> print max(2,4)4>>> x,y=11,12>>> print (lambda:x+y)() #使用默认的x,y23>>> print (lambda x:x+y)(x)  #传的参数是x,y使用默认的1223>>> print (lambda x:x+y)(y)  #传的参数是y,则y替换x24

Generator生成器

  可以保存状态的函数,用yield指令(不是return)返回一个值,并保存当前整个函数执行状态,等待下一次调用,如此循环往复,直至函数末尾,发生StopIteration异常。generator利用next()来获取下一个返回值。

>>> def gen(n):    for i in xrange(n):        yield i>>> g=gen(5)  >>> g.next()0>>> g.next()1>>> for x in g:    print x    234>>> print g.next()Traceback (most recent call last):  File "<pyshell#128>", line 1, in <module>    print g.next()StopIteration  #迭代已停止

Iterations迭代器 

  iter and next函数

>>> L=[1,2,3]>>> I=iter(L)>>> print I.next()1>>> print I.next()2>>> print I.next()3>>> print I.next()Traceback (most recent call last):  File "<pyshell#134>", line 1, in <module>    print I.next()StopIteration   #迭代停止>>> for x in I: print (x)  #已经迭代完了>>> Y=iter(L)>>> while True:    try:        X=next(Y)    except StopIteration:        break    print X**2    149
>>> R=range(3) # R=[0,1,2] 列表>>> I1,I2=iter(R),iter(R)>>> print next(I1),next(I1),next(I2)0 1 0

内建函数

(1)、enumerate函数 ——获得数组,或列表的索引及值

>>> string = 'hello'>>> print list(enumerate(string))[(0, 'h'), (1, 'e'), (2, 'l'), (3, 'l'), (4, 'o')]>>> for index,value in enumerate(string):    print index, value0 h1 e2 l3 l4 o

(2)、filter函数

  filter(bool_func,seq):此函数的功能相当于过滤器。调用一个布尔函数bool_func来迭代遍历每个seq中的元素;返回一个使bool_seq返回值为true的元素的序列。

>>> def f(x):    return x % 2 != 0 and x % 3 != 0>>> print filter(f, range(2, 25))[5, 7, 11, 13, 17, 19, 23]

(3)、map函数

  map(func,seq1[,seq2...]):将函数func作用于给定序列的每个元素,并用一个列表来提供返回值;如果func为None,func表现为身份函数,返回一个含有每个序列中元素集合的n个元组的列表。

>>> def cube(x):    return x*x*x>>> print map(cube,range(1,5))[1, 8, 27, 64]>>> print filter (cube,range(1,5))[1, 2, 3, 4]>>> print map(lambda x:x*2,[1,2,3,4,[5,6,7]])[2, 4, 6, 8, [5, 6, 7, 5, 6, 7]]

 None参数:

>>> map(None,'abc','xyz123')[('a', 'x'), ('b', 'y'), ('c', 'z'), (None, '1'), (None, '2'), (None, '3')]

(4)、reduce函数 
  reduce(func,seq[,init]):func 为二元函数,将func作用于seq序列的元素,每次携带一对(先前的结果以及下一个序列的元素),连续的将现有的结果和下一个值作用在获得的随后的结果上,最后减少我们的序列为一个单一的返回值:如果初始值init给定,第一个比较会是init和第一个序列元素而不是序列的头两个元素。

>>> print reduce((lambda x, y: x + y), [1, 2, 3, 4])10>>> print reduce((lambda x, y: x * y), [1, 2, 3, 4])24

(5)、zip函数

  zip允许用户使用for循环访问平行的多个序列,zip将一个或多个序列作为参数,然后返回一系列的与序列中项平行的元组。

>>> x, y = [1, 2, 3], [4, 5, 6]>>> print zip(x, y)[(1, 4), (2, 5), (3, 6)]>>> print list(zip(x, y))[(1, 4), (2, 5), (3, 6)]>>> print dict(zip(x, y)){1: 4, 2: 5, 3: 6}>>> print tuple(zip(x, y))((1, 4), (2, 5), (3, 6))>>> T1, T2, T3 = (1,2,3), (4,5,6), (7,8,9)>>> print list(zip(T1, T2, T3))[(1, 4, 7), (2, 5, 8), (3, 6, 9)]>>> print tuple(zip(T1, T2, T3))((1, 4, 7), (2, 5, 8), (3, 6, 9))

(6)、type函数——得到对象的类型

>>> type(12)<type 'int'>>>> type('hello')<type 'str'>>>> type(type(42))<type 'type'>>>> type([].append)<type 'builtin_function_or_method'>

(7)、cmp函数——比较两个对象是否相等

>>> cmp(1,2)-1>>> cmp(3,3)0>>> cmp(0xFF,255)0

(8)、类型转换

#类型转换>>> float(4)4.0>>> complex (2.4,8)  #转换为复数(2.4+8j)>>> coerce(1j,123)  #复数表示(1j, (123+0j))#ASCII转换>>> ord('s')115>>> chr(115)'s'#进制转换>>> hex(255)  #16进制'0xff'>>> oct(255)   #8进制'0377'

 

 

 

作者:zhoujie
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,不然我担心博客园找你算账
如果您觉得本文对你有帮助,请竖起您的大拇指右下角点推荐,也可以关注我
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表