函数;自定义函数;函数的参数:不带参数,普通参数,默认参数,动态参数;返回值return;函数作用域;内置函数高阶函数:map,reduce,filter,sorted;lambda表达式;文件操作:打开文件,操作文件,with方法;冒泡算法和递归;;;;;;;;;;;;;;;;;;;;;;;
在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下
上面的代码是就面向过程的编程,但是如果报警多了的话成百的代码需要添加如何操作呢?复制粘贴那会死人的!在看下下面的代码:
发送邮件('内存报警')
第二次必然比第一次的重用性和可读性要好,其实这就是函数式编程和面向过程编程的区别:
函数式编程最重要的是增强代码的重用性和可读性:
函数的定义主要有如下要点:
函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
return 一般写在函数的末尾,一般你想看函数的执行结果!然后判断后面的程序。看下面的例子
为什么要有参数?看下下面的例子:
如果不定义参数,用函数的话:(每个有相同功能的都写个函数,说好的代码简化呢?)
使用函数:(代码明显少了很多,把重复的内容改为参数调用!)
def 发送邮件(邮件内容) 发送邮件("CPU报警了。") 发送邮件("硬盘报警了。") 发送邮件("内存报警了。")
函数的有三种不同的参数:
但是普通参数有个问题!你在定义参数的时候定义了几个参数,你在调用的时候必须给他几个参数否则就报错!
在你没有给他指定参数的时候他就会使用默认的参数!
注:默认参数需要放在参数列表最后,要不就会报错!原因是:他的参数赋值是一个一个的赋值。如果提供了默认值的形参,你默认一定要往后排序为了就是你给那些没有陪默认值的参数 !
动态参数顾名思义就是可以动态的去扩展函数参数的数量!
例子:1 (多个单个变量,整合成元组)
例子:2(整合为字典变量)
总结:函数的作用域就是在函数里定义的变量不能被外面使用!但是外部全局定义的全局变量在函数内是可以使用的。
举个例子来说:你在房子里可以看到屋内的东西和房子外的东西,但是你在房子外面就只能看到房子外的东西不能看到房子内的东西!
原因防止在函数调用的时候防止变量冲突!
问题:我在外面定义的全局变量在函数内可以改他吗? #看下面的例子:
但我就是想在函数里改变全局变量是否可以呢?可以!
#但是我就想在函数内改掉这个变量怎么办呢?在函数内调用global参数!(提供这个功能,但是不建议用!你在局部变量改全局变量很容易引起混乱)
内置函数:(就是python把各个模块中常用的一些方法给拿出来方便使用)
常用的记住之后,要知道怎么去查:
是把字符串中符合python表达式的东西计算出来。意思就是:
range()函数的以下几点:
这个函数可以创建一个数字元素组成的列表。
这个函数最常用于for循环(关于for循环,马上就要涉及到了)
step默认值是1。如果不写,就是按照此值。
step不能等于零,如果等于零,就报错。
map()
函数接收两个参数,一个是函数,一个是Iterable
,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator
返回。
reduce
把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce
把结果继续和序列的下一个元素做累积计算,其效果就是:
和map()
类似,filter()
也接收一个函数和一个序列。和map()
不同的是,filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素。注意到filter()
函数返回的是一个Iterator
,也就是一个惰性序列,所以要强迫filter()
完成计算结果,需要用list()
函数获得所有结果并返回list。
sorted()
函数也是一个高阶函数,它还可以接收一个key
函数来实现自定义的排序,我们给sorted
传入key函数,即可实现忽略大小写的排序:要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True
:
1、sort()是可变对象(字典、列表)的方法,无参数,无返回值,sort()会改变可变对象,因此无需返回值;
2、sorted()是python的内置函数,并不是可变对象(列表、字典)的特有方法,sorted()函数需要一个参数(参数可以是列表、字典、元组、字符串),无论传递什么参数,都将返回一个以列表为容器的返回值,如果是字典将返回键的列表。