模块

1、一个py就是一个模块
2、包就是一个存放有__init__.py文件的文件夹,包的本质就是一个模块
三种来源:
   1、自带的
       内置
       标准库
   2、第三方的
       pip3 install 第三方库

   3、自定义的
在第一次导入模块时会做三件事,重复导入会直接引用内存中已经加载好的结果

1.为源文件(spam模块)创建新的名称空间,在spam中定义的函数和方法若是使用到了global时访问的就是这个名称空间。
2.在新创建的命名空间中执行模块中包含的代码,见初始导入import spam
3.创建名字spam来引用该命名空间

import

import spam #只在第一次导入时才执行spam.py内代码,此处的显式效果是只打印一次'from the spam.py',当然其他的顶级代码也都被执行了,只不过没有显示效果.
用import语句导入多个模块,可以写多行import语句    (不介意采用)
import module1
import module2

还可以在一行导入,用逗号分隔开不同的模块
import module1,module2,

from-import

from...import...与import语句基本一致,唯一不同的是:使用import foo导入模块后,引用模块中的名字都需要加上foo.作为前缀,可以在当前执行文件中直接引用模块foo中的名字

from foo import * #把foo中所有的名字都导入到当前执行文件的名称空间中,在当前位置直接可以使用这些名字

import foo as f #为导入的模块foo在当前位置起别名f,以后再使用时就用这个别名f

搜索模块的路径与优先级

模块搜索路径优先级从高到低
1、内存
2、内置
3、sys.path

from aaa.bbb.ccc import spam  # 导入语句中出现的点,代表路径分隔符

spam.money  # 使用语句中出现的点,代表问某一个名称空间要名字
编写好的一个python文件可以有两种用途:
    一:脚本,一个文件就是整个程序,用来被执行
    二:模块,文件中存放着一堆功能,用来被导入使用
    
    python为我们内置了全局变量__name__,
    当文件被当做脚本执行时:__name__ 等于'__main__'
    当文件被当做模块导入时:__name__等于模块名
    
    作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
    if __name__ == '__main__':
         foo.py被当做脚本执行时运行的代码
    else:
        foo.py被当做模块导入时运行的代码

匿名函数

什么是匿名函数?
匿名函数就是没有名字的函数

为何要用匿名函数?
用于临时使用一次的场景

如何定义匿名函数?
def foo(x, y):
    return x + y


# f = lambda x, y: x + y
# print(f)
# print(f(1,2))       无必要这样方式

# res = (lambda x, y: x + y)(1, 2)
# print(res)
max,用法
salaries = {
    "axx": 30000000,
    "bgon": 3000,
    "zxx": 1000
}


# print(max(salaries))

def f(name):
    return salaries[name]


# print(max(salaries,key=f))
# print(max(salaries,key=lambda name:salaries[name]))
# print(min(salaries,key=lambda name:salaries[name]))
# print(sorted(salaries))
# print(sorted(salaries,key=lambda name:salaries[name]))
# names = ['lxx', "hxx", "wxx"]
# # res=[name+"_vip" for name in names]
# # res=(name+"_vip" for name in names)
#
# res = map(lambda name:name+"_vip",names)
# print(res)
# print(list(res))

filter,

# filter()
# names = ['lxx', "hxx_vip", "wxx_vip"]
# # res = [name for name in names if name.endswith('_vip')]
# # print(res)
#
#
# res=filter(lambda name:name.endswith('_vip'),names)
# print(res)
# print(list(res))

reduce

# reduce()
from functools import reduce

# res = reduce(lambda x, y: x + y, [1, 2, 3, 4],100)
res = reduce(lambda x, y: x + y, ["a", "b", "c", "d"], "xxx")
print(res)