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

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

  • 相关阅读:
    swoole 安装方法 使用即时聊天
    git的介绍以及简单应用
    curl的应用
    linux下监听和同步代码配置
    mac skim 修改背景色
    php 编译安装的一个 configure 配置
    mac mysql error You must reset your password using ALTER USER statement before executing this statement.
    yii2 控制器里 action 大小写组合造成的路由问题
    warning : json_decode(): option JSON_BIGINT_AS_STRING not implemented in xxx
    redis 自启动脚本
  • 原文地址:https://www.cnblogs.com/Kate-liu/p/11291624.html
Copyright © 2011-2022 走看看