Python基础之函数用法实例详解


Posted in Python onSeptember 10, 2014

本文以实例形式较为详细的讲述了Python函数的用法,对于初学Python的朋友有不错的借鉴价值。分享给大家供大家参考之用。具体分析如下:

通常来说,Python的函数是由一个新的语句编写,即def,def是可执行的语句--函数并不存在,直到Python运行了def后才存在。

函数是通过赋值传递的,参数通过赋值传递给函数

def语句将创建一个函数对象并将其赋值给一个变量名,def语句的一般格式如下:

def <name>(arg1,arg2,arg3,……,argN):

<statements>

def语句是实时执行的,当它运行的时候,它创建并将一个新的函数对象赋值给一个变量名,Python所有的语句都是实时执行的,没有像独立的编译时间这样的流程

由于是语句,def可以出现在任一语句可以出现的地方--甚至是嵌套在其他语句中:

if test:
  def fun():
    ...
else:
  def func():
    ...
...
func()

可以将函数赋值给一个不同的变量名,并通过新的变量名进行调用:

othername=func()
othername()

创建函数

内建的callable函数可以用来判断函数是否可调用:

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

使用del语句定义函数:

>>> def hello(name):
  return 'Hello, '+name+'!'
>>> print hello('world')
Hello, world!
>>> print hello('Gumby')
Hello, Gumby!

编写一个fibnacci数列函数:

>>> 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 try_to_change(n):
  n='Mr.Gumby'
>>> name='Mrs.Entity'
>>> try_to_change(name)
>>> name
'Mrs.Entity'

由于字符串(以及元组和数字)是不可改变的,故做参数的时候也就不会改变,但是如果将可变的数据结构如列表用作参数的时候会发生什么:

>>> name='Mrs.Entity'
>>> try_to_change(name)
>>> name
'Mrs.Entity'
>>> def change(n):
   n[0]='Mr.Gumby'

>>> name=['Mrs.Entity','Mrs.Thing']
>>> change(name)
>>> name
['Mr.Gumby', 'Mrs.Thing']

参数发生了改变,这就是和前面例子的重要区别

以下不用函数再做一次:

>>> name=['Mrs.Entity','Mrs.Thing']
>>> n=name #再来一次,模拟传参行为
>>> n[0]='Mr.Gumby' #改变列表
>>> name
['Mr.Gumby', 'Mrs.Thing']

当2个变量同时引用一个列表的时候,它们的确是同时引用一个列表,想避免这种情况,可以复制一个列表的副本,当在序列中做切片的时候,返回的切片总是一个副本,所以复制了整个列表的切片,将会得到一个副本:

>>> names=['Mrs.Entity','Mrs.Thing']
>>> n=names[:]
>>> n is names
False
>>> n==names
True

此时改变n不会影响到names:

>>> n[0]='Mr.Gumby'
>>> n
['Mr.Gumby', 'Mrs.Thing']
>>> names
['Mrs.Entity', 'Mrs.Thing']
>>> change(names[:])
>>> names
['Mrs.Entity', 'Mrs.Thing']

关键字参数和默认值

参数的顺序可以通过给参数提供参数的名字(但是参数名和值一定要对应):

>>> def hello(greeting, name):
    print '%s,%s!'%(greeting, name)
>>> hello(greeting='hello',name='world!')
hello,world!!

关键字参数最厉害的地方在于可以在参数中给参数提供默认值:

>>> def hello_1(greeting='hello',name='world!'):
  print '%s,%s!'%(greeting,name)

>>> hello_1()
hello,world!!
>>> hello_1('Greetings')
Greetings,world!!
>>> hello_1('Greeting','universe')
Greeting,universe!

若想让greeting使用默认值:

>>> hello_1(name='Gumby')
hello,Gumby!

可以给函数提供任意多的参数,实现起来也不难:

>>> def print_params(*params):
   print params

>>> print_params('Testing')
('Testing',)
>>> print_params(1,2,3)
(1, 2, 3)

混合普通参数:

>>> def print_params_2(title,*params):
   print title
  
 print params

>>> print_params_2('params:',1,2,3)
params:
(1, 2, 3)
>>> print_params_2('Nothing:')
Nothing:
()

 星号的意思就是“收集其余的位置参数”,如果不提供任何供收集的元素,params就是个空元组

但是不能处理关键字参数:

>>> print_params_2('Hmm...',something=42)
Traceback (most recent call last):
 File "<pyshell#112>", line 1, in <module>
  print_params_2('Hmm...',something=42)
TypeError: print_params_2() got an unexpected keyword argument 'something'

试试使用“**”:

>>> def print_params(**params):
   print params

>>> print_params(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3}
>>> def parames(x,y,z=3,*pospar,**keypar):
  
 print x,y,z
  
 print pospar
  
 print keypar

>>> parames(1,2,3,5,6,7,foo=1,bar=2)
1 2 3
(5, 6, 7)
{'foo': 1, 'bar': 2}
>>> parames(1,2)
1 2 3
()
{}
>>> def print_params_3(**params):
  
 print params

>>> print_params_3(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3}
>>> #返回的是字典而不是元组
>>> #组合‘#'与'##'
>>> def print_params_4(x,y,z=3,*pospar,**keypar):
  
 print x,y,z
  
 print pospar
  
 print keypar

>>> print_params_4(1,2,3,5,6,7,foo=1,bar=2)
1 2 3
(5, 6, 7)
{'foo': 1, 'bar': 2}
>>> print_params_4(1,2)
1 2 3
()
{}

相信本文所述对大家Python程序设计的学习有一定的借鉴价值。

Python 相关文章推荐
Python 用户登录验证的小例子
Mar 06 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
Dec 20 Python
python从入门到精通 windows安装python图文教程
May 18 Python
如何使用python把ppt转换成pdf
Jun 29 Python
Python获取时间范围内日期列表和周列表的函数
Aug 05 Python
Python爬虫使用代理IP的实现
Oct 27 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
Feb 13 Python
jupyter notebook实现显示行号
Apr 13 Python
使用keras实现非线性回归(两种加激活函数的方式)
Jul 05 Python
python 30行代码实现蚂蚁森林自动偷能量
Feb 08 Python
Pytorch 使用tensor特定条件判断索引
Apr 08 Python
Python Django模型详解
Oct 05 Python
Python迭代用法实例教程
Sep 08 #Python
Python切片用法实例教程
Sep 08 #Python
Python常用模块用法分析
Sep 08 #Python
python实现斐波那契递归函数的方法
Sep 08 #Python
Python内置函数的用法实例教程
Sep 08 #Python
Python中函数的用法实例教程
Sep 08 #Python
Python多线程实例教程
Sep 06 #Python
You might like
php magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
下拉列表多级联动dropDownList示例代码
2013/06/27 PHP
解析PHP 5.5 新特性
2013/07/02 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
2014/10/20 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
vue框架搭建之axios使用教程
2018/07/11 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
2018/09/14 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
使用 Jest 和 Supertest 进行接口端点测试实例详解
2020/04/25 Javascript
在漏洞利用Python代码真的很爽
2007/08/26 Python
python 排列组合之itertools
2013/03/20 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
2017/05/08 Python
python读写LMDB文件的方法
2018/07/02 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
基于python plotly交互式图表大全
2019/12/07 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
python实现简单颜色识别程序
2020/02/19 Python
windows、linux下打包Python3程序详细方法
2020/03/17 Python
thinkphp5 路由分发原理
2021/03/18 PHP
比利时家具购买网站:Home24
2019/01/03 全球购物
一套C++笔试题面试题
2012/06/06 面试题
Ajax请求总共有多少种Callback
2016/07/17 面试题
人力资源管理专业毕业生自荐书
2014/05/25 职场文书
护士医德考评自我评价
2015/03/03 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书
Nginx tp3.2.3 404问题解决方案
2021/03/31 Servers
《最终幻想14》6.01版本4月5日推出 追加新任务新道具
2022/04/03 其他游戏
Vue深入理解插槽slot的使用
2022/08/05 Vue.js