python 函数
2016-01-19 13:19
375 查看
Python的函数是由一个新的语句编写,即def,def是可执行的语句--函数并不存在,直到Python运行了def后才存在。
函数是通过赋值传递的,参数通过赋值传递给函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
定义函数的一些规则
函数代码块以def关键词开头,后接函数标识符名称和圆括号()。
函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。不能使用任何的标点符号;函数名是区分大小写的, 函数名不能是保留字。
任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
函数内容以冒号起始,并且缩进。
Return[expression]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
我们来举个监控的例子
这样是不是很烦。那么我们来提取简化一下
很显然,第二种方法更合理,简练,这就已经很明显得表现出来了函数式编程的优势,下面我们来看一下函数式编程和面向过程编程的区别:
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象:对函数进行分类和封装,让开发“更快更好更强...”
另外,函数式编辑最重要的是增强代码的重用性和可读性(这好像是所有语言公共的目标)
标准语法
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
下面给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的实参
结果
当我们这样调用上面的程序时,会发现报错了
为什么?提示只有两个位置参数,我传了4个,那么当我们涉及到多个参数时,我们就可以使用动态参数
动态参数-序列
def
test_print(*args):
print(args)
### print 打印结果
test_print(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) ###
调用函数传入这个列表
结果看到依然可以
动态参数-字典
那么当我们再传入字典时会是什么样的结果呢?
def
test_print(*args):
print(args)
### print 打印结果
#test_print(12,34,56,25) ### 直接传入多个参数
zhang = {'name':'zhang','age':25}
### 定义一个字典
test_print(zhang) ###
调用函数传入这个列表
我们发现返回的结果还是在()内
怎么办?我们使用另外一个方法
def
test_print(**kwargs):
print(kwargs) ### print
打印结果
#test_print(12,34,56,25) ### 直接传入多个参数
zhang = {'name':'zhang','age':25,}
### 定义一个字典
test_print(**zhang)
### 调用函数传入这个列表
结果显示如我们所愿
动态参数-序列加字典
当我们即想传序列又想加上字典时,我们可以这样
def
test_print(*args,**kwargs):
print(args)
print(kwargs)
t1 = [1,2,3,'好好学习']
d1 = {'name':'zhang','age':25}
输出结果
函数是通过赋值传递的,参数通过赋值传递给函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道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}
相关文章推荐
- 33. Search in Rotated Sorted Array leetcode python 2016 new season
- Python 的socke编程示例
- python 环境搭建及pycharm的使用
- Python特殊语法:filter、map、reduce、lambda [转]
- python 协程
- Python序列之列表 (list)
- 自学Python八 爬虫大坑之网页乱码
- 《python》学习笔记(Day2),读入磁盘文件,经过处理,保存成相应的磁盘文件
- python中numpy库matrix和array的融合使用
- python文件操作
- PYTHON-基础-时间日期处理小结
- Transform from list in python to mat in numpy
- Python中list的实现
- python操作mysql总结
- python字符串/元组/列表/字典互转
- [python] - profilers性能分析器
- python的学习资源
- python浅拷贝与深拷贝
- Python算法题----求出和为S的所有连续正整数数列
- Python学习——struct模块的pack、unpack示例