Python函数定义及参数详解
Python函数定义及参数详解
函数定义
首先我们来创建一个函数,输出指定范围内的斐波拉契数列(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)
输出结果如下:
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 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
参考资料
Passing arguments to Python functions1.pdf
- 在ASP.NET MVC中使用Unity进行依赖注入的三种方式第一种方法第二种方法第三种方法
- Unity Container中的几种注册方式与示例1.实例注册2.简单类型注册
- 使用Unity创建依赖注入依赖注入生命周期:注册、解析、销毁 注册解析销毁
- 使用WCF进行跨平台开发之三(JAVA调用WCF服务)1.开发必备2.生成WCF客户端3.开发程序4.结束语
- 使用WCF进行跨平台开发之二(IIS托管WCF服务并使用php平台调用)1.系统必备2.在IIS中托管WCF服务3.使用PHP调用托管在IIS中的WCF服务
- 使用WCF进行跨平台开发之一(WCF的实现、控制台托管与.net平台的调用)1.创建项目结构2.契约的设计3.实现服务4.控制台托管服务5.在.net平台中调用WCF
- 使用GUI工具高效构建你自己的Nuget包丰富包的基础信息添加要包含的文件The end
- 网页结构与表现原则
- CSS3动画功能
- Angular开发者手册重点翻译之指令(一)文本和属性绑定ngAttr属性绑定
- CSS3中的变形处理
- WCF中操作的分界于调用顺序和会话的释放操作分界实例停止
- WCF中数据契约之已知类型的几种公开方式代码中定义配置中定义宿主端使用解析器
- 有趣的算法(一)——n阶层尾部有几个0
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 腾讯云物联网平台使用报告
- 01 . PostgreSQL简介部署
- 01 . Git常用命令及方法和分支管理
- 记一次公司mssql server密码频繁被改的事件
- elasticsearch 同义词更新,不同集群返回更新节点个数不一样
- H5应用加固防破解-js虚拟机保护方案浅谈
- struts2概述
- 移动端适配解决方案
- struts2(一)---编写第一个struts2项目
- Struts2(二)---将页面表单中的数据提交给Action
- 03 . Shell数组和函数
- Shell百宝箱(后续会不断更新)
- 09 . Prometheus监控tomcat+jvm
- 09 . Kubernetes之pv、pvc及使用nfs网络存储应用
- 10 . Kubernetes之Configmap,Secret