流畅的python学习笔记-第5章

第5章 函数

[toc]

函数

在python中一切都可以视作为对象,包括函数

def function_try():
    '''it is funciton try doc'''

    print('function_try doc')


if __name__ == "__main__":

    # __doc__属性用于生成对象的帮助文本
    print(function_try.__doc__)
    # __name__则是输出了具体的函数名
    print(function_try.__name__)



我们还可以将函数名赋值给变量,通过变量的形式来访问。

def function_try():
    '''it is funciton try doc'''

    print('function_try doc')


if __name__ == "__main__":

    fun = function_try

    # __doc__属性用于生成对象的帮助文本
    print(fun.__doc__)
    # __name__则是输出了具体的函数名
    print(fun.__name__)



函数也可以通过参数被传递给另外一个函数。

def function_try():
    '''it is funciton try doc'''

    print('function_try doc')


def function_try1(func):
    print(func.__doc__)
    print(func.__name__)
    func()


if __name__ == "__main__":

    fun = function_try
    function_try1(fun)

高阶函数

接受函数为参数,或者把函数作为结果返回的函数是高阶函数

map函数

def cube(x):
    return x * x


data = map(cube, range(1, 11))
print(list(data)) # 此处要加list


def add_num(n):
    return n + 1


print(list(map(add_num, range(1, 6))))

再看几个例子:

result = ['1', '2', '3']

print(list(map(int, result)))  # [1, 2, 3]

# 也可以用列表推导式
print([int(i) for i in result])
t = ((1, 'a'), (2, 'b'))
print(type(t))
print(dict(t))
print(dict((y, x) for x, y in t))

# map方法
# print(dict(map(None, t)))  # 这个python3已废弃
print(dict(map(reversed, t)))

filter函数

Filter的作用在于根据第一个参数为true还是false来进行过滤。
下面例子中将大于3的数值过滤出来。

s = [1, 2, 3, 4, 5]

print(list(filter(lambda x: x > 3, s)))
# [4, 5]

reduce函数

就是将参数累加的应用于函数中。就好比我们要对1到100进行求值。
代码如下。效果等同于sum(range(100))

# python3 已经将reduce移到functools模块中
from functools import reduce
from operator import add

print(reduce(add, range(100)))

lambda 函数

这是Python支持一种有趣的语法,它允许你快速定义单行的最小函数
例子:

g = lambda x: x * 2
print(g(3))

# 相等于下面的表达式
print((lambda x: x * 2)(3))

D = {'jack': 23, 'rose': 21, 'flank': 22}

value_sort = sorted(D.items(), key=lambda d: d[1])  # 值(value)排序
print(value_sort)
# [('rose', 21), ('flank', 22), ('jack', 23)]

key_sort = sorted(D.items(), key=lambda d: d[0])  # 按键(key)排序按
print(key_sort)
# [('flank', 22), ('jack', 23), ('rose', 21)]

key_reverse = sorted(D.items(), key=lambda d: d[0], reverse=True)  # 按键(key)降序
print(key_reverse)
# [('rose', 21), ('jack', 23), ('flank', 22)]

# 值(value)降序
value_reverse = sorted(D.items(), key=lambda d: d[1], reverse=True)
print(value_reverse)
# [('jack', 23), ('flank', 22), ('rose', 21)]

python lambda是在python中使用lambda来创建匿名函数,而用def创建的方法是有名称的,除了从表面上的方法名不一样外,python lambda还有哪些和def不一样呢?

1 python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则会把函数对象赋值给一个变量
2 python lambda它只是一个表达式,而def则是一个语句

下面是python lambda的格式,看起来好精简阿。

lambda x: print x

lambda表达式在“:”后只能有一个表达式。
也就是说,在 def中,用return可以返回的也可以放在lambda后面,不能用return返回的也不能定义在python lambda后面。

因此,像if或for或print这种语句就不能用于lambda中,lambda一般只用来定义简单的函数。

下面举几个python lambda的例子吧

  1. 单个参数的:
g = lambda x:x*2
print(g(3))
# 结果是6

2.多个参数的:

m = lambda x,y,z: (x-y)*z
print(m(3,1,2))

#结果是4

sorted函数

sorted是另外返回一个排序后的列表,原列表fruits并没有发生改变

fruits = ['strawberry', 'fig', 'apple', 'cherry', 'rasberry', 'banana']

ret = sorted(fruits, key=len)

print('before sorted %s' % fruits)
# before sorted ['strawberry', 'fig', 'apple', 'cherry', 'rasberry', 'banana']

print('after sorted %s' % ret)
# after sorted ['fig', 'apple', 'cherry', 'banana', 'rasberry', 'strawberry']

与它很相像的sort函数,看下面的例子:

a = [5, 4, 3, 2, 1]

sorted(a)  # 将a从大到小排序,不影响a本身结构
print("a=", a)  # a= [5, 4, 3, 2, 1]

a.sort()  # 将a从小到大排序,影响a本身结构
print(a)  # [1, 2, 3, 4, 5]

b = a.sort()
print("b=", b)  # b= None

c = ['aa', 'bb', 'BB', 'CC', 'zz']
print(sorted(c))
# 按列表中元素每个字母的ascii码从小到大排序
# 如果要从大到小,请用sorted(b,reverse=True)
# ['BB', 'CC', 'aa', 'bb', 'zz']

__call__方法

前面介绍到可以把函数当做对象。那么我们可以像调用函数那样调用类么。
答案是肯定的。

只需要我们重写类中的__call__就可以了

class function_try(object):
    def __init__(self, value):
        self.data = value

    def __call__(self, *args, **kwargs):
        print('function try was called')

        for a in args:
            print(a)


if __name__ == "__main__":

    f = function_try(3)
    f('hello', 'world')

除了__doc__, __name__这些函数还有很多属性。可以用dir(func)的方法进行查看

函数注解

Python 3提供了一种句法,用于为函数声明中的参数和返回值附加元数据
Python不做检查、不做强制、不做验证,什么操作都不做

# def test(text, max_len=5):
# 下面是python3 新写法
def test(text: str, max_len: 'int>0' = 5) -> str:
    if len(text) > max_len:
        return "OK"


text = "hello world"

# print(len(text))
a = test(text)
print(a, type(a))

print(test.__annotations__)
#{'text': <class 'str'>, 'max_len': 'int>0', 'return': <class 'str'>}

冻结参数的函数

最后介绍一个可以冻结参数的功能。Functions.partial.

在某些场景下,我们期望可以冻结一个参数,并将这个参数作用于其他参数。

from functools import partial
from operator import mul

triple = partial(mul, 3)  # 将第一个参数固定为3

print(triple(7))  # 7*3=21

print(list(map(triple, range(1, 10))))  # 1,10分别和3相乘
Image placeholder
Demi_Mo
未设置
  15人点赞

没有讨论,发表一下自己的看法吧

推荐文章
流畅的python学习笔记-第4章

第4章文本和字节序列[toc]编码和解码markdom可以插入emoji表情包其中作为前缀,x1f54为对应表情的unicode编码🥺emoji 把码位转换成字节序列的过程是编码;把字节序列转换成码位

流畅的Python读书笔记 --- 第一章 Python数据模型

近期开始读“流畅的Python”这本书,想把自己的读书笔记分享给大家,希望能帮到也对这本书感兴趣但是没时间看的各位。(文章中大部分的话和图片摘录总结自“流畅的Python”一书,以及python官方网

一文带你掌握常见的Pandas性能优化方法,让你的pandas飞起来!

微信公众号:「Python读财」如有问题或建议,请公众号留言Pandas是Python中用于数据处理与分析的屠龙刀,想必大家也都不陌生,但Pandas在使用上有一些技巧和需要注意的地方,尤其是对于较大

超8千Star,火遍Github的Python反直觉案例集!

大数据文摘授权转载作者:SatwikKansal译者:暮晨Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。但有的时候,Python的一些输出结果对于初学者来说似

最适合入门的Python数据分析实战项目

微信公众号:「Python读财」如有问题或建议,请公众号留言伴随着移动互联网的飞速发展,越来越多用户被互联网连接在一起,用户所积累下来的数据越来越多,市场对数据方面人才的需求也越来越大,由此也带火了如

2019机器学习框架之争:与Tensorflow竞争白热化,进击的PyTorch赢在哪里?

大数据文摘出品来源:thegradient编译:张大笔茹、曹培信、刘俊寰、牛婉扬、Andy2019年,机器学习框架之争进入了新阶段:PyTorch与TensorFlow成为最后两大玩家,PyTorch

Python 教程-了解Python

什么是Python Python能干什么? 有什么特点? 什么是Python 官方介绍: Python是一个易于学习、功能强大的编程语言。它拥有高效高级的数据结构和一种简单有效的面向对象编程的

Python 教程-Python 安装

在Windows上安装 访问https://www.python.org/downloads/并下载最新版本。在撰写时当前最新是3.8。在安装的时候和其他软件一样,无脑式下一步。需要注意的是如果在W

Python入门教程_2. 使用 Python 解释器

2.1.调用解释器 Python解释器通常安装在目标机器上的/usr/local/bin/python3.7目录下;把/usr/local/bin目录放进你的Unixshell的搜索路径里,确保它可以

Python入门教程_3. Python 简介

在下面的例子中,输入和输出分别由大于号和句号提示符(>>>和...)标注:如果想重现这些例子,就要在解释器的提示符后,输入(提示符后面的)那些不包含提示符的代码行。需要注意的是在练习中遇到的从属提示符

Python入门教程_4. 深入 Python 流程控制

除了刚刚介绍的while语句,Python还有一些在其他语言中常见的控制流语句,并做了一些改动。 4.1.if语句 也许最著名的语句是if语句了。 例如: >>>x=int(input("Please

【python测试开发栈】帮你总结python random模块高频使用方法

随机数据在平时写python脚本时会经常被用到,比如随机生成0和1来控制逻辑、或者从列表中随机选择一个元素(其实抽奖程序也类似,就是从公司所有人中随机选择中奖用户)等等。这篇文章,就帮大家整理在pyt

【python测试开发栈】帮你总结python time模块高频使用方法

在平时写python脚本时,时间是我们经常用到的数据,比如:时间戳、前端展示的对应格式的时间等,在python中主要有三个和时间处理相关的模块:time、datetime、calendar,这篇文章主

欧盟发布2018全球企业研发费用榜单:华为超苹果跃居第5,BAT排名50开外

大数据文摘出品作者:王嘉仪、魏子敏华为的迅速增长并不是一蹴而就的,至少从近几年的研发投入上看,它比中国任何一家公司都努力。欧盟下属联合研究中心近日公布了2018年度全球企业R&D研发投资排行榜(EUI

【Kubernetes系列】第5篇 Ingress controller – traefik组件介绍

1.概述为了能够让Ingress资源能够工作,在Kubernetes集群中必须至少有一个运行中的ingresscontroller组件。也就是说如果在kubernetes集群中没有一个ingressc

UfqiNews有福新闻的第N+1批次更新:清晰,流畅,省电

UfqiNews有福新闻自推出以来,一直持续更新、优化升级,作为一款带来全新新闻阅读体验的资讯应用,已经日益成熟,浏览量也日渐攀升。近日针对UfqiNews有福新闻的升级改进包括如下方面。1.UI调整

jQuery 学习笔记

jQuery中的dom追加操作方法(主动/被动、前面/后面、里面/外面): append:主动/后面/里面 appendTo:被动/后面/里面 prepend:主动/前面/里面 prependTo:被

软件工程学习笔记(一):软件工程

1计算机软件1.1软件计算机软件是指计算机系统中的程序以及文档,程序是计算任务处理对象和处理规则的描述.1.2软件特点 一种逻辑实体. 维护工作量大. 维护软件过程中会引入副作用. 1.3软件分类1.

go学习笔记-goroutine竞争状态

如果两个或者多个goroutine在没有相互同步状态的情况下同时访问某个资源,并且同时对这个资源进行读写的时候,对于这个资源就处于相互竞争状态(racecandition)。下面来看一个相互竞争的例子

Redis学习笔记2—缓存、集群、一致性等

缓存淘汰策略为了保证高性能,缓存都保存在内存中,当内存满了之后,需要通过适当的策略淘汰老数据,以便腾出空间存储新数据。数据的淘汰策略,典型的包括FIFO(先进先出,淘汰最老数据),LRU(淘汰最近最少

使用phpStudy小皮面板,typecho的POST数据提交无反应问题

在安装typecho的过程中,遇到提交数据无反应,页面不报错的问题,十分迷惑。刚开始以为是centos系统文件夹权限问题,反复修改权限都无法解决问题。最后发现是,小皮面板默认开启的防火墙问题,直接关闭

Python中的系统内置模块笔记

系统内置模块就是按照python解释器后,系统给提供的模块 在需要时可以导入后使用,例如:json,re,os。。。 序列化模块 序列化是指可以把python中的数据,以文本或二进制的方式进行转

Python time时间模块笔记

time时间模块 importtime ''' 概念: 1。时间戳:1574905882.6581771表示从1970年1月1日0时0分0秒到现在的一个秒数,目前可以计算到2

Python 初识面向对象笔记

面向对象编程——ObjectOrientedProgramming,简称OOP,是一种以对象为中心的程序设计思想。 面向过程编程——ProcedureOrientedProgramming,简称PO

Python 面向对象 OOP-三大特性笔记

面向对象的三大特性:封装,继承,多态 封装 封装就是使用特殊的语法,对成员属性和成员方法进行包装,达到保护和隐藏的目的但是一定注意,不能把成员全部封装死,就失去意义了被封装的成员主要是供类的内部