关于python:Python函数定义及参数详解

5次阅读

共计 3283 个字符,预计需要花费 9 分钟才能阅读完成。

函数定义

首先咱们来创立一个函数,输入指定范畴内的斐波拉契数列(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 Fibonacci
Fibonacci(2000)
print '\n',
print Fibonacci
f=Fibonacci
f(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 语句,然而如果咱们应用 print 输入的时候能够发现还是有返回值的,只是这个返回值是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 result
result=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 = 5

def f(arg=i):
    print arg

i = 6
f()

这段代码输入的应该是 5,而不是 6,就是因为 i 是在函数定义的时候解析的,这个时候 i =5。

重要正告:默认值只会解析一次。当默认参数是可变对象时,影响比拟大,比方列表,字典或者类的对象。上面演示的这个函数会把参数积攒并传到随后的函数调用外面:

def f(a, L=[]):
    L.append(a)
    return L

print 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 1
arg2 aa
arg3 bb
arg1 1
arg2 aa
arg3 bb
arg4 cc
arg1 ss
arg2 bb
arg3 cc
arg4 dd
arg1 ss
arg2 bb
arg3 cc
arg4 dd

参考资料

Python 官网 -defining-functions

Passing arguments to Python functions1.pdf

Python 中args 与*args 的区别


记得帮我点赞哦!

精心整顿了计算机各个方向的从入门、进阶、实战的视频课程和电子书,依照目录正当分类,总能找到你须要的学习材料,还在等什么?快去关注下载吧!!!

朝思暮想,必有回响,小伙伴们帮我点个赞吧,非常感谢。

我是职场亮哥,YY 高级软件工程师、四年工作教训,回绝咸鱼争当龙头的斜杠程序员。

听我说,提高多,程序人生一把梭

如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个激励,将不胜感激。

职场亮哥文章列表:更多文章

自己所有文章、答复都与版权保护平台有单干,著作权归职场亮哥所有,未经受权,转载必究!

正文完
 0