开发技术--Python核心技术B

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

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

原文地址:https://www.cnblogs.com/Kate-liu/p/11291624.html

时间: 2024-11-06 10:02:00

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

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

开发|Python核心知识A A篇,主要介绍Python基础中列表,元祖,字典,集合,字符串,I/O,条件与循环,异常处理的底层知识与使用的注意事项. 希望大家对于Python会有新的收获,本篇不同于之前的浅谈Python基础知识,会更加的深入,但是在深入的同时,涉及更多内容,需要自行看源码,着重点我会标明. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点的描述.力求不含任何的自我感情色彩. 情感:用我自己的方式,解读知识点.力求通俗易懂,完美透析知识. 正文 由于本文不

python开发技术详解(二)

文章目录: 数据类型 数据类型 a=1 b=2 print id(a) print id(b) Out[1]: 163578032 Out[2]: 163578032 python开发技术详解(二)

手游服务器开发技术详解

从事游戏服务器开发差不多两年时间,两年间参与了不少项目,学到了很多游戏服务器开发技术,参与过几个不同架构的服务器开发,就随便聊聊游戏服务器开发需要的技术.(以下所指游戏服务器更偏向于手游,因为我对端游和页游开发接触并不多) 一.聊聊服务器开发有哪些东西要考虑. 1.开发语言的选择: 工欲善其事,必先利其器,选择一门适合的开发语法对后期开发有着事半功倍的作用. 业界主要的是c/c++ + Python/lua模式做游戏服务器.c/c++做网络通讯数据传输,python/lua做业务逻辑.这样既保持

Web开发技术发展历史

Web开发技术发展历史 来自:天码营 原文:http://www.tianmaying.com/tutorial/web-history Web的诞生 提到Web,不得不提一个词就是"互联网".Web是World Wide Web的简称,中文译为万维网."万维网"和我们经常说的"互联网"是两个联系极其紧密但却不尽相同的概念.今天"互联网"三个字已经承载了太多的内涵,提到互联网,我们通常想到的一种战略思维,或者是一种颠覆传统的商

Android开发技术周报

Android开发技术周报 原文  http://androidweekly.cn/android-dev-weekly-issue48/ 教程 深入理解Android之Gradle Gradle是当前非常“劲爆”得构建工具.本篇文章就是专为讲解Gradle而来.介绍Gradle之前,先说点题外话.说实话,我在大法工作的 时候,就见过Gradle.但是当时我一直不知道这是什么东西.而且大法工具组的工程师还将其和Android Studio大法版一起推送,偶一看就更没兴趣了.为什么那个时候如此不待

转Web开发的发展史---Web开发技术的演变

转自:http://blog.csdn.net/zzzkk2009/article/details/9849431 在接下来的几个月时间里,我打算写一系列关于完整web开发的文章.这第一篇文章虽然有所粗略,但也能够充分概括了在之前15年或者更久的时间里web应用程序如何进行演变.并且最后我会囊括下这段时间内所写的相关技术. 在过去的美好日子里,我们使用的是简单的web页面(包括动态gif图片!).作为精美设计的典范,苹果有着这样的一个网站: 在那时,Web开发还比较简单,开发者经常会去操作web

区块链开发技术路线选择的思考(之一)

现在整个技术社区的注意力主要还是在 Web 和移动开发上面,相关人才供销两旺.不过个别有心人已经开始转向大数据分析.深度学习.VR/AR 这些前景看好的技术.最近几个月区块链非常火,所以也有极少数开发者在关注区块链的开发技术. 应该比较客观的看待现在区块链的这一把火.目前无论在中国还是在国外,讨论区块链最积极最热闹的主要是政府官员.金融政策研究者.技术未来学家和学院派学者,跟他们相比,真正在写代码的人发出的声音很小.官员们重视,说明这个技术的潜在影响力巨大,学者重视,说明还有很多技术问题有待解决

前端开发技术的发展

    作者:民工精髓 ,发布于:2013-3-21   前端开发技术,从狭义的定义来看,是指围绕HTML.JavaScript.CSS这样一套体系的开发技术,它的运行宿主是浏览器.从广义的定义来看,包括了: 专门为手持终端设计的类似WML这样的类HTML语言,类似WMLScript这样的类JavaScript语言. VML和SVG等基于XML的描述图形的语言. 从属于XML体系的XML,XPath,DTD等技术. 用于支撑后端的ASP,JSP,ASP.net,PHP,nodejs等语言或者技术

考研学生应该知道:研究方向和开发技术

我自己的一位大二学生,由參加ACM不安心.后来体会了应用的核心在算法,能在竞赛中坐住了.但如今,又有新问题了. [来信] 贺老师,我想问一下,假设打算考研,在这四年里仅仅搞算法不搞应用,或者说仅仅是懂一点应用.这样合适吗. [回复] 算法在计算机和软件project中都非常重要,但不是所有.大学期间的学习,是专业教育中的基础阶段.其它的也要好好学.研究生開始.要钻研详细的研究方向,须要对专业全面的了解作为支撑.对于应用,能够理解为要从事这方面的工作,但我觉得更关键的数据在于,为理解基础理论提供一