Python学习笔记<七>:Python函数式编程与内置函数

一、嵌套函数和作用域

name = 'alex'

def foo():
	name = 'lhf'
	def bar():
		name = 'wupeiqi'
		def tt():
			print(name)
			return tt
		return bar
foo()()()  #输出结果为 wupeiqi

嵌套了的函数,一层一层进去找的时候,看起来是一层一层的扒开最后找到,但实际上这个就是内存的指向问题,foo()()()就是一个指向的地址,指向了tt这个内存里的函数,所以可以直接根据地址去运行该内存里的函数,并不是看起来那样一个一个一层层找进去的。

二、匿名函数

定义方式:关键字 lambda。
例如我要创建一个函数,形参为x,返回值为x+1,正常函数可以这样写:

def conut(x):
	return x+1
Val = count(10)
print(Val)
#输出结果为 11

使用匿名函数,就这样写:

func = lambda x:x+1
print(func(10))
#输出结果为 11

匿名函数的作用:通常和其他函数联合使用,通常不单独使用,类似一个值,一个数,或者一个字符串,单独存在意义不大。

三、函数式编程

定义:函数式 = 编程语言定义的函数 + 数学意义的函数。

例如,在面向过程编程中,会将一个大问题分解成多个小问题然后按步骤逐个解决,而函数式编程则会将几个小问题编程为一个函数,由函数来解决。
例如有一个数学函数式为: y = 2*x + 1
面向过程的代码为:

def calc(x):
	res  = 2*x
	res = res +1
	return res

而函数式编程为:

def calc(x):
	return 2*x + 1

二者相比,可读性来说,肯定面向过程更容易读懂,但代码繁琐,就简洁性来说,肯定是函数式编程更加好。

高阶函数:满足 1.函数的输入形参是另外一个函数 2.函数的返回值是一个函数 中的任意一个条件,即为高阶函数。

四、尾递归调用优化

上次介绍的递归缺点很明显了,在后一个函数中未结束时,前一个函数是必须保存起来的,不能删掉,因为最后结果还是要回来的,如果销毁了就不符合规则了。但是随着递归层数的增加,会导致栈崩溃,越深层次的递归所占用的栈空间就会越大,因为每往深入一层,上一层的内容就要占用空间来保存。
这里介绍一种递归优化——尾递归调用,就是在函数的最后一步去调用别的函数,这里注意,最后一步不一定是函数最后一行,这个大家应该能理解,尾调用的关键就在于是在函数的最后一步去调用别的函数,那么最后一步调用,有何好处?根据函数即“变量”的定义,定义A函数,A内调用B函数,B内调用C函数,在内存中会形成一个调用记录,又称调用帧(call frame)用于保存调用位置和内部变量等信息,即A -> B -> C,直到 C返回结果给B,C的调用记录才会消失,B返回结果给A,B的调用记录消失,A返回结果,A的调用记录消失,所有的调用记录,都是先进后出,形成了一个“调用栈”(call stack)。

五、map函数(批量处理)

map(lambda x:x+1,num_l) —— 依次处理列表中的每一个元素,处理完后还是一个列表,该列表与原列表的数据个数和位置一样。第一个参数传操作方法,第二个参数传可迭代对象。map函数自动帮你处理。map函数运行完后变成一个可迭代对象,可以外加 list[] 变成列表。map函数内部会进行for循环对数据进行逐个处理。

六、filter函数(数据过滤)

filter(lambda x:x+1,num_l) —— 遍历序列中的每个元素,判断每个元素得到布尔值,如果是Ture则留下来,反之去除,最终结果还是一个列表。第一个参数传操作方法,第二个参数传可迭代对象。filter函数自动帮你对特定的内容进行去除。每次处理后返回一个布尔值,如果是Ture则保留,反之去除。

七、reduce函数(数据合并)

reducer(lambda x:x+1,num_l) —— 把列表中所有的值都按照指定的运算进行计算,最终得到一个值。第一个参数传操作方法,第二个参数传可迭代对象。filter函数自动帮你对特定的内容进行去除。每次处理后返回一个布尔值,如果是Ture则保留,反之去除。

八、Python的一些内置函数

1.abs() —— 取绝对值
2.all() —— 判断所有数据的布尔值,任何一个数据不为0或空或None,则返回Ture,否则返回False
3.any() —— 判断所有数据的布尔值,只要有一个数据不为0或空或None,则返回Ture,否则返回False
4.bin() —— 十进制转二进制
5.bool() —— 判断数据是否为0或空或None,是则返回False,反之返回Ture
6.bytes(“你好”, encoding = “utf-8”) —— 把一个字符串转换成一个字节的形式显示
7.chr() —— 显示数值的ASCII码
8.dir(all) —— 打印all这个对象下面都有哪些方法
9.divmod(10,3) —— 得到10/3 的商和余数(通常用作分页功能)
10.eval() —— ①.把字符串当中的数据结构取出来。②把字符串当中的表达式计算出来
11.hash() —— (可哈希的数据类型即不可变数据,不可哈希的即可变的数据)
12.hex() —— 十进制改十六进制
13.help —— 打印对象的方法的具体信息
14.oct —— 十进制改八进制
15.id() —— 打印对象地址
16.isinstance(“abc”,int) —— 判断"abc"是不是int类型,返回布尔值
17.globals() —— 打印当前存在的全局变量
18.locals() —— 打印当前存在的局部变量
19.max() —— 取最大值
20.min() —— 取最小值
21.zip() —— “拉链”
22.ord(‘a’) —— 打印出字符a的ASCII码值,与chr()刚好相反
23.pow(3,3,2) —— 相当于3的3次方(3**3),再对2取余
24.reversed() —— 翻转
25.round(3.5) —— 四舍五入
26.slice() —— 对固定的切片做整合,方便下次调用
27.sorted() —— 用作排序,本质就是在比较大小,同类型间才能比较和排序,否则报错
28.vars() —— 如果直接调用,就是调取当前locals(),否则就是查看对象的所有方法,以字典形式表示
29.import + xxx ——把某个.py文件包含进当前文件中使用
30.import 导入字符串类型

九、文件操作的其他模式

#文件读操作
f = open('xxx','r',encoding = 'UTF8')
Data = f.read
print(Data)
f.close()
#文件写操作,写操作时,如果文件存在,则自动将文件中的内容先清空再进行写操作,如果文件不存在,则自动创建文件
f = open('xxx','w',encoding = 'UTF8')
f.write('111111\n')
f.write('222222\n')
f.close()
#文件追加写操作,写操作时,如果文件存在,则以最后一行追加的方式写,并不覆盖原来的内容,如果文件不存在,则自动创建文件
f = open('xxx','a',encoding = 'UTF8')
f.write('111111\n')
f.write('222222\n')
f.close()

其他模式:

1.r+ ,读写【可读,可写】
2.w+,写读【可读,可写】
3.x+ ,写读【可读,可写】
4.a+ ,写读【可读,可写】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值