Python运维开发之路《函数》
函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可
特性:
- 减少重复代码
- 使程序变的可扩展
- 使程序变得易维护
定义一个函数
语法定义:
1 def sayhi():#函数名
2 print("Hello, I'm nobody!")
3
4 sayhi() #调用函数
实例:
>>> def hello() :
print("Hello World!") >>> hello()
Hello World!
>>>
带参数:
#下面这段代码
a,b = 5,8
c = a**b
print(c) #改成用函数写
def calc(x,y):
res = x**y
return res #返回函数执行结果 c = calc(a,b) #结果赋值给c变量
print(c)
函数参数和环境变量
参数
默认参数:
位置参数:
形参:变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
实参:可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
实例图:

默认参数
定义:调用函数时,如果没有传递参数,则会使用默认参数。
默认参数必须放到非默认参数(位置参数)的右面;
1 def sayHi(name,age,nationality='CN'):
2 print("Hello,I'm %s !"%name,age,nationality)
3
4 sayHi('lain','24') #默认显示国籍为'CN'
5 sayHi('liha','22','USA') #修改默认国籍为'USA'
6
7
8 结果:
9 Hello,I'm lain ! 24 CN
10 Hello,I'm liha ! 22 USA
指定参数
指定参数必须放在位置参数的右面;
1 def sayHi(name,age,nationality='CN'):
2 print("Hello,I'm %s !"%name,age,nationality)
3
4 sayHi('lain',nationality='JP',age=24)
5 sayHi('liha',age=22,nationality='USA')
6
7 运行结果:
8 Hello,I'm lain ! 24 JP
9 Hello,I'm liha ! 22 USA
非固定参数(不定长参数)
一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名;
命名规范:*args,**kwargs
元组形式:加一个星号(*)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组。
1 def stu_register(name, age, country, course,*heh):
2 print("----注册学生信息------")
3 print("姓名:", name)
4 print("age:", age)
5 print("国籍:", country)
6 print("课程:", course)
7 print("爱好:",*heh)
8
9
10 stu_register("张三", 22, "CN", "Python_devops",'妹纸','聊天')
11 stu_register("李四", 24, "CN", "Linux","玩蛋")
12 stu_register("王三炮", 25, "CN", "Oracle",'LOL')
13
14 执行结果:
15 ----注册学生信息------
16 姓名: 张三
17 age: 22
18 国籍: CN
19 课程: Python_devops
20 爱好: 妹纸 聊天
21 ----注册学生信息------
22 姓名: 李四
23 age: 24
24 国籍: CN
25 课程: Linux
26 爱好: 玩蛋
27 ----注册学生信息------
28 姓名: 王三炮
29 age: 25
30 国籍: CN
31 课程: Oracle
32 爱好: LOL
字典形式:加两个星号(**)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空字典。
1 def stu_register(name, age, country, course,*heh,**hah):
2 print("----注册学生信息------")
3 print("姓名:", name)
4 print("age:", age)
5 print("国籍:", country)
6 print("课程:", course)
7 print("爱好:",heh,hah)
8
9
10 stu_register("张三", 22, "CN", "Python_devops",'妹纸','聊天',stuid='134123',fee=4000)
11 stu_register("李四", 24, "CN", "Linux","玩蛋")
12 stu_register("王三炮", 25, "CN", "Oracle",'LOL')
13
14 执行结果:
15 ----注册学生信息------
16 姓名: 张三
17 age: 22
18 国籍: CN
19 课程: Python_devops
20 爱好: ('妹纸', '聊天') {'stuid': '134123', 'fee': 4000}
21 ----注册学生信息------
22 姓名: 李四
23 age: 24
24 国籍: CN
25 课程: Linux
26 爱好: ('玩蛋',) {}
27 ----注册学生信息------
28 姓名: 王三炮
29 age: 25
30 国籍: CN
31 课程: Oracle
32 爱好: ('LOL',) {}
递归函数
定义:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是 无限的,所以,递归调用的次数过多,会导致栈溢出)
1 data = range(0,1000000)
2
3 def digui(data,find):
4 if len(data) > 0:
5 middle_pos = int(len(data)/2)
6 if data[middle_pos] == find:
7 print('find_name:',find)
8 elif data[middle_pos] < find:
9 print('\033[31;1m 右边的值:%s\033[0m',data[middle_pos+1:])
10 digui(data[middle_pos+1:],find)
11 else:
12 print('\033[32;1m 左边的值:%s\033[0m',data[0:middle_pos])
13 digui(data[0:middle_pos],find)
14 else:
15 print('没有找到!')
16
17 digui(data,451232)
环境变量
1.函数外声明的是全局变量,函数内声明的是局部变量;
2.全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序;
3.当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
4.正常情况下,局部环境变量无法修改全局变量;可以使用global命令:
1 login_status=True
2 def login():
3 #global login_status
4 login_status=False
5 if login_status==True:
6 print('login_status is True')
7 else:
8 print('login_status is False')
9
10 login()
11 print(login_status)
12
13 运行结果:
14 #注释global
15 login_status is False
16 True
17 #使用global
18 login_status is False
19 False
函数返回值
要想获取函数的执行结果,就可以用return语句把结果返回
注意:
一旦函数经过调用并开始执行,那函数外部的程序,就无法再控制函数的执行过程,只能等待函数执行结果;所以return语句代表着函数的结束
如果未在函数中指定return,那这个函数的返回值为None
匿名函数
匿名函数lambda就是不需要显式的指定函数
1 #非匿名函数
2 def calc(x,y):
3 runturn x*y
4 print(calc(3,4))
5
6 #匿名函数
7 calc = lambda x,y:x*y
8 print(calc(3,4))
匿名函数搭配map()方法使用
1 def calc(n):
2 return n*n
3
4 data = map(calc,range(10))
5
6 for i in data:
7 print(i)
8
9 ======================
10 data = map(lambda n:n*n,range(10))
11 print(data)
12
13 data = map(lambda n:n*2,range(10))
14 print(data)
15
16 for i in data:
17 print(i)
18
19 =======================
20 data = map(lambda n:n*2 if n>5 else n,range(10))
21 print(data)
22
23 for i in data:
24 print(i)
高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
1 def add(x,y,f):
2 return f(x) + f(y)
3
4 res = add(3,-6,abs)
5 print(res)
6
7 #x,y表示形参
8 #f表示内置函数abs
Python运维开发之路《函数》的更多相关文章
- python运维开发之路第一天
一.python安装及环境变量配置 1.windows7安装python 1)下载地址:https://www.python.org/downloads/windows/ 如下图: 注意:下载,用代理 ...
- Python运维开发基础09-函数基础【转】
上节作业回顾 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 实现简单的shell命令sed的替换功能 import ...
- Python运维开发基础08-文件基础【转】
一,文件的其他打开模式 "+"表示可以同时读写某个文件: r+,可读写文件(可读:可写:可追加) w+,写读(不常用) a+,同a(不常用 "U"表示在读取时, ...
- Python运维开发基础04-语法基础【转】
上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 仅用列表+循环实现“简单的购物车程 ...
- Python运维开发基础01-语法基础【转】
开篇导语 整个Python运维开发教学采用的是最新的3.5.2版,当遇到2.x和3.x版本的不同点时,会采取演示的方式,让同学们了解. 教学预计分为四大部分,Python开发基础,Python开发进阶 ...
- 重磅|0元学 Python运维开发,别再错过了
51reboot 运维开发又双叒叕的搞活动了,鉴于之前 51reboot 的活动反馈,每次活动结束后(或者已经结束了很长时间)还有人在问活动的事情.这一次小编先声明一下真的不想在此次活动结束后再听到类 ...
- Python运维开发基础01-语法基础
标签(空格分隔): Mr.chen之Python3.0执教笔记(QQ:215379068) --仅供北大青鸟内部学习交流使用 开发不是看出来的,开发一定是练出来的: 想学好开发,没有捷径可走,只有不断 ...
- Python运维开发基础10-函数基础【转】
一,函数的非固定参数 1.1 默认参数 在定义形参的时候,提前给形参赋一个固定的值. #代码演示: def test(x,y=2): #形参里有一个默认参数 print (x) print (y) t ...
- Python运维开发基础07-文件基础【转】
一,文件的基础操作 对文件操作的流程 [x] :打开文件,得到文件句柄并赋值给一个变量 [x] :通过句柄对文件进行操作 [x] :关闭文件 创建初始操作模板文件 [root@localhost sc ...
- Python运维开发基础06-语法基础【转】
上节作业回顾 (讲解+温习120分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 添加商家入口和用户入口并实现物 ...
随机推荐
- PyCharm解决Git冲突
技术背景 在前面的一篇博客中,我们介绍了Fork到自己名下的本地仓库如何与远程原始仓库创建链接的方法.在这篇文章中,我们将要讲解如何应对在这种异步开发的过程中经常有可能会遇到的Git冲突问题,在Pyc ...
- [Java EE]解决浏览器跨域问题
1 解决浏览器跨域问题的方案 方式1: 浏览器(chrome)中取消跨域限制 step1 浏览器 chrome://flags step2 搜索:same step3 将搜索结果中的3个插件[Same ...
- 机器学习(五):混合高斯聚类(求聚类标签)+PCA降维(3维降2维)习题
使用混合高斯模型 GMM,计算如下数据点的聚类过程: \(Data = np.array([1,2,6,7])\) 均值初值为: \(\mu_1, \mu_2 = 1, 5\) 权重初值为: \(w_ ...
- 请求被中止: 未能创建 SSL/TLS 安全通道 解决方案
最近项目改造https,有部分请求出现"请求被中止: 未能创建 SSL/TLS 安全通道". 原因应该是,接口方变更了安全协议,而客户端并未启用该协议. 解决办法自然就是:让客户端 ...
- 手动编写Swagger文档与部署指南
Swagger介绍 在Web开发中,后端开发者在完成接口开发后,需要给前端相应的接口使用说明,所以一般会写一份API文档.一般来说,有两种方式提供API接口文档,一种是利用插件在代码中自动生成,另一种 ...
- css中文字与图片对齐
css中文字与图片对齐 第一种,使用vertical-align:middle .icon{ background-repeat:no-repeat; background-position:cent ...
- 使用Vue.js实现文字跑马灯效果
实现文字跑马灯效果,首先用到 substring()截取 和 setInterval计时器 clearInterval()清除计时器 效果如下: 实现代码如下: <!DOCTYPE html&g ...
- RTSP Server(LIVE555)源码分析(一)-重要关系类
live项目包括四个基本的库,程序入口类(在mediaServer中),各种测试代码(测试代码在testProgs里面). 四个基本的库分别是: UsageEnvironment&TaskSc ...
- Vue项目使用Echarts来实现中国地图,省份显示
当时做的时候参考了CSND博主:接口写好了吗 第一步:下载echarts npm install echarts --save main.js中引入 import * as echarts fr ...
- 在unity中制作live2d参数的AnimationClip[简单随笔]
假定:已经成功导入模型.相关文档参考:https://github.com/gtf35/live2d_unity_sdk_chinese_document(人力翻译版的Live2d SDK文档) 全部 ...