当前位置: 首页 > article >正文

python学习笔记5-函数的定义

1.函数的定义:

# def 是英⽂ define 的缩写

def 函数名([参数1],[参数2]....[参数n]):

  函数体

关于函数名的定义,有几项需要注意的地方:

函数名命名规则同变量名,要满⾜标识符命名规则
不能和系统函数重名,否则系统函数⽆法使⽤
命名⻛格:⼀般建议⽤下划线分隔的⼩写单词组成:say_hello
函数名称应该能够表达 函数封装代码 的功能,⽅便后续的调⽤
可以由 字⺟、下划线 和 数字 组成 ,不能以数字开头 ,不能与关键字重名
•  不能将函数调⽤放在函数定义 的上⽅
在python调试中,F8 Step Over 可以单步执⾏代码,会把函数调⽤看作是⼀⾏代码直接执⾏
F7 Step Into 可以单步执⾏代码,如果是函数,会 进⼊函数内部

2.函数的返回值:在python中,使用return返回函数的执行结果。

3.函数的参数

参数分类
位置参数,要求实参顺序必须和形参顺序完全⼀致,由形参顺序决定实参顺序
def say_hello(name,age,home):
 print('⼤家好,我是{},我今年{}岁了,我来⾃{}'.format(name,age,home))

#实参个数、顺序必须和形参⼀致
say_hello('王佳',18,'湖北武汉')
关键字参数,函数调⽤时,实参可以是键值对,键就是形参名字,这样的调⽤,实参不必关⼼形参 的顺序。
def say_hello(name,age,home):
 print('⼤家好,我是{},我今年{}岁了,我来⾃{}'.format(name,age,home))

#三个关键字参数
say_hello(name='王佳',home='⼤连',age=20)
#两个关键字参数
say_hello('⼤强',home='美国',age=30)
#⼀个关键字参数
say_hello('小强',24,home='何⽅')
默认值参数,如果形参在定义的时候给定⼀个值,那么函数在调⽤时就可以不传实参,可以简化调⽤,关于默认值参数,有几处需要注意的地方:
默认值参数必须放到最右边
如果传了实参,那么实参优先,不会使⽤默认值
默认值只计算⼀次
默认值必须是不可变对象
示例:
gl_num_list = [6, 3, 9]
# 默认就是升序排序,因为这种应⽤需求更多
gl_num_list.sort()
print(gl_num_list)# 只有当需要降序排序时,才需要传递 reverse 参数
gl_num_list.sort(reverse=True)
print(gl_num_list)
指定函数的缺省参数
在参数后使⽤赋值语句,可以指定参数的缺省值
def print_info(name, gender=True): 
  gender_text = "男⽣"
  if not gender:
    gender_text = "⼥⽣" 
  print("%s 是 %s" % (name, gender_text))
提⽰
1. 缺省参数,需要使⽤ 最常⻅的值 作为默认值!
2. 如果⼀个参数的值 不能确定,则不应该设置默认值,具体的数值在调⽤函数时,由外界传递!
缺省参数的注意事项:
1) 缺省参数的定义位置
必须保证 带有默认值的缺省参数 在参数列表末尾
所以,以下定义是错误的!
def print_info (name, gender= True , title):
2) 调⽤带有多个缺省参数的函数
在调⽤函数时,如果有 多个缺省参数,需要指定参数名,这样解释器才能够知道参数的对应关
系!
可变参数,传⼊的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。使⽤*接收任意数 量的位置参数
#注意:*的不定⻓参数被当做元组处理
def demo(a,b,*args):
 print(a,b,args)

demo(12,33,90)
demo(1,2,3,4,5)

a=(1,2,3)
demo(*a)

#使⽤接收任意数量的关键字参数
#注意:不定⻓参数被当做字典处理
def demo1(a,args):
 print(a,args)

demo1(1,name='kk',age=3)

b = {'a':20,'b':12,'c':32}
demo(b)

多值参数
• 有时可能需要一个函数能够处理的参数个数是不确定的,这个时候,就可以使用多值参数
• python 中有两种多值参数:
◦ 参数名前增加 一个 * 可以接收 元组
◦ 参数名前增加 两个 * 可以接收 字典
• 一般在给多值参数命名时,习惯使用以下两个名字
◦ *args 存放元组参数,前面有1个 *
◦ **kwargs 存放字典 参数,前面有两个 *
• args 是 arguments 的缩写,有变量的含义
• kw 是 keyword 的缩写, kwargs 可以记忆键值对参数
参数组合
在Python中定义函数,可以⽤必选参数、默认参数、可变参数和关键字参数,这4种参数都可以⼀起 使⽤,或者只⽤其中某些,但是请注意, 参数定义的顺序必须是:必选参数、默认参数、可变参数和 关键字参数。
⽐如定义⼀个函数,包含上述4种参数:
def func(a, b, c=0, *args, **kw):
 print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
最神奇的是通过⼀个tuple和dict,也可以调⽤该函数:
>>> args = (1, 2, 3, 4)
>>> kw = {'x': 99}
>>> func(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'x': 99}

匿名函数

不在使⽤def语句这样标准的形式定义函数,⽽是使⽤lambda来创建匿名函数
格式: lambda [arg1[, arg2[, args,……]]]: exception
作⽤:作为参数传递,实现回调,简化代码
特点:
1. lambda只是⼀个表达式,函数体⽐def简单的多
2. lamdba主体是⼀个的表达,⽽不是代码块,仅能在lamdba表达式中封装有限的逻辑
3. lamdba函数拥有⾃⼰的命名空间,且不能访问⾃有参数列表之外的或全局命名空间⾥的参数
f = lambda x, y: x + y
print(f(2,3))

函数名作为参数

函数也是⼀种数据,那么就可以⽤变量来保存(函数名也是⼀个特殊的变量)
应⽤:将函数作为参数传递(回调函数)
def func(x, y):
 return x + y

f = func
print(f(1,2))

命令⾏参数

如果要获取命令⾏下传给python⽂件的参数可以使⽤体统模块sys的argv来获取
参数个数:len(sys.argv)
⽂件名:sys.argv[0]
参数:sys.argv[1],sys.argv[2].....
import sys

print(len(sys.argv))
print(sys.argv[0])
print(sys.argv[1])

参数传递(**)

python的参数传递是简单的值传递,当然这⾥的值是指变量的引⽤(地址),不是变量的值。不存在 值传递和引⽤传递的区分。简⽽⾔之,python的参数传递可以称之为对象引⽤传递,对象可以分为:
不可变对象:int、float、None、complex、bool、tuple、str,range
在函数内部不可能修改函数外部的变量
可变对象: dict、list
可以在函数内部修改

⼩结:

Python的函数具有⾮常灵活的参数形态,既可以实现简单的调⽤,⼜可以传⼊⾮常复杂的参数。
默认参数⼀定要⽤不可变对象,如果是可变对象,运⾏会有逻辑错误!
要注意定义可变参数和关键字参数的语法:
*args 是可变参数,args接收的是⼀个tuple;
**kw 是关键字参数,kw接收的是⼀个dict。
以及调⽤函数时如何传⼊可变参数和关键字参数的语法: 可变参数既可以直接传⼊: func(1, 2, 3) ,⼜可以先组装list或tuple,再通过 *args 传⼊:
func(*(1, 2, 3))
关键字参数既可以直接传⼊: func(a=1, b=2) ,⼜可以先组装dict,再通过 kw 传⼊:
func( {'a': 1, 'b': 2})
使⽤ *args **kw 是Python的习惯写法,当然也可以⽤其他参数名,但最好使⽤习惯⽤法。

http://www.kler.cn/a/532272.html

相关文章:

  • 【零基础到精通】小白如何自学网络安全
  • Airflow:深入理解Apache Airflow Task
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.25 视觉风暴:NumPy驱动数据可视化
  • 安全策略实验报告
  • 解决PyG安装中torch-sparse安装失败问题:详细指南
  • Jenkins 触发构建的几种常见方式
  • 2022ACMToG | 寻找快速的去马赛克算法
  • 每天学点小知识之设计模式的艺术-策略模式
  • 网络安全学习 day5
  • 司库信息化解决方案(deepseek来源)
  • DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”_deepseek ddos
  • 11. 9 构建生产级聊天对话记忆系统:从架构设计到性能优化的全链路指南
  • 低空经济火热,大载重物流运输无人机技术详解
  • TensorFlow 与 PyTorch 的直观区别
  • sql表的增删改、替换
  • 扩展域并查集 带权并查集
  • 【PyQt】pyqt小案例实现简易文本编辑器
  • 【Leetcode刷题记录】1456. 定长子串中元音的最大数目---定长滑动窗口即解题思路总结
  • 代码随想录八股训练营学习总结
  • 哈希(Hashing)在 C++ STL 中的应用
  • 虚幻基础17:动画蓝图
  • 网站快速收录:如何优化网站长尾关键词布局?
  • BUU14 [极客大挑战 2019]PHP1
  • 基于Springboot框架的学术期刊遴选服务-项目演示
  • proxmox创建虚拟机
  • Vue安装相关依赖冲突问题