Python3基础之函数用法


Posted in Python onAugust 13, 2014

一般来说,函数(function)是组织好的、可重复使用的、具有一定功能的代码段。函数能提高应用的模块性和代码的重复利用率,在Python中已经提供了很多的内建函数,比如print(),同时Python还允许用户自定义函数。

本文就来实例总结一下Python3的函数用法,具体内容如下:

一、定义

定义函数使用关键字def,后接函数名和放在圆括号( )中的可选参数列表,函数内容以冒号起始并且缩进。一般格式如下:

def 函数名(参数列表): 
  """文档字符串""" 
  函数体 
  return [expression]

注意:参数列表可选,文档字符串可选,return语句可选。

示例:

def fib(n): 
  """Print a Fibonacci series""" 
  a, b = 0, 1 
  while b < n: 
    print(b, end=' ') 
    a, b = b, a+b 
  print() 
 
fib(2000) # call 
f = fib  # assignment 
f(2000)

函数名的值是一种用户自定义的函数类型。函数名的值可以被赋予另一个名字,使其也能作为函数使用。

二、函数变量作用域

在函数内部定义的变量拥有一个局部作用域,在函数外定义的拥有全局作用域。注意:在函数内部可以引用全局变量,但无法对其赋值(除非用global进行声明)。

a = 5     # 全局变量a 
 
def func1(): 
  print('func1() print a =', a) 
 
def func2(): 
  a = 21  # 局部变量a 
  print('func2() print a =', a)  
 
def func3(): 
  global a 
  a = 10  # 修改全局变量a 
  print('func3() print a =', a) 
 
func1() 
func2() 
func3() 
print('the global a =', a)

三、函数调用

1、普通调用

与其他语言中函数调用一样,Python中在调用函数时,需要给定和形参相同个数的实参并按顺序一一对应。

def fun(name, age, gender): 
  print('Name:',name,'Age:',age,'Gender:',gender,end=' ') 
  print() 
 
fun('Jack', 20, 'man') # call

2、使用关键字参数调用函数

函数也可以通过keyword=value 形式的关键字参数来调用,因为我们明确指出了对应关系,所以参数的顺序也就无关紧要了。

def fun(name, age, gender): 
  print('Name:',name,'Age:',age,'Gender:',gender,end=' ') 
  print() 
 
fun(gender='man', name='Jack', age=20) # using keyword arguments

3、调用具有默认实参的函数

Python中的函数也可以给一个或多个参数指定默认值,这样在调用时可以选择性地省略该参数:

def fun(a, b, c=5): 
  print(a+b+c) 
 
fun(1,2) 
fun(1,2,3)

注意:通常情况下默认值只被计算一次,但如果默认值是一个可变对象时会有所不同, 如列表, 字典, 或大多类的对象时。例如,下面的函数在随后的调用中会累积参数值

def fun(a, L=[]): 
  L.append(a) 
  print(L) 
 
fun(1) # 输出[1] 
fun(2) # 输出[1, 2] 
fun(3) # 输出[1, 2, 3]

4、调用可变参数函数

通过在形参前加一个星号(*)或两个星号(**)来指定函数可以接收任意数量的实参。

def fun(*args): 
  print(type(args)) 
  print(args) 
 
fun(1,2,3,4,5,6) 
 
# 输出: 
# <class 'tuple'> 
# (1, 2, 3, 4, 5, 6) 

def fun(**args): 
  print(type(args)) 
  print(args) 
 
fun(a=1,b=2,c=3,d=4,e=5) 
 
# 输出: 
# <class 'dict'> 
# {'d': 4, 'e': 5, 'b': 2, 'c': 3, 'a': 1}

从两个示例的输出可以看出:当参数形如*args时,传递给函数的任意个实参会按位置被包装进一个元组(tuple);当参数形如**args时,传递给函数的任意个key=value实参会被包装进一个字典(dict)。

5、通过解包参数调用函数

上一点说到传递任意数量的实参时会将它们打包进一个元组或字典,当然有打包也就有解包(unpacking)。通过 单星号和双星号对List、Tuple和Dictionary进行解包:

def fun(a=1, b=2, c=3): 
  print(a+b+c) 
 
fun()  # 正常调用 
list1 = [11, 22, 33] 
dict1 = {'a':40, 'b':50, 'c':60} 
fun(*list1)  # 解包列表 
fun(**dict1) # 解包字典 
 
# 输出: 
# 6 
# 66 
# 150

注:*用于解包Sequence,**用于解包字典。解包字典会得到一系列的key=value,故本质上就是使用关键字参数调用函数。

四、lambda表达式

lambda关键词能创建小型匿名函数。lambda函数能接收任何数量的参数但只能返回一个表达式的值,它的一般形式如下:

lambda [arg1 [,arg2,.....argn]] : expression

lambda表达式可以在任何需要函数对象的地方使用,它们在语法上被限制为单一的表达式:

f = lambda x, y: x+y 
print(f(10, 20)) 

def make_fun(n): 
  return lambda x: x+n 
 
f = make_fun(15) 
print(f(5))

五、文档字符串

函式体的第一个语句可以是三引号括起来的字符串, 这个字符串就是函数的文档字符串,或称为docstring 。我们可以使用print(function.__doc__)输出文档:

def fun(): 
  """Some information of this function. 
  This is documentation string.""" 
  return 
 
print(fun.__doc__)

文档字符串主要用于描述一些关于函数的信息,让用户交互地浏览和输出。建议养成在代码中添加文档字符串的好习惯。

Python 相关文章推荐
详解Python中contextlib上下文管理模块的用法
Jun 28 Python
python 3.5下xadmin的使用及修复源码bug
May 10 Python
多版本Python共存的配置方法
May 22 Python
django实现前后台交互实例
Aug 07 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
解决pandas read_csv 读取中文列标题文件报错的问题
Jun 15 Python
从请求到响应过程中django都做了哪些处理
Aug 01 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
Python使用Opencv实现图像特征检测与匹配的方法
Oct 30 Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 Python
解决Python数据可视化中文部分显示方块问题
May 16 Python
Python连接mysql方法及常用参数
Sep 01 Python
Python3基础之条件与循环控制实例解析
Aug 13 #Python
Python3基础之基本运算符概述
Aug 13 #Python
Python3基础之list列表实例解析
Aug 13 #Python
Python3基础之基本数据类型概述
Aug 13 #Python
Python常用正则表达式符号浅析
Aug 13 #Python
wxpython中利用线程防止假死的实现方法
Aug 11 #Python
将图片文件嵌入到wxpython代码中的实现方法
Aug 11 #Python
You might like
国产动画《伍六七》原声大碟大卖,啊哈娱乐引领音乐赋能IP的新尝试
2020/03/08 国漫
php下使用以下代码连接并测试
2008/04/09 PHP
php AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
给ECShop添加最新评论
2015/01/07 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
js变量作用域及可访问性的探讨
2006/11/23 Javascript
jquery ajax abort()的使用方法
2010/10/28 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
js 声明数组和向数组中添加对象变量的简单实例
2016/07/28 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
[01:00:30]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第二场 10.31
2020/11/02 DOTA
python 中的int()函数怎么用
2017/10/17 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
2018/03/22 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
Python网络爬虫四大选择器用法原理总结
2020/06/01 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
浅析Python requests 模块
2020/10/09 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
结婚典礼证婚词
2014/01/11 职场文书
快餐店的创业计划书范文
2014/01/29 职场文书
动员大会主持词
2014/03/20 职场文书
保险内勤岗位职责
2014/04/05 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
公司委托书格式范本
2014/09/16 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
golang 语言中错误处理机制
2021/08/30 Golang