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

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

  • 相关阅读:
    [转]用C++实现跨平台游戏开发之Irrlicht引擎
    Struts 2中的constant
    Xming + PuTTY 在Windows下远程Linux主机使用图形界面的程序
    eclipse、myeclipse、aptana 安装spket ,zen coding等插件
    第三方软件源——OpenSUSE
    opensuse 12.2 安装手记
    eclipse j2ee 开发环境配置
    多线程浏览器编程总结
    c#.net设计规范一
    正则表达式系统学习之一
  • 原文地址:https://www.cnblogs.com/Kate-liu/p/11291624.html
Copyright © 2020-2023  润新知