本章内容
- 函数的定义与调用
- 函数的分类
- 函数的返回值
- 函数的参数
函数的定义与调用
"""
函数的使用必须遵循’先定义,后调用’的原则。函数的定义就相当于事先将函数体代码保存起来,然后将内存地址赋值给函数名,函数名就是对这段代码的引用,这和变量的定义是相似的。没有事先定义函数而直接调用,就相当于在引用一个不存在的’变量名’。
"""
eg :
定义函数:
def func():
print('hello world')
调用函数:
func()
函数的分类
1.内置函数
python解释器提前定义好可以直接调用的函数
eg: len、open...
2.自定义函数
1.1 自己编写的函数
2.1 无参函数
2.3 空函数
"""
定义空函数通常是有用的,因为在程序设计的开始,往往是先想好程序都需要完成什么功能,然后把所有功能都列举出来用pass充当函数体“占位符”,这将使得程序的体系结构立见,清晰且可读性强。
"""
函数的返回值
变量名 = 函数调用
1.当函数体代码没有return关键字的时候,返回值是None
eg:
def func():
print('你他喵的,哈哈哈!!!')
s = func()
print(s)
2. 当函数体代码写了return但是没有跟任何值得时候 返回值也是None
def func():
print('你他喵的,哈哈哈!!!')
return
s = func()
print(s)
3.当函数体代码写了return并且跟了数据 那么写什么就返回什么
如果写的是值那么直接返回值(任意数据类型)
如果写的是变量名那么返回变量名指向的值
eg:
def func():
name = 'jerry'
return name
s = func()
print(s)
4.return后面还可以跟多个值 逗号隔开 会自动组织成元组返回出去后
eg:
def func():
print('python是最牛逼的语言')
name = 'jerry'
name2 = 'kevin'
return name,name2,18,19
s = func()
print(s)
5.函数体代码遇到return会立刻结束函数运行
函数体代码里面写return相当于循环体代码里面写break
遇到了就立刻结束函数和循环的执行
函数的参数
1.函数的参数可以分为两大类
1.函数在定义阶段括号内写的参数
我们称之为'形式参数',简称为>>>>>:形参
2.函数在调用阶段括号内写的参数
我们称之为'实际参数',简称为>>>>>:实参
2.形参与实参的关系
形参类似于是变量名、实参类似于是变量的值
在调用函数的时候传入实参 会与形参临时绑定
函数运行结束之后自动结束绑定
eg:
def func(a,b):
print(a,b)
return 0
func('jason',18)
位置参数
位置形参:
在函数的定义中,括号内依次从左往右写上变量名
def func(name,age,gender):
print(f'他叫{name},{age}岁了,性别是{gender}')
return 666
位置实参:
func('jason',18,'male')
位置参数的特征:
1.位置形参与位置实参在绑定关系的时候就是按照从左往右的顺序依次绑定
2.位置形参与位置实参的个数要一致
eg:
func('jason',18,'male')
func()
func('jason',18)
func('jason',19,'male',182)
关键字参数
出现在实参中
指名道姓的给形参传值 不需要遵循位置
def func(name,age,gender):
print(f'他叫{name},{age}岁了,性别是{gender}')
return 666
func(name = 'jason',age = 18,gender = 'male')
func('tony',name='jason',gender='male')
func(name='jerry',age=18,'male')
func('jason',19,gender='male')
默认参数
出现在形参中
在函数定义阶段就已经给一些形参赋值了
后续如果不传值则使用默认的
后续如果传值则使用传入的
默认参数的出现也打破了形参与实参之间个数一致的情况
默认参数必须定义在位置参数的后面
eg:
def func(name,age,gender='male'):
print(f'他叫{name},{age}岁了,性别是{gender}')
return 666
func('jason',19,)
func(name='tony',age=20)
func('jerry',20,'remale')
可变长参数(重要)
需求:定义一个函数,无论传多少位置实参都可以正常执行
类似于print
def func(*a):
print(a)
func()
func(1)
func(1,2)
func(1,2,3,4,5,6,6)
eg:
def func(a, b, *s):
print(a, b, s)
func(1)
func(1,2)
func(1,2,3)
func(1,2,3,4)
eg:
def index(a, b, **k):
print(a, b, k)
index(a=1, b=2)
index(a=1, b=2, c=3, name='jason')
index(1,2,name='jason',age=18,pwd=123)
'''需求:定义一个函数 无论传入多少关键字参数都可以正常执行'''
def func(**k):
print(k)
func()
func(a=1,b=2)
func(a=1,b=2,c=3,d=4)
可变长形参
"""
思考题:如何定义一个无论接收多少个任意类型的参数都可以正常执行的函数
"""
def func(*a,**k):
print(a,k)
func()
func(1,2,3,4,name='jason',age=18)
"""*和**在形参中的使用 后面的变量名并不是关键 但是针对这两个特殊符号后面的变量名 有推荐的写法"""
def index(*args, **kwargs):
pass
补充说明
*和**不单单可以在形参中使用 还可以在实参中使用
def index(*args, **kwargs):
print(args, kwargs)
"""
*号在实参中
可以将列表或者元组打散成位置参数一一传入
"""
def func(*args, **kwargs):
print(args, kwargs)
func(*[1, 2, 3, 4, 5, 6])
func(*(1, 2, 3, 4, 5, 6))
func([1, 2, 3, 4, 5, 6])
"""
**号在实参中
可以将字典打散成关键字参数一一传入
"""
def func(*args, **kwargs):
print(args, kwargs)
func(**{'name': 'jason', 'name2': 'tony', 'name3': 'jerry'})
func({'name': 'jason', 'name2': 'tony', 'name3': 'jerry'})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人