Python学习笔记之自定义函数用法详解


Posted in Python onJune 08, 2019

本文实例讲述了Python学习笔记之自定义函数用法。分享给大家供大家参考,具体如下:

函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()等。也可以创建用户自定义函数。

函数定义

函数定义的简单规则:

  • 函数代码块以def关键词开头,后接函数标识符名称和圆括号(),任何传入参数和自变量必须放在圆括号中间
  • 函数内容以冒号起始,并且缩进
  • 若有返回值,Return[expression] 结束函数;不带return 表达式相当于返回None

函数通常使用三个单引号  '''...'''   来注释说明函数;函数体内容不可为空,可用 pass 来表示空语句;以下几个为简单的函数示例:

''' some basic functions '''
def func1():          # 函数无传入参数
  print("func1")       # 无return值
func1()             # 函数调用
def func2():
  return("func2")       # return 字符串 "func2"
print(func2())
def func3(a,b):         # 需传两个参数
  print("a+b = %d" %(a+b))  # print表达式,无return
func3(3,4)
def func4(a,b):         # 需传两个参数
  return (a+b)        # return a+b 的值
print(func4(4,3))

函数调用

定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。

上面的例子中  func1() 就是无参数函数的调用; func3(3,4) 为有参数函数的调用

深入函数定义

默认参数值

最常用的一种形式是为一个或过个参数指定默认值。调用时,可不传入有默认值的参数。参考下例:

''' advanced: 简单询问框 '''
def ask_ok(hint, retries=4, complaint='Yes or no, please!'):  # 仅有hint是必须要传入的,retries 和 complaint 均有默认值
  while True:
    u = input(hint)
    if u in ('y','ye','yes'):       # in 的用法;若用户回答在('y','ye','yes') return True 
      return True
    if u in ('n','no','nop','nope'):   # 若用户回答在('n','no','nop','nope') return False
      return False
    retries = retries -1         # 若用户输入不在之前所列,可重试,重试次数-1
    if retries <= 0 :           # 若超出重试次数,raise自定义Error
      raise IOError('refusenik user')
    print(complaint)           # 若用户输入不在之前所列,提示 complaint 信息
result1 = ask_ok("Yes or No?")        # 只给必要的参数值hint,可尝试输入'y' 'no' 等;输入其他的如 'x' 超过4次
print(result1)                # 查看return的值
# result2 = ask_ok("Yes or No?",2)      # 给出retries=2,尝试输入其他的如 'x' 超过2次    
# result3 = ask_ok("Yes or No?",'Y or N?')  # 不可只省略第二个参数,若尝试输入其他的如 'x',会报错
# result4 = ask_ok("Yes or No?",3,'Y or N?') # 给出所有的参数,可尝试输入'y' 'no' 等;输入其他的如 'x' 超过3次
# print(result4)

注意:默认值是在函数定义作用域被解析的,如下所示

'''默认值是在函数定义作用域被解析的'''
i = 5
def print_i(var=i):
  print(var)
i = 6
print_i()    # 输出为5

重要警告:默认值只被赋值一次。这使得当默认值是可变对象时会有所不同,如列表、字典或大多数类的实例。如下例,函数在后续调用过程中会累积之前传给它的参数。

''' 默认值只被赋值一次。这使得当默认值是可变对象时会有所不同,如列表、字典或大多数类的实例。
  函数在后续调用过程中会累积之前传给它的参数。
'''
def append_L(a,L=[]):     # 必须传参a,L不必须,为list,默认为空
  L.append(a)
  return L
print(append_L(1))      # 给出参数 a=1, 此时 L 已变为 [1]
print(append_L(2))      # 输出 [1,2]
print(append_L(3))      # 输出 [1,2,3]
''' L缺省时,做改变L,而不是累积值,可像下方这样定义函数 '''
def change_L(a,L=None):
  if L is None:
    L = []
  L.append(a)
  return L
print(change_L(1))      # 给出参数 a=1, L为None
print(change_L(2))      # 给出参数 a=2, L为None  输出 [2]
print(change_L(3,[0]))    # 给出参数 a=1, L=[0]  输出 [0,3]

关键字参数

上面的例子中,调用函数给出的参数都是根据定义的顺序来的。函数还可以根据 关键字函数 的形式来调用,参见下面的示例:

def add(a,b):
  return (a+b)
print(add(b=9,a=2))        # 关键字参数定义 b=9 , a=2 与传参顺序无关
# print(add(b=9,2))        # 会报错

可变参数列表

可以让函数调用可变个数的参数(不常用),这些参数被包装进一个元组。在这些可变个数的参数之前,可以有零到多个普通的参数。

可变参数的表示为在其参数名前加*,如*args;参见下面的示例:

def join_bysep(*strs,sep):    # strs 可为多个参数
  return sep.join(strs)     # 字符串连接函数 sep.join(str)
print(join_bysep("red","blue","green",sep=" "))
print(join_bysep("red","blue",sep=","))
print(join_bysep("red",sep=","))
print(join_bysep(sep=","))    # 无strs传参,为一空的字符串

关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python求斐波那契数列示例分享
Feb 14 Python
详解python中xlrd包的安装与处理Excel表格
Dec 16 Python
用于业余项目的8个优秀Python库
Sep 21 Python
使用python socket分发大文件的实现方法
Jul 08 Python
Apache部署Django项目图文详解
Jul 30 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
Feb 07 Python
Python实现文件压缩和解压的示例代码
Aug 12 Python
Python Unittest原理及基本使用方法
Nov 06 Python
Python datetime模块的使用示例
Feb 02 Python
python 爬取华为应用市场评论
May 29 Python
python tqdm用法及实例详解
Jun 16 Python
python使用matplotlib绘制图片时x轴的刻度处理
Aug 30 Python
Python3基础教程之递归函数简单示例
Jun 07 #Python
Python正则表达式匹配和提取IP地址
Jun 06 #Python
Python 常用模块 re 使用方法详解
Jun 06 #Python
Python比较配置文件的方法实例详解
Jun 06 #Python
Django中使用 Closure Table 储存无限分级数据
Jun 06 #Python
创建Django项目图文实例详解
Jun 06 #Python
Django网络框架之HelloDjango项目创建教程
Jun 06 #Python
You might like
VFP与其他应用程序的集成
2006/10/09 PHP
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
PHP基于SPL实现的迭代器模式示例
2018/04/22 PHP
Yii框架的路由配置方法分析
2019/09/09 PHP
JavaScript 对象模型 执行模型
2010/10/15 Javascript
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
2013/07/09 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
js实现贪吃蛇小游戏(加墙)
2020/07/31 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
Python 正则表达式操作指南
2009/05/04 Python
python装饰器初探(推荐)
2016/07/21 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
python求加权平均值的实例(附纯python写法)
2019/08/22 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
基于DOM+CSS3实现OrgChart组织结构图插件
2016/03/02 HTML / CSS
世界领先的26岁以下学生和青少年旅行预订网站:StudentUniverse
2018/07/01 全球购物
软件测试常见笔试题
2012/02/04 面试题
事业单位接收函
2014/01/10 职场文书
期末考试动员演讲稿
2014/01/10 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
职代会闭幕词
2015/01/28 职场文书
应聘教师求职信范文
2015/03/20 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
职工培训工作总结
2015/08/10 职场文书
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js