把实现某一个功能的代码定义为一个函数,在需要使用时,随即调用即可。
简单理解就是可以完成某项 工作的代码块,类似于积木块,可以反复地使用
一、函数的创建和调用
创建一个函数
创建函数其实就是定义一个函数:
语法格式如下
def functionname([parameterlist])
['''comments''']
[functionbody]
- 1
- 2
- 3
参数说明:
functionname : 函数名称,在调用函数时使用
parameterlist :可选参数,用于指定向函数中传递参数。参数之间用逗号分割 ,不指定表示没有参数
‘’‘comments’’’:可选参数,表示为函数指定注释,注释的内容通常是说明该函数的功能
functionbody:可选参数,用于指定函数体功能代码。如果函数有返回值,可以使用return语句调用
注意:如果定义一个什么也不做的空函数,可以使用pass语句作为占位符
比如创建一个根据体重和身高计算BMI的函数fun_bmi(),该函数包含三个参数,分别用于指定姓名,身高和体重,再根据公式:BMI=体重/(身高*身高)
# -*- coding: utf-8 -*-
# @Time : 2019/5/26 19:15
# @Author : Xieqc
# @Email : xieqc@tedu.cn
# @File : 定义函数BMI.py
# @Software: PyCharm
def fun_bmi(person,height,weight):
'''功能:根据身高和体重计算BMI指数
:param person: 姓名
:param height: 身高,单位:米
:param weight: 体重,单位:千克
'''
print(person + '的身高' + str(height) + "米 \t 体重:" + str(weight) + "千克")
bmi = weight/(height*height)
print(person + "的BMI指数为:" + str(bmi))
if bmi<18.5:
print('tai qing le')
if bmi>=18.5 and bmi<24.9:
print('zhengchang')
if bmi>=24.9 and bmi<29.9:
print('guozhong')
if bmi>=29.9:
print('pangzi')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
运行上面的代码,将不会显示任何内容,也不会抛出异常,因为fun_bmi()函数还没有调用。
调用函数
调用上诉函数:
fun_bmi('匿名',1.75,75)
- 1
显示如下结果:
匿名的身高1.75米 体重:75千克
匿名的BMI指数为:24.489795918367346
zhengchang
- 1
- 2
- 3
pass语句
def func():
pass
- 1
- 2
写个pass先占着,以后再写。
二、参数传递
什么是形式参数和实际参数
形式参数就是你定义函数时写的参数,相当于 变量名
实际参数就是你调用函数时写的参数,相当于给变量赋的值
值传递和引用传递又是什么鬼?
值传递:实参为不可变对象,传递后,实参值不变
引用传递:实参为可变对象,传递后,实参值也一同改变
# 定义函数
def demo(obj):
print("原值:",obj)
obj += obj
#调用函数
print("=========值传递========")
mot = "唯有在被追赶的时候,你才能真正地奔跑。"
print("函数调用前:",mot)
demo(mot) #采用不可变对象——字符串
print("函数调用后:",mot)
print("=========引用传递 ========")
list1 = ['邓肯','吉诺比利','帕克']
print("函数调用前:",list1)
demo(list1) #采用可变对象——列表
print("函数调用后:",list1)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
函数执行后:
=========值传递========
函数调用前: 唯有在被追赶的时候,你才能真正地奔跑。
原值: 唯有在被追赶的时候,你才能真正地奔跑。
函数调用后: 唯有在被追赶的时候,你才能真正地奔跑。
=========引用传递 ========
函数调用前: ['邓肯', '吉诺比利', '帕克']
原值: ['邓肯', '吉诺比利', '帕克']
函数调用后: ['邓肯', '吉诺比利', '帕克', '邓肯', '吉诺比利', '帕克']
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
位置参数
- 数量必须与定义的参数保持一致,否则会报以下错误:
Traceback (most recent call last):
File "D:/01study/02python/python代码存放/日常练习代码存放/定义函数BMI.py", line 24, in <module>
fun_bmi('匿名',1.75)
TypeError: fun_bmi() missing 1 required positional argument: 'weight'
- 1
- 2
- 3
- 4
- 位置必须 与定义时保持一致
关键字参数:
调用时如果想位置不一致怎么办:
fun_bmi(height=1.83,weight=75,person='路人甲')
- 1
为参数设置默认值
在定义函数时,可以指定默认参数,需要注意的是,默认参数写在所有参数的最后,否则会产生语法错误。
使用函数“函数名.defaults” 查看函数的默认值参数的当前值。
- 使用可变对象作为函数参数的默认值时,多次调用,会导致意料之外的情况:
def demo(obj=[]): # 定义函数并为参数obj指定默认值
print("obj的值:",obj)
obj.append(1)
demo()
demo()
- 1
- 2
- 3
- 4
- 5
连续调用两次,会产生如下效果:
obj的值: []
obj的值: [1]
- 1
- 2
- 3
为了防止出现这种情况,最好使用None作为对象的默认值
def demo(obj=None):
if obj==None:
obj = []
print("obj的值:",obj)
obj.append(1)
demo()
demo()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
结果如下:
obj的值: [ ]
obj的值: [ ]
- 1
- 2
- 定义函数时,为形参设置默认值,必须指向不可变对象
可变参数
两种形式,一种形参前面有一个*号,接收参数后放到元祖中
一种有两个**星号,接收参数后放到字典中。
1.*parameter
表示接收任意多个实际参数并将其放到一个元组中:
def printplayer(*name): # 定义输出我喜欢的NBA球员的函数
print('\n我喜欢的NBA球员有:')
for item in name:
print(item) # 输出球员名称
printplayer('邓肯')
printplayer('邓肯', '乔丹', '吉诺比利', '帕克')
printplayer('邓肯', '大卫罗宾逊', '卡特', '鲍文')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
调用上面三次函数,结果如下:
我喜欢的NBA球员有:
邓肯
我喜欢的NBA球员有:
邓肯
乔丹
吉诺比利
帕克
我喜欢的NBA球员有:
邓肯
大卫罗宾逊
卡特
鲍文
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
如果想要使用已经存在的列表作为函数的可变参数,在列表名前加*号
parm = ['邓肯','吉诺比利','帕克']
printplayer(*parm)
- 1
- 2
2.**parameter
接收任意多个显式赋值的参数,并将其放到一个字典中。
def printsign(**sign): # 定义输出姓名和绰号的函数
print() # 输出一个空行
for key, value in sign.items(): # 遍历字典
print("[" + key + "] 的绰号是:" + value) # 输出组合后的信息
printsign(邓肯=‘石佛’, 罗宾逊=‘海军上将’)
printsign(吉诺比利=‘妖刀’, 帕克=‘跑车’, 鲍文=‘鲍三叔’)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
运行结果如下:
[邓肯] 的绰号是:石佛
[罗宾逊] 的绰号是:海军上将
[帕克] 的绰号是:跑车
[吉诺比利] 的绰号是:妖刀
[鲍文] 的绰号是:鲍三叔
- 1
- 2
- 3
- 4
- 5
- 6
变量的作用域
局部变量和全局变量
局部变量:在函数内部有用
全局变量:
1.如果一个变量在函数外调用,name不仅可以在函数外可以访问到,在函数内也可以访问到
message = '唯有在被追赶的时候,你才能真正地奔跑。' # 全局变量
def f_demo():
print('函数体内:全局变量message =',message) # 在函数体内输出全局变量的值
f_demo() # 调用函数
print('函数体外:全局变量message =',message) # 在函数体外输出全局变量的值
- 1
- 2
- 3
- 4
- 5
运行结果如下:
函数体内:全局变量message = 唯有在被追赶的时候,你才能真正地奔跑。
函数体外:全局变量message = 唯有在被追赶的时候,你才能真正地奔跑。
- 1
- 2
- 局部变量和全局变量重名时,不影响函数外的变量。
2.使用global 关键字进行修饰,也可以变为全局变量
message = '唯有在被追赶的时候,你才能真正地奔跑。' # 全局变量
print('函数体外:message =',message) # 在函数体外输出全局变量的值
def f_demo():
message = '命运给予我们的不是失望之酒,而是机会之杯。' # 局部变量
print('函数体内:message =',message) # 在函数体内输出局部变量的值
f_demo() # 调用函数
print('函数体外:message =',message) # 在函数体外输出全局变量的值
- 1
- 2
- 3
- 4
- 5
- 6
- 7
运行结果如下:
函数体外:message = 唯有在被追赶的时候,你才能真正地奔跑。
函数体内:message = 命运给予我们的不是失望之酒,而是机会之杯。
函数体外:message = 唯有在被追赶的时候,你才能真正地奔跑。
- 1
- 2
- 3
上诉结果可以看出,内部定义的变量没有变为全局变量,可以使用global关键字
message = '唯有在被追赶的时候,你才能真正地奔跑。' # 全局变量
print('函数体外:message =',message) # 在函数体外输出全局变量的值
def f_demo():
global message # 将message声明为全局变量
message = '命运给予我们的不是失望之酒,而是机会之杯。' # 全局变量
print('函数体内:message =',message) # 在函数体内输出全局变量的值
f_demo() # 调用函数
print('函数体外:message =',message) # 在函数体外输出全局变量的值
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
运行结果如下:
函数体外:message = 唯有在被追赶的时候,你才能真正地奔跑。
函数体内:message = 命运给予我们的不是失望之酒,而是机会之杯。
函数体外:message = 命运给予我们的不是失望之酒,而是机会之杯。
- 1
- 2
- 3
- 虽然内部和外部变量可以重名,但是不建议这样做。
匿名函数
没有名字的函数,只是用一次,没什么用。。。
import math # 导入math模块
def circlearea(r): # 计算圆面积的函数
result = math.pi*r*r # 计算圆面积
return result # 返回圆的面积
r = 10 # 半径
print('半径为',r,'的圆面积为:',circlearea(r))
- 1
- 2
- 3
- 4
- 5
- 6
半径为 10 的圆面积为: 314.1592653589793
- 1
import math # 导入math模块
r = 10 # 半径
result = lambda r:math.pi*r*r # 计算圆的面积的lambda表达式
print('半径为',r,'的圆面积为:',result(r))
- 1
- 2
- 3
- 4
- 5
- 在使用lambda表达式时,需要定义一个变量,用于调用lambda,否则会报错
- 上诉两个函数都没有名字,当你不会起名的时候会用得到
常用python内置函数:
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet">
<div class="more-toolbox">
<div class="left-toolbox">
<ul class="toolbox-list">
<li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
<use xlink:href="#csdnc-thumbsup"></use>
</svg><span class="name">点赞</span>
<span class="count"></span>
</a></li>
<li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{"mod":"popu_824"}"><svg class="icon" aria-hidden="true">
<use xlink:href="#icon-csdnc-Collection-G"></use>
</svg><span class="name">收藏</span></a></li>
<li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{"mod":"1582594662_002"}"><svg class="icon" aria-hidden="true">
<use xlink:href="#icon-csdnc-fenxiang"></use>
</svg>分享</a></li>
<!--打赏开始-->
<!--打赏结束-->
<li class="tool-item tool-more">
<a>
<svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
</a>
<ul class="more-box">
<li class="item"><a class="article-report">文章举报</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="person-messagebox">
<div class="left-message"><a href="https://blog.csdn.net/xie_qi_chao" target="_blank">
<img src="https://profile.csdnimg.cn/B/F/6/3_xie_qi_chao" class="avatar_pic" username="xie_qi_chao">
<img src="https://g.csdnimg.cn/static/user-reg-year/1x/2.png" class="user-years">
</a></div>
<div class="middle-message">
<div class="title"><span class="tit"><a href="https://blog.csdn.net/xie_qi_chao" data-report-click="{"mod":"popu_379"}" target="_blank">解启超</a></span>
</div>
<div class="text"><span>发布了317 篇原创文章</span> · <span>获赞 48</span> · <span>访问量 3万+</span></div>
</div>
<div class="right-message">
<a href="https://im.csdn.net/im/main.html?userName=xie_qi_chao" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
</a>
<a class="btn btn-sm attented bt-button personal-watch" data-report-click="{"mod":"popu_379"}">已关注</a>
</div>
</div>
</div>
</article>