python学习day26笔记
作者:互联网
匿名函数
匿名函数就是没有名字的函数
为何要用匿名函数
用于临时使用一次的场景
通常与其他函数搭配使用
如何定义匿名函数
lambda关键字
lambda 形参:函数内容
lambda x,y:x+y
调用匿名函数
1.(蠢)
f = lambda x,y:x+y
2.
(lambda x,y:x+y)(1,2)
例:
salaries = {
'axx':1000,
'bxx':10000,
'cxx':100000
}
print(max(salaries,key=lambda name:salaries[name]))
# max将字典内的k值传给key里函数的形参,得到的返回值再进行max找到最大值,得到最大值对应的k值
print(min(salaries,key=lambda name:salaries[name]))
# 与max同理
print(sorted(salaries,key=lambda name:salaries[name]))
# sorted默认从小到大排序 其他与max同理
names = ['lxx','hxx_vip','wxx_vip']
# 下面的一般不使用,只是为了反映出函数式编程的思想
map(lambda name:name+'_vip',names) # 直接输出是内存地址
# res=[name+'_vip' for name in names]
filter(lambda name:name.endswith('_vip'),names) # 直接输出是内存地址
# res=[name for name in names if name.endswith('_vip')]
from functools import reduce
reduce(lambda x,y:x+y,[1,2,3],100) # 将其中数据累加,可以是字符串也可以是整型浮点型,必须是同一数据类型
面向过程编程
编程思想
过程就是流程,即先干什么再干什么
基于该思想写程序就好比在设计一条条的流水线
优点:复杂的问题流程化,进而简单化
缺点:牵一发而动全身,扩展性差
在哪里使用
1.实现基础的功能
2.构建程序的框架
# 框架即软件的半成品
模块介绍
模块本质上就是一个工具,它本身不能达成需求
自定义模块
1.一个py文件可以当做一个模块
2.包就是一个存放有__init__.py文件的文件夹,包的本质就是一个模块
模块的三种来源
1.自带的 内置 标准库2.第三方的 pip3 install 第三方库3.自定义的
导入模块
首次导入模块发生了两件事
import spam
1.会触发spam.py的运行,同时会在内存中产生一个模块的名称空间,用来存放模块运行过程中产生的名字
2.会在当前文件的名称空间中产生一个名字spam,该名字指向模块的名称空间
# 后续的导入引用之前已经产生的名称空间
整体流程
名称空间的关系是在定义阶段生成的,与调用阶段没关系
spam.money # 指名道姓的问spam里的money
spam.read1() # 指名道姓的执行spam里的read1函数
被调用模块内的参数只能调用该模块文件内的数据
import语法
import指向大空间,里面包含了你需要的模块
起别名
import spam as a # 给spam起别名叫a
import spam as a,os as b
一行导入多个
import spam,os
使用时需要加上前缀,例如:spam.money
from ... import ...语法
from ... import ...直接指向你需要的模块
from spam import money
使用时不需要加前缀
如果在调用money后再给money定义,新的定义会覆盖掉之前的调用
from spam import *
将模块内全部调用
# 极易容易与当前变量冲突
在模块内写入:__all__ = ['money','read1'] # 列表内输入字符串格式的变量名
再调用from spam import *,只能导入__all__内的内容
循环导入问题
'''!!!尽量不要使用循环导入!!!'''
例子:
有个m1.py文件,内容是:
from m2 import y
print(y)
x = 3
有个m2.py文件,内容是:
from m1 import x
print(x)
y = 4
此时在一个新的py文件内import m1
此时会报错
导入具体流程:
新的py文件import m1,导入时会触发m1.py的运行,m1.py运行时第一行代码是from m2 import y,又触发了m2的运行,此时要等m2运行完毕后m1才会运行下一步内容,所以此时m1只有from m2 import y这一行代码,但是m2的运行需要调用m1的x变量,此时m1已经存在内存里了,所以m2直接问内存的m1要x变量,很显然要不到,所以报错
解决方法1:
将m2需要的x代码放在导入m2之前
解决方法2:
将导入m2那串代码变成函数
最好的解决方法:
不使用循环导入,将需要被两边调用的值放进另一个模块内
m1导入os模块,添加代码os.environ['x']=str(x)
m2导入os模块,添加代码os.environ['y']=str(y)
这时就会将xy放进共用的os模块内
模块搜索路径
模块搜索路径,优先级从高到低
1.内存
2.内置
3.sys.path(环境变量的一种,是个文件夹,里面包含了很多文件夹)
sys.path内的第一个文件夹就是当前执行程序的文件夹
自定义模块不能和内置模块重名
正确使用自定义模块:
sys.path.append(r'导入模块的路径')
将需要的模块导入到环境变量
如果需要的模块在当前文件夹的某个文件夹内:
from aaa.bbb.ccc import spam
.是文件路径分隔符,指导入当前路径下aaa内bbb内ccc内的spam
name
__name__是一个内置的函数,如果该文件被运行了,__name__='__main__',通常用在自动启动模块内参数:
if __name__=='__main__':
f1()
标签:__,name,spam,python,day26,笔记,导入,模块,import 来源: https://www.cnblogs.com/Milu-Mi/p/14974332.html