开发|Python核心技术B
B篇,主要介绍Python的自定义函数,匿名函数,面向对象,模块化。
由于不涉及基础的知识,我会将重难点加以解释。
前言
目前所有的文章思想格式都是:知识+情感。
知识:对于所有的知识点的描述。力求不含任何的自我感情色彩。
情感:用我自己的方式,解读知识点。力求通俗易懂,完美透析知识。
正文
谈谈自定义函数
谈谈匿名函数
谈谈面向对象
谈谈模块化
谈谈自定义函数
对于,如何自定义一个函数,我觉得应该不需要介绍了,在之前的浅谈Python函数文章中,有详细的介绍。
问题:函数的参数有哪几种?
答:位置参数,默认参数,关键字参数,非固定参数。
Python 中函数的参数可以接受任意的数据类型,使用起来需要注意,必要时请在函数开头加入数据类型的检查。
问题:Python的函数名可以当成参数使用吗?
答:可以,直接传递函数名字,加上括号之后就可以调用该函数。
问题:函数嵌套之后,变量的作用域查找顺序是什么样子的?
答:遵循LEGB顺序,首先会在local寻找,其次会在嵌套域找,接着会在全局寻找,最后会在内置变量找,找不到就报错,NameError。
嵌套函数的使用,能保证数据的隐私性,提高程序运行效率。
问题:nonelocal与global的区别?
答:对于嵌套函数来说,内部函数可以访问外部函数定义的变量,但是无法修改,若要修改,必须加上 nonlocal 这个关键字。
如果使用 global,就会直接声明函数内部的变量就是全局的那个同名变量。
问题:闭包(closure)是什么?
答:闭包表示在嵌套函数中,外部函数返回内部函数的函数名,内部函数引用外部函数的变量。
闭包函数返回的值,可以加括号直接调用。使用闭包的一个原因,是让程序变得更简洁易读。
谈谈匿名函数(lambda)
问题:为什么使用匿名函数?
答:运用匿名函数,能让我们的代码更简洁、易读。
问题:匿名函数是什么?
答:lambda 是一个表达式(expression),并不是一个语句(statement).lambda 的主体是只有一行的简单表达式,并不能扩展成一个多行的代码块。
所谓的表达式,就是用一系列“公式”去表达一个东西,比如x + 2、 x**2等等;
而所谓的语句,则一定是完成了某些功能,比如赋值语句x = 1完成了赋值,print 语句print(x)完成了打印,条件语句 if x < 0:完成了选择功能等等。
lambda 专注于简单的任务,而常规函数则负责更复杂的多行逻辑。
问题:lambda的应用场景?
答:lambda可以结合列表生成式一起使用。
s = [(lambda x: x+1) (x) for x in range(10)]
s
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
lamba可以和内置函数一起使用,如reduce(), sort(),filter()。
m = filter(lambda x: x >7, [1, 4, 5, 6, 9, 33, 22])
m
list(m)
[9, 33, 22]
问题:什么是函数式编程?
答: 所谓函数式编程,是指代码中每一块都是不可变的(immutable),都由纯函数(pure function)的形式组成。这里的纯函数,是指函数本身相互独立、互不影响,对于相同的输入,总会有相同的输出,没有任何副作用。
函数式编程的优点,主要在于其纯函数和不可变的特性使程序更加健壮,易于调试(debug)和测试;缺点主要在于限制多,难写。
问题:什么是map()?
答:map(function, iterable) 函数,它表示,对 iterable 中的每个元素,都运用 function 这个函数,最后返回一个新的可遍历的集合。结合lambda使用。
map函数,for 循环和 list comprehension,一起创建列表,最终map() 是最快的。因为 map() 函数直接由 C 语言写的,运行时不需要通过 Python 解释器间接调用,并且内部做了诸多优化,所以运行速度最快。
问题:什么是filter()?
答: filter(function, iterable) 函数,它和 map 函数类似,function 同样表示一个函数对象。filter() 函数表示对 iterable 中的每个元素,都使用 function 判断,并返回 True 或者 False,最后将返回 True 的元素组成一个新的可遍历的集合。
问题:什么是reduse()?
答: reduce(function, iterable) 函数,它通常用来对一个集合做一些累积操作。function 同样是一个函数对象,规定它有两个参数,表示对 iterable 中的每个元素以及上一次调用后的结果,运用 function 进行计算,所以最后返回的是一个单独的数值。
谈谈面向对象
引入: 谈面向对象,必然会引入面向过程,而面向过程的基本单位是函数,面向对象的基本单位就是类。
问题:Python中的类是什么?
答: 类,是一群有着相同属性和函数的对象的集合。
**问题: __ init __函数的作用?**
答:在对象生成的时候,自动调用__ init __函数,构造当前对象的属性。init表示构造函数,不知道你还记得初始化git仓库不~
问题:如何在一个类中定义一些常量,每个对象都可以方便访问这些常量而不用重新构造?
答:可以直接书写类的属性,可以供类自己调用,每一个实例化对象调用。
问题:如果一个函数不涉及到访问修改这个类的属性,而放到类外面有点不恰当,怎么做才能更优雅呢?
答: 使用类的封装性,使用双下划线,表示为类的私有属性,只能内部调用。其实外部也可以调用,只是需要变一种格式,_类名__属性名。
针对于方法,可以使用装饰器添加给类的@classmethod,也可以属于静态函数,相当于普通函数,使用装饰器加上@staticmethod。
问题:既然类是一群相似的对象的集合,那么可不可以是一群相似的类的集合呢?
答:可以,使用类的继承特性,子类可以继承父类。继承关系使用mro表存储。
注意:继承的查找顺序,一定是自己对象有的,就在对象找,找不到去类找,再找不到按照mro继承表顺序查找。
问题:继承的super()使用场景?
答:super可以重用父类的方法和属性,是的代码重用。
问题:抽象类有什么用途?
答:抽象类,from abc import ABCMeta, abstractmethod
抽象类可以定义接口,要求继承者必须实现当前接口,不然就会报错。
大型工程往往需要很多人合作开发,在 idea 提出之后,开发组和产品组首先会召开产品设计会,PM(Product Manager,产品经理) 写出产品需求文档,然后迭代;TL(Team Leader,项目经理)编写开发文档,开发文档中会定义不同模块的大致功能和接口、每个模块之间如何协作、单元测试和集成测试、线上灰度测试、监测和日志等等一系列开发流程。
问题:什么是面向对象编程?
答:面向对象编程是软件工程中重要的思想。正如动态规划是算法中的重要思想一样,它不是某一种非常具体的技术,而是一种综合能力的体现,是将大型工程解耦化、模块化的重要方法。在实践中要多想,尤其是抽象地想,才能更快掌握这个技巧。
谈谈模块化
问题:模块化可以解决什么问题?
答:模块化,可以很方便的对代码进行解耦,化繁为简,只需要调用即可实现。后期的配置,更改更为简单。
问题:引入模块的方式?
答:可以使用: from xx import xx 或者 import xxx
**问题:__ init__.py文件是什么?**
答:在模块所在的文件夹新建一个 init.py,内容可以为空,也可以用来表述包对外暴露的模块接口。
实上,这是 Python 2 的规范。在 Python 3 规范中,init.py 并不是必须的。
问题:如何将项目模块化?
答:虽然运行 sys.path.append("..") ,则可以改变当前 Python 解释器的位置,但是不要使用。
在大型工程中尽可能使用绝对位置是第一要义。对于一个独立的项目,所有的模块的追寻方式,最好从项目的根目录开始追溯,这叫做相对的绝对路径。
以项目的根目录作为最基本的目录,所有的模块调用,都要通过根目录一层层向下索引的方式来 import。
问题:sys.path列表表示什么?
答:Python 解释器在遇到 import 的时候,它会在一个sys.path的列表中寻找模块。所以,sys.path 表示的是Python执行程序导入包的查找路径。
它的第一项为空,第一项设置为项目根目录的绝对地址。
问题:项目的包一半如何管理?
答:使用Python 的 Virtual Environment(虚拟运行环境)。Python 可以通过 Virtualenv 工具,非常方便地创建一个全新的 Python 运行环境。
对于每一个项目来说,最好要有一个独立的运行环境来保持包和模块的纯净性。
问题:if name == 'main' 是什么意思?
答: name 作为 Python 的魔术内置参数,本质上是模块对象的一个属性。我们使用 import 语句时,name 就会被赋值为该模块的名字,自然就不等于 __main__了。
所以,import 在导入文件的时候,会自动把所有暴露在外面的代码全都执行一遍,而在if name == 'main' 内部的代码不会被执行。
注意: import 模块的时候,会执行该模块,所以最终执行的代码是在该文件下的文件加上所有导入的代码。(可以适当幻想一下~)
结束语
Python的核心技术B,主要是函数与对象的知识,外加讲解了自定义函数与匿名函数,模块化。
希望大家,可以在书写项目的时候,巧用模块化思想,面向对象思想~