函数Ⅳ (闭包&内置模块)
1.内置函数(补充)
lambda表达式也叫匿名函数.
-
函数与函数之间的数据互不影响,每次运行函数都会开一个辟新的内存.
item = 10 def func(): item = 2 def inner(): print(item) for item in range(10): pass inner() func()
-
函数销毁条件:
- 函数运行完毕
- 函数内部元素没有被其他使用
可迭代数据类型:可被for循环的类型
-
chr,将十进制数字转换成 unicode 编码中的对应字符串。
v = chr(99) print(v)
-
ord,根据字符在unicode编码中找到其对应的十进制。
num = ord('中')
2.闭包
-
应用场景:
- 装饰器/SQLAIchemy源码
函数可以作为变量
函数可以作为参数
-
函数可以作为返回值
def bar(): def inner(): print(123) return inner v = bar() v()
-
闭包:为一个函数创建一块区域(内部变量供自己使用),为他以后执行提供数据
# 基本格式 def func(name): def inner(): print(name) return inner v1 = func('alex') v1() v2 = func('eric') v2()
#练习 # 第一题 name = 'alex' def base(): print(name) def func(): name = 'eric' base() func() # {name=eric, } # 第二题 name = 'alex' def func(): name = 'eric' def base(): print(name) base() func() # 第三题 name = 'alex' def func(): name = 'eric' def base(): print(name) return base base = func() base()
闭包企业面试题
info = [] def func(i): def inner(): print(i) return inner for item in range(10): info.append(func(item)) info[0]() info[1]() info[4]()
3.高阶函数
对函数进行赋值
函数当做返回值
-
高级一点的内置函数(了解,懂什么意思)
-
map(函数,可迭代对象),映射函数,循环每个元素,然后让每个元素执行函数,将每个函数执行的结果保存到新的列表,并返回.
v1 = [11,22,33,44] result = map(lambda x:x+100,v1) print(list(result)) # 特殊
-
fifter(函数,可迭代对象),筛选过滤,循环每个元素然后执行函数,将每个函数执行的结果筛选保存到新的列表并返回.
result = filter(lambda x: True if type(x) == int else False ,v1) print(list(result)) result = filter(lambda x: type(x) == int ,v1) print(list(result))
-
reduce(函数,可迭代对象),循环每个元素,然后执行函数,将每个函数执行的结果删选保存到新的列表并返回.
import functools v1 = ['wo','hao','e'] def func(x,y): return x+y result = functools.reduce(func,v1) print(result) result = functools.reduce(lambda x,y:x+y,v1) print(result)
-
小结
- 函数执行流程
- 闭包:为一个函数创建一块区域(内部变量供自己使用),为他以后执行提供数据
# 第一题
name = 'alex'
def base():
print(name)
def func():
name = 'eric'
base()
func() # {name=eric, }
4.内置模块(.py文件)
1.将指定的字符串加密:
- 将指定的字符串加密md5加密
import hashlib
def get_md5(data):
obj = hashlib.md5()
obj.update(data.encode('utf-8'))
result = obj.hexdigest()
return result
val = get_md5('123')
print(val)
-
加盐
import hashlib def get_md5(data): obj = hashlib.md5("sxff123ad".encode('utf-8'))#md5(加入任意字符串增加密码复杂度) obj.update(data.encode('utf-8')) result = obj.hexdigest() return result val = get_md5('123') print(val)
应用:
#账户密码加密函数:
import hashlib
USER_LIST = []
def get_md5(data):
obj = hashlib.md5("12:;idrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8'))
obj.update(data.encode('utf-8'))
result = obj.hexdigest()
return result
#用户注册:
def register():
print('**************用户注册**************')
while True:
user = input('请输入用户名:')
if user == 'N':
return
pwd = input('请输入密码:')
temp = {'username':user,'password':get_md5(pwd)}
USER_LIST.append(temp)
#用户登录
def login():
print('**************用户登陆**************')
user = input('请输入用户名:')
pwd = input('请输入密码:')
for item in USER_LIST:
#校验新输入密码加密后与用户注册加密是否相同
if item['username'] == user and item['password'] == get_md5(pwd):
return True
register()
result = login()
if result:
print('登陆成功')
else:
print('登陆失败')
2.随机验证码模块应用:
- chr() 十进制数字转换成unicode编码中的对应字符串
- ord() 根据字符在unicode编码中找到其对应的十进制
- random.randit(最小值,最大值) 生产随机数
#生产随机验证码
import random
def get_random_code(length=6):
data = []
for i in range(length):
v = random.randint(65,90) #random.randit(最小值,最大值) 生产随机数
data.append(chr(v))
return ''.join(data)
code = get_random_code()
print(code)
import random # 导入一个模块
v = random.randint(起始,终止) # 得到一个随机数
3.密码不显示(只能在终端运行)
import getpass
pwd = getpass.getpass('请输入密码:')
if pwd == '123':
print('输入正确')