一、PyCharm 中 import 包
1、Python中可以引入自定义模块,比如我需要user中的一个a字段的值,那么我么直接就可以import 这个包,如果是在不同的文件中,那么我们就需要加上他的包名,而且在Python 中是可以自定义导入的包名的,需要添加一个 as 然后加上自定义名称
然后运行结果
2、from x import x模式
这两种方法都是导入自定义模块,结果是
那我们不希望访问user模块的 b 这个信息怎么办呢,我们可以添加__all__ = [x,x,x]来选取可以访问对象,那么剩下的自然就不可访问了,但是这种情况只适用于当你导入的对象时所有的时候,如果是单独导入是没有效果的
3、__name__的用法
a、可以用来获取项目所在包名,我们在__init.py以及user.py中都写上print(__name__)
我们会发现,当我们运行代码的时候第一个打印的是init.py的包名,也就是说我们导入包名的时候,会默认选择我们导入的是init这个模块,第二个打印的是模块名,因为除了init这个模块会被默认,其他的包是无法导入的,只能导入模块
b、我们还可以用来防止外部引用模块时造成的二次运行,我们写一个简单的加法运算,然后执行,打印出来结果是 10
当我们外部引用的时候,会发现,我们的结果出现了两个,一个是user中对象本身运行,一个是外部调用
那么我们如何避免呢,这就用到了__name__,当函数再次运行的时候会发现,只出现的我们外部调用的结果
二、迭代器
自定义迭代器,定义一个自增三次方的迭代器
三、生成器:只要有了yield,那么这个函数就是生成器函数,他会在运行到yield的时候停止并且存储数据,然后在下一次运行next() 的时候从上一次停止的地方开始继续运行,从下面的函数就可以看出来
四、闭包
1、特点
2、简单的闭包函数,__closure[x].cell.contents这是判断该函数是否为闭包函数的方法,如果报错证明不是闭包函数,如果返回了数据那么就证明是闭包函数
3、如何在内部函数中修改闭包函数的外部变量,我们需要一个nonlocal,会发现,我们的值是递加过来的,也就是修改成功
五、装饰器:装饰器是一种增强函数方法,其实并没有什么区别
1、定义装饰器:装饰器的函数名,以及内部方法名是可以自定义的
2、调用装饰器:可以用 @你自己定义的名称 来调用装饰器
3、我们可以看一下装饰器拦截的数据,可以看得出来,我们已经拦截到了数据,如果有需要是可以直接提取出来并且操作的
六、lambda匿名函数,我们可以用来做一些简单函数,我们可以看出lambda与普通函数的区别是减少了关键字,以及不需要进行命名了
不仅简单函数,稍微复杂的也是可以的,比如进行判断的,我们可以伙同三元表达式来
七、map:map(函数,可迭代序列(可以添加多个序列)),这就是一个简单的立方操作,将序列中每一个数据立方之后返回
我们可以试着将序列中的数据长度变化一下,我们可以发现返回的数据是根据最短的序列长度来判断的
八、reduce(函数,序列,初始值) 用于连续计算
我们平时如果用到了连续的计算一般是直接for循环进行计算,比如下面的计算1-5的乘法结果
但是我们有一个reduce函数可以做到,在这之前必须引入reduce函数,在reduce中还有一个参数,代表的是初始值,第一个值先于其做计算,之后才会进行计算
九、filter(函数,序列)函数:是一个过滤函数
如果有一个序列,其中有许多 0 以及非 0 常量,我们需要将非 0 常量提取出来放到一起的话,是下面这么做的
我们还可以用filter函数来做
或者用lambda,为什么这返回值是True以及False呢,因为filter的返回结果必须是True以及False,否则就会报错,别问我怎么知道,又因为之前有说过,boolean类型中,除了0,其他的常量都代表了True,所以我们还可以简写成第二种
十、列表推导式
这就属于列表推导式,那么还有字典推导式,我们可以用字典推导式将键值调换