函数的理解

面向过程:根据业务逻辑从上到下写垒代码
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
函数作用是你的程序有良好的扩展性、复用性。
同样的功能要是用3次以上的话就建议使用函数。
标注:不能死记,
函数可以理解为一个一个的功能块,你把一个大的功能拆分成一块一块的,用某项功能的时候就去调用某个功能块即可!
函数可以理解为:乐高积木,给你一块一块的,你可以用这些积木块组成你想要的任何,功能!
函数可以调用函数!主函数的作用就是把函数进行串联、调用!函数本身是不能自己执行的如果你不调用就永不执行!
#python name is test.py
#-------------------------------
def func1():pass
def func2():pass
def func3():pass
def func4():func1()func2()func3()if __name__ == '__main__'#调用上面的函数,判断了、循环了调用等!#函数里也可以调用函数例子:def func4():#__name__  这个是用来判断,如果你是把这个程序当模块导入的话他的__name__就等于这个程序的文件名,如果是手动执行这个脚本比如:python test.py  那么__name__ 就等于__main__所以,我们可以用他来做判断,如果你是手动执行我就运行我调函数执行if下面的语句,如果你是调用模块我下面的if判断后面的语句就不执行!仅当模块使用!#如果函数当模块导入的时候,他导入的是函数的名称,内容没有被导入,当你去调用的时候他才去导入函数里的信息。

自定义函数

一、背景

在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下

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]中的最大数等...
  • 参数:为函数体提供数据
  • 返回值:当函数执行完毕后,可以给调用者返回数据。

1、返回值

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

def 发送短信():发送短信的代码...if 发送成功:return Trueelse:return Falsewhile True:# 每次执行发送短信函数,都会将返回值自动赋值给result# 之后,可以根据result来写日志,或重发等操作
 result = 发送短信()if result == False:记录日志,短信发送失败...

2、参数

为什么要有参数?看下下面的例子:

如果不定义参数,用函数的话:(每个有相同功能的都写个函数,说好的代码简化呢?)

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. 动态参数

普通参数:

# ######### 定义函数 ######### # name 叫做函数func的形式参数,简称:形参
def func(name):print name# ######### 执行函数 #########
#  'luotianshuai' 叫做函数func的实际参数,简称:实参
func('luotianshuai')

但是普通参数有个问题!你在定义参数的时候定义了几个参数,你在调用的时候必须给他几个参数否则就报错!

def func(name,shuai):print name,shuai
#func('luotianshuai')
func('luotianshuai')#报错内容:TypeError: func() takes exactly 2 arguments (1 given)

默认参数:

在你没有给他指定参数的时候他就会使用默认的参数!

def func(name, age = 18):print "%s:%s" %(name,age)# 指定参数
func('luotianshuai', 19)
# 使用默认参数
func('luotianshuai')

注:默认参数需要放在参数列表最后,要不就会报错!原因是:他的参数赋值是一个一个的赋值。如果提供了默认值的形参,你默认一定要往后排序为了就是你给那些没有陪默认值的参数 !

动态参数:

动态参数顾名思义就是可以动态的去扩展函数参数的数量!

例子:1 (多个单个变量,整合成元组)

def func(*args):print args# 执行方式一
func(11,33,4,4454,5)
#输出结果:11,33,4,4454,5# 执行方式二
li = [11,2,2,3,3,4,54]
func(li)
#输出结果:([11,2,2,3,3,4,54])
#如果想输入的列表,不想让列表称谓元组里的仅一个元素而是让列表的元素成为元组的元素加*即可
func(*li)
#输出结果:(11,2,2,3,3,4,54)
#############################################################
1、接受多个参数
2、内部自动构造元组
3、序列,*,避免内部构造元组

例子:2(整合为字典变量)

def func(**kwargs):print args# 执行方式一
func(name='luotianshuai',age=18)# 执行方式二
li = {'name':'luotianshuai', age:18, 'gender':'male'}
func(**li)

例子:3(整合了*args,**args)

def func(*args, **drgs):print argsprint dargs
#例子:
func(11,22,33,44,k1='luotianshuai',k2='shuaige')
(11, 22, 33, 44)
{'k2': 'shuaige', 'k1': 'luotianshuai'}

扩展:发邮件实例

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddrdef email(message):msg = MIMEText("邮件报警测试", 'plain', 'utf-8')msg['From'] = formataddr(["shuaige",'shuaige@test.com']) #发件人和发件邮箱msg['To'] = formataddr(["帅哥",'451161316@qq.com'])msg['Subject'] = message  #这里我调用了参数
server = smtplib.SMTP("smtp.test.com", 25)server.login("shuaige@126.com", "pwdnq.buzhidao")server.sendmail('shuaige@126.com', ['451161316@qq.com',], msg.as_string())server.quit()if __name__ == u'__main__':cpu = 100disk = 500ram = 50for i in range(1):if cpu > 90:alert = u'CPU出问题了'   #这里设置了一个变量email(alert)  #这里调用函数的时候引用了上面的变量,当执行函数的时候形参讲会被替换掉,message='CPU出问题了'  发送邮件!if disk > 90:alert = u'硬盘出问题了'email(alert)if ram> 80:alert = u'内存出问题了'email(alert)

内置函数

内置函数:(就是python把各个模块中常用的一些方法给拿出来方便使用)

常用的记住之后,要知道怎么去查:

>>> li = [11,22,33,44]
>>> type(li)  #查看数据类型
<type 'list'>
>>> dir(list)  #查看类型包含的那些方法
>>>help(list)  #查看类型中包含的方法的详细说明

函数的作用域

看下面的例子:

def say():name = "tianshuai"print name
say()这个输出:
tianshuai  # 是没有问题的,那么看下下面的例子:def say():name = "tianshuai"print name
say()
print name
# 这个能不能调用呢,不能,会报错!函数的作用域就是在函数里定义的变量不能被外面使用!

在看下面的例子:

name2 = "shuaige"
def say():name = "tianshuai"print nameprint name2
say()
输出结果:
tianshuai
shuaige

总结:函数的作用域就是在函数里定义的变量不能被外面使用!但是外部全局定义的全局变量在函数内是可以使用的。
举个例子来说:你在房子里可以看到屋内的东西和房子歪的东西,但是你在房子外面就只能看到房子外的东西不能看到房子内的东西!
原因防止在函数调用的时候防止变量冲突!

问题:我在外面定义的全局变量在函数内可以改他吗?  #看下面的例子:

name2 = "shuaige"
def say():name = "tianshuai"name2 = "shuaige is shuaige"print name,name2
say()
print name2#输出结果:
tianshuai shuaige is shuaige   #在函数内改变了
shuaige  #但是外面调用还是没有改变!

但我就是想在函数里改变全局变量是否可以呢?可以!

#但是我就想在函数内改掉这个变量怎么办呢?在函数内调用global参数!(提供这个功能,但是不建议用!你在局部变量改全局变量很容易引起混乱)
name2 = "shuaige"
def say():global name2name = "tianshuai"name2 = "shuaige is shuaige"print name,name2
say()
print name2输出结果:
tianshuai shuaige is shuaige
shuaige is shuaige

return参数

def count():for i in range(1,10):if i = 5:returnelse:print iprint "Hello World"   #所以当i=5的时候就直接跳出了函数了,这里是不会被打印出来了!不是循环!!!
count()输出结果:
1
2
3
4

return 一般写在函数的末尾,一般你想看函数的执行结果!然后判断后面的程序。看下面的例子

def count():name = "tianshuai"for i in range(1,10):if i == 5:print "hello"else:print ireturn name    #在这里加了一个return
user = count()
if user == "tianshuai":   #然后判断,看下执行结果!print "oh shuaige is coming"  执行结果:
1
2
3
4
hello
6
7
8
9
oh shuaige is coming   #这里看下! 上面的判断执行了!所以return这个把name的值输出了!

文件操作

操作文件时,一般需要经历如下步骤:

  • 打开文件
  • 操作文件

一、打开文件

文件句柄 = file('文件路径', '模式')
#python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open。3.0以后file方法讲被用做其他,open方法会自动的去帮你找他调用得方法在那里!

打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。

打开文件的模式有:

  • r,只读模式(默认)。
  • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
  • a,追加模式。【可读;   不存在则创建;存在则只追加内容;】

"+" 表示可以同时读写某个文件

  • r+,可读写文件。【可读;可写;可追加】
  • w+,无意义
  • a+,同a

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

  • rU
  • r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

  • rb
  • wb
  • ab

二、操作操作

class file(object):def close(self): # real signature unknown; restored from __doc__
        关闭文件"""close() -> None or (perhaps) an integer.  Close the file.Sets data attribute .closed to True.  A closed file cannot be used forfurther I/O operations.  close() may be called more than once withouterror.  Some kinds of file objects (for example, opened by popen())may return an exit status upon closing."""def fileno(self): # real signature unknown; restored from __doc__
        文件描述符  """fileno() -> integer "file descriptor".This is needed for lower-level file interfaces, such os.read()."""return 0    def flush(self): # real signature unknown; restored from __doc__
        刷新文件内部缓冲区""" flush() -> None.  Flush the internal I/O buffer. """passdef isatty(self): # real signature unknown; restored from __doc__
        判断文件是否是同意tty设备""" isatty() -> true or false.  True if the file is connected to a tty device. """return Falsedef next(self): # real signature unknown; restored from __doc__
        获取下一行数据,不存在,则报错""" x.next() -> the next value, or raise StopIteration """passdef read(self, size=None): # real signature unknown; restored from __doc__
        读取指定字节数据"""read([size]) -> read at most size bytes, returned as a string.If the size argument is negative or omitted, read until EOF is reached.Notice that when in non-blocking mode, less data than what was requestedmay be returned, even if no size parameter was given."""passdef readinto(self): # real signature unknown; restored from __doc__
        读取到缓冲区,不要用,将被遗弃""" readinto() -> Undocumented.  Don't use this; it may go away. """passdef readline(self, size=None): # real signature unknown; restored from __doc__
        仅读取一行数据"""readline([size]) -> next line from the file, as a string.Retain newline.  A non-negative size argument limits the maximumnumber of bytes to return (an incomplete line may be returned then).Return an empty string at EOF."""passdef readlines(self, size=None): # real signature unknown; restored from __doc__
        读取所有数据,并根据换行保存值列表"""readlines([size]) -> list of strings, each a line from the file.Call readline() repeatedly and return a list of the lines so read.The optional size argument, if given, is an approximate bound on thetotal number of bytes in the lines returned."""return []def seek(self, offset, whence=None): # real signature unknown; restored from __doc__
        指定文件中指针位置"""seek(offset[, whence]) -> None.  Move to new file position.Argument offset is a byte count.  Optional argument whence defaults to0 (offset from start of file, offset should be >= 0); other values are 1(move relative to current position, positive or negative), and 2 (moverelative to end of file, usually negative, although many platforms allowseeking beyond the end of a file).  If the file is opened in text mode,only offsets returned by tell() are legal.  Use of other offsets causesundefined behavior.Note that not all file objects are seekable."""passdef tell(self): # real signature unknown; restored from __doc__
        获取当前指针位置""" tell() -> current file position, an integer (may be a long integer). """passdef truncate(self, size=None): # real signature unknown; restored from __doc__
        截断数据,仅保留指定之前数据"""truncate([size]) -> None.  Truncate the file to at most size bytes.Size defaults to the current file position, as returned by tell()."""passdef write(self, p_str): # real signature unknown; restored from __doc__
        写内容"""write(str) -> None.  Write string str to file.Note that due to buffering, flush() or close() may be needed beforethe file on disk reflects the data written."""passdef writelines(self, sequence_of_strings): # real signature unknown; restored from __doc__
        将一个字符串列表写入文件"""writelines(sequence_of_strings) -> None.  Write the strings to the file.Note that newlines are not added.  The sequence can be any iterable objectproducing strings. This is equivalent to calling write() for each string."""passdef xreadlines(self): # real signature unknown; restored from __doc__
        可用于逐行读取文件,非全部"""xreadlines() -> returns self.For backward compatibility. File objects now include the performanceoptimizations previously implemented in the xreadlines module."""pass

三、with方法

为了避免打开文件后忘记关闭,可以通过管理上下文,即:(建议使用此方法打开文件)

with open('log','r') as f:...

如此方式,当with代码块执行完毕时,内部会自动关闭并释放文件资源。

在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

with open('log1') as obj1, open('log2') as obj2:pass

例子:比如要修改nginx.conf 文件然后还的回滚怎么做?

with open('nginx.conf','r') as obj1,open('nginx.conf.new','w') as obj2:for i in obj1.readlines():i = i.strip()print iobj2.write(i)obj2.write('\n')#读取nginx.conf每行然后存储到新的文件nginx.conf.new里!

转载于:https://www.cnblogs.com/luotianshuai/p/4949497.html

Python之路【第三篇】:Python基础(二)相关推荐

  1. Python 学习笔记 第三篇 Python实现网易云评论网页爬虫+词云展示 (Pycharm+Mysql)

    初始条件,具体可见我的其他文章. 1.安装Python.Python 学习笔记 第一篇 Python的安装与配置 2.安装Pycharm,并导入第三方包.Python 学习笔记 第二篇 Python ...

  2. Python之路【第二篇】:Python基础(一)

    Python之路[第二篇]:Python基础(一) 入门知识拾遗 一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1:     name ...

  3. Python之路【第一篇】:Python简介和入门

    Python之路[第一篇]:Python简介和入门 Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗 ...

  4. 黎想深度访谈腾讯顶级产品经理的进阶之路——第三篇《需求》

    16个月精心打磨,9位顶级产品专家研讨提炼,凝聚腾讯产品经验的八集八分钟产品课分别从用户.定位.需求.时机.匠心.危机.合作.商业角度出发,还原产品背后的故事,分享给你腾讯产品的心法.艺形艺意工作室创 ...

  5. Python和Java结合的项目实战_[项目实战] Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 [...

    资源介绍 课程简介:xa0xa0 Python高级教程项目实战篇 Python和Java结合的项目实战 视频教程 教学视频 ----------------------课程目录 Python项目实战篇 ...

  6. 十、给小白看的第三篇Python基础教程

    本文是第三篇,一共四篇打下Python基础 @Author:Runsen @公众号:Python之王 上面两个基本搞定了Python中数据结构,下面花一篇讲讲最重要的类. 7.面向对象编程 万物皆是对 ...

  7. Python新手引导 第三篇-Python基础和字符编码

    阅读本文需要4.66分钟 <!--more--> 有其他计算机语言基础的同学,阅读本篇基础部分建议1到2分钟. 基础类型.变量和字符编码 list 和 tuple 第一.基础类型.变量和字 ...

  8. 初学Python——文件操作第三篇

    一.引言 什么?有了第二篇文件操作还不够?远远不够!而且在读完第三篇文件操作还是不够.关于文件的操作,后续的学习中将不断学习新的操作方式,使用更加合适的方法. 进入正题,上一篇讲到,Python对文件 ...

  9. 原创:《Python之路实战40篇》PDF高清版,限时下载!

    内容简介 1 <Python之路40篇实战 .pdf>包含Python篇.数据分析篇.机器学习篇等 3 大模块,目录如下: 下载方式 2 关注公众号「Python与算法社区」,后台回复一个 ...

  10. python快速入门第三版-Python 快速入门:第3版 配套资源 PDF 完整版

    给大家带来的一篇关于Python入门相关的电子文档资源,介绍了关于Python.快速入门方面的内容,本书是由Python官网出版,格式为PDF,资源大小23 MB,码小辫编写,目前豆瓣.亚马逊.当当. ...

最新文章

  1. Nat. Commun | 预测RNA-蛋白质结合偏好的深度学习框架
  2. LAN WAN WLAN 的区别
  3. 使用FlowDroid生成Android应用程序的函数调用图
  4. ★☆★ lc 847. Shortest Path Visiting All Nodes
  5. npm 打包vue,错误 errno 126 / 清空node_modules目录
  6. 升级鸿蒙系统照片,华为鸿蒙系统照片出炉,神似EMUI,海内外花粉沸腾了
  7. 如何:在 Windows 窗体 ListView 控件中启用平铺视图 【转载】
  8. 军用装备产品GJB150A淋雨试验检测机构
  9. 第六章、面向对象(oop)
  10. 单元测试用例编写总结
  11. 中国便利店行业战略发展及投资盈利研究报告2022年版
  12. HTTP请求常见错误码大全
  13. 深度学习与计算机视觉教程(6) | 神经网络训练技巧 (上)(CV通关指南·完结)
  14. 让电脑变成无线路由器的简单方法
  15. winserver2008 安装elasticsearch
  16. 新卡插手机显示无服务器,手机插卡无服务怎么回事
  17. 系统集成项目管理|十大管理
  18. 【python 图片文字识别】pyocr图片文字识别
  19. 电脑处理器多核心好还是高频率好?
  20. Promise异步编程

热门文章

  1. 如何修改帝国cms文章点击量默认值和成倍增加
  2. C语言137页答案,综合化学实验答案题库(137页)-原创力文档
  3. oracle修改undo清理时间,修改Oracle的Undo文件的方法
  4. msf win10漏洞_【CVE20200796】漏洞复现
  5. qtableview删除选中行_如何批量删除PPT备注+如何修改模板信息
  6. 贝叶斯决策理论对CIFAR-10数据图像分类
  7. c# 客户端 服务器传输文件,通过TCP在C++客户端/ C#服务器之间传输文件
  8. 计算机不能检测到第二个屏幕,Win10检测不到第二个显示器怎么办?Win10第二个显示器不能识别解决方法...
  9. c语言用栈实现计算器加法运算,请问,用c语言做一个计算器 包括+-*/()的运算 用栈 该怎么做...
  10. 汇编和c语言混合编程缺点,汇编C语言混合编程经验总结