python程序一定要有主函数_作为Python中级程序员,有句话不知当讲不当讲 ( ̄へ ̄)...

原标题:作为Python中级程序员,有句话不知当讲不当讲 ( ̄へ ̄)

爱你们♥

作者:Pulkit Agrawa

编译:公众号编辑部

祝妈妈们节日快乐!

f1ba8df8e9ca421a8e4ff2ea21265b68.jpeg

这句话里有10个问题

Python中都是对象吗?

字符串是对象。列表对象。函数对象。甚至模块也是对象。任何东西都是一个对象,因为它可以赋值给一个变量或作为参数传递给一个函数。

任何可以(合法地)放在等号右边的东西都是(或创建)Python中的对象。

041cae5b1da643c8a7d1ad2665844a66.jpeg

对象:

1、ID

2、值(可变的或不可变的)

可变的:当更改项目时,ID仍然是相同的。比如:字典、列表。

不可变的:字符串、整数、元组。

e1d852f2651142839a2c758ea780af05.jpeg

推导式

Comprehension——用于创建集合和可迭代对象的简写语法。

▍列表推导式

23acefda0d464cd2b492b0d222a2861e.png

▍集合推导式

89af320b601540609a3e8f0dcb8bc6ba.png

▍字典推导式

a3f05fd488414835a0b56cd9cef9421a.png

▍Generator 推导式

4c48229699b14a9dab0f1cca4a52577d.png

▍ If-clause 推导式

920b46f1d4df457f899fec02d19e475e.png

▍多重推导式

23a932c6da3d461f912c122b4ff15b95.jpeg

76a8459d23914c99833cee7000492115.png

▍嵌套推导式

5ad45ac1b70544febb4aef94e2f8f68f.jpeg

fdff6f1ba7e9463ab0f06eeb1f1cb005.png

扩展关键字参数

在Python中调用函数时,通常必须在使用关键字参数和位置参数之间进行选择。 关键字参数通常可用于使函数调用更加明确。当我们使用关键字参数时:我们通常可以省略具有默认值的参数。

485ef8a4e6994671a0fa6e4efdfb6b18.png

扩展形式参数语法:

5b5364fe3a3d468a855923fc34351f47.png

e4659a109c664db8873b920c0f01f336.png

扩展参数的数据类型:

4242dc1f6ce74409a238726c05967923.jpeg

扩展实参语法:

a976d96e5d9749e59b5cb556cd6cfcc8.png

f00dc2a3887849699ee15ea551c28aa9.png

闭包和装饰器

在开始闭包之前,我们先了解一下local 函数:

适用于特殊的、一次性的功能

使得代码具有组织性和可读性

类似于lambdas,但更为一般

可能包含多个表达式

可能包含statements

▍LEGB含义解释

L-Local(function):函数内的名字空间

E-Enclosing function locals:外部嵌套函数的名字空间(例如closure)

G-Global(module):函数定义所在模块(文件)的名字空间

B-Builtin(Python):Python内置模块的名字空间

Python的命名空间是一个字典,字典内保存了变量名称与对象之间的映射关系,因此,查找变量名就是在命名空间字典中查找键-值对。

Python有多个命名空间,因此,需要有规则来规定,按照怎样的顺序来查找命名空间,LEGB就是用来规定命名空间查找顺序的规则。

LEGB规定了查找一个名称的顺序为:local-->enclosing function locals-->global-->builtin(局部变量———闭包空间———全局变量———内建模块内置)

229b10d763c54639a8ef1250b8daa89b.png

▍Returning Function

c0e1d304903944df8102ee574c9f13cb.png

▍闭包

维持对早期范围对象的引用。

d1b0889ee2a845bea6526c5b19b60f61.png

我们可以使用_closure__来验证函数是否为闭包。

ca16212cac72493c845537617b32dd79.png

一个函数和它的环境变量合在一起,就构成了一个闭包(closure)。在Python中,所谓的闭包是一个包含有环境变量取值的函数对象。环境变量取值被保存在函数对象的 __closure__ 属性中。比如下面的代码:

3c0d423d9da2417fa3a8bb53c7d63b03.png

__closure__ 里包含了一个元组。这个元组中的每个元素是cell类型的对象。我们看到第一个cell包含的就是整数15,也就是我们创建闭包时的环境变量b的取值。

下面看一个闭包的实际例子:

4be672c25c4d490b905fe26b74bda2f4.png

这个例子中,函数line与环境变量a,b构成闭包。在创建闭包的时候,我们通过line_conf的参数a,b说明了这两个环境变量的取值,这样,我们就确定了函数的最终形式(y = x + 1和y = 4x + 5)。我们只需要变换参数a,b,就可以获得不同的直线表达函数。由此,我们可以看到,闭包也具有提高代码可复用性的作用。

如果没有闭包,我们需要每次创建直线函数的时候同时说明a,b,x。这样,我们就需要更多的参数传递,也减少了代码的可移植性。利用闭包,我们实际上创建了泛函。line函数定义一种广泛意义的函数。这个函数的一些方面已经确定(必须是直线),但另一些方面(比如a和b参数待定)。随后,我们根据line_conf传递来的参数,通过闭包的形式,将最终函数确定下来。

一个函数闭包是一个函数和一个引用集合的组合,这个引用集合指向这个函数被定义的作用域的变量。后者通常指向一个引用环境(referencing environment),这使得函数能够在它被定义的区域之外执行。在Python中,这个引用环境被存储在一个cell的tuple中。你能够通过func_closure或Python 3中的__closure__属性访问它。要铭记的一点是引用及是引用,而不是对象的深度拷贝。当然了,对于不可变对象而言,这并不是问题,然而对可变对象(list)这点就必须注意。请注意函数在定义的地方也有__globals__字段来存储全局引用环境。

▍装饰器

装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过继承或是直接修改源代码实现,那么可以使用装饰器模式。简单来说Python中的装饰器就是指某些函数或其他可调用对象,以函数或类作为可选输入参数,然后返回函数或类的形式。

简单地说,decorator就像一个wrapper一样,在函数执行之前或者之后修改该函数的行为,而无需修改函数本身的代码,这也是修饰器名称的来由。

30596e30760747c5bf131266b5fc1805.jpeg

生成器和迭代协议

▍Iterable:可以将对象传递给内置的iter()函数来获得迭代器。

▍Iterator:可以将对象传递给内置的next()函数来获取下一项。

20d29f96d62f4dd495561a99254aee2c.png

▍生成器

Python生成器是创建迭代器的一种简单方法。上面提到的都由Python中的生成器自动处理的。

生成器是一个函数,它返回一个对象(迭代器),我们可以遍历该对象(每次一个值)。

如果一个函数包含至少一个yield语句,则它将成为生成器函数。

不同之处在于,虽然return语句完全终止了一个函数,但是yield语句暂停保存函数的所有状态,然后在后续调用时继续执行。

0a930af2291745fdb252a1dbee756a7c.jpeg

为什么在Python中使用生成器?

Easy to Implement

Memory Efficient

Represent Infinite Stream

Pipelining Generators

0f8390d6f3d94712b158469f2f506e12.png

上下文管理器

▍ContextManager:上下文管理器就是实现了上下文管理协议的对象。主要用于保存和恢复各种全局状态,关闭文件等,上下文管理器本身就是一种装饰器。

1a0543e8a5674ca79902c8dc6889a471.png

9db8842064204c32b956617005aefb86.jpeg

▍__enter__ ()

在进入with-statement主体之前调用

返回绑定到变量的值

可以返回任何类型的值

通常返回上下文管理器本身

▍__exit__()

当语句体退出时调用

__exit__(self, exc_type, exc_val, exc_tb)

9104a7b5d6cd4adbba184c1d1e72111f.jpeg

@staticmethod、 @classmethod

0dcd03f25dd54b36a4794b41d9d94338.png

如果需要访问函数中的类属性,请使用@classmethod。

如果不需要使用cls对象,则使用@static method。

与其他语言不同,Python中的静态方法可以在子类中重写。

f19b6b3a0bb245869969da9c313181e1.jpeg

继承和封装

▍继承

继承是一个类获取另一个类的属性的机制。例如,一个孩子继承了他/她父母的特点。通过继承,我们可以重用现有类的字段和方法。因此,继承促进了可重用性,并且是OOPs的一个重要概念。

▍单继承

子类将具有基类的所有功能,还可以修改和增强。

子类初始化器希望调用基类初始化器,以使整个对象被初始化。

df046b006d7b4d33b6d7ec694bb5c167.png

调用其他类初始化器:

1、其他语言自动调用base class初始化器

2、Python像对待其他方法一样处理 _init__()

3、base class _init__()在被覆盖时不会被调用

4、使用super()调用 base class _init__()

isinstance(instance, class):确定对象是否具有指定的类型。

Issubclass(subclass,base class):确定一个类型是否是其他类型的子类。

▍多继承

即子类有多个父类,并且具有它们的特征:

304a3ee1b0f246d98caa82c11f8378fc.png

Python如何知道应该调用哪个base class函数?

Python使用方法解析Order和super来做到这一点。

358b00e0cf3549239752f920b0303051.png

方法解析顺序

确定方法名称查找的顺序

1、通常称为“MRO”

2、方法可以在多个地方定义

3、MRO是继承图的排序

2ab73da004d24260a8784a9dc22b2aed.jpeg

473d4aa4b9b04316bb1256fc784403d1.jpeg

▍封装

620612facdbd4cd4b37e8260ce1de692.jpeg

Python包和程序设计

Sys.pathPython搜索模块的目录列表。

PYTHONPATH添加到sys.path的环境变量列表路径。

8e6d36b109ef4483bdff8e7ce5a797ca.jpeg

1、包是包含其他模块的模块。

2、包通常实现为包含特殊 _init__.py 文件的目录。

3、导入包时执行 __init__.py 文件。

4. 包可以包含自己实现的子包。这些子包本身是用目录中的 __init__.py 文件实现的。

5、包的模块对象具有__path__属性。

绝对导入:使用模块完整路径的导入。比如 import a,Python 会在 sys.path 里寻找所有名为 a 的顶层模块。

e4062fbbf602489e950fd8b30b3e6209.png

相对导入:使用相同包中模块的相对路径的导入。比如一个 package 下有 a.py 和 b.py 两个文件,在 a.py 里 from . import b 即是相对导入 b.py。

8f19438dc99d472988428dc18c7349f0.png

__all__:是一个字符串list,用来定义模块中对于from XXX import *时要对外导出的符号,即要暴露的借口,但它只对import *起作用,对from XXX import XXX不起作用。

a7d9a0732d4e4810af1d3b3b84adf971.jpeg

来自:https://medium.com/@agrawal.pulkit1994

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值