篇二 python函数

20200206

##命名空间(namespace)

指的是变量存储的位置,每一个变量都需要存储到指定的命名空间中

每一个作用域都会有一个它对应的命名空间

全局命名空间,用来保存全局变量,函数命名空间用来保存函数中的变量

命名空间实际上就是一个字典,是一个专门用来存储变量的字典。

locals()用于获取当前作用域的命名空间

r如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中调用locals()

返回一个字典

示例代码:

scope=locals()

print(scope)

print(scope['a'])

在函数内部locals()会获取函数的命名空间,使用globals()获取全局命名空间。

可以使用locals()可以来操控函数的命名空间,但是不建议这么操作。

##递归

1.基线条件(问题可以被分解为的最小问题,当满足基线条件时,递归就不再执行了)

2.递归条件(将问题继续分解的条件)

递归编写起来容易,不容易阅读。

循环编写起来难,容易阅读。

问题:求解10的阶乘

示例代码:

def factorial1(n):

'''

求解任意数的阶乘

参数:

n要求阶乘的数字

'''

    result=n

    for i in range(1,n):

        result*=i

        return  result

def factorial2(n):

'''

求解任意数的阶乘

参数:

n要求阶乘的数字

'''

#基线条件,判断n是否为1,若为1,不再继续。

    if n==1:

        return 1

    return  n*factorical2(n-1)

函数power为任意数字做幂运算

def power(n,i):

    if i==1:

        return n

    ruturn n*power(n,i-1)

判断回文字符串,是的话返回ture,反之flase

def huiwen(str):

    if len(s)<2:

        return ture

    elif s[0]!=s[-1]:

        return false

    return huiwen(s[1:-1])

##高阶函数

在python中,函数是一等对象

一等对象一般都会具有如下特点:

对象在运行时创建

能赋值给变量或作为数据结构中的元素

能作为参数传递

能作为返回值返回

高阶函数至少要符合以下两个条件:

接收函数作为参数或者函数作为返回值的函数

实际上是将函数中保存的代码传输至函数中

应用场景:

定义函数,可以将指定列表中的所有的偶数,保存到一个新的列表中进行返回

def fn(lst):

#创建新列表

    new_list=[]

#对列表进行筛选

    for n in lst:

        if n%2==0:

            new_list.append(n)

        return new_list

#定义一个函数,用来检查一个任意的数字是否为偶数

def fn2(i):

    if i%2==0:

        return True

    return False

#定义一个函数,用来检查一个任意的数字是否大于5

def fn3(i):

    if i>5:

        return True

    return False

def fn(func,lst):

    # 创建新列表

    new_list = []

    # 对列表进行筛选

    for n in lst:

        if func(n):

            new_list.append(n)

    return new_list

#filter()可以从序列这种过滤出符合条件的元素,保存到一个新的序列中

参数:

1.函数,根据该函数来过滤序列(可迭代的结构)

2.需要过滤的序列(可迭代的结构)

返回值:

过滤后的新序列(可迭代的结构)

print(list(filter(fn,l)))

##匿名函数lamba

lambda函数表达式专门来创建一些简单的函数,是创建函数的又一种方式.

语法:lambda 参数列表:返回值

匿名函数一般都是作为参数使用,在其他地方一般不会使用

def fn5(a,b):

    return a+b

#也可以将匿名函数赋值给一个变量,一般不会这么做

lambda a,b:a+b

filter(fn5,l)

filter(lambda a,b:a+b,l)

map()函数可以对对象中所有元素做指定的操作,然后添加到一个新的对象中进行返回。

map(lambda i:i+1,l)

#定义一个函数,用来检查一个任意的数字是否为偶数

def fn2(i):

    if i%2==0:

        return True

    return False

#定义一个函数,用来检查一个任意的数字是否大于5

def fn3(i):

    if i>5:

        return True

    return False

def fn(func,lst):

# 创建新列表

    new_list = []

# 对列表进行筛选

    for nin lst:

        if func(n):

            new_list.append(n)

        return new_list

##匿名函数lamba

lambda函数表达式专门来创建一些简单的函数,是创建函数的又一种方式:

def fn5(a,b):

return a+b

#也可以将匿名函数赋值给一个变量,一般不会这么做

lambda a,b:a+b

filter(fn5,l)

filter(lambda a,b:a+b,l)

map()函数可以对对象中所有元素做指定的操作,然后添加到一个新的对象中进行返回。

##sort

该方法用来对列表中的元素进行排序

sort()默认是直接比较列表中元素的大小

sort()可以接收一个关键字参数,key

key作为函数的一个参数,当设置了函数作为参数

每次都会一列表中的一个元素作为参数来调用函数,并且使用函数的返回值来比较元素的大小

l=['a','vv','cccc','dddddd']

l.sort(key=len)

print(l)

l.sort()

print(l)

sorted()

这个函数和sort()的用法基本一致,但是sorted()可以对任意的序列进行排序

sorted排序不会影响原来的序列,而是返回一个新的序列

print(sorted(l,key=len))

##闭包

函数作为返回值返回

通过闭包可以创建一些只有当前函数能访问的变量

形成闭包的条件

1.函数的嵌套

2.将函数作为返回值进行返回

3.内部函数必须使用外部函数的变量

使用闭包主要是想隐藏不想让他人看到的数据

def fn():

#函数内部定义一个函数

    def inner():

        print('wo')

    return inner

#r是一个函数,是调用fn()后的返回的函数

#这个函数是在fn()内部定义的,并不是全局函数

#所以这个函数总是能访问到fn()函数内的变量

r=fn()

print(r)

#求多个数的平局值

nums=[11,2,34,33]

print(sum(nums)/len(nums))

def make_average()

    nums=[]

    def average(n):

        nums.append(n)

        return sum(nums)/len(nums)

return average

##装饰器

创建几个函数

def add(a,b):

    r=a+b

    return r

def mul(a,b):

    r=a*b

    return r

r=add(1122,22)

print(r)

#我们不希望在不修改原函数的情况下,对函数进行扩展

def fn():

    print('我是fn函数')

def fn2():

    print('程序开始执行')

    fn()

    print('程序执行结束')


def new_add(a,b):

    print('程序开始执行')

    r=add(a,b)

    print('程序执行结束')

    return r

r=new_add(11,22)

print(r)

#上边的方式在不修改源码的情况下,对函数进行扩展,但是每扩展一个函数需要手动创建一个函数

#为了解决这个问题,我们创建一个函数,让这个函数自动帮助我们创建生产函数

def begin_end(old):

'''

    用于对其他函数进行扩展,是其他函数在执行前打印开始执行,执行后打印执行结束

    参数:old要扩展的函数'''

    def new_function(*args,**kwargs):

        print('程序开始执行')

        r = old(*args,**kwargs)

        print('程序执行结束')

        return r

    #返回新函数

    return new_function

#像begin_end()这种函数,我们成为装饰器,通过装饰器,可以在不修改原函数的情况下对函数进行修改

#在定义函数时,可以通过@装饰器,来使用指定的装饰器,同时可以为多个函数指定多个装饰器

#多个装饰器的时候,从内往外进行装饰。

#典型用法:

@begin_end

def say_hello():

    print('大家好')

#希望函数可以在计算前,打印开始计算值,计算结束后打印计算完毕

#我们可以直接修改函数中的代码完成需求,但是会产生以下一些问题:

#1.函数多,修改会方便

#2.后期不方便维护

#3.违反开闭原则(OCP)  程序的设计,要求开发对程序的扩展,要关闭对程序的修改

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容