Python之路-Day08函数式编程与内置函数

return可以返回任何值

当你在一个函数当中返回一个函数名的时候,其实返回的是这个函数在内存当中的地址,如果你用一个变量去接收它,然后以这个变量名运行的话,就会执行你返回的内存地址对应的那个函数.

def test1():
    print("in the test1")


def test():
    print("in the test")
    return test1


res = test()
print(res())
输出结果:
in the test
in the test1
None  这里返回none的意思是print(res())这个函数没有返回值,所以返回空

函数调用和它在什么位置没关系,和函数定义在什么位置有关系

name = "123"
def test1():
    name = "456"
    def test():
        name = "789" 
        def test2():
            print(name)
        return test2
    return test

test1()()()

匿名函数

匿名函数是用lambada关键字去定义的
定义匿名函数时最好一行搞定,切忌复杂冗长.

lambda x:x+1
    #这两个函数的功能是一样的
def test(x):
    return x+1

res = test(10)
print(res)

匿名函数的使用方法如下:

func = lambda x:x+1
print(func(10))

总结的小技巧:如果不知道一个匿名函数怎么写的话,可以先写一个函数,然后运行一遍成功后,在把函数改为匿名函数

li = ["123", "456", "789"]
start_swith = lambda name: str(name).startswith("1")
for itsm in li:
    print(start_swith(itsm))

函数式编程

高阶函数:满足两个特性任意一个即为高阶函数
1.函数的传入参数是一个函数名
2.函数的返回值是一个函数名
函数式编程: 函数式 = 编程语言定义的函数+数字意义的函数
通俗来讲,函数式就是用编程语言去实现数学函数.这种函数内对象是永恒不变的,要么参数是函数,要么返回值是函数,没有for和while循环,所有的循环都由递归去实现,无变量的赋值(即不用变量去保存状态),五赋值即不改变.

y = x * 2 + 1#这是数学意义的函数
def test(x):
    return x * 2 + 1#这是编程语言定义的函数

先执行括号里面的,在执行括号外面的方法
把函数当作参数传给另外一个函数

def foo(n):
    print(n)
def bar(name):
    print("my name is %s"%name)
foo(bar("zhoujielun"))

python中的map函数

map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9]

def f(x):
    return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])

[1, 4, 9, 10, 25, 36, 49, 64, 81]
注意:map()函数不改变原有的 list,而是返回一个新的 list。
  利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。
由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。
任务:
假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list:
输入:[‘adam’, ‘LISA’, ‘barT’]
输出:[‘Adam’, ‘Lisa’, ‘Bart’]
代码:

def format_name(s):
     a = s[0].upper()
     b = s[1:].lower()
     return a+b
print(list(map(format_name,['adam','LISA','barT'])))

python中reduce函数

reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。

例如,编写一个f函数,接收x和y,返回x和y的和:

def f(x, y):
return x + y
调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:

先计算头两个元素:f(1, 3),结果为4;
再把结果和第3个元素计算:f(4, 5),结果为9;
再把结果和第4个元素计算:f(9, 7),结果为16;
再把结果和第5个元素计算:f(16, 9),结果为25;
由于没有更多的元素了,计算结束,返回结果25。
上述计算实际上是对 list 的所有元素求和。虽然Python内置了求和函数sum(),但是,利用reduce()求和也很简单。

reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:

reduce(f, [1, 3, 5, 7, 9], 100)
结果将变为125,因为第一轮计算是:

计算初始值和第一个元素:f(100, 1),结果为101。

注意:在python3.x后的版本中,reduce函数被划归到的functools库,因此使用reduce函数之前必须先引入functools库

python中的filter()函数

filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。

例如,要从一个list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:

def is_odd(x):
return x % 2 == 1
然后,利用filter()过滤掉偶数:

filter(is_odd, [1, 4, 6, 7, 9, 12, 17])
结果:[1, 7, 9, 17]

利用filter(),可以完成很多有用的功能,例如,删除 None 或者空字符串:

def is_not_empty(s):
return s and len(s.strip()) > 0
filter(is_not_empty, [‘test’, None, ‘’, ‘str’, ’ ', ‘END’])
结果:[‘test’, ‘str’, ‘END’]

注意: s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。

当rm为空时,默认删除空白符(包括’\n’, ‘\r’, ‘\t’, ’ '),如下:

a = ’ 123’
a.strip()
结果: ‘123’

a=’\t\t123\r\n’
a.strip()
结果:‘123’

内置函数

abs():取一个数的绝对值
all():把括号内的值全部拿来做bool运算,只有所有为真才为真,空值为false.(none)不算,如果括号里面只有一个参数,那么无论如何都会返回true.
any():只要有一个值是true就返回true
bin():把括号里面的数转换为二进制
bool():判断括号里面的值是不是空的<“为false,None也是false”,0也是false
bytes():把一个字符串转换成一个字节.字符串后面跟上编码表,encoding=“utf-8”
chr():把括号里面的是十进制数转换成ascii码表里面的字符
dir():在括号里面填入一个对象,然后输出这个对象里面的所有方法名(查看作用)
divmod(10,3),输出结果是(3,1),取商得余数,(可以用来做网站的分页功能)
eval():把字符串当中的数据结构提取出来生成字典,key和value对应,还可以在括号里面输出一个表达式计算其结果.
hash():数据类型包含可hash的就是不可变类型和不可hash的就是可变类型,在括号里面随便输入一个字符串,它会把它转换成hash值.不管你传入的参数有多长,得到的数就是固定长度,不能根据hash值进行反推,
help():打印方法的帮助或者说用法.
hex():用法类似于bin,十进制转十六进制
cot():十进制转八进制
isstance(1,int),可以判断第一个参数是不是第二个参数所表示的数据类型.
globals():打印全局变量
locals():打印局部变量

max():取最大值

1.max函数处理的是可迭代对象,相当于一个for循环取出每个元素进行比较,注意,不同类型之间不能进行比较.
2.每个元素间进行比较,是从每个元素的第一个位置依次比较,如果这一个位置分出大小,后面的都不需要比较了,直接得出这俩元素的大小.

min():取最小值
zip(),每个字母都对应了一个数字,如果字母或者数字多出一个,是不会输出的.例如:a和1组成一个元组

print(list(zip(('a','b','c'),(1,2,3,4))))
person = {'name' : "zhoujielun","age" :18,"gender":"none"}
print(list(zip(person.keys(),person.values())))
print(list(zip("hello","12345")))

ord()写一个字符会出现对应的ascll码表对应的字符
sorted():排序,排序本质就是在比较大小,不同类型之间不可以比较大小.
import():导入一个模块,任何一个PY文件都是一个模块,例如:我们创建了一个py文件,里面有一个方法叫test,如果需要在别的PY文件调用这个方法,首先import PY文件名,然后使用文件名.方法名的形式调用.

你可能感兴趣的:(python编程基础)