全栈python之路——用函数实现模块化程序设计

把实现某一个功能的代码定义为一个函数,在需要使用时,随即调用即可。
简单理解就是可以完成某项 工作的代码块,类似于积木块,可以反复地使用

一、函数的创建和调用

创建一个函数

创建函数其实就是定义一个函数:
语法格式如下

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
位置参数
  1. 数量必须与定义的参数保持一致,否则会报以下错误:
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
  1. 位置必须 与定义时保持一致
关键字参数:

调用时如果想位置不一致怎么办:

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="{&quot;mod&quot;:&quot;popu_824&quot;}"><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="{&quot;mod&quot;:&quot;1582594662_002&quot;}"><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="{&quot;mod&quot;:&quot;popu_379&quot;}" 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="{&quot;mod&quot;:&quot;popu_379&quot;}">已关注</a>
                                </div>
                        </div>
                </div>
</article>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河北王承志

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值