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

Python自动化运维之函数基础知识

2017-07-21 23:03 330 查看
1、函数简介
简而言之,函数就是将一些语句集中方在一起的部件,它能够不止一次的在程序中运行。函数还能够计算出一个返回值,并能够改变作为函数输入的参数,而这些参数在代码运行时也许每次都不相同。以函数的形式去编写一个操作可以使它成为一个能够广泛应用的工具,让我们在不同的情形下都能够使用它。
更具体地说,函数是在编程过程中剪剪贴贴的替代——我们不再有一个操作的代码的多个冗余副本,而是将代码包含到一个单独的函数中。通过这样做,我们可以大大减少今后的工作:如果这个操作之后必须要修改,我们只需要修改其中的一份拷贝,而不是所有代码。
2、为什么要使用函数
2.1 最大化实现代码重用和最小化实现代码冗余
函数允许整合通用化代码,以便这些代码能够多次使用。因为它们允许一处编写多处运行,Python函数是这个语言中最基本的组成工具——它让我们在程序中减少代码的冗余成为现实, 并为代码的维护节省了不少的力气。
2.2 程序执行流程的分解
函数可以将一个程序分割定义为不同部分的工具。举个栗子:去做一份比萨,开始需要混合面粉,将面粉搅拌匀,增加顶部原料和烤等。如果你是在编写一个制作比萨的机器人的程序, 函数将会将整个“做比萨”这个任务分割成为独立的函数来完成整个流程中的每个子任务。独立的实现较小的任务要比一次完成整个流程要容易得多。一般来说,函数讲的是流程: 告诉你怎样去做某事,而不是让你使用它去做的事。

3、函数的分类:内置函数与自定义函数
函数即变量,变量必须先定义后使用,未定义而直接引用函数,就相当于在引用一个不存在的变量名

4、如何自定义函数
4.1 自定义函数语法

def 函数名():
'''注释'''
函数数体
return 返回值
需求:
1. 打印下面信息:
*****************************
hell world!
*****************************
2. 设置返回值
功能实现:
# 使用def关键字定义函数,print_msg为函数名

def print_msg():
# 打印15个"*"
print('*' * 15)
# 打印"hello world!"
print("hell world!")
# 打印15个"*"
print('*' * 15)
# 设置返回值
return "OK"
# 调用函数,使用"RETURN"接受函数返回值,并打印
RETURN = print_msg()
print(RETURN)
执行结果:

"D:\Program Files\python36\python.exe" E:/Python/day3/4.函数.py
***************
hell world!
***************
OK
Process finished with exit code 0
小结:
1. 关键字def引入了一个函数定义,在其后必须跟有函数名和包括形式参数的圆括号。函数体语句从下一行开始,必须是缩进的。
2. 函数的定义与变量的定义类似,没有事先定义变量,而直接引用变量,会报错。
3. 没有事先定义函数,而直接调用,就相当于在引用一个不存在的变量名
4. 函数内部可以有多个return,但只能执行一次,函数就结束调用,并且会把return后的值作为函数执行的结果返回

4.3 函数定义过程中都做了什么?
函数在定义的时候只检查语法,并未执行。
下面进行验证:
直接在文本中输入"hello"(不包括双引号),则会报错"NameError: name 'hello' is not defined"错误,而在函数定义的时候则没有提示任何信息,而在输入"if",则也会报错"SyntaxError: invalid syntax"语法错误
演示过程:
代码:

hello
执行结果:

"D:\Program Files\python36\python.exe" E:/Python/day3/4.函数.py
Traceback (most recent call last):
File "E:/Python/day3/4.函数.py", line 1, in <module>
hello
NameError: name 'hello' is not defined
Process finished with exit code 1
代码:

def function():
hello
执行结果:

"D:\Program Files\python36\python.exe" E:/Python/day3/4.函数.py
Process finished with exit code 0
代码:

def function():
hello
if
执行结果:

"D:\Program Files\python36\python.exe" E:/Python/day3/4.函数.py
File "E:/Python/day3/4.函数.py", line 3
if
^
SyntaxError: invalid syntax
Process finished with exit code 1
4.4 定义有参数函数,及有参函数的应用场景
需求:
1. 函数能够接受用户名
2. 打印下面信息:
*****************************
"用户名称" hell world!
*****************************
功能实现:

def print_msg(name):
print('*'*20)
print("%s hello world!" %name)
print('*'*20)
print_msg("xuanwei")
执行结果:

"D:\Program Files\python36\python.exe" E:/Python/day3/4.函数.py
********************
xuanwei hello world!
********************
Process finished with exit code 0
小结:
1. name为形参,xuanwei为实参。下面会详细介绍形参和实参
2. 有参函数的应用场景是需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值

4.5 定义无参数函数,及无参函数的应用场景
需求:
请用户输入两个数字比较大小
功能实现:

def auth():
name = input("请输入用户名:")
password = input("请输入密码:")
if name == "xuanwei" and password == "123123":
print("%s 登录成功" % name)
else:
print("用户名或密码错误")
auth()
执行结果

"D:\Program Files\python36\python.exe" E:/Python/day3/4.函数.py
请输入用户名:xuanwei
请输入密码:123123
xuanwei 登录成功
Process finished with exit code 0
小结:无参函数应用场景仅仅只是执行一些操作,比如与用户交互,打印
4.6 定义空函数,及空函数的应用场景

def func():
pass
func()
小结:空函数主要是为了设计代码结构

5、调用函数
函数的调用必须是先定义后调用,否则就会像为定义的变量名一样报"NameError: name 'hello' is not defined"的错误。
5.1 如何调用函数
函数的调用有三种形式:
1. 语句形式:foo()
2. 表达式形式:3*len('hello')
3. 当中另外一个函数的参数:range(len('hello'))
5.2 函数的返回值
函数return可以返回任意类型的值
函数中不使用return返回值时,RETURN默认接受到的就是"None"。返回多个值时,则是以元组的形式返回
什么时候该有?
调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值
通常有参函数需要有返回值,输入参数,经过计算,得到一个最终的结果
什么时候不需要有?
调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值
通常无参函数不需要有返回值
5.3 函数参数的应用:形参和实参,位置参数,关键字参数,默认参数,*args,**kwargs
个人认为函数参数可以大致分分为两大类:形参和实参。形参即变量名,实参即变量值,函数调用则将值绑定到名字上,函数调用结束,解除绑定
5.3.1 形参
位置形参:如果在定义时不赋值,在调用的时候必须赋值。
代码:

def foo(name,age):
print(name,end='\t')
print(age)
foo("xuan",18)
执行结果:

"D:\Program Files\python36\python.exe" E:/Python/day3/4.函数.py
xuan    18
Process finished with exit code 0
默认形参:如果在定义时赋值又称为默认形参,在调用的时候可以不必在赋值。
代码:

def foo(name,age,sex="男"):
print(name,age,sex)
foo("xuan",18)
执行结果:

"D:\Program Files\python36\python.exe" E:/Python/day3/4.函数.py
xuan 18 男
Process finished with exit code 0
注意的问题:
1. 只在定义时赋值一次
2. 默认参数的定义应该在位置形参右面
3. 默认参数通常应该定义成不可变类型
可变长形参:针对实参在定义时长度不固定的情况,应该从形参的角度找到可以接收可变长实参的方案,这就是可变长参数(形参),而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参也应该有两种解决方案,分别是*args,**kwargs。
位置实参溢出:使用*args形参处理,存储成元组数值类型
代码:

def foo(name,age,*agrs):
print(name,age,agrs)
foo("xuan",18,19,20)
执行结果:

"D:\Program Files\python36\python.exe" E:/Python/day3/4.函数.py
xuan 18 (19, 20)
Process finished with exit code 0
关键字实参溢出:使用**kewargs形参处理,存储成字典数值类型
代码:

def foo(name,age,**kwagrs):
print(name,age,kwagrs)
foo("xuan",18,x=19,y=20)
执行结果:

"D:\Program Files\python36\python.exe" E:/Python/day3/4.函数.py
xuan 18 {'x': 19, 'y': 20}
Process finished with exit code 0
同时使用*args和**kwargs可以使用函数接受任何参数或者不传参但是*args必须放在**kwargs前面,因为他们要遵循位置实参和关键字实参的原则。
代码:

def foo(*args,**kwagrs):
print(args,kwagrs)
foo("xuan",18,**{"x":19,"y":20})
执行结果:

"D:\Program Files\python36\python.exe" E:/Python/day3/4.函数.py
('xuan', 18) {'x': 19, 'y': 20}
Process finished with exit code 0
命名关键字形参:在*后面定义的形参称为命名关键字形参,必须关键字实参的形式传值
5.3.2 实参:必须和形参数量相同
位置实参:按照位置给形参传值
代码:

def foo(name,age,*agrs):
print(name,age,agrs)
foo("xuan",18,19,20)
执行结果:

"D:\Program Files\python36\python.exe" E:/Python/day3/4.函数.py
xuan 18 (19, 20)
Process finished with exit code 0
关键字实参:按照key=value的形式定义实参
代码:

def foo(name,age):
print(name,end='\t')
print(age)
foo(age=18,name='xuan')
执行结果:

"D:\Program Files\python36\python.exe" E:/Python/day3/4.函数.py
xuan    18
Process finished with exit code 0
注意的问题:
1. 关键字实参必须在位置实参右面
2. 对同一个形参不能重复传值

阶段性练习题:
练习:
1、写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成批了修改操作
2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数
3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
4、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
5、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
6、写函数,检查字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 Python