开发|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. Python3在使用requests提示警告InsecureRequestWarning

    解决方法:

  2. JavaScript初探 三 (学习js数组)

    JavaScript初探 (三) JavaScript数组 定义 创建数组 var 数组名 = [元素0,元素1,元素2,--] ; var arr = ["Huawei",&qu ...

  3. Kali 无线网络

    WiFi——必备的一个东西: AP:这是无线用户接入到互联网的设备 ESSID:可以用于无限局域网中的多个AP中 BSSID:每个AP的唯一标识符 SSID:网络名称 Channels Wi-Fi可以 ...

  4. sql使用cte表达式进行递归查询

    --递归获取所有子节点 with temp as ( select * from MK_Base_Department where F_DepartmentId='5f258320-c1b7-42a4 ...

  5. yum工具及源码包

    目录 yum工具及源码包 yum yum源 yum实战案例 yum全局配置文件 制作本地yum仓库 构建企业级yum仓库 源码包 yum工具及源码包 yum yum是RedHat以及CentOS中的软 ...

  6. ThinkPHP 3.2,配置 'URL_MODEL'=>2。 APP_DEBUG设为false,U函数生成的URL的index.php不能去掉,只有将APP_DEBUG改成true,才能去掉index.php,求解~~

    ThinkPHP 3.2,配置 'URL_MODEL'=>2.APP_DEBUG设为false,U函数生成的URL的index.php不能去掉,只有将APP_DEBUG改成true,才能去掉in ...

  7. Falling back to java on path. This behavior is deprecated

    windows启动elasticsearch报错:warning: Falling back to java on path. This behavior is deprecated. Specify ...

  8. nginx 安装 lua_nginx_module 模块(nginx——lua 学习笔记1)

    插入两个网站: nginx + lua 的OpenResty 开发 跟我学OpenResty(Nginx+Lua)开发目录贴 两个都是 可以根据目录一步步学习的. 1. 版本下载 nginx版本为 n ...

  9. 各种windows10下的快捷键

    Windows键+ctrl+D 创建虚拟桌面 windows键+Ctrl+方向键 可以切换桌面 windows+tab ctrl+alt+TAB 切换应用 windows+[1-9] 打开任务栏固定的 ...

  10. day3_7.1

    1.python的注释 python中为了使代码更容易被人看懂,提高团队开发效率,可使用注释.代码中的注释不加入编译中. 注释有单行注释,如 #这是一段注释 和多行注释: ''' 这是一行注释 ''' ...