python 基础
一,名字空间和作用域
1.1名字空间:
1,命名空间类型:
local:局部命名空间,查看:locals()
global:全局命名空间,只要在全局命名空间中的内容到处都能使用.
查看:globals()
__name__: 模块名, 如果是主执行文件 值为 __main__
__builtins__:内建名字空间对象,用于查看内建名字空间中的内容的
__file__:当前文件的绝对路径
#动态获取当前文件所在的目录
import os
print(os.path.dirname(__file__))
1.2作用域
1,作用域的分类
局部作用域(local):作用范围为当前函数内容
闭包作用域(enclosing):作用范围为函数中的子函数中(函数嵌套)
全局作用域(global):作用范围全局
内建作用域(bulitin):作用范围全局
#作用域:指成员(变量,函数,方法,类)的使用范围
2,成员的查找顺序:L>E>G>B
3,指定操作对应作用域中的成员
在函数内修改全局的成员,使用global 全局变量名 引入之后才能修改
在子函数中修改闭包变量,使用nonlocal 闭包变量 引入闭包变量才能修改
3,装饰器
1,概念:本质也是一个函数,用于加强原版函数,这个函数就是装饰器
备注:原函数功能不变的情况进行加强
2,如何实现装饰器函数
1)定义一个函数
2)接收原函数作为参数
3)新增新功能
3.装饰器的使用
def 装饰器函数(原函数):
pass
@装饰器函数--->类方法,静态方法,装饰器的使用
def 原函数()
pass
4,导入随机模块
import random
random.random()--->实数相关,用于生成一个0到1的随机浮点数:[0,1)
random.uniform(a,b)----->生成[a,b]或[b,a]之间的均匀分布随机浮点数.
random.randint(a,b)---->整数相关,生成[a,b]的随机整数,要求a<b
random.randrange(a,b)---->生成[a,b)的随机整数,第三个参数可以指定步长.
random.choice(seq)---->序列相关,从序列中随机选择一个元素,若序列为空,则抛出异常
random.shuffle(seqb)---->打乱原序列,原序列必须可写
random.sample(seq,k)----->从序列中随机选择K个元素返回,原序列不变
random.seed(n=none) ----->初始化 初始化随机商池.
5,时间模块
1,概念
time模块:基于计算机底层时钟实现的模块,计算机时间是默认使用4个字节存储,这个时间也就是时间戳,时间到2038年
datetime 模块:对应time模块的二次封装和改进,表示0000-9999
2,time 模块
语法:
import time
time.time():获取当前时间戳
time.sleep(秒):让程序休眠多少秒
3,datetime 模块
--->该模块上有两个重要的类,datetime类和,timedelta类
语法:
from datetime import datetime,timedelta
使用:
datetime类的使用:
datetime.now():创建当前时间对象
datetime(year=年,month=月,day=天):创建指定时间对象
datatime.strptime():将字符串转换为时间对象
#时间对象上的方法
时间对象.year
时间对象.month
时间对象.day
时间对象.strftime()#将时间对象进行字符串格式,用于自定义时间展示.
4.timedelta类:用于处理时间对象之间的差(时间计算),时间跨度类
创建对象的方式:
1,两时间对象相减
2,创建跨度对象
例: 计算100天后的日期
例: future = datetime.now() + timedelta(days=100)
print(future)
6,哈希散列算法
1,哈希散列是一种算法,用于对对数据进行加密,生成固定长度小量的数据,是原数据的唯一识别码
注:哈希散列算法是不可逆算法
2,用处:
a,密码加密
b,软件生成md5码进行比对安全
3,常见的算法
a,md5
b,sha
4,算法的使用步骤
a,导入算法库模块
import hashlib
b,准备需要加密的数据(将数据转为二进制)
1) b'字符串'
2)变量名.encode('utf-8')
3)读取文件时采用rb
c,创建算法对象
h=hashlib.md5(二进制数据)
h=hashlib.sha256(二进制数据)
h=hashlib.sha512(二进制)
d,获取加密结果
h.hexdigest()
迭代器和生成器
1容器: 存储多个元素的数据结构
例如: 列表,元组,字典,集合,字符串迭代器(for ... in ...遍历的底层实现)
a. 使用 iter(容器) ----> 生成迭代器
b. 使用 next(迭代器) 每次取下一个元素
c. 取完抛出异常 StopIteration
names = ["张飞","李四","关羽","曹操","刘备"]
# for ... in ...
# 通过迭代器的形式遍历列表
d = iter(names)
while True:
try:
print(next(d))
except Exception as e:
pass
生成器:
概念: 1. 生成器是特殊的迭代器(使用方式和迭代器一样)
2. 生成器中的元素不是直接生成, 而是每次调用next()才生成
3. 好处: 大大的节约内存资源
定义生成语法:
1. 方式一: 列表推导式生成器
g = (表达式 for i in 容器 简单判断语句) # range() generate
g = (i for i in range(1,1000000000)) # 直接生成数据 对内存消耗非常大
print(g)
print(next(g))
print(next(g))
2. 方式二: 函数式生成器
a. 定义函数的时候,只要函数中出现了 yield , 这个函数就是生成器函数
b. 调用函数: 生成器函数名() 不会立马执行函数体, 返回生成器对象
c. 当使用 next(生成器对象) 执行函数体
d. 当执行到 yield 数据, 返回数据到 next() 调用位置 并且 暂停 代码运行. e. 当下次再调用 next() 才继续运行.
例:# 生成器函数 1-任意
def showNum():
i = 1
while True:
yield i # 返回
i += 1
g = showNum() # 返回生成器对象
print(next(g))
print(next(g))
print(next(g))
print(next(g))
# 生成斐波那契数列:1 1 2 3 5 8 13 ............
def fbnq():
a, b = 1, 1 # 初始化值
while True:
yield a + b
a, b = b, a + b
# 使用
g = fbnq()
print(next(g))
print(next(g))
print(next(g))