模块:如何使用模块
面向对象编程:面向对象的概念、属性、方法、继承、多态等
定制类:利用python的特殊方法定制类
一.函数式编程
函数式:functional,一种编程范式,函数式编程是一种抽象计算的编程模式。
1. 函数式编程的特点:
- 把计算视为函数而非指令;
- 纯函数式编程:不需要变量,没有副作用,测试简单;
- 支持高阶函数,代码简洁.
2. python支持的函数式编程:
- 不是纯函数式编程,允许有变量;
- 支持高阶函数:函数也可以作为变量传入;
- 支持闭包,有了闭包就能返回函数;
- 有限度的支持匿名函数。
3. 高阶函数
变量可以指向函数,并且可以直接对变量进行调用,和调用函数的效果是一样的。
(1)demo:
函数名就是指向函数的变量,函数名和普通变量名没有什么区别,指向的只是一个函数对象。
(2)高阶函数定义:
- 能接受函数做参数的函数;
- 变量可以指向函数;
- 函数的参数可以接收变量;
- 一个函数可以接收另一个函数作为参数;
- 能接收函数作为参数的函数就是高阶函数;
(3)demo--接收abs函数:
定义一个函数,接收x、y、f三个参数
其中x、y是普通参数,接收一个数值,f是函数
4. python把函数作为参数
import math
def add(x, y, f):
return f(x) + f(y)
print(add(25, 9, math.sqrt))
5. python中的map()函数
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
注意:map()函数不改变原有的 list,而是返回一个新的 list。
利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。
由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。
# 将list中的数据首字母转化成大写
def format_name(s):
return s[0].upper() + s[1:].lower()
print(list(map(format_name, ['adam', 'LISA', 'barT'])))
6. python中的 reduce()函数
reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
reduce()还可以接收第3个可选参数,作为计算的初始值。
# python3之后reduce() 函数已经被从全局名字空间里移除了,它现在被放置在fucntools模块里
# 利用reduce函数来求奇
from functools import reduce
def prod(x, y):
return x * y
print(reduce(prod, [2, 4, 5, 7, 12]))
# 第三个参数表示初始值
print(reduce(prod, [2, 4, 5, 7, 12],4))
7. python中的filter()函数
filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
# coding:utf-8
import math
# Demo1:利用filter过滤掉偶数
def is_odd(x):
return x % 2 == 1
print(list(filter(is_odd, [1, 4, 6, 7, 9, 12, 17])))
# Demo2:利用filter删除None或者空字符串
def is_not_empty(s):
return s and len(s.strip()) > 0
print(list(filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])))
# 注意:s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' ')
a = ' 123'
print(a.strip())
a='\t\t123\r\n'
print(a.strip())
# Demo3:利用filter()过滤出1~100中平方根是整数的数
def is_sqr(x):
r = int(math.sqrt(x))
return r*r == x
# range()可以创建一个从x起,到y结束,不包括y的一个整数列表
print(list(filter(is_sqr, range(1, 101))))
8.python中的自定义排序函数
Python内置的 sorted()函数可对list进行排序。
sorted()也是一个高阶函数,在python3 以后sorted取消了对cmp的支持。
sorted(iterable, key=None, reverse=False)
- reverse是一个布尔值。如果设置为True,列表元素将被倒序排列,默认为False
- key接受一个函数,这个函数只接受一个元素,默认为None
Python3实现方式:
# coding:utf-8
# 任务:对字符串排序时,有时候忽略大小写排序更符合习惯。请利用sorted()高阶函数,实现忽略大小写排序的算法。
# 输入:['bob', 'about', 'Zoo', 'Credit']
# 输出:['about', 'bob', 'Credit', 'Zoo']
# python3实现方式
# by : kimtian 20190701
import functools
def cmp_ignore_case(s1, s2):
u1 = s1.upper()
u2 = s2.upper()
if u1 < u2:
return -1
if u1 > u2:
return 1
return 0
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=functools.cmp_to_key(cmp_ignore_case)))
Python2实现方式:
def cmp_ignore_case(s1, s2):
u1 = s1.upper()
u2 = s2.upper()
if u1 < u2:
return -1
if u1 > u2:
return 1
return 0
print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
9.python中返回函数
Python的函数不但可以返回int、str、list、dict等数据类型,还可以返回函数。
(1)返回函数和返回值的区别:
def myabs():
return abs # 返回函数
def myabs2(x):
return abs(x) # 返回函数调用的结果,返回值是一个数值
(2)返回函数可以把一些计算延迟执行。
如:
def calc_sum(lst):
def lazy_sum():
return sum(lst)
return lazy_sum
调用:
f = calc_sum([1, 2, 3, 4]) # 调用calc_sum()并没有计算出结果,而是返回函数。
f() # 对返回的函数进行调用时,才计算出结果。
(3)练习:编写一个函数calc_prod(lst),它接收一个list,返回一个函数,返回函数可以计算参数的乘积。
python 3实现方式:
# coding:utf-8
# kimtian 2019.07.11
from functools import reduce
def calc_prod(lst):
def calc_cheng():
def cheng(x, y):
return x * y
return reduce(cheng, lst, 1)
return calc_cheng
f = calc_prod([1, 2, 3, 4])
print(f())
python 2实现方式:
def calc_prod(lst):
def calc_cheng():
def cheng (x,y):
return x * y
return reduce(cheng, lst, 1)
return calc_cheng
f = calc_prod([1, 2, 3, 4])
print f()
10.python中闭包
这种内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)。
闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。
练习:编写一个函数,让它正确返回能计算1x1、2x2、3x3的函数。
def count():
fs = []
for i in range(1, 4):
def f(j):
def g():
return j*j
return g
r = f(i)
fs.append(r)
return fs
f1, f2, f3 = count()
print f1(), f2(), f3()