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使用MD5加密字符串示例
Aug 22 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
Sep 11 Python
利用python获取某年中每个月的第一天和最后一天
Dec 15 Python
Python字符编码与函数的基本使用方法
Sep 30 Python
Python中矩阵库Numpy基本操作详解
Nov 21 Python
Python实现PS滤镜特效之扇形变换效果示例
Jan 26 Python
python Qt5实现窗体跟踪鼠标移动
Dec 13 Python
在python中计算ssim的方法(与Matlab结果一致)
Dec 19 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 Python
Python三维绘图之Matplotlib库的使用方法
Sep 20 Python
使用pytorch实现线性回归
Apr 11 Python
python如何正确使用yield
May 21 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模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
PHP错误处理函数
2016/04/03 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
深入剖析JavaScript编程中的对象概念
2015/10/21 Javascript
jquery插件jquery.LightBox.js实现点击放大图片并左右点击切换效果(附demo源码下载)
2016/02/25 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
微信小程序 拍照或从相册选取图片上传代码实例
2019/08/28 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
vue2.0实现列表数据增加和删除
2020/06/17 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
Python的ORM框架SQLObject入门实例
2014/04/28 Python
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
Python网络爬虫之爬取微博热搜
2019/04/18 Python
选择Python写网络爬虫的优势和理由
2019/07/07 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
python turtle 绘制太极图的实例
2019/12/18 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
python模式 工厂模式原理及实例详解
2020/02/11 Python
一篇文章带你学习CSS3图片边框
2020/11/04 HTML / CSS
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
英国专业美容产品在线:Mylee(从指甲到脱毛)
2020/07/06 全球购物
2014小学数学教研组工作总结
2014/12/06 职场文书
2015年信访工作总结
2015/04/07 职场文书
Nginx的gzip相关介绍
2022/05/11 Servers