Python自定义函数定义,参数,调用代码解析


Posted in Python onDecember 27, 2017

函数能提高应用的模块性,和代码的重复利用率。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脚本将绝对url替换为相对url的教程
Apr 24 Python
Python实现数据库编程方法详解
Jun 09 Python
详解Python多线程
Nov 14 Python
Python 文件处理注意事项总结
Apr 10 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
Oct 28 Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 Python
对python当中不在本路径的py文件的引用详解
Dec 15 Python
Python面向对象之继承和多态用法分析
Jun 08 Python
HTML的form表单和django的form表单
Jul 25 Python
使用Python制作新型冠状病毒实时疫情图
Jan 28 Python
python线程池如何使用
May 28 Python
Python pip使用超时问题解决方案
Aug 03 Python
详解用Python处理HTML转义字符的5种方式
Dec 27 #Python
Python中使用支持向量机(SVM)算法
Dec 26 #Python
Python中支持向量机SVM的使用方法详解
Dec 26 #Python
详解python中的 is 操作符
Dec 26 #Python
matplotlib简介,安装和简单实例代码
Dec 26 #Python
Python中xrange与yield的用法实例分析
Dec 26 #Python
Python简单计算数组元素平均值的方法示例
Dec 26 #Python
You might like
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
使用PHP会话(Session)实现用户登陆功能
2013/06/29 PHP
php检测url是否存在的方法
2015/04/14 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
2016/03/05 PHP
php面向对象值单例模式
2016/05/03 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
js如何实现设计模式中的模板方法
2013/07/23 Javascript
使用jQuery实现Web页面换肤功能的要点解析
2016/05/12 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
2017/09/29 NodeJs
Linux Centos7.2下安装nodejs&amp;npm配置全局路径的教程
2018/05/15 NodeJs
js实现开关灯效果
2020/03/30 Javascript
element-ui 本地化使用教程详解
2019/10/28 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python pass 语句使用示例
2014/03/11 Python
搞笑的程序猿:看看你是哪种Python程序员
2015/06/12 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
python创造虚拟环境方法总结
2019/03/04 Python
python日志模块logbook使用方法
2019/09/19 Python
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
英国50岁以上人群的交友网站:Ourtime
2018/03/28 全球购物
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
受欢迎的大学生自我评价
2013/12/05 职场文书
服装设计专业自荐书范文
2013/12/30 职场文书
幼儿园儿童节主持词
2014/03/21 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
民主评议党员登记表自我评价
2014/10/20 职场文书
2019年英语版感谢信(8篇)
2019/09/29 职场文书
详解python字符串驻留技术
2021/05/21 Python
pandas取dataframe特定行列的实现方法
2021/05/24 Python
dubbo服务整合zipkin详解
2021/07/26 Java/Android