函数Ⅳ(闭包&内置模块)
- 企业面试题
- 常用的内置函数有哪些?
- filter/map/reduce是什么意思?
- 什么是匿名函数?
1
2
3
2
3
# 1.内置函数(补充)
lambda表达式也叫匿名函数.
函数与函数之间的数据互不影响,每次运行函数都会开一个辟新的内存.
item = 10 def func(): item = 2 def inner(): print(item) for item in range(10): pass inner() func()
1
2
3
4
5
6
7
8
9函数销毁条件:
- 函数运行完毕
- 函数内部元素没有被其他使用
可迭代数据类型:可被for循环的类型
chr,将十进制数字转换成 unicode 编码中的对应字符串。
v = chr(99) print(v)
1
2ord,根据字符在unicode编码中找到其对应的十进制。
num = ord('中')
1
# 2.闭包
应用场景:
- 装饰器/SQLAIchemy源码
函数可以作为变量
函数可以作为参数
函数可以作为返回值
def bar(): def inner(): print(123) return inner v = bar() v()
1
2
3
4
5
6闭包:为一个函数创建一块区域(内部变量供自己使用),为他以后执行提供数据
# 基本格式 def func(name): def inner(): print(name) return inner v1 = func('alex') v1() v2 = func('eric') v2()
1
2
3
4
5
6
7
8
9
10#练习 # 第一题 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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34########################闭包企业面试题#######################
# 题1 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]() """ 闭包过程中 每一次遍历执行func(item), 系统会将func(item)返回值 inner压入栈,并将item的值一并放入(值传递), info[0]()调用的时候将inner从栈中取出执行,inner中的指向不同的内存地址 """ # 题2 def fun(): temp=[lambda x:x*i for i in range(4)] return temp for every in fun(): print(every(2)) """ 在列表生成式中匿名函数lambda 每一次调用都是将i的引用压入栈(引用传递),在列表生成式中最后一次更改i的值时, temp中所有的i都指向同一块内存地址, 所以在遍历temp时执行结果都是一样的 """
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 3.高阶函数
对函数进行赋值
函数当做返回值
高级一点的内置函数(了解,懂什么意思)
map(函数,可迭代对象),映射函数,循环每个元素,然后让每个元素执行函数,将每个函数执行的结果保存到新的列表,并返回.
v1 = [11,22,33,44] result = map(lambda x:x+100,v1) print(list(result)) # 特殊
1
2
3fifter(函数,可迭代对象),筛选过滤,循环每个元素然后执行函数,将每个函数执行的结果筛选保存到新的列表并返回.
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))
1
2
3
4
5reduce(函数,可迭代对象),循环每个元素,然后执行函数,将每个函数执行的结果删选保存到新的列表并返回.
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)
1
2
3
4
5
6
7
8
9
10
# 小结
- 函数执行流程
- 闭包:为一个函数创建一块区域(内部变量供自己使用),为他以后执行提供数据
# 第一题
name = 'alex'
def base():
print(name)
def func():
name = 'eric'
base()
func() # {name=eric, }
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 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)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
加盐
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)
1
2
3
4
5
6
7
8
应用:
#账户密码加密函数:
import hashlib
USER_LIST = []
def get_md5(data):
obj = hashlib.md5("gfdsjdxff123ad".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('登陆失败')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 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)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
import random # 导入一个模块
v = random.randint(起始,终止) # 得到一个随机数
1
2
2
# 3.密码不显示(只能在终端运行)
import getpass
pwd = getpass.getpass('请输入密码:')
if pwd == '123':
print('输入正确')
1
2
3
4
2
3
4
上次更新: 2023/04/16, 18:35:33