您的位置:首页 > 编程语言 > Python开发

python 函数

2016-01-19 13:19 375 查看
Python的函数是由一个新的语句编写,即def,def是可执行的语句--函数并不存在,直到Python运行了def后才存在。

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

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

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



定义函数的一些规则

函数代码块以def关键词开头,后接函数标识符名称和圆括号()。
函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。不能使用任何的标点符号;函数名是区分大小写的, 函数名不能是保留字。

任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
Return[expression]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

我们来举个监控的例子
while True:
    if cpu利用率 > 90%:
        #发送邮件提醒
        连接邮箱服务器
        发送邮件
        关闭连接

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

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



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

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

while True:

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

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

    if 内存占用 > 80%:



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

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

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

标准语法

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}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: