函数定义
首先咱们来创立一个函数,输入指定范畴内的斐波拉契数列(Fibonacci series)。
#!/usr/bin/env python #coding=utf-8'''Created on 2016年9月4日下午2:37:31@author: Flowsnow@file: D:/Workspaces/eclipse/HelloPython/main/FibonacciSeries.py@function: 定义函数-输入给定范畴内的斐波拉契数列'''def Fibonacci(n): #print "success" a=0 b=1 while a<n: print a, a,b=b,a+b#call the function FibonacciFibonacci(2000)print '\n',print Fibonaccif=Fibonaccif(100)print '\n',print Fibonacci(0)
<!--more-->
输入后果如下:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 <function Fibonacci at 0x000000000258D9E8>0 1 1 2 3 5 8 13 21 34 55 89 None
由第一行可知 Fibonacci函数输入了2000以内的斐波拉契数列。由第二行可知 Fibonacci函数在内存中的地址
由第三行可知 将Fibonacci函数的地址值赋给另外一个变量f之后,f也就是一个函数了,这相似于重名机制
由第四行可知 尽管Fibonacci函数没有
return
语句,然而如果咱们应用None
,这是Python的內建名称。
咱们也能够写一个函数,不输入斐波拉契数列的值,而是把值作为返回值返回。
#!/usr/bin/env python #coding=utf-8'''Created on 2016年9月4日下午3:07:06@author: Flowsnow@file: D:/Workspaces/eclipse/HelloPython/main/FibonacciSeriesAdv.py@function: 函数定义-返回斐波拉契数列,而不是间接打印'''def Fibonacci(n): a=0 b=1 result=[] while a<n: result.append(a) a,b=b,a+b return resultresult=Fibonacci(2000)for x in result: print x,
输入后果:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
参数详解
Python 的内建规范类型有一种分类规范是分为可变类型与不可变类型
- 可变类型:列表、字典
- 不可变类型:数字、字符串、元组
下面函数定义中的参数都是属于不可变类型的。
可变参数三种状况:默认参数,地位参数*args
关键字参数**kwargs
。
默认参数
默认参数的益处就是在调用函数的时候写上去的参数比在函数定义时的参数少。例如:
#!/usr/bin/env python #coding=utf-8'''Created on 2016年9月5日下午2:50:12@author: Flowsnow@file: D:/Workspaces/eclipse/HelloPython/main/askYesOrNo.py@function: 测试默认参数的应用'''def ask_ok(prompt, retries=4, complaint='Yes or no, please!'): while True: ok = raw_input(prompt) if ok in ('y', 'ye', 'yes'): return True if ok in ('n', 'no', 'nop', 'nope'): return False retries = retries - 1 if retries < 0: raise IOError('refusenik user') print complaint
这个函数的调用办法有很多,比方:
- 只给必选参数:
ask_ok('OK to overwrite the file?')
- 给一个可选参数:
ask_ok('OK to overwrite the file?', 2)
- 给所有的可选参数:
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
对于默认值,应该留神的是默认值只会在函数定义的时候被python解析一次。因而
i = 5def f(arg=i): print argi = 6f()
这段代码输入的应该是5,而不是6,就是因为i是在函数定义的时候解析的,这个时候i=5。
重要正告:默认值只会解析一次。当默认参数是可变对象时,影响比拟大,比方列表,字典或者类的对象。上面演示的这个函数会把参数积攒并传到随后的函数调用外面:
def f(a, L=[]): L.append(a) return Lprint f(1)print f(2)print f(3)
这段代码会输入
[1][1, 2][1, 2, 3]
如果不想默认参数在前面的函数调用中共享,能够把函数写成这种模式
def f(a, L=None): if L is None: L = [] L.append(a) return L
这段代码会输入
[1][2][3]
地位参数*args
地位参数须要在参数后面加一个星号。把参数收集到一个元tuple中,作为变量args。至于为什么叫地位参数,这个是因为各个参数是依照程序接管的。
def argTest(arg1,*args): print arg1 print('~start to print *args~') for x in args: print x,argTest(1,'two',3)
这段代码会输入
1~start to print *args~two 3
args被解释为蕴含多个变量的元组tuple。因而也可用如下写法:
def argTest(arg1,*args): print arg1 print('~start to print *args~') for x in args: print x,#argTest(1,'two',3)args=['two',3]argTest(1,*args)
关键字参数**kwargs
函数也可能依照kwarg=value
这种模式的关键字参数来调用。关键字参数须要在参数后面加两个星号。其作用是把参数收集成一个字典类型,蕴含参数名和值。
def argTest(arg1,**kwargs): print 'arg1',arg1 for key in kwargs: print key,kwargs[key]argTest(1,arg2='aa',arg3='bb')argTest(arg1=1,arg2='aa',arg3='bb',arg4='cc')arg={'arg2':'bb','arg3':'cc','arg4':'dd'}argTest(arg1='ss',**arg)argTest(arg1='ss',**arg)
这段代码会输入
arg1 1arg2 aaarg3 bbarg1 1arg2 aaarg3 bbarg4 ccarg1 ssarg2 bbarg3 ccarg4 ddarg1 ssarg2 bbarg3 ccarg4 dd
参考资料
Python官网-defining-functions
Passing arguments to Python functions1.pdf
Python中args与*args的区别
记得帮我点赞哦!
精心整顿了计算机各个方向的从入门、进阶、实战的视频课程和电子书,依照目录正当分类,总能找到你须要的学习材料,还在等什么?快去关注下载吧!!!
朝思暮想,必有回响,小伙伴们帮我点个赞吧,非常感谢。
我是职场亮哥,YY高级软件工程师、四年工作教训,回绝咸鱼争当龙头的斜杠程序员。听我说,提高多,程序人生一把梭
如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个激励,将不胜感激。
职场亮哥文章列表:更多文章
自己所有文章、答复都与版权保护平台有单干,著作权归职场亮哥所有,未经受权,转载必究!