开发|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
<filter object at 0x000002A0FA605E80>
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,主要是函数与对象的知识,外加讲解了自定义函数与匿名函数,模块化。

希望大家,可以在书写项目的时候,巧用模块化思想,面向对象思想~

开发技术--Python核心技术B的更多相关文章

  1. 开发技术--Python核心知识A

    开发|Python核心知识A A篇,主要介绍Python基础中列表,元祖,字典,集合,字符串,I/O,条件与循环,异常处理的底层知识与使用的注意事项. 希望大家对于Python会有新的收获,本篇不同于 ...

  2. Python开发技术详解(视频+源码+文档)

    Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...

  3. Python开发技术详解PDF

    Python开发技术详解(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1F5J9mFfHKgwhkC5KuPd0Pw 提取码:xxy3 复制这段内容后打开百度网盘手 ...

  4. 《Python测试开发技术栈—巴哥职场进化记》—前言

    写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...

  5. 《python开发技术详解》|百度网盘免费下载|Python开发入门篇

    <python开发技术详解>|百度网盘免费下载|Python开发入门篇 提取码:2sby  内容简介 Python是目前最流行的动态脚本语言之一.本书共27章,由浅入深.全面系统地介绍了利 ...

  6. 《Python测试开发技术栈—巴哥职场进化记》—初来乍到,请多关照

    上文<巴哥职场进化记-Python测试开发技术栈>开篇讲到巴哥毕业初到深圳,见到了来自五湖四海的室友.一番畅聊之后,抱着对未来职场生活的期待,大家都进入了梦乡.今天我们来看看巴哥第一天上班 ...

  7. 《Python测试开发技术栈—巴哥职场进化记》—软件测试工程师“兵器库”

    上文<Python测试开发技术栈-巴哥职场进化记>-初来乍到,请多关照 我们介绍了巴哥入职后见到了自己的导师华哥,第一次参加团队站会,认识了团队中的开发小哥哥和产品小姐姐以及吃到了公司的加 ...

  8. 《Python 测试开发技术栈—巴哥职场进化记》—每日站会的意义

    上文<Python测试开发技术栈-巴哥职场进化记>-一道作业题我们讲到华哥给巴哥出了一道作业题,让巴哥用Python实现记录日志的功能,巴哥历经"千辛万苦",终于做出了 ...

  9. Qt混合Python开发技术:Python介绍、混合过程和Demo

    前言   Qt中混合Python开发,可调用Python命令与脚本.   Python   Python是一种跨平台的计算机程序设计语言. 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语 ...

随机推荐

  1. KB奇遇记(3):糟糕的IT现状

    2015年8月3号,终于告别了过去来到了KB. 公司给安排的住房是一间套房里的小房间,小的简直连坐的地方都没有了,中间一个大床将房间隔了两边,显得特别狭小.由于是刚来,我也不好要求太多.但就这个小房间 ...

  2. [20190909]完善vim的bccacl插件.txt

    [20190909]完善vim的bccacl插件.txt http://blog.itpub.net/267265/viewspace-2140886/http://blog.itpub.net/26 ...

  3. MySQL数据库(三)锁机制

    MyISAM默认使用表级锁,不支持行级锁 InnoDB默认使用行级锁,也支持表级锁 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现 ...

  4. [PHP] 深度解析Nginx下的PHP框架路由实现

    所有的框架处理业务请求时,都会处理URL的路径部分,分配到指定的代码中去处理.实现这一功能的关键就是获取$_SERVER全局变量中对于URL部分的数据 当请求的路径为http://test.com/a ...

  5. Nginx 配置高可用的集群

    1.什么是 nginx 高可用 (1)需要两台 nginx 服务器 (2)需要 keepalived (3)需要虚拟 ip 2.配置高可用的准备工作 (1)需要两台服务器 192.168.17.129 ...

  6. Web-babyphp

    题目地址 http://web.jarvisoj.com:32798/ 首先先观察网页,点击about发现下面包含这些 看到GIT,那么基本可以明确这题有.git泄露,我们用GitHack来获取源码分 ...

  7. [C10] 异常检测(Anomaly Detection)

    异常检测(Anomaly Detection) 问题的动机 (Problem Motivation) 异常检测(Anomaly detection)问题是机器学习算法中的一个常见应用.这种算法的有趣之 ...

  8. TransportFireWall

    1.shadow for python install on windows (1.) install python pip (2.) install openssl for windows (3.) ...

  9. Tensorflow加载预训练模型和保存模型(ckpt文件)以及迁移学习finetuning

    转载自:https://blog.csdn.net/huachao1001/article/details/78501928 使用tensorflow过程中,训练结束后我们需要用到模型文件.有时候,我 ...

  10. CF455C Civilization 树的直径

    问题描述 LG-CF455C 题解 首先,题目给出了 \(m\) 条边,对这 \(n\) 个点, \(m\) 条边组成的森林,跑出每棵树的直径,同时使用并查集维护树的连通性. 考虑合并两棵树的情况:设 ...