python 函数

Python的函数是由一个新的语句编写,即def,def是可执行的语句--函数并不存在,直到Python运行了def后才存在。

函数是通过赋值传递的,参数通过赋值传递给函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

 

定义函数的一些规则

  1. 函数代码块以def关键词开头,后接函数标识符名称和圆括号()。
  2. 函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。不能使用任何的标点符号;函数名是区分大小写的, 函数名不能是保留字。
  3. 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  4. 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  5. 函数内容以冒号起始,并且缩进。
  6. Return[expression]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

我们来举个监控的例子

while True:
    if cpu利用率 > 90%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接

    if 硬盘使用空间 > 90%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接

    if 内存占用 > 80%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接

 

这样是不是很烦。那么我们来提取简化一下

def 发送邮件(内容)
    #发送邮件提醒
    连接邮箱服务器
    发送邮件
    关闭连接

while True:

    if cpu利用率 > 90%:
        发送邮件('CPU报警')

    if 硬盘使用空间 > 90%:
        发送邮件('硬盘报警')

    if 内存占用 > 80%:

 

很显然,第二种方法更合理,简练,这就已经很明显得表现出来了函数式编程的优势,下面我们来看一下函数式编程和面向过程编程的区别

  1. 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  2. 面向对象:对函数进行分类和封装,让开发“更快更好更强...”

另外,函数式编辑最重要的是增强代码的重用性和可读性(这好像是所有语言公共的目标)

标准语法

def 函数名(参数)
    ....
    .....
   
函数体
    .....
    .....

 

如上面的规则所说的一样,函数的定义主要包括

·        def:表示函数的关键字

·        函数名:函数的名称,日后根据函数名调用函数

·        函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888,2]中的最大数等...

·        参数:为函数体提供数据

·        返回值:当函数执行完毕后,可以给调用者返回数据。

 

返回值:

函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。

def 发送短信():

   
发送短信的代码...

   
if 发送成功:
       
return True
    else
:
       
return False


while True
:

   
# 每次执行发送短信函数,都会将返回值自动赋值给result
    #
之后,可以根据result来写日志,或重发等操作

    result = 发送短信()
   
if result== False:
       
记录日志,短信发送失败...

 

参数

1:无参数实现

def CPU报警邮件()
   
#发送邮件提醒
   
连接邮箱服务器
   
发送邮件
    关闭连接

def 硬盘报警邮件()
   
#发送邮件提醒
   
连接邮箱服务器
   
发送邮件
    关闭连接

def 内存报警邮件()
   
#发送邮件提醒
   
连接邮箱服务器
   
发送邮件
    关闭连接
 
while True
 
   
if cpu利用率 >90%:
       
CPU报警邮件()
 
   
if 硬盘使用空间 > 90%:
       
硬盘报警邮件()
 
   
if 内存占用 > 80%:
       
内存报警邮件()

 

 

有参数实现

def 发送邮件(邮件内容)

   
#发送邮件提醒
   
连接邮箱服务器
   
发送邮件
    关闭连接


while True

   
if cpu利用率 >90%:
       
发送邮件("CPU报警了。")

   
if 硬盘使用空间 > 90%:
       
发送邮件("硬盘报警了。")

   
if 内存占用 > 80%:
       
发送邮件("内存报警了。")

 

函数又分为三中不同的参数

1:普通参数

2:默认参数

3:动态参数

我们先来看下普通参数

def test_print(name):                      ### 定义一个函数名为 test_print 的函数,接收参数赋值给name
    print("your name is %s:" % name)       ###  print 打印结果

test_print('zhang')                       ### 调用test_print函数 传递’zhang’的实参

## name : test_print 函数的形式参数,简称形参
## zhang: test_print 函数的实际参数,简称实参

 

默认参数:

def test_print(name,age = 20):    ### 定义一个函数名为 test_print 的函数,接收参数赋值给name,age,哪果没有age值,默认为20
    print("your name is %s: and your age is%s" % (name,age))    ### print 打印结果

test_print('zhang')                      ### 调用 test_print函数 只传递name的实参

 

输出结果可以看到 age 默认应用了default的20

your nameis zhang: and your age is 20


下面给age 传入实参

def test_print(name,age = 20):    ### 定义一个函数名为 test_print 的函数,接收参数赋值给name,age,哪果没有age值,默认为20
    print("your name is %s: and your age is%s" % (name,age))    ### print 打印结果

test_print('zhang',25)                       ### 调用test_print函数 只传递name的实参

结果

your nameis zhang: and your age is 25

 

test_print(12,34,56,25) 

当我们这样调用上面的程序时,会发现报错了

Traceback(most recent call last):
  File"C:/Users/zhang/PycharmProjects/S12/day3/Test_Def.py", line 185, in<module>
    test_print(12,34,56,25)                       ### 调用 test_print函数 只传递name的实参
TypeError:test_print() takes from 1 to 2 positional arguments but 4 were given

为什么?提示只有两个位置参数,我传了4个,那么当我们涉及到多个参数时,我们就可以使用动态参数

 

动态参数-序列

def test_print(*args):
   
print(args)               ### print 打印结果

test_print(12,34,56,25)       ### 直接传入多个参数

结果

(12, 34,56, 25)

 

def test_print(*args):
   
print(args)               ### print 打印结果

#test_print(12,34,56,25)       ###
直接传入多个参数

zhang = [11,22,33,44,'age'### 定义一个列表
test_print(zhang)             ### 调用函数传入这个列表

结果看到依然可以

([11, 22,33, 44, 'age'],)

动态参数-字典

那么当我们再传入字典时会是什么样的结果呢?

def test_print(*args):
   
print(args)               ### print 打印结果

#test_print(12,34,56,25)       ###
直接传入多个参数

zhang = {'name':'zhang','age':25### 定义一个字典
test_print(zhang)             ### 调用函数传入这个列表

我们发现返回的结果还是在()内

({'age':25, 'name': 'zhang'},)


怎么办?我们使用另外一个方法

def test_print(**kwargs):
   
print(kwargs)                     ###  print 打印结果

#test_print(12,34,56,25)              ###
直接传入多个参数

zhang = {'name':'zhang','age':25,}  ### 定义一个字典
test_print(**zhang)                    ### 调用函数传入这个列表

结果显示如我们所愿

{'age':25, 'name': 'zhang'}

 

动态参数-序列加字典

当我们即想传序列又想加上字典时,我们可以这样

def test_print(*args,**kwargs):
   
print(args)
   
print(kwargs)

t1
= [1,2,3,'好好学习']
d1
= {'name':'zhang','age':25}

 

输出结果

([1, 2,3, '好好学习'],)
{'name':'zhang', 'age': 25}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值